@magic-xpa/angular 4.1100.0-dev4110.20 → 4.1100.0-dev4110.203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/{esm2020 → esm2022}/index.mjs +59 -59
  2. package/{esm2020 → esm2022}/magic-xpa-angular.mjs +1 -1
  3. package/esm2022/src/controls.metadata.model.mjs +183 -0
  4. package/{esm2020 → esm2022}/src/interfaces/sub-form-definition.iterface.mjs +1 -1
  5. package/{esm2020 → esm2022}/src/magic.core.module.mjs +159 -160
  6. package/{esm2020 → esm2022}/src/services/ISubformMagicService.mjs +1 -1
  7. package/esm2022/src/services/OverlayWindowService.mjs +244 -0
  8. package/esm2022/src/services/StylesMapManager.mjs +28 -0
  9. package/esm2022/src/services/accessor.magic.service.mjs +358 -0
  10. package/esm2022/src/services/commands-collector.magic.service.mjs +47 -0
  11. package/esm2022/src/services/component-list.magic.service.mjs +45 -0
  12. package/{esm2020 → esm2022}/src/services/confirmation.components.magic.provider.mjs +21 -21
  13. package/esm2022/src/services/engine.magic.service.mjs +80 -0
  14. package/{esm2020 → esm2022}/src/services/exit.magic.service.mjs +13 -13
  15. package/esm2022/src/services/magic-color.service.mjs +101 -0
  16. package/{esm2020 → esm2022}/src/services/magic.lazy.loader.service.mjs +16 -16
  17. package/{esm2020 → esm2022}/src/services/magic.providers.mjs +24 -24
  18. package/esm2022/src/services/magic.services.mjs +36 -0
  19. package/esm2022/src/services/mg-date-adapter.mjs +108 -0
  20. package/{esm2020 → esm2022}/src/services/overlay.conainer.magic.provider.mjs +14 -14
  21. package/esm2022/src/services/router-commands.magic.service.mjs +31 -0
  22. package/esm2022/src/services/subform.magic.service.mjs +194 -0
  23. package/esm2022/src/services/table.magic.service.mjs +81 -0
  24. package/esm2022/src/services/task.magics.service.mjs +637 -0
  25. package/esm2022/src/services/title.magic.service.mjs +19 -0
  26. package/esm2022/src/ui/GuiInteractiveExecutor.mjs +109 -0
  27. package/esm2022/src/ui/components/base-magic-alert.component.mjs +24 -0
  28. package/esm2022/src/ui/components/base-magic-confirm.component.mjs +24 -0
  29. package/esm2022/src/ui/components/magic-alert.component.mjs +36 -0
  30. package/esm2022/src/ui/components/magic-confirmation-box.component.mjs +42 -0
  31. package/esm2022/src/ui/directives/NonMagicControlDirective.mjs +58 -0
  32. package/esm2022/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +29 -0
  33. package/esm2022/src/ui/directives/magic/checkbox.magic.directive.mjs +29 -0
  34. package/esm2022/src/ui/directives/magic/combobox.magic.directive.mjs +37 -0
  35. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +27 -0
  36. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +85 -0
  37. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +32 -0
  38. package/esm2022/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +28 -0
  39. package/esm2022/src/ui/directives/magic/nocontrol.magic.directive.mjs +193 -0
  40. package/esm2022/src/ui/directives/magic/row.magic.directive.mjs +62 -0
  41. package/esm2022/src/ui/directives/magic-focus.directive.mjs +20 -0
  42. package/esm2022/src/ui/directives/magic.directive.mjs +229 -0
  43. package/esm2022/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
  44. package/esm2022/src/ui/directives/mgformat.magic.directive.mjs +578 -0
  45. package/esm2022/src/ui/directives/range-validator.magic.directive.mjs +60 -0
  46. package/{esm2020 → esm2022}/src/ui/magic-confirmationBox.mjs +42 -42
  47. package/{esm2020 → esm2022}/src/ui/magic-modal/base-magic-overlay-container.mjs +22 -22
  48. package/esm2022/src/ui/magic-modal/magic-modal-form.mjs +6 -0
  49. package/{esm2020 → esm2022}/src/ui/magic-modal/magic-modal-interface.mjs +1 -1
  50. package/esm2022/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +124 -0
  51. package/esm2022/src/ui/magic-modal/magic-overlay-container.mjs +162 -0
  52. package/esm2022/src/ui/magic-root.component.mjs +216 -0
  53. package/esm2022/src/ui/mgerror.magic.component.mjs +125 -0
  54. package/esm2022/src/ui/pipes/date.magic.pipe.mjs +106 -0
  55. package/esm2022/src/ui/pipes/time.magic.pipe.mjs +52 -0
  56. package/esm2022/src/ui/pipes/time24.magic.pipe.mjs +35 -0
  57. package/esm2022/src/ui/router-container.magic.component.mjs +115 -0
  58. package/{esm2020 → esm2022}/src/ui/subform.magic.component.mjs +50 -46
  59. package/esm2022/src/ui/task-base.magic.component.mjs +91 -0
  60. package/esm2022/src/ui/utils.mjs +54 -0
  61. package/{fesm2020 → fesm2022}/magic-xpa-angular.mjs +4807 -4443
  62. package/fesm2022/magic-xpa-angular.mjs.map +1 -0
  63. package/index.d.ts +58 -58
  64. package/package.json +7 -13
  65. package/src/controls.metadata.model.d.ts +62 -62
  66. package/src/interfaces/sub-form-definition.iterface.d.ts +12 -12
  67. package/src/magic.core.module.d.ts +41 -41
  68. package/src/services/ISubformMagicService.d.ts +4 -4
  69. package/src/services/OverlayWindowService.d.ts +30 -25
  70. package/src/services/StylesMapManager.d.ts +5 -5
  71. package/src/services/accessor.magic.service.d.ts +69 -69
  72. package/src/services/commands-collector.magic.service.d.ts +15 -15
  73. package/src/services/component-list.magic.service.d.ts +23 -23
  74. package/src/services/confirmation.components.magic.provider.d.ts +8 -8
  75. package/src/services/engine.magic.service.d.ts +27 -27
  76. package/src/services/exit.magic.service.d.ts +6 -6
  77. package/src/services/magic-color.service.d.ts +19 -19
  78. package/src/services/magic.lazy.loader.service.d.ts +6 -6
  79. package/src/services/magic.providers.d.ts +107 -107
  80. package/src/services/magic.services.d.ts +16 -16
  81. package/src/services/mg-date-adapter.d.ts +38 -40
  82. package/src/services/overlay.conainer.magic.provider.d.ts +7 -7
  83. package/src/services/router-commands.magic.service.d.ts +17 -17
  84. package/src/services/subform.magic.service.d.ts +43 -43
  85. package/src/services/table.magic.service.d.ts +30 -30
  86. package/src/services/task.magics.service.d.ts +100 -100
  87. package/src/services/title.magic.service.d.ts +9 -9
  88. package/src/ui/GuiInteractiveExecutor.d.ts +22 -21
  89. package/src/ui/components/base-magic-alert.component.d.ts +10 -10
  90. package/src/ui/components/base-magic-confirm.component.d.ts +10 -10
  91. package/src/ui/components/magic-alert.component.d.ts +6 -6
  92. package/src/ui/components/magic-confirmation-box.component.d.ts +6 -6
  93. package/src/ui/directives/NonMagicControlDirective.d.ts +26 -26
  94. package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +9 -9
  95. package/src/ui/directives/magic/checkbox.magic.directive.d.ts +9 -9
  96. package/src/ui/directives/magic/combobox.magic.directive.d.ts +10 -10
  97. package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +7 -7
  98. package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +23 -17
  99. package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +7 -7
  100. package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +9 -9
  101. package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +18 -18
  102. package/src/ui/directives/magic/row.magic.directive.d.ts +17 -17
  103. package/src/ui/directives/magic-focus.directive.d.ts +9 -9
  104. package/src/ui/directives/magic.directive.d.ts +44 -44
  105. package/src/ui/directives/magicViewContainerRef.directive.d.ts +8 -8
  106. package/src/ui/directives/mgformat.magic.directive.d.ts +38 -31
  107. package/src/ui/directives/range-validator.magic.directive.d.ts +17 -17
  108. package/src/ui/magic-confirmationBox.d.ts +6 -6
  109. package/src/ui/magic-modal/base-magic-overlay-container.d.ts +5 -5
  110. package/src/ui/magic-modal/magic-modal-form.d.ts +5 -5
  111. package/src/ui/magic-modal/magic-modal-interface.d.ts +10 -10
  112. package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +30 -31
  113. package/src/ui/magic-modal/magic-overlay-container.d.ts +24 -25
  114. package/src/ui/magic-root.component.d.ts +40 -40
  115. package/src/ui/mgerror.magic.component.d.ts +20 -20
  116. package/src/ui/pipes/date.magic.pipe.d.ts +17 -17
  117. package/src/ui/pipes/time.magic.pipe.d.ts +11 -11
  118. package/src/ui/pipes/time24.magic.pipe.d.ts +10 -10
  119. package/src/ui/router-container.magic.component.d.ts +29 -30
  120. package/src/ui/subform.magic.component.d.ts +16 -16
  121. package/src/ui/task-base.magic.component.d.ts +34 -34
  122. package/src/ui/utils.d.ts +9 -9
  123. package/esm2020/src/controls.metadata.model.mjs +0 -180
  124. package/esm2020/src/services/OverlayWindowService.mjs +0 -208
  125. package/esm2020/src/services/StylesMapManager.mjs +0 -28
  126. package/esm2020/src/services/accessor.magic.service.mjs +0 -356
  127. package/esm2020/src/services/commands-collector.magic.service.mjs +0 -46
  128. package/esm2020/src/services/component-list.magic.service.mjs +0 -46
  129. package/esm2020/src/services/engine.magic.service.mjs +0 -82
  130. package/esm2020/src/services/magic-color.service.mjs +0 -99
  131. package/esm2020/src/services/magic.services.mjs +0 -31
  132. package/esm2020/src/services/mg-date-adapter.mjs +0 -109
  133. package/esm2020/src/services/router-commands.magic.service.mjs +0 -28
  134. package/esm2020/src/services/subform.magic.service.mjs +0 -184
  135. package/esm2020/src/services/table.magic.service.mjs +0 -77
  136. package/esm2020/src/services/task.magics.service.mjs +0 -624
  137. package/esm2020/src/services/title.magic.service.mjs +0 -18
  138. package/esm2020/src/ui/GuiInteractiveExecutor.mjs +0 -98
  139. package/esm2020/src/ui/components/base-magic-alert.component.mjs +0 -23
  140. package/esm2020/src/ui/components/base-magic-confirm.component.mjs +0 -23
  141. package/esm2020/src/ui/components/magic-alert.component.mjs +0 -35
  142. package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +0 -41
  143. package/esm2020/src/ui/directives/NonMagicControlDirective.mjs +0 -49
  144. package/esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +0 -28
  145. package/esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs +0 -28
  146. package/esm2020/src/ui/directives/magic/combobox.magic.directive.mjs +0 -36
  147. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +0 -27
  148. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +0 -52
  149. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +0 -32
  150. package/esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +0 -27
  151. package/esm2020/src/ui/directives/magic/nocontrol.magic.directive.mjs +0 -193
  152. package/esm2020/src/ui/directives/magic/row.magic.directive.mjs +0 -58
  153. package/esm2020/src/ui/directives/magic-focus.directive.mjs +0 -19
  154. package/esm2020/src/ui/directives/magic.directive.mjs +0 -215
  155. package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +0 -19
  156. package/esm2020/src/ui/directives/mgformat.magic.directive.mjs +0 -408
  157. package/esm2020/src/ui/directives/range-validator.magic.directive.mjs +0 -58
  158. package/esm2020/src/ui/magic-modal/magic-modal-form.mjs +0 -8
  159. package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +0 -121
  160. package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +0 -159
  161. package/esm2020/src/ui/magic-root.component.mjs +0 -203
  162. package/esm2020/src/ui/mgerror.magic.component.mjs +0 -119
  163. package/esm2020/src/ui/pipes/date.magic.pipe.mjs +0 -105
  164. package/esm2020/src/ui/pipes/time.magic.pipe.mjs +0 -51
  165. package/esm2020/src/ui/pipes/time24.magic.pipe.mjs +0 -34
  166. package/esm2020/src/ui/router-container.magic.component.mjs +0 -108
  167. package/esm2020/src/ui/task-base.magic.component.mjs +0 -86
  168. package/esm2020/src/ui/utils.mjs +0 -54
  169. package/fesm2015/magic-xpa-angular.mjs +0 -4832
  170. package/fesm2015/magic-xpa-angular.mjs.map +0 -1
  171. package/fesm2020/magic-xpa-angular.mjs.map +0 -1
@@ -0,0 +1,578 @@
1
+ import { Directive, HostListener } from '@angular/core';
2
+ import { TaskMagicService } from '../../services/task.magics.service';
3
+ import { StringBuilder, RefParam } from '@magic-xpa/mscorelib';
4
+ import { PICInterface, StorageAttribute } from '@magic-xpa/utils';
5
+ import { MagicDirective } from './magic.directive';
6
+ import { Validators } from '@angular/forms';
7
+ import { MgDateFormatter } from '../pipes/date.magic.pipe';
8
+ import { isUndefined } from '@magic-xpa/mscorelib';
9
+ import { Environment, LastFocusedManager } from "@magic-xpa/engine";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./magic.directive";
12
+ import * as i2 from "../../services/task.magics.service";
13
+ export class MgformatMagicDirective {
14
+ magicDir;
15
+ _task;
16
+ datePasteFlag = false;
17
+ constructor(magicDir, _task) {
18
+ this.magicDir = magicDir;
19
+ this._task = _task;
20
+ }
21
+ ngAfterViewInit() {
22
+ let control = this._task.getFormControl(this.magicDir.rowId, this.magicDir.id);
23
+ if (control != null && this._task.mgInputDateFormat == null) {
24
+ let pic = this._task.GetControlPictureMask(this.magicDir.id);
25
+ if (pic.getAttr() == StorageAttribute.DATE) {
26
+ this.formatDate(pic);
27
+ }
28
+ }
29
+ }
30
+ onFocusEvent($event) {
31
+ this.calculatePattern();
32
+ }
33
+ onPaste(event) {
34
+ this.datePasteFlag = true;
35
+ }
36
+ onInputEvent(event) {
37
+ let attr = this._task.Records.list[0].getControlMetadata(this.magicDir.id).dataType;
38
+ if (attr == StorageAttribute.DATE) {
39
+ if (!this.datePasteFlag)
40
+ this.dateMasking(event);
41
+ this.datePasteFlag = false;
42
+ }
43
+ this.calculatePattern();
44
+ }
45
+ dateMasking(event) {
46
+ const input = event.target;
47
+ let cursorPos = event.target.selectionStart;
48
+ const separator = this._task.mgInputDateFormat.includes('/') ? '/' : '-';
49
+ if (cursorPos >= input.value.length) {
50
+ const value = input.value.replace(/[^a-zA-Z0-9/-]/g, '');
51
+ if (this._task.mgInputDateFormat == "dd/MM/yyyy" || this._task.mgInputDateFormat == "MM/dd/yyyy" || this._task.mgInputDateFormat == "dd-MM-yyyy" || this._task.mgInputDateFormat == "MM-dd-yyyy") {
52
+ if (value.length == 1 && value[0] == separator)
53
+ input.value = '01' + separator;
54
+ else if (value.length == 2 && value[1] == separator)
55
+ input.value = 0 + value;
56
+ else if (value.length == 3 && value[2] != separator)
57
+ input.value = value.slice(0, 2) + separator + value.slice(2);
58
+ else if (value.length == 4 && value[3] == separator)
59
+ input.value = value.slice(0, 3) + '01' + value.slice(3);
60
+ else if (value.length == 5 && value[4] == separator)
61
+ input.value = value.slice(0, 3) + '0' + value.slice(3);
62
+ else if (value.length == 6 && value[5] != separator)
63
+ input.value = value.slice(0, 5) + separator + value.slice(5);
64
+ else if (value.length >= 10)
65
+ input.value = value.slice(0, 10);
66
+ }
67
+ else if (this._task.mgInputDateFormat == "yyyy/MM/dd" || this._task.mgInputDateFormat == "yyyy/dd/MM" || this._task.mgInputDateFormat == "yyyy-MM-dd" || this._task.mgInputDateFormat == "yyyy-dd-MM") {
68
+ if (value.length == 1 && value[0] == separator)
69
+ input.value = '0000' + separator;
70
+ else if (value.length == 2 && value[1] == separator)
71
+ input.value = '000' + value.slice(0);
72
+ else if (value.length == 3 && value[2] == separator)
73
+ input.value = '00' + value.slice(0);
74
+ else if (value.length == 4 && value[3] == separator)
75
+ input.value = '0' + value.slice(0);
76
+ else if (value.length == 5 && value[4] != separator)
77
+ input.value = value.slice(0, 4) + separator + value.slice(4);
78
+ else if (value.length == 6 && value[5] == separator)
79
+ input.value = value.slice(0, 5) + '01' + value.slice(5);
80
+ else if (value.length == 7 && value[6] == separator)
81
+ input.value = value.slice(0, 5) + '0' + value.slice(5);
82
+ else if (value.length == 8 && value[7] != separator)
83
+ input.value = value.slice(0, 7) + separator + value.slice(7);
84
+ else if (value.length >= 10)
85
+ input.value = value.slice(0, 10);
86
+ }
87
+ else if (this._task.mgInputDateFormat == "dd/MM/yy" || this._task.mgInputDateFormat == "yy/MM/dd" || this._task.mgInputDateFormat == "MM/dd/yy" || this._task.mgInputDateFormat == "yy/dd/MM" || this._task.mgInputDateFormat == "dd-MM-yy" || this._task.mgInputDateFormat == "yy-MM-dd" || this._task.mgInputDateFormat == "MM-dd-yy" || this._task.mgInputDateFormat == "yy-dd-MM") {
88
+ if (value.length == 1 && value[0] == separator)
89
+ input.value = '01' + separator;
90
+ else if (value.length == 2 && value[1] == separator)
91
+ input.value = 0 + value;
92
+ else if (value.length == 3 && value[2] != separator)
93
+ input.value = value.slice(0, 2) + separator + value.slice(2);
94
+ else if (value.length == 4 && value[3] == separator)
95
+ input.value = value.slice(0, 3) + '01' + value.slice(3);
96
+ else if (value.length == 5 && value[4] == separator)
97
+ input.value = value.slice(0, 3) + '0' + value.slice(3);
98
+ else if (value.length == 6 && value[5] != separator)
99
+ input.value = value.slice(0, 5) + separator + value.slice(5);
100
+ else if (value.length >= 8)
101
+ input.value = value.slice(0, 8);
102
+ }
103
+ else if (this._task.mgInputDateFormat == "dd/MMM/yy" || this._task.mgInputDateFormat == "dd-MMM-yy") {
104
+ if (value.length == 1 && value[0] == separator)
105
+ input.value = '01' + separator;
106
+ else if (value.length == 2 && value[1] == separator)
107
+ input.value = 0 + value;
108
+ else if (value.length == 3 && value[2] != separator)
109
+ input.value = value.slice(0, 2) + separator + value.slice(2);
110
+ else if (value.length == 7 && value[6] != separator)
111
+ input.value = value.slice(0, 6) + separator + value.slice(6);
112
+ else if (value.length >= 9)
113
+ input.value = value.slice(0, 9);
114
+ }
115
+ else if (this._task.mgInputDateFormat == "dd/MMM/yyyy" || this._task.mgInputDateFormat == "dd-MMM-yyyy") {
116
+ if (value.length == 1 && value[0] == separator)
117
+ input.value = '01' + separator;
118
+ else if (value.length == 2 && value[1] == separator)
119
+ input.value = 0 + value;
120
+ else if (value.length == 3 && value[2] != separator)
121
+ input.value = value.slice(0, 2) + separator + value.slice(2);
122
+ else if (value.length == 7 && value[6] != separator)
123
+ input.value = value.slice(0, 6) + separator + value.slice(6);
124
+ else if (value.length >= 11)
125
+ input.value = value.slice(0, 11);
126
+ }
127
+ else if (this._task.mgInputDateFormat == "yy/dd/MMM" || this._task.mgInputDateFormat == "yy-dd-MMM") {
128
+ if (value.length == 1 && value[0] == separator)
129
+ input.value = '00' + separator;
130
+ else if (value.length == 2 && value[1] == separator)
131
+ input.value = 0 + value;
132
+ else if (value.length == 3 && value[2] != separator)
133
+ input.value = value.slice(0, 2) + separator + value.slice(2);
134
+ else if (value.length == 4 && value[3] == separator)
135
+ input.value = value.slice(0, 3) + '01' + value.slice(3);
136
+ else if (value.length == 5 && value[4] == separator)
137
+ input.value = value.slice(0, 3) + '0' + value.slice(3);
138
+ else if (value.length == 6 && value[5] != separator)
139
+ input.value = value.slice(0, 5) + separator + value.slice(5);
140
+ else if (value.length >= 9)
141
+ input.value = value.slice(0, 9);
142
+ }
143
+ else if (this._task.mgInputDateFormat == "yyyy/dd/MMM" || this._task.mgInputDateFormat == "yyyy-dd-MMM") {
144
+ if (value.length == 1 && value[0] == separator)
145
+ input.value = '0000' + separator;
146
+ else if (value.length == 2 && value[1] == separator)
147
+ input.value = '000' + value.slice(0);
148
+ else if (value.length == 3 && value[2] == separator)
149
+ input.value = '00' + value.slice(0);
150
+ else if (value.length == 4 && value[3] == separator)
151
+ input.value = '0' + value.slice(0);
152
+ else if (value.length == 5 && value[4] != separator)
153
+ input.value = value.slice(0, 4) + separator + value.slice(4);
154
+ else if (value.length == 6 && value[5] == separator)
155
+ input.value = value.slice(0, 5) + '01' + value.slice(5);
156
+ else if (value.length == 7 && value[6] == separator)
157
+ input.value = value.slice(0, 5) + '0' + value.slice(5);
158
+ else if (value.length == 8 && value[7] != separator)
159
+ input.value = value.slice(0, 7) + separator + value.slice(7);
160
+ else if (value.length >= 11)
161
+ input.value = value.slice(0, 11);
162
+ }
163
+ else if (this._task.mgInputDateFormat == "MMM/dd/yy" || this._task.mgInputDateFormat == "MMM-dd-yy") {
164
+ if (value.length == 4 && value[3] != separator)
165
+ input.value = value.slice(0, 3) + separator + value.slice(3);
166
+ else if (value.length == 5 && value[4] == separator)
167
+ input.value = value.slice(0, 4) + '01' + value.slice(4);
168
+ else if (value.length == 6 && value[5] == separator)
169
+ input.value = value.slice(0, 4) + '0' + value.slice(4);
170
+ else if (value.length == 7 && value[6] != separator)
171
+ input.value = value.slice(0, 6) + separator + value.slice(6);
172
+ else if (value.length >= 9)
173
+ input.value = value.slice(0, 9);
174
+ }
175
+ else if (this._task.mgInputDateFormat == "MMM/dd/yyyy" || this._task.mgInputDateFormat == "MMM-dd-yyyy") {
176
+ if (value.length == 4 && value[3] != separator)
177
+ input.value = value.slice(0, 3) + separator + value.slice(3);
178
+ else if (value.length == 5 && value[4] == separator)
179
+ input.value = value.slice(0, 4) + '01' + value.slice(4);
180
+ else if (value.length == 6 && value[5] == separator)
181
+ input.value = value.slice(0, 4) + '0' + value.slice(4);
182
+ else if (value.length == 7 && value[6] != separator)
183
+ input.value = value.slice(0, 6) + separator + value.slice(6);
184
+ else if (value.length >= 11)
185
+ input.value = value.slice(0, 11);
186
+ }
187
+ }
188
+ if (cursorPos < input.value.length && input.value.length > this._task.mgInputDateFormat.length) {
189
+ let inputDate = input.value;
190
+ let start = input.selectionStart - 1;
191
+ let end = input.selectionEnd - 1;
192
+ let indexToRemove = input.selectionStart - 1;
193
+ input.value = inputDate.slice(0, indexToRemove) + inputDate.slice(indexToRemove + 1);
194
+ input.setSelectionRange(start, end);
195
+ }
196
+ }
197
+ onChangeEvent(event) {
198
+ let control = this._task.getFormControl(this.magicDir.rowId, this.magicDir.id);
199
+ let attr = this._task.Records.list[0].getControlMetadata(this.magicDir.id).dataType;
200
+ switch (attr) {
201
+ case StorageAttribute.ALPHA:
202
+ case StorageAttribute.UNICODE:
203
+ this.formatAlphaUnicode(control);
204
+ break;
205
+ case StorageAttribute.BOOLEAN:
206
+ this.formatBoolean(control);
207
+ break;
208
+ }
209
+ }
210
+ onBlurEvent(event) {
211
+ let control = this._task.getFormControl(this.magicDir.rowId, this.magicDir.id);
212
+ let attr = this._task.Records.list[0].getControlMetadata(this.magicDir.id).dataType;
213
+ const century = Environment.Instance.GetCentury(LastFocusedManager.Instance.getCurrTask().getCompIdx());
214
+ if (attr == StorageAttribute.DATE)
215
+ this.formatDateWithCentury(event.target.value, century, control);
216
+ }
217
+ formatDateWithCentury(userInput, century, control) {
218
+ const dateFormat = this._task.mgInputDateFormat;
219
+ const separator = userInput.includes('/') ? '/' : "-";
220
+ let centuryVal = parseInt(century.toString().slice(0, 2));
221
+ if (userInput.length == 0)
222
+ return;
223
+ if ((dateFormat == 'dd/MMM/yyyy' || dateFormat == 'dd-MMM-yyyy')) {
224
+ const dateArray = userInput.split(separator);
225
+ const [day, month, year] = this.getDateSegments1(dateArray);
226
+ const isMonthInNumber = !isNaN(Number(month));
227
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
228
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
229
+ }
230
+ }
231
+ else if ((dateFormat == 'dd/MM/yyyy' || dateFormat == 'dd-MM-yyyy' || dateFormat == 'd/M/yyyy' || dateFormat == 'd-M-yyyy')) {
232
+ const dateArray = userInput.split(separator);
233
+ const [day, month, year] = this.getDateSegments1(dateArray);
234
+ if ((day < 32 && month < 13)) {
235
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
236
+ }
237
+ }
238
+ else if ((dateFormat == 'MM/dd/yyyy' || dateFormat == 'MM-dd-yyyy' || dateFormat == 'M/d/yyyy' || dateFormat == 'M-d-yyyy')) {
239
+ const dateArray = userInput.split(separator);
240
+ const [day, month, year] = this.getDateSegments2(dateArray);
241
+ if ((day < 32 && month < 13)) {
242
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
243
+ }
244
+ }
245
+ else if ((dateFormat == 'MMM/dd/yyyy' || dateFormat == 'MMM-dd-yyyy')) {
246
+ const dateArray = userInput.split(separator);
247
+ const [day, month, year] = this.getDateSegments2(dateArray);
248
+ const isMonthInNumber = !isNaN(Number(month));
249
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
250
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
251
+ }
252
+ }
253
+ else if ((dateFormat == 'yyyy/MM/dd' || dateFormat == 'yyyy-MM-dd')) {
254
+ const dateArray = userInput.split(separator);
255
+ const [day, month, year] = this.getDateSegments3(dateArray);
256
+ if ((day < 32 && month < 13)) {
257
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
258
+ }
259
+ }
260
+ else if ((dateFormat == 'yyyy/dd/MM' || dateFormat == 'yyyy-dd-MM')) {
261
+ const dateArray = userInput.split(separator);
262
+ const [day, month, year] = this.getDateSegments4(dateArray);
263
+ if ((day < 32 && month < 13)) {
264
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
265
+ }
266
+ }
267
+ else if ((dateFormat == 'yyyy/dd/MMM' || dateFormat == 'yyyy-dd-MMM')) {
268
+ const dateArray = userInput.split(separator);
269
+ const [day, month, year] = this.getDateSegments4(dateArray);
270
+ const isMonthInNumber = !isNaN(Number(month));
271
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
272
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
273
+ }
274
+ }
275
+ else if ((dateFormat == 'dd/MM/yy' || dateFormat == 'dd-MM-yy' || dateFormat == 'd/M/yy' || dateFormat == 'd-M-yy')) {
276
+ const dateArray = userInput.split(separator);
277
+ const [day, month, year] = this.getDateSegments1(dateArray);
278
+ if ((day < 32 && month < 13)) {
279
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
280
+ }
281
+ }
282
+ else if ((dateFormat == 'MM/dd/yy' || dateFormat == 'MM-dd-yy' || dateFormat == 'M/d/yy' || dateFormat == 'M-d-yy')) {
283
+ const dateArray = userInput.split(separator);
284
+ const [day, month, year] = this.getDateSegments2(dateArray);
285
+ if ((day < 32 && month < 13)) {
286
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
287
+ }
288
+ }
289
+ else if ((dateFormat == 'yy/MM/dd' || dateFormat == 'yy-MM-dd')) {
290
+ const dateArray = userInput.split(separator);
291
+ const [day, month, year] = this.getDateSegments3(dateArray);
292
+ if ((day < 32 && month < 13)) {
293
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
294
+ }
295
+ }
296
+ else if ((dateFormat == 'yy/dd/MM' || dateFormat == 'yy-dd-MM')) {
297
+ const dateArray = userInput.split(separator);
298
+ const [day, month, year] = this.getDateSegments4(dateArray);
299
+ if ((day < 32 && month < 13)) {
300
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
301
+ }
302
+ }
303
+ else if ((dateFormat == 'dd/MMM/yy' || dateFormat == 'dd-MMM-yy')) {
304
+ const dateArray = userInput.split(separator);
305
+ const [day, month, year] = this.getDateSegments1(dateArray);
306
+ const isMonthInNumber = !isNaN(Number(month));
307
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
308
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
309
+ }
310
+ }
311
+ else if ((dateFormat == 'yy/dd/MMM' || dateFormat == 'yy-dd-MMM')) {
312
+ const dateArray = userInput.split(separator);
313
+ const [day, month, year] = this.getDateSegments4(dateArray);
314
+ const isMonthInNumber = !isNaN(Number(month));
315
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
316
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
317
+ }
318
+ }
319
+ else if ((dateFormat == 'MMM/dd/yy' || dateFormat == 'MMM-dd-yy')) {
320
+ const dateArray = userInput.split(separator);
321
+ const [day, month, year] = this.getDateSegments2(dateArray);
322
+ const isMonthInNumber = !isNaN(Number(month));
323
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
324
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
325
+ }
326
+ }
327
+ else if ((dateFormat == 'yyyy/MMM/dd' || dateFormat == 'yyyy-MMM-dd' || dateFormat == 'yy/MMM/dd' || dateFormat == 'yy-MMM-dd')) {
328
+ const dateArray = userInput.split(separator);
329
+ const [day, month, year] = this.getDateSegments3(dateArray);
330
+ const isMonthInNumber = !isNaN(Number(month));
331
+ if ((isMonthInNumber && day < 32 && Number(month) < 13) || (!isMonthInNumber && day < 32)) {
332
+ this.updateYear(day, month, year, separator, century, centuryVal, control);
333
+ }
334
+ }
335
+ else if (dateFormat == 'yyyy/MM' || dateFormat == 'yyyy-MM') {
336
+ const dateArray = userInput.split(separator);
337
+ const month = dateArray[1];
338
+ const year = Number(dateArray[0]);
339
+ if (Number(month) < 13) {
340
+ this.updateYear(1, month, year, separator, century, centuryVal, control);
341
+ }
342
+ }
343
+ }
344
+ updateYear(day, month, year, separator, century, centuryVal, control) {
345
+ let updatedYear = year.toString().length === 2 ? (year < century % 100 ? centuryVal + 1 : centuryVal) + '' + year :
346
+ year.toString().length === 1 ? (year < century % 100 ? centuryVal + 1 : centuryVal) + '0' + year :
347
+ year;
348
+ control.setValue(new Date(`${updatedYear}${separator}${month}${separator}${day}`));
349
+ }
350
+ getDateSegments1(dateArray) {
351
+ const day = Number(dateArray[0]);
352
+ const month = dateArray[1];
353
+ const year = Number(dateArray[2]);
354
+ return [day, month, year];
355
+ }
356
+ getDateSegments2(dateArray) {
357
+ const day = Number(dateArray[1]);
358
+ const month = dateArray[0];
359
+ const year = Number(dateArray[2]);
360
+ return [day, month, year];
361
+ }
362
+ getDateSegments3(dateArray) {
363
+ const day = Number(dateArray[2]);
364
+ const month = dateArray[1];
365
+ const year = Number(dateArray[0]);
366
+ return [day, month, year];
367
+ }
368
+ getDateSegments4(dateArray) {
369
+ const day = Number(dateArray[1]);
370
+ const month = dateArray[2];
371
+ const year = Number(dateArray[0]);
372
+ return [day, month, year];
373
+ }
374
+ calculatePattern() {
375
+ let control = this._task.getFormControl(this.magicDir.rowId, this.magicDir.id);
376
+ if (control != null) {
377
+ let attr = this._task.Records.list[0].getControlMetadata(this.magicDir.id).dataType;
378
+ if (attr == StorageAttribute.NUMERIC || attr == StorageAttribute.ALPHA || attr == StorageAttribute.UNICODE) {
379
+ let pic = this._task.GetControlPictureMask(this.magicDir.id);
380
+ if (this.isPatternGenerationNeeded(attr, pic)) {
381
+ let pattern = this.generatePattern(attr, pic);
382
+ if (control.validator == null)
383
+ control.setValidators(Validators.pattern(pattern));
384
+ else
385
+ control.setValidators([control.validator, Validators.pattern(pattern)]);
386
+ }
387
+ else {
388
+ if (attr == StorageAttribute.ALPHA || attr == StorageAttribute.UNICODE) {
389
+ if (control.validator == null)
390
+ control.setValidators(Validators.maxLength(pic.getMaskLength()));
391
+ else {
392
+ if (pic.isFormatExp()) {
393
+ control.setValidators(Validators.maxLength(pic.getMaskLength()));
394
+ if (isUndefined(this.magicDir.rowId))
395
+ this.magicDir.rowId = '0';
396
+ control.setValidators([control.validator, this._task.customValidator(this.magicDir.rowId, this.magicDir.id)]);
397
+ }
398
+ else
399
+ control.setValidators([control.validator, Validators.maxLength(pic.getMaskLength())]);
400
+ }
401
+ control.updateValueAndValidity();
402
+ }
403
+ }
404
+ }
405
+ }
406
+ }
407
+ formatDate(pic) {
408
+ let mgDateFormatter = new MgDateFormatter();
409
+ this._task.mgInputDateFormat = mgDateFormatter.ConvertMgDateFormatToAngular(pic.getMask());
410
+ }
411
+ formatAlphaUnicode(control) {
412
+ let value = control.value;
413
+ if (value !== null && value.length > 0) {
414
+ const newValue = this._task.GetRangedValue(this.magicDir.id, value);
415
+ if (newValue != null)
416
+ value = newValue;
417
+ let pic = this._task.GetControlPictureMask(this.magicDir.id);
418
+ let mask = pic.getMask();
419
+ let valueStr = new StringBuilder();
420
+ for (let i = 0; i < value.length; i++) {
421
+ switch (mask.charCodeAt(i)) {
422
+ case PICInterface.PIC_U:
423
+ valueStr.Append(value.charAt(i).toUpperCase());
424
+ break;
425
+ case PICInterface.PIC_L:
426
+ valueStr.Append(value.charAt(i).toLowerCase());
427
+ break;
428
+ default:
429
+ valueStr.Append(value.charAt(i));
430
+ break;
431
+ }
432
+ }
433
+ control.setValue(valueStr.ToString());
434
+ }
435
+ }
436
+ formatBoolean(control) {
437
+ let value = control.value;
438
+ if (value !== null && value.length > 0) {
439
+ let newValue = this._task.GetRangedValue(this.magicDir.id, value);
440
+ if (newValue.toUpperCase().startsWith(value.toUpperCase())) {
441
+ control.setValue(newValue);
442
+ }
443
+ else {
444
+ control.setValue(value);
445
+ }
446
+ }
447
+ }
448
+ generatePattern(attribute, pic) {
449
+ let pattern = '';
450
+ switch (attribute) {
451
+ case StorageAttribute.NUMERIC:
452
+ pattern = this.generatePatternForNumber(pic);
453
+ break;
454
+ case StorageAttribute.ALPHA:
455
+ case StorageAttribute.UNICODE:
456
+ pattern = this.generatePatternForAlpha(pic);
457
+ break;
458
+ }
459
+ return pattern;
460
+ }
461
+ generatePatternForNumber(pic) {
462
+ let patternStr = new StringBuilder();
463
+ patternStr.Append('^');
464
+ if (pic.isNegative())
465
+ patternStr.Append('-?');
466
+ if (pic.getWholes())
467
+ patternStr.AppendFormat('\\d{{0},{1}}', 0, pic.getWholes());
468
+ if (pic.getDec())
469
+ patternStr.AppendFormat('(\\.\\d{1,{0}})?', pic.getDec());
470
+ patternStr.Append('$');
471
+ return patternStr.ToString();
472
+ }
473
+ isPatternGenerationNeeded(attr, pic) {
474
+ switch (attr) {
475
+ case StorageAttribute.NUMERIC:
476
+ return true;
477
+ case StorageAttribute.ALPHA:
478
+ case StorageAttribute.UNICODE:
479
+ return (pic.getMaskChars() > 0) ? true : false;
480
+ }
481
+ }
482
+ generatePatternForAlpha(pic) {
483
+ let cnt = 0;
484
+ let inputAllChars = false;
485
+ let closeSet = false;
486
+ let mask = pic.getMask();
487
+ let pattern = new StringBuilder();
488
+ pattern.Append('^');
489
+ for (let i = 0; i < mask.length;) {
490
+ if (inputAllChars && (mask.charCodeAt(i) == PICInterface.PIC_N || mask.charCodeAt(i) == PICInterface.PIC_U || mask.charCodeAt(i) == PICInterface.PIC_L
491
+ || mask.charCodeAt(i) == PICInterface.PIC_X)) {
492
+ pattern.Append('(');
493
+ closeSet = true;
494
+ inputAllChars = false;
495
+ }
496
+ cnt = 0;
497
+ switch (mask.charCodeAt(i)) {
498
+ case PICInterface.PIC_U:
499
+ case PICInterface.PIC_X:
500
+ case PICInterface.PIC_L:
501
+ {
502
+ pattern.Append('.');
503
+ let inputAllCharsRef = new RefParam(false);
504
+ let dirs = PICInterface.PIC_U.toString();
505
+ dirs += PICInterface.PIC_L.toString();
506
+ dirs += PICInterface.PIC_X.toString();
507
+ cnt = this.getDirectiveCount(mask, i, dirs, inputAllCharsRef);
508
+ inputAllChars = inputAllCharsRef.value;
509
+ i += cnt;
510
+ }
511
+ break;
512
+ case PICInterface.PIC_N:
513
+ {
514
+ pattern.Append('\\d');
515
+ let inputAllCharsRef = new RefParam(false);
516
+ cnt = this.getDirectiveCount(mask, i, PICInterface.PIC_L.toString(), inputAllCharsRef);
517
+ inputAllChars = inputAllCharsRef.value;
518
+ i += cnt;
519
+ }
520
+ break;
521
+ default:
522
+ pattern.Append(mask[i]);
523
+ i++;
524
+ break;
525
+ }
526
+ if (cnt > 0)
527
+ pattern.AppendFormat('{{0},{1}}', inputAllChars ? cnt : 0, cnt);
528
+ if (closeSet)
529
+ pattern.Append(')');
530
+ closeSet = false;
531
+ }
532
+ pattern.Append('$');
533
+ return pattern.ToString();
534
+ }
535
+ getDirectiveCount(mask, idx, pattern, changeInPattern) {
536
+ changeInPattern.value = false;
537
+ let patternCount = 0;
538
+ while (idx < mask.length && this.IsPatternMatches(mask.charCodeAt(idx).toString(), pattern)) {
539
+ patternCount++;
540
+ idx++;
541
+ }
542
+ if (idx < mask.length)
543
+ changeInPattern.value = true;
544
+ return patternCount;
545
+ }
546
+ IsPatternMatches(mask, pattern) {
547
+ for (let i = 0; i < pattern.length; i++)
548
+ if (mask == pattern[i])
549
+ return true;
550
+ return false;
551
+ }
552
+ static ɵfac = function MgformatMagicDirective_Factory(t) { return new (t || MgformatMagicDirective)(i0.ɵɵdirectiveInject(i1.MagicDirective), i0.ɵɵdirectiveInject(i2.TaskMagicService)); };
553
+ static ɵdir = i0.ɵɵdefineDirective({ type: MgformatMagicDirective, selectors: [["", "mgFormat", ""]], hostBindings: function MgformatMagicDirective_HostBindings(rf, ctx) { if (rf & 1) {
554
+ i0.ɵɵlistener("focus", function MgformatMagicDirective_focus_HostBindingHandler($event) { return ctx.onFocusEvent($event); })("paste", function MgformatMagicDirective_paste_HostBindingHandler($event) { return ctx.onPaste($event); })("input", function MgformatMagicDirective_input_HostBindingHandler($event) { return ctx.onInputEvent($event); })("change", function MgformatMagicDirective_change_HostBindingHandler($event) { return ctx.onChangeEvent($event); })("blur", function MgformatMagicDirective_blur_HostBindingHandler($event) { return ctx.onBlurEvent($event); });
555
+ } } });
556
+ }
557
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MgformatMagicDirective, [{
558
+ type: Directive,
559
+ args: [{
560
+ selector: '[mgFormat]'
561
+ }]
562
+ }], () => [{ type: i1.MagicDirective }, { type: i2.TaskMagicService }], { onFocusEvent: [{
563
+ type: HostListener,
564
+ args: ['focus', ['$event']]
565
+ }], onPaste: [{
566
+ type: HostListener,
567
+ args: ['paste', ['$event']]
568
+ }], onInputEvent: [{
569
+ type: HostListener,
570
+ args: ['input', ['$event']]
571
+ }], onChangeEvent: [{
572
+ type: HostListener,
573
+ args: ['change', ['$event']]
574
+ }], onBlurEvent: [{
575
+ type: HostListener,
576
+ args: ['blur', ['$event']]
577
+ }] }); })();
578
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWdmb3JtYXQubWFnaWMuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvdWkvZGlyZWN0aXZlcy9tZ2Zvcm1hdC5tYWdpYy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBa0IsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFTbEUsTUFBTSxPQUFPLHNCQUFzQjtJQVFyQjtJQUNBO0lBUFosYUFBYSxHQUFZLEtBQUssQ0FBQztJQUsvQixZQUNZLFFBQXdCLEVBQ3hCLEtBQXVCO1FBRHZCLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3hCLFVBQUssR0FBTCxLQUFLLENBQWtCO0lBRS9CLENBQUM7SUFFTCxlQUFlO1FBQ2IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUUsQ0FBQztR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QUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDakQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDckQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDcEQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDekQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUU7b0JBQ3hCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFckMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3hNLElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7b0JBQzNDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztxQkFDOUIsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEMsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDakMsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDaEMsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDMUQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDckQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDcEQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDMUQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUU7b0JBQ3hCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFckMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3ZYLElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7b0JBQzNDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQztxQkFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDakQsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO3FCQUNyQixJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFFLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN6RCxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNqRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyRCxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNwRCxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFFLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFD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O29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNoQyxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUMxRCxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyRCxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNwRCxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTO29CQUNoRCxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUMxRCxJQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRTtvQkFDeEIsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVyQyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBRyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxXQUFXLEVBQUcsQ0FBQztnQkFDdEcsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDM0MsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDMUQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDcEQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbkQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUztvQkFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDekQsSUFBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUM7b0JBQ3ZCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFcEMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksYUFBYSxFQUFHLENBQUM7Z0JBQzFHLElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7b0JBQzNDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzFELElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7b0JBQ2hELEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3BELElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7b0JBQ2hELEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ25ELElBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7b0JBQ2hELEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFD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VUFBVSxDQUFDLEVBQUMsQ0FBQztZQUMzSCxNQUFNLFNBQVMsR0FBYSxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxJQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBRUgsQ0FBQzthQUFLLElBQUcsQ0FBQyxVQUFVLElBQUksWUFBWSxJQUFJLFVBQVUsSUFBSSxZQUFZLElBQUksVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLEVBQUMsQ0FBQztZQUMzSCxNQUFNLFNBQVMsR0FBYSxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxJQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBRUgsQ0FBQzthQUFLLElBQUksQ0FBQyxVQUFVLElBQUksYUFBYSxJQUFJLFVBQVUsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sU0FBUyxHQUFhLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sZUFBZSxHQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxlQUFlLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBRUgsQ0FBQzthQUFLLElBQUcsQ0FBQyxVQUFVLElBQUksWUFBWSxJQUFJLFVBQVUsSUFBSSxZQUFZLENBQUMsRUFBQyxDQUFDO1lBQ25FLE1BQU0sU0FBUyxHQUFhLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVELElBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFFSCxDQUFDO2FBQUssSUFBRyxDQUFDLFVBQVUsSUFBSSxZQUFZLElBQUksVUFBVSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxTQUFTLEdBQWEsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUVILENBQUM7YUFBSyxJQUFHLENBQUMsVUFBVSxJQUFJLGFBQWEsSUFBSSxVQUFVLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN0RSxNQUFNLFNBQVMsR0FBYSxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxNQUFNLGVBQWUsR0FBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsZUFBZSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzFGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUVILENBQUM7YUFBSyxJQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksVUFBVSxJQUFJLFVBQVUsSUFBSSxRQUFRLElBQUksVUFBVSxJQUFJLFFBQVEsQ0FBQyxFQUFDLENBQUM7WUFDbkgsTUFBTSxTQUFTLEdBQWEsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUVILENBQUM7YUFBSyxJQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksVUFBVSxJQUFJLFVBQVUsSUFBSSxRQUFRLElBQUksVUFBVSxJQUFJLFFBQVEsQ0FBQyxFQUFDLENBQUM7WUFDbkgsTUFBTSxTQUFTLEdBQWEsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUVILENBQUM7YUFBSyxJQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLEVBQUMsQ0FBQztZQUMvRCxNQUFNLFNBQVMsR0FBYSxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxJQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBRUgsQ0FBQzthQUFLLElBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsRUFBQyxDQUFDO1lBQy9ELE1BQU0sU0FBUyxHQUFhLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVELElBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFFSCxDQUFDO2FBQUssSUFBRyxDQUFDLFVBQVUsSUFBSSxXQUFXLElBQUksVUFBVSxJQUFJLFdBQVcsQ0FBQyxFQUFDLENBQUM7WUFDakUsTUFBTSxTQUFTLEdBQWEsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsTUFBTSxlQUFlLEdBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMxRixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFFSCxDQUFDO2FBQUssSUFBRyxDQUFDLFVBQVUsSUFBSSxXQUFXLElBQUksVUFBVSxJQUFJLFdBQVcsQ0FBQyxFQUFDLENBQUM7WUFDakUsTUFBTSxTQUFTLEdBQWEsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsTUFBTSxlQUFlLEdBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMxRixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFFSCxDQUFDO2FBQUss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UUFFL0IsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUtELGdCQUFnQixDQUFDLElBQVksRUFBRSxPQUFlO1FBRTVDLEtBQUssSUFBSSxDQUFDLEdBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUM1QyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQztRQUNoQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Z0ZBcnFCVSxzQkFBc0I7K0NBQXRCLHNCQUFzQjtZQUF0QixpR0FBQSx3QkFBb0IsSUFBRSxvRkFBdEIsbUJBQWUsSUFBTyxvRkFBdEIsd0JBQW9CLElBQUUsc0ZBQXRCLHlCQUFxQixJQUFDLGtGQUF0Qix1QkFBbUIsSUFBRzs7O2lGQUF0QixzQkFBc0I7Y0FMbEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxZQUFZO2FBQ3ZCOzhFQXFDUSxZQUFZO2tCQURsQixZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztZQU1qQyxPQUFPO2tCQUROLFlBQVk7bUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBWTFCLFlBQVk7a0JBRGxCLFlBQVk7bUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBbUwxQixhQUFhO2tCQURuQixZQUFZO21CQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQW9CM0IsV0FBVztrQkFEakIsWUFBWTttQkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSG9zdExpc3RlbmVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUYXNrTWFnaWNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXNrLm1hZ2ljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHtTdHJpbmdCdWlsZGVyLCBSZWZQYXJhbX0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1BJQ0ludGVyZmFjZSwgU3RvcmFnZUF0dHJpYnV0ZX0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7TWFnaWNEaXJlY3RpdmV9IGZyb20gJy4vbWFnaWMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtQSUN9IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHtNZ0RhdGVGb3JtYXR0ZXJ9IGZyb20gJy4uL3BpcGVzL2RhdGUubWFnaWMucGlwZSc7XHJcbmltcG9ydCB7aXNVbmRlZmluZWR9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudCwgTGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tIFwiQG1hZ2ljLXhwYS9lbmdpbmVcIjtcclxuLyoqXHJcbiAqIFBlcmZvcm0gTWFnaWMgdmFsaWRhdGlvbiBvbiBpbnB1dCBjb250cm9scyB3aGljaCBob2xkIGFscGhhbnVtZXJpYyBzdHJpbmdzXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1ttZ0Zvcm1hdF0nXHJcbn0pXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE1nZm9ybWF0TWFnaWNEaXJlY3RpdmUge1xyXG5cclxuICBkYXRlUGFzdGVGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBtYWdpY0RpcjogTWFnaWNEaXJlY3RpdmUgLFxyXG4gICAgcHJvdGVjdGVkIF90YXNrOiBUYXNrTWFnaWNTZXJ2aWNlXHJcblxyXG4gICkgeyB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGxldCBjb250cm9sID0gdGhpcy5fdGFzay5nZXRGb3JtQ29udHJvbCh0aGlzLm1hZ2ljRGlyLnJvd0lkLCB0aGlzLm1hZ2ljRGlyLmlkICk7XHJcblxyXG4gICAgaWYoY29udHJvbCAhPSBudWxsICYmIHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gbnVsbCkge1xyXG4gICAgICAvLyBnZXQgdGhlIGZpcnN0IGRhdGUgY29udHJvbCdzIGZvcm1hdC5cclxuICAgICAgbGV0IHBpYzogUElDID0gdGhpcy5fdGFzay5HZXRDb250cm9sUGljdHVyZU1hc2sodGhpcy5tYWdpY0Rpci5pZCk7XHJcbiAgICAgIGlmIChwaWMuZ2V0QXR0cigpID09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSApIHtcclxuICAgICAgICB0aGlzLmZvcm1hdERhdGUocGljKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICAvKipcclxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNldCBwYXR0ZXJuXHJcbiAgICogT24gaW5wdXQsIHZlcmlmaWVzIHRoZSBpbnB1dCBtYXRjaGVzIHRoZSByZXF1aXJlZCBtYXNrXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBvbkZvY3VzRXZlbnQoJGV2ZW50KXtcclxuICAgIHRoaXMuY2FsY3VsYXRlUGF0dGVybigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigncGFzdGUnLCBbJyRldmVudCddKVxyXG4gIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZmxhZyBpcyBuZWVkZWQgdG8gc2tpcCBleGVjdXRpb24gb2YgZGF0ZU1hc2tpbmcoKSBtZXRob2Qgd2hlbiB1c2VyIHBhc3RlIGRhdGUgaW4gaW5wdXQgY29udHJvbC5cclxuICAgICAqIFRoaXMgaXMgb25seSBuZWVkZWQgd2hlbiBcIlN0b3JhZ2VBdHRyaWJ1dGVcIiBpcyBEQVRFLiBCdXQgdG8gY2hlY2sgdHlwZSBvZiBcIlN0b3JhZ2VBdHRyaWJ1dGVcIiwgd2VcclxuICAgICBuZWVkIHRvIGV4ZWN1dGUgZ2V0Q29udHJvbE1ldGFkYXRhKCkgbWV0aG9kLiBTbywgdG8gcmVkdWNlIHRoaXMgZXhlY3V0aW9uIG92ZXJsb2FkIHdlIHNldFxyXG4gICAgIFwiZGF0ZVBhc3RlRmxhZ1wiIGRpcmVjdGx5LlxyXG4gICAgICovXHJcbiAgICB0aGlzLmRhdGVQYXN0ZUZsYWcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBvbklucHV0RXZlbnQoZXZlbnQpe1xyXG4gICAgbGV0IGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl90YXNrLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEodGhpcy5tYWdpY0Rpci5pZCkuZGF0YVR5cGU7XHJcbiAgICBpZiAoYXR0ciA9PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpe1xyXG4gICAgICBpZighdGhpcy5kYXRlUGFzdGVGbGFnKVxyXG4gICAgICAgIHRoaXMuZGF0ZU1hc2tpbmcoZXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy5kYXRlUGFzdGVGbGFnID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhbGN1bGF0ZVBhdHRlcm4oKTtcclxuICB9XHJcblxyXG5cclxuICAvL1RoaXMgbWV0aG9kIGluc2VydHMgJy8nIGFzIGEgc2VwYXJhdG9yIHdoaWxlIGVudGVyaW5nIGRhdGUgaW4gdGhlIHRleHRib3guXHJcbiAgLy9FeGFtcGxlOiAxMC8xMC8yMDIzXHJcbiAgZGF0ZU1hc2tpbmcoZXZlbnQpe1xyXG5cclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgbGV0IGN1cnNvclBvcyA9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IHNlcGFyYXRvciA9IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQuaW5jbHVkZXMoJy8nKT8gJy8nOictJztcclxuXHJcbiAgICBpZihjdXJzb3JQb3MgPj0gaW5wdXQudmFsdWUubGVuZ3RoKSB7XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlLnJlcGxhY2UoL1teYS16QS1aMC05Ly1dL2csICcnKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiZGQvTU0veXl5eVwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJNTS9kZC95eXl5XCIgfHx0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiZGQtTU0teXl5eVwiIHx8dGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdCA9PSBcIk1NLWRkLXl5eXlcIikge1xyXG4gICAgICAgIGlmKHZhbHVlLmxlbmd0aCA9PSAxICYmIHZhbHVlWzBdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gJzAxJyArIHNlcGFyYXRvcjtcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT0gMiAmJiB2YWx1ZVsxXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IDAgKyB2YWx1ZTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSAzICYmIHZhbHVlWzJdICE9IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgMikgKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSgyKTtcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT0gNCAmJiB2YWx1ZVszXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDMpICsgJzAxJyArIHZhbHVlLnNsaWNlKDMpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDUgJiYgdmFsdWVbNF0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAzKSArICcwJyArIHZhbHVlLnNsaWNlKDMpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDYgJiYgdmFsdWVbNV0gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA1KSsgc2VwYXJhdG9yICsgdmFsdWUuc2xpY2UoNSk7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPj0gMTApXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDEwKTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdCA9PSBcInl5eXkvTU0vZGRcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwieXl5eS9kZC9NTVwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJ5eXl5LU1NLWRkXCIgfHwgdGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdCA9PSBcInl5eXktZGQtTU1cIikge1xyXG4gICAgICAgIGlmKHZhbHVlLmxlbmd0aCA9PSAxICYmIHZhbHVlWzBdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gJzAwMDAnICsgc2VwYXJhdG9yO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDIgJiYgdmFsdWVbMV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnMDAwJyArIHZhbHVlLnNsaWNlKDApO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDMgJiYgdmFsdWVbMl0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnMDAnICsgdmFsdWUuc2xpY2UoMCk7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gNCAmJiB2YWx1ZVszXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcwJyArIHZhbHVlLnNsaWNlKDApO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDUgJiYgdmFsdWVbNF0gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA0KSArIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDQpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDYgJiYgdmFsdWVbNV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA1KSArICcwMScgKyB2YWx1ZS5zbGljZSg1KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA3ICYmIHZhbHVlWzZdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNSkgKyAnMCcgKyB2YWx1ZS5zbGljZSg1KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA4ICYmIHZhbHVlWzddICE9IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNykgKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSg3KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA+PSAxMClcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgMTApO1xyXG5cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiZGQvTU0veXlcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwieXkvTU0vZGRcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiTU0vZGQveXlcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwieXkvZGQvTU1cIiB8fHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJkZC1NTS15eVwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJ5eS1NTS1kZFwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJNTS1kZC15eVwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJ5eS1kZC1NTVwiKSB7XHJcbiAgICAgICAgaWYodmFsdWUubGVuZ3RoID09IDEgJiYgdmFsdWVbMF0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnMDEnICsgc2VwYXJhdG9yO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PSAyICYmIHZhbHVlWzFdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gMCArIHZhbHVlO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDMgJiYgdmFsdWVbMl0gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAyKSsgc2VwYXJhdG9yICsgdmFsdWUuc2xpY2UoMik7XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID09IDQgJiYgdmFsdWVbM10gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAzKSArICcwMScgKyB2YWx1ZS5zbGljZSgzKTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA1ICYmIHZhbHVlWzRdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgMykgKyAnMCcgKyB2YWx1ZS5zbGljZSgzKTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA2ICYmIHZhbHVlWzVdICE9IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNSkrIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDUpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID49IDgpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDgpO1xyXG5cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09XCJkZC9NTU0veXlcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiZGQtTU1NLXl5XCIgKSB7XHJcbiAgICAgICAgaWYodmFsdWUubGVuZ3RoID09IDEgJiYgdmFsdWVbMF0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnMDEnICsgc2VwYXJhdG9yO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PSAyICYmIHZhbHVlWzFdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gMCArIHZhbHVlO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDMgJiYgdmFsdWVbMl0gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAyKSsgc2VwYXJhdG9yICsgdmFsdWUuc2xpY2UoMik7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gNyAmJiB2YWx1ZVs2XSAhPSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDYpKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSg2KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA+PSA5KVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA5KTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdCA9PVwiZGQvTU1NL3l5eXlcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiZGQtTU1NLXl5eXlcIiApIHtcclxuICAgICAgICBpZih2YWx1ZS5sZW5ndGggPT0gMSAmJiB2YWx1ZVswXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcwMScgKyBzZXBhcmF0b3I7XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID09IDIgJiYgdmFsdWVbMV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAwICsgdmFsdWU7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gMyAmJiB2YWx1ZVsyXSAhPSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDIpKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSgyKTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA3ICYmIHZhbHVlWzZdICE9IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNikrIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDYpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID49IDExKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAxMSk7XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT1cInl5L2RkL01NTVwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJ5eS1kZC1NTU1cIiApIHtcclxuICAgICAgICBpZih2YWx1ZS5sZW5ndGggPT0gMSAmJiB2YWx1ZVswXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcwMCcgKyBzZXBhcmF0b3I7XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID09IDIgJiYgdmFsdWVbMV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAwICsgdmFsdWU7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gMyAmJiB2YWx1ZVsyXSAhPSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDIpKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSgyKTtcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT0gNCAmJiB2YWx1ZVszXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDMpICsgJzAxJyArIHZhbHVlLnNsaWNlKDMpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDUgJiYgdmFsdWVbNF0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAzKSArICcwJyArIHZhbHVlLnNsaWNlKDMpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDYgJiYgdmFsdWVbNV0gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA1KSArIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDUpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID49IDkpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDkpO1xyXG5cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09XCJ5eXl5L2RkL01NTVwiIHx8IHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPT0gXCJ5eXl5LWRkLU1NTVwiICkge1xyXG4gICAgICAgIGlmKHZhbHVlLmxlbmd0aCA9PSAxICYmIHZhbHVlWzBdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gJzAwMDAnICsgc2VwYXJhdG9yO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDIgJiYgdmFsdWVbMV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnMDAwJyArIHZhbHVlLnNsaWNlKDApO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDMgJiYgdmFsdWVbMl0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSAnMDAnICsgdmFsdWUuc2xpY2UoMCk7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gNCAmJiB2YWx1ZVszXSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcwJyArIHZhbHVlLnNsaWNlKDApO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDUgJiYgdmFsdWVbNF0gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA0KSArIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDQpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDYgJiYgdmFsdWVbNV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA1KSArICcwMScgKyB2YWx1ZS5zbGljZSg1KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA3ICYmIHZhbHVlWzZdID09IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNSkgKyAnMCcgKyB2YWx1ZS5zbGljZSg1KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA4ICYmIHZhbHVlWzddICE9IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNykgKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSg3KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA+PSAxMSlcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgMTEpO1xyXG5cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09XCJNTU0vZGQveXlcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiTU1NLWRkLXl5XCIgKSB7XHJcbiAgICAgICAgaWYodmFsdWUubGVuZ3RoID09IDQgJiYgdmFsdWVbM10gIT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAzKSArIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDMpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDUgJiYgdmFsdWVbNF0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA0KSsgJzAxJyArIHZhbHVlLnNsaWNlKDQpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID09IDYgJiYgdmFsdWVbNV0gPT0gc2VwYXJhdG9yKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA0KSsgJzAnICsgdmFsdWUuc2xpY2UoNCk7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gNyAmJiB2YWx1ZVs2XSAhPSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDYpKyBzZXBhcmF0b3IgKyB2YWx1ZS5zbGljZSg2KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA+PSA5KVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA5KTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdCA9PVwiTU1NL2RkL3l5eXlcIiB8fCB0aGlzLl90YXNrLm1nSW5wdXREYXRlRm9ybWF0ID09IFwiTU1NLWRkLXl5eXlcIiApIHtcclxuICAgICAgICBpZih2YWx1ZS5sZW5ndGggPT0gNCAmJiB2YWx1ZVszXSAhPSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDMpICsgc2VwYXJhdG9yICsgdmFsdWUuc2xpY2UoMyk7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gNSAmJiB2YWx1ZVs0XSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDQpKyAnMDEnICsgdmFsdWUuc2xpY2UoNCk7XHJcbiAgICAgICAgZWxzZSBpZih2YWx1ZS5sZW5ndGggPT0gNiAmJiB2YWx1ZVs1XSA9PSBzZXBhcmF0b3IpXHJcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDQpKyAnMCcgKyB2YWx1ZS5zbGljZSg0KTtcclxuICAgICAgICBlbHNlIGlmKHZhbHVlLmxlbmd0aCA9PSA3ICYmIHZhbHVlWzZdICE9IHNlcGFyYXRvcilcclxuICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgNikrIHNlcGFyYXRvciArIHZhbHVlLnNsaWNlKDYpO1xyXG4gICAgICAgIGVsc2UgaWYodmFsdWUubGVuZ3RoID49IDExKVxyXG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAxMSk7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihjdXJzb3JQb3MgPCBpbnB1dC52YWx1ZS5sZW5ndGggJiYgaW5wdXQudmFsdWUubGVuZ3RoID4gdGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdC5sZW5ndGgpe1xyXG4gICAgICBsZXQgaW5wdXREYXRlID0gaW5wdXQudmFsdWU7XHJcbiAgICAgIGxldCBzdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0LTE7XHJcbiAgICAgIGxldCBlbmQgPSBpbnB1dC5zZWxlY3Rpb25FbmQtMTtcclxuICAgICAgbGV0IGluZGV4VG9SZW1vdmUgPSBpbnB1dC5zZWxlY3Rpb25TdGFydC0xO1xyXG5cclxuICAgICAgaW5wdXQudmFsdWUgPSBpbnB1dERhdGUuc2xpY2UoMCxpbmRleFRvUmVtb3ZlKSArIGlucHV0RGF0ZS5zbGljZShpbmRleFRvUmVtb3ZlICsgMSk7XHJcbiAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIC8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHVwcGVyY2FzZS9sb3dlciBjYXNlXHJcbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcclxuICBwdWJsaWMgb25DaGFuZ2VFdmVudChldmVudCl7XHJcbiAgICBsZXQgY29udHJvbCA9IHRoaXMuX3Rhc2suZ2V0Rm9ybUNvbnRyb2wodGhpcy5tYWdpY0Rpci5yb3dJZCwgdGhpcy5tYWdpY0Rpci5pZCApO1xyXG4gICAgbGV0IGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl90YXNrLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEodGhpcy5tYWdpY0Rpci5pZCkuZGF0YVR5cGU7XHJcblxyXG4gICAgc3dpdGNoICAoYXR0cilcclxuICAgIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICB0aGlzLmZvcm1hdEFscGhhVW5pY29kZSAoY29udHJvbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHRoaXMuZm9ybWF0Qm9vbGVhbihjb250cm9sKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIG9uQmx1ckV2ZW50KGV2ZW50KSB7XHJcbiAgICBsZXQgY29udHJvbCA9IHRoaXMuX3Rhc2suZ2V0Rm9ybUNvbnRyb2wodGhpcy5tYWdpY0Rpci5yb3dJZCwgdGhpcy5tYWdpY0Rpci5pZCApO1xyXG4gICAgbGV0IGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl90YXNrLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEodGhpcy5tYWdpY0Rpci5pZCkuZGF0YVR5cGU7XHJcbiAgICBjb25zdCBjZW50dXJ5ID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0Q2VudHVyeShMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0Q3VyclRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGlmKGF0dHIgPT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKVxyXG4gICAgICB0aGlzLmZvcm1hdERhdGVXaXRoQ2VudHVyeShldmVudC50YXJnZXQudmFsdWUsIGNlbnR1cnksIGNvbnRyb2wpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKiBGb3JtYXQgeWVhciwgaWYgdXNlciBlbnRlcnMgMiBkaWdpdHMgaW5zdGVhZCBvZiA0IGRpZ2l0cyBhcyBwZXIgdGhlIGNlbnR1cnkgZ2l2ZW4gaW4gTWFnaWMuaW5pIGZpbGUgKi9cclxuICBmb3JtYXREYXRlV2l0aENlbnR1cnkodXNlcklucHV0OiBzdHJpbmcsIGNlbnR1cnk6IG51bWJlciwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICBjb25zdCBkYXRlRm9ybWF0ID0gdGhpcy5fdGFzay5tZ0lucHV0RGF0ZUZvcm1hdDtcclxuICAgIGNvbnN0IHNlcGFyYXRvciA9IHVzZXJJbnB1dC5pbmNsdWRlcygnLycpID8gJy8nIDogXCItXCI7XHJcbiAgICBsZXQgY2VudHVyeVZhbCA9IHBhcnNlSW50KGNlbnR1cnkudG9TdHJpbmcoKS5zbGljZSgwLCAyKSk7XHJcbiAgICBpZih1c2VySW5wdXQubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiA7XHJcblxyXG4gICAgaWYgKChkYXRlRm9ybWF0ID09ICdkZC9NTU0veXl5eScgfHwgZGF0ZUZvcm1hdCA9PSAnZGQtTU1NLXl5eXknKSkge1xyXG4gICAgICBjb25zdCBkYXRlQXJyYXk6IHN0cmluZ1tdID0gdXNlcklucHV0LnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHRoaXMuZ2V0RGF0ZVNlZ21lbnRzMShkYXRlQXJyYXkpO1xyXG4gICAgICBjb25zdCBpc01vbnRoSW5OdW1iZXI6IGJvb2xlYW4gPSAhaXNOYU4oTnVtYmVyKG1vbnRoKSk7XHJcbiAgICAgIGlmICgoaXNNb250aEluTnVtYmVyICYmIGRheSA8IDMyICYmIE51bWJlcihtb250aCkgPCAxMykgfHwgKCFpc01vbnRoSW5OdW1iZXIgJiYgZGF5IDwgMzIpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyKGRheSwgbW9udGgsIHllYXIsIHNlcGFyYXRvciwgY2VudHVyeSwgY2VudHVyeVZhbCwgY29udHJvbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9ZWxzZSBpZigoZGF0ZUZvcm1hdCA9PSAnZGQvTU0veXl5eScgfHwgZGF0ZUZvcm1hdCA9PSAnZGQtTU0teXl5eScgfHwgZGF0ZUZvcm1hdCA9PSAnZC9NL3l5eXknIHx8IGRhdGVGb3JtYXQgPT0gJ2QtTS15eXl5Jykpe1xyXG4gICAgICBjb25zdCBkYXRlQXJyYXk6IHN0cmluZ1tdID0gdXNlcklucHV0LnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHRoaXMuZ2V0RGF0ZVNlZ21lbnRzMShkYXRlQXJyYXkpO1xyXG4gICAgICBpZigoZGF5IDwgMzIgJiYgbW9udGggPCAxMykpe1xyXG4gICAgICAgIHRoaXMudXBkYXRlWWVhcihkYXksIG1vbnRoLCB5ZWFyLCBzZXBhcmF0b3IsIGNlbnR1cnksIGNlbnR1cnlWYWwsIGNvbnRyb2wpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2UgaWYoKGRhdGVGb3JtYXQgPT0gJ01NL2RkL3l5eXknIHx8IGRhdGVGb3JtYXQgPT0gJ01NLWRkLXl5eXknIHx8IGRhdGVGb3JtYXQgPT0gJ00vZC95eXl5JyB8fCBkYXRlRm9ybWF0ID09ICdNLWQteXl5eScpKXtcclxuICAgICAgY29uc3QgZGF0ZUFycmF5OiBzdHJpbmdbXSA9IHVzZXJJbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xyXG4gICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSB0aGlzLmdldERhdGVTZWdtZW50czIoZGF0ZUFycmF5KTtcclxuICAgICAgaWYoKGRheSA8IDMyICYmIG1vbnRoIDwgMTMpKXtcclxuICAgICAgICB0aGlzLnVwZGF0ZVllYXIoZGF5LCBtb250aCwgeWVhciwgc2VwYXJhdG9yLCBjZW50dXJ5LCBjZW50dXJ5VmFsLCBjb250cm9sKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1lbHNlIGlmICgoZGF0ZUZvcm1hdCA9PSAnTU1NL2RkL3l5eXknIHx8IGRhdGVGb3JtYXQgPT0gJ01NTS1kZC15eXl5JykpIHtcclxuICAgICAgY29uc3QgZGF0ZUFycmF5OiBzdHJpbmdbXSA9IHVzZXJJbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xyXG4gICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSB0aGlzLmdldERhdGVTZWdtZW50czIoZGF0ZUFycmF5KTtcclxuICAgICAgY29uc3QgaXNNb250aEluTnVtYmVyOiBib29sZWFuID0gIWlzTmFOKE51bWJlcihtb250aCkpO1xyXG4gICAgICBpZiAoKGlzTW9udGhJbk51bWJlciAmJiBkYXkgPCAzMiAmJiBOdW1iZXIobW9udGgpIDwgMTMpIHx8ICghaXNNb250aEluTnVtYmVyICYmIGRheSA8IDMyKSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlWWVhcihkYXksIG1vbnRoLCB5ZWFyLCBzZXBhcmF0b3IsIGNlbnR1cnksIGNlbnR1cnlWYWwsIGNvbnRyb2wpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2UgaWYoKGRhdGVGb3JtYXQgPT0gJ3l5eXkvTU0vZGQnIHx8IGRhdGVGb3JtYXQgPT0gJ3l5eXktTU0tZGQnKSl7XHJcbiAgICAgIGNvbnN0IGRhdGVBcnJheTogc3RyaW5nW10gPSB1c2VySW5wdXQuc3BsaXQoc2VwYXJhdG9yKTtcclxuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gdGhpcy5nZXREYXRlU2VnbWVudHMzKGRhdGVBcnJheSk7XHJcbiAgICAgIGlmKChkYXkgPCAzMiAmJiBtb250aCA8IDEzKSl7XHJcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyKGRheSwgbW9udGgsIHllYXIsIHNlcGFyYXRvciwgY2VudHVyeSwgY2VudHVyeVZhbCwgY29udHJvbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9ZWxzZSBpZigoZGF0ZUZvcm1hdCA9PSAneXl5eS9kZC9NTScgfHwgZGF0ZUZvcm1hdCA9PSAneXl5eS1kZC1NTScpKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVBcnJheTogc3RyaW5nW10gPSB1c2VySW5wdXQuc3BsaXQoc2VwYXJhdG9yKTtcclxuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gdGhpcy5nZXREYXRlU2VnbWVudHM0KGRhdGVBcnJheSk7XHJcbiAgICAgIGlmICgoZGF5IDwgMzIgJiYgbW9udGggPCAxMykpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVllYXIoZGF5LCBtb250aCwgeWVhciwgc2VwYXJhdG9yLCBjZW50dXJ5LCBjZW50dXJ5VmFsLCBjb250cm9sKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1lbHNlIGlmKChkYXRlRm9ybWF0ID09ICd5eXl5L2RkL01NTScgfHwgZGF0ZUZvcm1hdCA9PSAneXl5eS1kZC1NTU0nKSkge1xyXG4gICAgICBjb25zdCBkYXRlQXJyYXk6IHN0cmluZ1tdID0gdXNlcklucHV0LnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHRoaXMuZ2V0RGF0ZVNlZ21lbnRzNChkYXRlQXJyYXkpO1xyXG4gICAgICBjb25zdCBpc01vbnRoSW5OdW1iZXI6IGJvb2xlYW4gPSAhaXNOYU4oTnVtYmVyKG1vbnRoKSk7XHJcbiAgICAgIGlmICgoaXNNb250aEluTnVtYmVyICYmIGRheSA8IDMyICYmIE51bWJlcihtb250aCkgPCAxMykgfHwgKCFpc01vbnRoSW5OdW1iZXIgJiYgZGF5IDwgMzIpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyKGRheSwgbW9udGgsIHllYXIsIHNlcGFyYXRvciwgY2VudHVyeSwgY2VudHVyeVZhbCwgY29udHJvbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9ZWxzZSBpZigoZGF0ZUZvcm1hdCA9PSAnZGQvTU0veXknIHx8IGRhdGVGb3JtYXQgPT0gJ2RkLU1NLXl5JyB8fCBkYXRlRm9ybWF0ID09ICdkL00veXknIHx8IGRhdGVGb3JtYXQgPT0gJ2QtTS15eScpKXtcclxuICAgICAgY29uc3QgZGF0ZUFycmF5OiBzdHJpbmdbXSA9IHVzZXJJbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xyXG4gICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSB0aGlzLmdldERhdGVTZWdtZW50czEoZGF0ZUFycmF5KTtcclxuICAgICAgaWYoKGRheSA8IDMyICYmIG1vbnRoIDwgMTMpKXtcclxuICAgICAgICB0aGlzLnVwZGF0ZVllYXIoZGF5LCBtb250aCwgeWVhciwgc2VwYXJhdG9yLCBjZW50dXJ5LCBjZW50dXJ5VmFsLCBjb250cm9sKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1lbHNlIGlmKChkYXRlRm9ybWF0ID09ICdNTS9kZC95eScgfHwgZGF0ZUZvcm1hdCA9PSAnTU0tZGQteXknIHx8IGRhdGVGb3JtYXQgPT0gJ00vZC95eScgfHwgZGF0ZUZvcm1hdCA9PSAnTS1kLXl5Jykpe1xyXG4gICAgICBjb25zdCBkYXRlQXJyYXk6IHN0cmluZ1tdID0gdXNlcklucHV0LnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHRoaXMuZ2V0RGF0ZVNlZ21lbnRzMihkYXRlQXJyYXkpO1xyXG4gICAgICBpZigoZGF5IDwgMzIgJiYgbW9udGggPCAxMykpe1xyXG4gICAgICAgIHRoaXMudXBkYXRlWWVhcihkYXksIG1vbnRoLCB5ZWFyLCBzZXBhcmF0b3IsIGNlbnR1cnksIGNlbnR1cnlWYWwsIGNvbnRyb2wpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2UgaWYoKGRhdGVGb3JtYXQgPT0gJ3l5L01NL2RkJyB8fCBkYXRlRm9ybWF0ID09ICd5eS1NTS1kZCcpKXtcclxuICAgICAgY29uc3QgZGF0ZUFycmF5OiBzdHJpbmdbXSA9IHVzZXJJbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xyXG4gICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSB0aGlzLmdldERhdGVTZWdtZW50czMoZGF0ZUFycmF5KTtcclxuICAgICAgaWYoKGRheSA8IDMyICYmIG1vbnRoIDwgMTMpKXtcclxuICAgICAgICB0aGlzLnVwZGF0ZVllYXIoZGF5LCBtb250aCwgeWVhciwgc2VwYXJhdG9yLCBjZW50dXJ5LCBjZW50dXJ5VmFsLCBjb250cm9sKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1lbHNlIGlmKChkYXRlRm9ybWF0ID09ICd5eS9kZC9NTScgfHwgZGF0ZUZvcm1hdCA9PSAneXktZGQtTU0nKSl7XHJcbiAgICAgIGNvbnN0IGRhdGVBcnJheTogc3RyaW5nW10gPSB1c2VySW5wdXQuc3BsaXQoc2VwYXJhdG9yKTtcclxuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gdGhpcy5nZXREYXRlU2VnbWVudHM0KGRhdGVBcnJheSk7XHJcbiAgICAgIGlmKChkYXkgPCAzMiAmJiBtb250aCA8IDEzKSl7XHJcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyKGRheSwgbW9udGgsIHllYXIsIHNlcGFyYXRvciwgY2VudHVyeSwgY2VudHVyeVZhbCwgY29udHJvbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9ZWxzZSBpZigoZGF0ZUZvcm1hdCA9PSAnZGQvTU1NL3l5JyB8fCBkYXRlRm9ybWF0ID09ICdkZC1NTU0teXknKSl7XHJcbiAgICAgIGNvbnN0IGRhdGVBcnJheTogc3RyaW5nW10gPSB1c2VySW5wdXQuc3BsaXQoc2VwYXJhdG9yKTtcclxuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gdGhpcy5nZXREYXRlU2VnbWVudHMxKGRhdGVBcnJheSk7XHJcbiAgICAgIGNvbnN0IGlzTW9udGhJbk51bWJlcjogYm9vbGVhbiA9ICFpc05hTihOdW1iZXIobW9udGgpKTtcclxuICAgICAgaWYgKChpc01vbnRoSW5OdW1iZXIgJiYgZGF5IDwgMzIgJiYgTnVtYmVyKG1vbnRoKSA8IDEzKSB8fCAoIWlzTW9udGhJbk51bWJlciAmJiBkYXkgPCAzMikpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVllYXIoZGF5LCBtb250aCwgeWVhciwgc2VwYXJhdG9yLCBjZW50dXJ5LCBjZW50dXJ5VmFsLCBjb250cm9sKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1lbHNlIGlmKChkYXRlRm9ybWF0ID09ICd5eS9kZC9NTU0nIHx8IGRhdGVGb3JtYXQgPT0gJ3l5LWRkLU1NTScpKXtcclxuICAgICAgY29uc3QgZGF0ZUFycmF5OiBzdHJpbmdbXSA9IHVzZXJJbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xyXG4gICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSB0aGlzLmdldERhdGVTZWdtZW50czQoZGF0ZUFycmF5KTtcclxuICAgICAgY29uc3QgaXNNb250aEluTnVtYmVyOiBib29sZWFuID0gIWlzTmFOKE51bWJlcihtb250aCkpO1xyXG4gICAgICBpZiAoKGlzTW9udGhJbk51bWJlciAmJiBkYXkgPCAzMiAmJiBOdW1iZXIobW9udGgpIDwgMTMpIHx8ICghaXNNb250aEluTnVtYmVyICYmIGRheSA8IDMyKSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlWWVhcihkYXksIG1vbnRoLCB5ZWFyLCBzZXBhcmF0b3IsIGNlbnR1cnksIGNlbnR1cnlWYWwsIGNvbnRyb2wpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2UgaWYoKGRhdGVGb3JtYXQgPT0gJ01NTS9kZC95eScgfHwgZGF0ZUZvcm1hdCA9PSAnTU1NLWRkLXl5Jykpe1xyXG4gICAgICBjb25zdCBkYXRlQXJyYXk6IHN0cmluZ1tdID0gdXNlcklucHV0LnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHRoaXMuZ2V0RGF0ZVNlZ21lbnRzMihkYXRlQXJyYXkpO1xyXG4gICAgICBjb25zdCBpc01vbnRoSW5OdW1iZXI6IGJvb2xlYW4gPSAhaXNOYU4oTnVtYmVyKG1vbnRoKSk7XHJcbiAgICAgIGlmICgoaXNNb250aEluTnVtYmVyICYmIGRheSA8IDMyICYmIE51bWJlcihtb250aCkgPCAxMykgfHwgKCFpc01vbnRoSW5OdW1iZXIgJiYgZGF5IDwgMzIpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyKGRheSwgbW9udGgsIHllYXIsIHNlcGFyYXRvciwgY2VudHVyeSwgY2VudHVyeVZhbCwgY29udHJvbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9ZWxzZSBpZigoZGF0ZUZvcm1hdCA9PSAneXl5eS9NTU0vZGQnIHx8IGRhdGVGb3JtYXQgPT0gJ3l5eXktTU1NLWRkJyB8fGRhdGVGb3JtYXQgPT0gJ3l5L01NTS9kZCcgfHwgZGF0ZUZvcm1hdCA9PSAneXktTU1NLWRkJykpe1xyXG4gICAgICBjb25zdCBkYXRlQXJyYXk6IHN0cmluZ1tdID0gdXNlcklucHV0LnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHRoaXMuZ2V0RGF0ZVNlZ21lbnRzMyhkYXRlQXJyYXkpO1xyXG4gICAgICBjb25zdCBpc01vbnRoSW5OdW1iZXI6IGJvb2xlYW4gPSAhaXNOYU4oTnVtYmVyKG1vbnRoKSk7XHJcbiAgICAgIGlmICgoaXNNb250aEluTnVtYmVyICYmIGRheSA8IDMyICYmIE51bWJlcihtb250aCkgPCAxMykgfHwgKCFpc01vbnRoSW5OdW1iZXIgJiYgZGF5IDwgMzIpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyKGRheSwgbW9udGgsIHllYXIsIHNlcGFyYXRvciwgY2VudHVyeSwgY2VudHVyeVZhbCwgY29udHJvbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9ZWxzZSBpZihkYXRlRm9ybWF0ID09ICd5eXl5L01NJyB8fCBkYXRlRm9ybWF0ID09ICd5eXl5LU1NJyl7XHJcbiAgICAgIGNvbnN0IGRhdGVBcnJheTogc3RyaW5nW10gPSB1c2VySW5wdXQuc3BsaXQoc2VwYXJhdG9yKTtcclxuICAgICAgY29uc3QgbW9udGggPSBkYXRlQXJyYXlbMV07XHJcbiAgICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoZGF0ZUFycmF5WzBdKTtcclxuICAgICAgaWYgKE51bWJlcihtb250aCkgPCAxMykge1xyXG4gICAgICAgIHRoaXMudXBkYXRlWWVhcigxLCBtb250aCwgeWVhciwgc2VwYXJhdG9yLCBjZW50dXJ5LCBjZW50dXJ5VmFsLCBjb250cm9sKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlWWVhcihkYXk6bnVtYmVyLCBtb250aDpzdHJpbmcsIHllYXI6bnVtYmVyLCBzZXBhcmF0b3I6c3RyaW5nLCBjZW50dXJ5Om51bWJlciwgY2VudHVyeVZhbDpudW1iZXIsIGNvbnRyb2w6QWJzdHJhY3RDb250cm9sKXtcclxuICAgIGxldCB1cGRhdGVkWWVhciA9IHllYXIudG9TdHJpbmcoKS5sZW5ndGggPT09IDIgPyAoeWVhciA8IGNlbnR1cnkgJSAxMDAgPyBjZW50dXJ5VmFsICsgMSA6IGNlbnR1cnlWYWwpICsgJycgKyB5ZWFyIDpcclxuICAgICAgeWVhci50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/ICh5ZWFyIDwgY2VudHVyeSAlIDEwMCA/IGNlbnR1cnlWYWwgKyAxIDogY2VudHVyeVZhbCkgKyAnMCcgKyB5ZWFyIDpcclxuICAgICAgICB5ZWFyO1xyXG5cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUobmV3IERhdGUoYCR7dXBkYXRlZFllYXJ9JHtzZXBhcmF0b3J9JHttb250aH0ke3NlcGFyYXRvcn0ke2RheX1gKSlcclxuICB9XHJcblxyXG4gIGdldERhdGVTZWdtZW50czEoZGF0ZUFycmF5KXtcclxuICAgIGNvbnN0IGRheSA9IE51bWJlcihkYXRlQXJyYXlbMF0pO1xyXG4gICAgY29uc3QgbW9udGggPSBkYXRlQXJyYXlbMV07XHJcbiAgICBjb25zdCB5ZWFyID0gTnVtYmVyKGRhdGVBcnJheVsyXSk7XHJcbiAgICByZXR1cm4gW2RheSwgbW9udGgsIHllYXJdO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVNlZ21lbnRzMihkYXRlQXJyYXkpe1xyXG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRhdGVBcnJheVsxXSk7XHJcbiAgICBjb25zdCBtb250aCA9IGRhdGVBcnJheVswXTtcclxuICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoZGF0ZUFycmF5WzJdKTtcclxuICAgIHJldHVybiBbZGF5LCBtb250aCwgeWVhcl07XHJcbiAgfVxyXG5cclxuICBnZXREYXRlU2VnbWVudHMzKGRhdGVBcnJheSl7XHJcbiAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF0ZUFycmF5WzJdKTtcclxuICAgIGNvbnN0IG1vbnRoID0gZGF0ZUFycmF5WzFdO1xyXG4gICAgY29uc3QgeWVhciA9IE51bWJlcihkYXRlQXJyYXlbMF0pO1xyXG4gICAgcmV0dXJuIFtkYXksIG1vbnRoLCB5ZWFyXTtcclxuICB9XHJcblxyXG4gIGdldERhdGVTZWdtZW50czQoZGF0ZUFycmF5KXtcclxuICAgIGNvbnN0IGRheSA9IE51bWJlcihkYXRlQXJyYXlbMV0pO1xyXG4gICAgY29uc3QgbW9udGggPSBkYXRlQXJyYXlbMl07XHJcbiAgICBjb25zdCB5ZWFyID0gTnVtYmVyKGRhdGVBcnJheVswXSk7XHJcbiAgICByZXR1cm4gW2RheSwgbW9udGgsIHllYXJdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGNhbGN1bGF0ZVBhdHRlcm4gKClcclxuICB7XHJcbiAgICBsZXQgY29udHJvbCA9IHRoaXMuX3Rhc2suZ2V0Rm9ybUNvbnRyb2wodGhpcy5tYWdpY0Rpci5yb3dJZCwgdGhpcy5tYWdpY0Rpci5pZCApO1xyXG5cclxuICAgIGlmKGNvbnRyb2wgIT0gbnVsbCApIHtcclxuICAgICAgbGV0IGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl90YXNrLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEodGhpcy5tYWdpY0Rpci5pZCkuZGF0YVR5cGU7XHJcbiAgICAgIGlmIChhdHRyID09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCBhdHRyID09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgYXR0ciA9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl90YXNrLkdldENvbnRyb2xQaWN0dXJlTWFzayh0aGlzLm1hZ2ljRGlyLmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXR0ZXJuR2VuZXJhdGlvbk5lZWRlZChhdHRyLCBwaWMpKSB7XHJcbiAgICAgICAgICBsZXQgcGF0dGVybjogc3RyaW5nID0gdGhpcy5nZW5lcmF0ZVBhdHRlcm4oYXR0ciwgcGljKTtcclxuICAgICAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvciA9PSBudWxsKVxyXG4gICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFtjb250cm9sLnZhbGlkYXRvciwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGF0dHIgPT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCBhdHRyID09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3IgPT0gbnVsbClcclxuICAgICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5tYXhMZW5ndGgocGljLmdldE1hc2tMZW5ndGgoKSkpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyByZS1zZXQgYWxsIHZhbGlkYXRvcnMgYWdhaW5cclxuICAgICAgICAgICAgICBpZiAocGljLmlzRm9ybWF0RXhwKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLm1heExlbmd0aChwaWMuZ2V0TWFza0xlbmd0aCgpKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodGhpcy5tYWdpY0Rpci5yb3dJZCkpXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFnaWNEaXIucm93SWQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoW2NvbnRyb2wudmFsaWRhdG9yLCB0aGlzLl90YXNrLmN1c3RvbVZhbGlkYXRvcih0aGlzLm1hZ2ljRGlyLnJvd0lkLCB0aGlzLm1hZ2ljRGlyLmlkKV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoW2NvbnRyb2wudmFsaWRhdG9yLCBWYWxpZGF0b3JzLm1heExlbmd0aChwaWMuZ2V0TWFza0xlbmd0aCgpKV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHBpYy5nZXRNYXNrTGVuZ3RoKCkpKTtcclxuICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShwaWM6IFBJQyk6IHZvaWQge1xyXG4gICAgbGV0IG1nRGF0ZUZvcm1hdHRlciA9IG5ldyBNZ0RhdGVGb3JtYXR0ZXIoKTtcclxuICAgIHRoaXMuX3Rhc2subWdJbnB1dERhdGVGb3JtYXQgPSBtZ0RhdGVGb3JtYXR0ZXIuQ29udmVydE1nRGF0ZUZvcm1hdFRvQW5ndWxhcihwaWMuZ2V0TWFzaygpKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGZvcm1hdEFscGhhVW5pY29kZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nID0gY29udHJvbC52YWx1ZTtcclxuXHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBuZXdWYWx1ZTogc3RyaW5nID0gdGhpcy5fdGFzay5HZXRSYW5nZWRWYWx1ZSh0aGlzLm1hZ2ljRGlyLmlkLCB2YWx1ZSk7XHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XHJcblxyXG4gICAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl90YXNrLkdldENvbnRyb2xQaWN0dXJlTWFzayh0aGlzLm1hZ2ljRGlyLmlkKTtcclxuICAgICAgbGV0IG1hc2s6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzd2l0Y2ggKG1hc2suY2hhckNvZGVBdChpKSkge1xyXG4gICAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1U6XHJcbiAgICAgICAgICAgIHZhbHVlU3RyLkFwcGVuZCh2YWx1ZS5jaGFyQXQoaSkudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0w6XHJcbiAgICAgICAgICAgIHZhbHVlU3RyLkFwcGVuZCh2YWx1ZS5jaGFyQXQoaSkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdmFsdWVTdHIuQXBwZW5kKHZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZVN0ci5Ub1N0cmluZygpKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZm9ybWF0Qm9vbGVhbiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCAge1xyXG4gICAgbGV0IHZhbHVlOiBzdHJpbmcgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IG5ld1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl90YXNrLkdldFJhbmdlZFZhbHVlICh0aGlzLm1hZ2ljRGlyLmlkICwgdmFsdWUpO1xyXG4gICAgICBpZiAobmV3VmFsdWUudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKHZhbHVlLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZW5lcmF0ZSBwYXR0ZXJuIGZyb20gIGZsZCdzICBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdlbmVyYXRlUGF0dGVybiAoYXR0cmlidXRlOiBTdG9yYWdlQXR0cmlidXRlLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcbiAgICBsZXQgcGF0dGVybjogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgc3dpdGNoIChhdHRyaWJ1dGUpXHJcbiAgICB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIHBhdHRlcm4gPSB0aGlzLmdlbmVyYXRlUGF0dGVybkZvck51bWJlcihwaWMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHBhdHRlcm4gPSB0aGlzLmdlbmVyYXRlUGF0dGVybkZvckFscGhhKHBpYyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdHRlcm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZW5lcmF0ZSBwYXR0ZXJuIGZvciBBbHBoYVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2VuZXJhdGVQYXR0ZXJuRm9yTnVtYmVyKHBpYzogUElDKTogc3RyaW5nIHtcclxuICAgIGxldCBwYXR0ZXJuU3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIgKCk7XHJcblxyXG4gICAgcGF0dGVyblN0ci5BcHBlbmQoJ14nKTtcclxuICAgIGlmIChwaWMuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICBwYXR0ZXJuU3RyLkFwcGVuZCgnLT8nKTtcclxuICAgIGlmIChwaWMuZ2V0V2hvbGVzKCkpXHJcbiAgICAgIHBhdHRlcm5TdHIuQXBwZW5kRm9ybWF0KCdcXFxcZHt7MH0sezF9fScsIDAsIHBpYy5nZXRXaG9sZXMoKSk7XHJcbiAgICBpZiAocGljLmdldERlYygpKVxyXG4gICAgICBwYXR0ZXJuU3RyLkFwcGVuZEZvcm1hdCgnKFxcXFwuXFxcXGR7MSx7MH19KT8nLCBwaWMuZ2V0RGVjKCkpO1xyXG4gICAgcGF0dGVyblN0ci5BcHBlbmQoJyQnKTtcclxuXHJcbiAgICByZXR1cm4gcGF0dGVyblN0ci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGlzUGF0dGVybkdlbmVyYXRpb25OZWVkZWQgKGF0dHIgOiBTdG9yYWdlQXR0cmlidXRlLCBwaWMgOiBQSUMpOiBib29sZWFuIHtcclxuXHJcbiAgICBzd2l0Y2ggKGF0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHJldHVybiAocGljLmdldE1hc2tDaGFycygpID4gMCkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZW5lcmF0ZSBwYXR0ZXJuIGZvciBBbHBoYVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2VuZXJhdGVQYXR0ZXJuRm9yQWxwaGEocGljIDogUElDKTogc3RyaW5nIHtcclxuICAgIGxldCBjbnQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaW5wdXRBbGxDaGFyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGNsb3NlU2V0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgIG1hc2s6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgIHBhdHRlcm46IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIHBhdHRlcm4uQXBwZW5kKCdeJyk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbWFzay5sZW5ndGg7KVxyXG4gICAge1xyXG4gICAgICAvL3N0YXJ0IG5ldyBzdWJzZXQgLCBpZiBtYXNrW2ldIGlzIG9uZSBvZiB0aGVzZS5cclxuICAgICAgaWYgKGlucHV0QWxsQ2hhcnMgJiYgKG1hc2suY2hhckNvZGVBdChpKSA9PSBQSUNJbnRlcmZhY2UuUElDX04gfHwgbWFzay5jaGFyQ29kZUF0KGkpID09IFBJQ0ludGVyZmFjZS5QSUNfVSB8fCBtYXNrLmNoYXJDb2RlQXQoaSkgPT0gUElDSW50ZXJmYWNlLlBJQ19MXHJcbiAgICAgICAgfHwgbWFzay5jaGFyQ29kZUF0KGkpID09IFBJQ0ludGVyZmFjZS5QSUNfWCkpXHJcbiAgICAgIHtcclxuICAgICAgICBwYXR0ZXJuLkFwcGVuZCgnKCcpO1xyXG4gICAgICAgIGNsb3NlU2V0ID0gdHJ1ZTtcclxuICAgICAgICBpbnB1dEFsbENoYXJzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNudCA9IDA7XHJcbiAgICAgIHN3aXRjaCAobWFzay5jaGFyQ29kZUF0KGkpKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1U6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1g6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0w6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcGF0dGVybi5BcHBlbmQoJy4nKTtcclxuICAgICAgICAgIGxldCBpbnB1dEFsbENoYXJzUmVmOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPihmYWxzZSk7XHJcbiAgICAgICAgICBsZXQgZGlyczogc3RyaW5nID0gIFBJQ0ludGVyZmFjZS5QSUNfVS50b1N0cmluZygpO1xyXG4gICAgICAgICAgZGlycyArPSBQSUNJbnRlcmZhY2UuUElDX0wudG9TdHJpbmcoKTtcclxuICAgICAgICAgIGRpcnMgKz0gUElDSW50ZXJmYWNlLlBJQ19YLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBjbnQgPSB0aGlzLmdldERpcmVjdGl2ZUNvdW50KG1hc2ssIGksIGRpcnMsIGlucHV0QWxsQ2hhcnNSZWYpO1xyXG4gICAgICAgICAgaW5wdXRBbGxDaGFycyA9IGlucHV0QWxsQ2hhcnNSZWYudmFsdWU7XHJcbiAgICAgICAgICBpICs9IGNudDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX046XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcGF0dGVybi5BcHBlbmQoJ1xcXFxkJyk7XHJcbiAgICAgICAgICBsZXQgaW5wdXRBbGxDaGFyc1JlZjogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgICAgICAgY250ID0gdGhpcy5nZXREaXJlY3RpdmVDb3VudChtYXNrLCBpLCBQSUNJbnRlcmZhY2UuUElDX0wudG9TdHJpbmcoKSwgaW5wdXRBbGxDaGFyc1JlZik7XHJcbiAgICAgICAgICBpbnB1dEFsbENoYXJzID0gaW5wdXRBbGxDaGFyc1JlZi52YWx1ZTtcclxuICAgICAgICAgIGkgKz0gY250O1xyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcGF0dGVybi5BcHBlbmQobWFza1tpXSk7XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpZiAoY250ID4gMClcclxuICAgICAgICBwYXR0ZXJuLkFwcGVuZEZvcm1hdCgne3swfSx7MX19JywgaW5wdXRBbGxDaGFycyA/IGNudCA6IDAsIGNudCk7XHJcbiAgICAgIGlmIChjbG9zZVNldClcclxuICAgICAgICBwYXR0ZXJuLkFwcGVuZCgnKScpO1xyXG4gICAgICBjbG9zZVNldCA9IGZhbHNlO1xyXG5cclxuICAgIH1cclxuICAgIHBhdHRlcm4uQXBwZW5kKCckJyk7XHJcbiAgICByZXR1cm4gcGF0dGVybi5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldERpcmVjdGl2ZUNvdW50KG1hc2s6IHN0cmluZywgaWR4OiBudW1iZXIsIHBhdHRlcm46IHN0cmluZywgY2hhbmdlSW5QYXR0ZXJuOiBSZWZQYXJhbTxib29sZWFuPiApOiBudW1iZXIgIHtcclxuXHJcbiAgICBjaGFuZ2VJblBhdHRlcm4udmFsdWUgPSBmYWxzZTtcclxuICAgIGxldCBwYXR0ZXJuQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gZmluZCBtYXggY2hhcnNcclxuICAgIHdoaWxlIChpZHggPCBtYXNrLmxlbmd0aCAmJiB0aGlzLklzUGF0dGVybk1hdGNoZXMobWFzay5jaGFyQ29kZUF0KGlkeCkudG9TdHJpbmcoKSwgcGF0dGVybikpXHJcbiAgICB7IHBhdHRlcm5Db3VudCsrOyBpZHgrKzsgfVxyXG5cclxuXHJcbiAgICBpZiAoaWR4IDwgbWFzay5sZW5ndGgpXHJcbiAgICAgIGNoYW5nZUluUGF0dGVybi52YWx1ZSA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHBhdHRlcm5Db3VudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBJc1BhdHRlcm5NYXRjaGVzKG1hc2s6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgZm9yIChsZXQgaTpudW1iZXIgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKylcclxuICAgICAgaWYgKG1hc2sgPT0gcGF0dGVybltpXSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19