@bnsights/bbsf-controls 1.0.0

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 (193) hide show
  1. package/README.md +24 -0
  2. package/bnsights-bbsf-controls.d.ts +26 -0
  3. package/bnsights-bbsf-controls.metadata.json +1 -0
  4. package/bundles/bnsights-bbsf-controls.umd.js +6375 -0
  5. package/bundles/bnsights-bbsf-controls.umd.js.map +1 -0
  6. package/esm2015/bnsights-bbsf-controls.js +27 -0
  7. package/esm2015/lib/Shared/Enums/CalendarView.js +8 -0
  8. package/esm2015/lib/Shared/Enums/ControlLayout.js +6 -0
  9. package/esm2015/lib/Shared/Enums/Countries.js +247 -0
  10. package/esm2015/lib/Shared/Enums/FileType.js +22 -0
  11. package/esm2015/lib/Shared/Enums/FilterType.js +11 -0
  12. package/esm2015/lib/Shared/Enums/FontSize.js +7 -0
  13. package/esm2015/lib/Shared/Enums/ForceDirection.js +6 -0
  14. package/esm2015/lib/Shared/Enums/IconPosition.js +6 -0
  15. package/esm2015/lib/Shared/Enums/ImageType.js +10 -0
  16. package/esm2015/lib/Shared/Enums/InputType.js +9 -0
  17. package/esm2015/lib/Shared/Enums/Insert.js +9 -0
  18. package/esm2015/lib/Shared/Enums/LanguageMode.js +11 -0
  19. package/esm2015/lib/Shared/Enums/Misc.js +7 -0
  20. package/esm2015/lib/Shared/Enums/PagingActionMode.js +6 -0
  21. package/esm2015/lib/Shared/Enums/Para.js +9 -0
  22. package/esm2015/lib/Shared/Enums/PickerType.js +7 -0
  23. package/esm2015/lib/Shared/Enums/SelectMode.js +6 -0
  24. package/esm2015/lib/Shared/Enums/StartView.js +7 -0
  25. package/esm2015/lib/Shared/Enums/Style.js +8 -0
  26. package/esm2015/lib/Shared/Enums/menu-list-enum.js +6 -0
  27. package/esm2015/lib/Shared/Models/Attribute.js +3 -0
  28. package/esm2015/lib/Shared/Models/AutocompleteDTO.js +7 -0
  29. package/esm2015/lib/Shared/Models/AutocompleteOptions.js +29 -0
  30. package/esm2015/lib/Shared/Models/CalendarEventDTO.js +3 -0
  31. package/esm2015/lib/Shared/Models/CalendarOptions.js +17 -0
  32. package/esm2015/lib/Shared/Models/CancelDTO.js +7 -0
  33. package/esm2015/lib/Shared/Models/CheckBoxOptions.js +12 -0
  34. package/esm2015/lib/Shared/Models/CustomValidation.js +14 -0
  35. package/esm2015/lib/Shared/Models/DropdownListItem.js +3 -0
  36. package/esm2015/lib/Shared/Models/DropdownOptions.js +18 -0
  37. package/esm2015/lib/Shared/Models/EditPersonalImage.js +7 -0
  38. package/esm2015/lib/Shared/Models/EnglishArabicDTO.js +3 -0
  39. package/esm2015/lib/Shared/Models/FileDTO.js +2 -0
  40. package/esm2015/lib/Shared/Models/FileUploadModel.js +3 -0
  41. package/esm2015/lib/Shared/Models/FileUploadOptions.js +15 -0
  42. package/esm2015/lib/Shared/Models/FilterItem.js +8 -0
  43. package/esm2015/lib/Shared/Models/FormOptions.js +26 -0
  44. package/esm2015/lib/Shared/Models/HtmlEditorOptions.js +16 -0
  45. package/esm2015/lib/Shared/Models/ImageUploadOptions.js +18 -0
  46. package/esm2015/lib/Shared/Models/MapAutoCompleteOptions.js +11 -0
  47. package/esm2015/lib/Shared/Models/MapAutocompleteDTO.js +3 -0
  48. package/esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js +19 -0
  49. package/esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js +19 -0
  50. package/esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js +22 -0
  51. package/esm2015/lib/Shared/Models/MultipleFileUploadModel.js +9 -0
  52. package/esm2015/lib/Shared/Models/PagingDTO.js +13 -0
  53. package/esm2015/lib/Shared/Models/PagingOptions.js +43 -0
  54. package/esm2015/lib/Shared/Models/PhoneOptions.js +15 -0
  55. package/esm2015/lib/Shared/Models/ProfileImageUploadOptions.js +15 -0
  56. package/esm2015/lib/Shared/Models/ProfilePictureDTO.js +3 -0
  57. package/esm2015/lib/Shared/Models/RadioButtonItem.js +3 -0
  58. package/esm2015/lib/Shared/Models/RadioButtonOptions.js +10 -0
  59. package/esm2015/lib/Shared/Models/RangeNumber.js +3 -0
  60. package/esm2015/lib/Shared/Models/SaveDTO.js +7 -0
  61. package/esm2015/lib/Shared/Models/TagsInputDTO.js +3 -0
  62. package/esm2015/lib/Shared/Models/TagsInputOptions.js +45 -0
  63. package/esm2015/lib/Shared/Models/TextAreaOptions.js +14 -0
  64. package/esm2015/lib/Shared/Models/TextBoxOptions.js +21 -0
  65. package/esm2015/lib/Shared/Models/ToggleslideOptions.js +9 -0
  66. package/esm2015/lib/Shared/Models/UploadPersonalImage.js +7 -0
  67. package/esm2015/lib/Shared/Models/datePickerOptions.js +24 -0
  68. package/esm2015/lib/Shared/config/environment.js +12 -0
  69. package/esm2015/lib/Shared/services/ControlUtility.js +114 -0
  70. package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +22 -0
  71. package/esm2015/lib/Shared/services/validationErrorMassage.service.js +122 -0
  72. package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +236 -0
  73. package/esm2015/lib/controls/Calendar/Calendar.component.js +176 -0
  74. package/esm2015/lib/controls/CheckBox/CheckBox.component.js +111 -0
  75. package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +148 -0
  76. package/esm2015/lib/controls/DropdownList/DropdownList.component.js +172 -0
  77. package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +319 -0
  78. package/esm2015/lib/controls/Form/Form.component.js +82 -0
  79. package/esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js +202 -0
  80. package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +304 -0
  81. package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +283 -0
  82. package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +383 -0
  83. package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +325 -0
  84. package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +326 -0
  85. package/esm2015/lib/controls/Paging/JwPagination.component.js +127 -0
  86. package/esm2015/lib/controls/Paging/Paging.component.js +215 -0
  87. package/esm2015/lib/controls/Phone/Phone.component.js +114 -0
  88. package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +326 -0
  89. package/esm2015/lib/controls/RadioButton/RadioButton.component.js +98 -0
  90. package/esm2015/lib/controls/TagsInput/TagsInput.component.js +205 -0
  91. package/esm2015/lib/controls/TextArea/TextArea.component.js +148 -0
  92. package/esm2015/lib/controls/TextBox/TextBox.component.js +217 -0
  93. package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +71 -0
  94. package/esm2015/lib/controls/bbsf-controls.module.js +208 -0
  95. package/esm2015/public-api.js +101 -0
  96. package/fesm2015/bnsights-bbsf-controls.js +5794 -0
  97. package/fesm2015/bnsights-bbsf-controls.js.map +1 -0
  98. package/lib/Shared/Enums/CalendarView.d.ts +6 -0
  99. package/lib/Shared/Enums/ControlLayout.d.ts +4 -0
  100. package/lib/Shared/Enums/Countries.d.ts +245 -0
  101. package/lib/Shared/Enums/FileType.d.ts +20 -0
  102. package/lib/Shared/Enums/FilterType.d.ts +9 -0
  103. package/lib/Shared/Enums/FontSize.d.ts +5 -0
  104. package/lib/Shared/Enums/ForceDirection.d.ts +4 -0
  105. package/lib/Shared/Enums/IconPosition.d.ts +4 -0
  106. package/lib/Shared/Enums/ImageType.d.ts +8 -0
  107. package/lib/Shared/Enums/InputType.d.ts +7 -0
  108. package/lib/Shared/Enums/Insert.d.ts +7 -0
  109. package/lib/Shared/Enums/LanguageMode.d.ts +9 -0
  110. package/lib/Shared/Enums/Misc.d.ts +5 -0
  111. package/lib/Shared/Enums/PagingActionMode.d.ts +4 -0
  112. package/lib/Shared/Enums/Para.d.ts +7 -0
  113. package/lib/Shared/Enums/PickerType.d.ts +5 -0
  114. package/lib/Shared/Enums/SelectMode.d.ts +4 -0
  115. package/lib/Shared/Enums/StartView.d.ts +5 -0
  116. package/lib/Shared/Enums/Style.d.ts +6 -0
  117. package/lib/Shared/Enums/menu-list-enum.d.ts +4 -0
  118. package/lib/Shared/Models/Attribute.d.ts +4 -0
  119. package/lib/Shared/Models/AutocompleteDTO.d.ts +4 -0
  120. package/lib/Shared/Models/AutocompleteOptions.d.ts +74 -0
  121. package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -0
  122. package/lib/Shared/Models/CalendarOptions.d.ts +29 -0
  123. package/lib/Shared/Models/CancelDTO.d.ts +5 -0
  124. package/lib/Shared/Models/CheckBoxOptions.d.ts +38 -0
  125. package/lib/Shared/Models/CustomValidation.d.ts +10 -0
  126. package/lib/Shared/Models/DropdownListItem.d.ts +4 -0
  127. package/lib/Shared/Models/DropdownOptions.d.ts +67 -0
  128. package/lib/Shared/Models/EditPersonalImage.d.ts +5 -0
  129. package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -0
  130. package/lib/Shared/Models/FileDTO.d.ts +19 -0
  131. package/lib/Shared/Models/FileUploadModel.d.ts +4 -0
  132. package/lib/Shared/Models/FileUploadOptions.d.ts +56 -0
  133. package/lib/Shared/Models/FilterItem.d.ts +13 -0
  134. package/lib/Shared/Models/FormOptions.d.ts +15 -0
  135. package/lib/Shared/Models/HtmlEditorOptions.d.ts +66 -0
  136. package/lib/Shared/Models/ImageUploadOptions.d.ts +59 -0
  137. package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +44 -0
  138. package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -0
  139. package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +97 -0
  140. package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +85 -0
  141. package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +83 -0
  142. package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -0
  143. package/lib/Shared/Models/PagingDTO.d.ts +11 -0
  144. package/lib/Shared/Models/PagingOptions.d.ts +51 -0
  145. package/lib/Shared/Models/PhoneOptions.d.ts +56 -0
  146. package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +64 -0
  147. package/lib/Shared/Models/ProfilePictureDTO.d.ts +12 -0
  148. package/lib/Shared/Models/RadioButtonItem.d.ts +4 -0
  149. package/lib/Shared/Models/RadioButtonOptions.d.ts +44 -0
  150. package/lib/Shared/Models/RangeNumber.d.ts +4 -0
  151. package/lib/Shared/Models/SaveDTO.d.ts +5 -0
  152. package/lib/Shared/Models/TagsInputDTO.d.ts +4 -0
  153. package/lib/Shared/Models/TagsInputOptions.d.ts +91 -0
  154. package/lib/Shared/Models/TextAreaOptions.d.ts +60 -0
  155. package/lib/Shared/Models/TextBoxOptions.d.ts +70 -0
  156. package/lib/Shared/Models/ToggleslideOptions.d.ts +36 -0
  157. package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -0
  158. package/lib/Shared/Models/datePickerOptions.d.ts +65 -0
  159. package/lib/Shared/config/environment.d.ts +1 -0
  160. package/lib/Shared/services/ControlUtility.d.ts +23 -0
  161. package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +7 -0
  162. package/lib/Shared/services/validationErrorMassage.service.d.ts +13 -0
  163. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +51 -0
  164. package/lib/controls/Calendar/Calendar.component.d.ts +40 -0
  165. package/lib/controls/CheckBox/CheckBox.component.d.ts +33 -0
  166. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +41 -0
  167. package/lib/controls/DropdownList/DropdownList.component.d.ts +47 -0
  168. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +49 -0
  169. package/lib/controls/Form/Form.component.d.ts +15 -0
  170. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +44 -0
  171. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +64 -0
  172. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +52 -0
  173. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +58 -0
  174. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +59 -0
  175. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +57 -0
  176. package/lib/controls/Paging/JwPagination.component.d.ts +24 -0
  177. package/lib/controls/Paging/Paging.component.d.ts +44 -0
  178. package/lib/controls/Phone/Phone.component.d.ts +37 -0
  179. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +65 -0
  180. package/lib/controls/RadioButton/RadioButton.component.d.ts +31 -0
  181. package/lib/controls/TagsInput/TagsInput.component.d.ts +47 -0
  182. package/lib/controls/TextArea/TextArea.component.d.ts +41 -0
  183. package/lib/controls/TextBox/TextBox.component.d.ts +50 -0
  184. package/lib/controls/Toggleslide/toggleslide.component.d.ts +26 -0
  185. package/lib/controls/bbsf-controls.module.d.ts +10 -0
  186. package/package.json +85 -0
  187. package/public-api.d.ts +66 -0
  188. package/src/lib/assets/Style.css +1149 -0
  189. package/src/lib/assets/i18n/ar.json +29 -0
  190. package/src/lib/assets/i18n/en.json +24 -0
  191. package/src/lib/assets/images/imagenotfound.png +0 -0
  192. package/src/lib/assets/images/uploadimg.png +0 -0
  193. package/src/lib/assets/images/userimg.png +0 -0
@@ -0,0 +1,283 @@
1
+ import { Component, Input, Optional, NgZone, ViewChild, EventEmitter, Output } from '@angular/core';
2
+ import { FormControl, Validators, ControlContainer, FormGroupDirective } from '@angular/forms';
3
+ import { ErrorMassageValidation } from '../../Shared/services/validationErrorMassage.service';
4
+ import { ControlUtility } from '../../Shared/services/ControlUtility';
5
+ import { MapAutocompleteDTO } from '../../Shared/Models/MapAutocompleteDTO';
6
+ import { Title } from '@angular/platform-browser';
7
+ import { MapsAPILoader, LazyMapsAPILoader } from '@agm/core';
8
+ import { BBSFTranslateService, ControlValidationService, UtilityService } from '@bnsights/bbsf-utilities';
9
+ export class MapAutoCompleteComponent {
10
+ constructor(mapsAPILoader, ngZone, titleService, ErrorHandler, controlUtility, controlContainer, MapAutoCompleteControlHost, UtilityService, translate, controlValidationService) {
11
+ this.mapsAPILoader = mapsAPILoader;
12
+ this.ngZone = ngZone;
13
+ this.titleService = titleService;
14
+ this.ErrorHandler = ErrorHandler;
15
+ this.controlUtility = controlUtility;
16
+ this.controlContainer = controlContainer;
17
+ this.MapAutoCompleteControlHost = MapAutoCompleteControlHost;
18
+ this.UtilityService = UtilityService;
19
+ this.translate = translate;
20
+ this.controlValidationService = controlValidationService;
21
+ this.OnChange = new EventEmitter();
22
+ this.MapAutoCompleteModel = new MapAutocompleteDTO();
23
+ this.CurrentLanguage = "";
24
+ this.onAutocompleteSelected = new EventEmitter();
25
+ this.onGermanAddressMapped = new EventEmitter();
26
+ this.onLocationSelected = new EventEmitter();
27
+ this.markAllAsTouched = false;
28
+ this.validationRules = [];
29
+ this.validationRulesasync = [];
30
+ this.resetError = () => {
31
+ this.controlValidationService.RemoveGlobalError();
32
+ };
33
+ //External Method
34
+ this.RemoveRequiredValidation = () => {
35
+ this.controlUtility.RemoveRequiredValidation(this.MapAutoCompleteFormControl, this.validationRules, this.options);
36
+ };
37
+ //External Method
38
+ this.AddRequiredValidation = () => {
39
+ this.controlUtility.AddRequiredValidation(this.MapAutoCompleteFormControl, this.validationRules, this.options);
40
+ };
41
+ //External Method
42
+ this.RemoveCustomValidation = (CustomValidation) => {
43
+ this.controlUtility.RemoveCustomValidation(this.MapAutoCompleteFormControl, this.validationRules, CustomValidation);
44
+ };
45
+ //External Method
46
+ this.AddCustomValidation = (CustomValidation) => {
47
+ this.controlUtility.AddCustomValidation(this.MapAutoCompleteFormControl, this.validationRules, CustomValidation);
48
+ };
49
+ //External Method
50
+ this.IsValid = () => {
51
+ this.controlUtility.IsValid(this.MapAutoCompleteFormControl);
52
+ };
53
+ MapAutoCompleteComponent.controlContainerstatic = this.controlContainer;
54
+ this.CurrentLanguage = translate.currentLang != undefined ? translate.currentLang : translate.defaultLang;
55
+ }
56
+ ngOnInit() {
57
+ this.controlValidationService.isCreatedBefor = false;
58
+ this.MapAutoCompleteModel = new MapAutocompleteDTO();
59
+ this.translate.onLangChange.subscribe((event) => {
60
+ this.CurrentLanguage = event.lang;
61
+ ;
62
+ if (this.CurrentLanguage == 'ar')
63
+ this.mapsAPILoader["_config"]["localeId"] = "ar-EG";
64
+ if (this.CurrentLanguage == 'en')
65
+ this.mapsAPILoader["_config"]["localeId"] = "en-US";
66
+ this.mapsAPILoader["_scriptLoadingPromise"] = null;
67
+ this.mapsAPILoader["_config"]["apiKey"] = `AIzaSyA75ojhZhEhDaO3vfn3mxTY32sq5flAwlY&language=${this.CurrentLanguage}`;
68
+ var ScriptTag = document.getElementById(this.mapsAPILoader["_SCRIPT_ID"]);
69
+ if (ScriptTag)
70
+ ScriptTag.remove();
71
+ var elements = document.getElementsByClassName("pac-container");
72
+ while (elements.length > 0)
73
+ elements[0].remove();
74
+ let window = this.mapsAPILoader["_windowRef"].getNativeWindow();
75
+ window.google = null;
76
+ this.LazyMapsAPILoader = new LazyMapsAPILoader({
77
+ // &language=${UtilityService.CurrentLanguage}
78
+ apiKey: `AIzaSyA75ojhZhEhDaO3vfn3mxTY32sq5flAwlY&language=${this.CurrentLanguage}`,
79
+ libraries: ['places'],
80
+ }, this.mapsAPILoader["_windowRef"], this.mapsAPILoader["_documentRef"], this.mapsAPILoader["_config"]["localeId"]);
81
+ this.LazyMapsAPILoader.load().then(() => {
82
+ let autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, {
83
+ types: ["address"]
84
+ });
85
+ autocomplete.addListener('place_changed', ( /**
86
+ * @return {?}
87
+ */() => {
88
+ this.ngZone.run(( /**
89
+ * @return {?}
90
+ */() => {
91
+ // get the place result
92
+ /** @type {?} */
93
+ const place = autocomplete.getPlace();
94
+ /** @type {?} */
95
+ const germanAddress = {
96
+ gmID: place.id,
97
+ icon: place.icon,
98
+ url: place.url,
99
+ placeID: place.place_id,
100
+ displayAddress: place.formatted_address,
101
+ name: place.name,
102
+ vicinity: place.vicinity,
103
+ locality: {},
104
+ state: {},
105
+ country: {},
106
+ geoLocation: { latitude: -1, longitude: -1 },
107
+ };
108
+ if (place.geometry && place.geometry.location) {
109
+ germanAddress.geoLocation.latitude = place.geometry.location.lat();
110
+ germanAddress.geoLocation.longitude = place.geometry.location.lng();
111
+ }
112
+ place.address_components.forEach(( /**
113
+ * @param {?} value
114
+ * @return {?}
115
+ *//**
116
+ * @param {?} value
117
+ * @return {?}
118
+ */ value => {
119
+ if (value.types.indexOf('street_number') > -1) {
120
+ germanAddress["streetNumber"] = value.short_name;
121
+ }
122
+ if (value.types.indexOf('route') > -1) {
123
+ germanAddress["streetName"] = value.long_name;
124
+ }
125
+ if (value.types.indexOf('postal_code') > -1) {
126
+ germanAddress["postalCode"] = Number(value.short_name);
127
+ }
128
+ if (value.types.indexOf('sublocality') > -1) {
129
+ germanAddress["sublocality"] = value.long_name;
130
+ }
131
+ if (value.types.indexOf('locality') > -1) {
132
+ germanAddress.locality["long"] = value.long_name;
133
+ germanAddress.locality["short"] = value.short_name;
134
+ }
135
+ if (value.types.indexOf('administrative_area_level_1') > -1) {
136
+ germanAddress.state["long"] = value.long_name;
137
+ germanAddress.state["short"] = value.short_name;
138
+ }
139
+ if (value.types.indexOf('country') > -1) {
140
+ germanAddress.country["long"] = value.long_name;
141
+ germanAddress.country["short"] = value.short_name;
142
+ }
143
+ if (value.types.indexOf('administrative_area_level_3') > -1) {
144
+ germanAddress.locality["short"] = value.short_name;
145
+ }
146
+ }));
147
+ this.onGermanAddressMapped.emit(germanAddress);
148
+ this.GermanAddressMapped(germanAddress);
149
+ if (!place.place_id || place.geometry === undefined || place.geometry === null) {
150
+ // place result is not valid
151
+ return;
152
+ }
153
+ else {
154
+ // show dialog to select a address from the input
155
+ // emit failed event
156
+ }
157
+ // this.address = place.formatted_address;
158
+ this.onAutocompleteSelected.emit(place);
159
+ this.AutocompleteSelected(place);
160
+ this.onLocationSelected.emit({
161
+ latitude: place.geometry.location.lat(),
162
+ longitude: place.geometry.location.lng()
163
+ });
164
+ }));
165
+ }));
166
+ });
167
+ });
168
+ ;
169
+ if (this.CurrentLanguage == 'ar')
170
+ this.mapsAPILoader["_config"]["localeId"] = "ar-EG";
171
+ if (this.CurrentLanguage == 'en')
172
+ this.mapsAPILoader["_config"]["localeId"] = "en-US";
173
+ this.mapsAPILoader["_scriptLoadingPromise"] = null;
174
+ this.mapsAPILoader["_config"]["apiKey"] = `AIzaSyA75ojhZhEhDaO3vfn3mxTY32sq5flAwlY&language=${this.CurrentLanguage}`;
175
+ var leftSection = document.getElementById(this.mapsAPILoader["_SCRIPT_ID"]);
176
+ if (leftSection)
177
+ leftSection.remove();
178
+ this.LazyMapsAPILoader = new LazyMapsAPILoader({
179
+ apiKey: `AIzaSyA75ojhZhEhDaO3vfn3mxTY32sq5flAwlY&language=${this.CurrentLanguage}`,
180
+ libraries: ['places'],
181
+ }, this.mapsAPILoader["_windowRef"], this.mapsAPILoader["_documentRef"], this.mapsAPILoader["_config"]["localeId"]);
182
+ this.LazyMapsAPILoader.load();
183
+ this.mapsAPILoader.load().then(() => {
184
+ let autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, {
185
+ types: ["address"]
186
+ });
187
+ });
188
+ this.group.addControl(this.options.Name, new FormControl(''));
189
+ this.MapAutoCompleteFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
190
+ if (this.options.IsRequired) {
191
+ this.validationRules.push(Validators.required);
192
+ }
193
+ if (this.options.LabelKey != null && this.options.LabelKey != "")
194
+ this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
195
+ this.MapAutoCompleteFormControl.setValidators(this.validationRules);
196
+ this.MapAutoCompleteFormControl.setAsyncValidators(this.validationRulesasync);
197
+ if (this.options.IsDisabled) {
198
+ this.MapAutoCompleteFormControl.disable();
199
+ }
200
+ if (this.options.Value != null) {
201
+ this.MapAutoCompleteFormControl.setValue(this.options.Value);
202
+ }
203
+ if (this.options.CustomValidation.length > 0) {
204
+ let Validations = this.options.CustomValidation;
205
+ for (let index = 0; index < Validations.length; index++) {
206
+ const Validation = Validations[index];
207
+ this.validationRules.push(Validation.functionBody);
208
+ }
209
+ }
210
+ this.MapAutoCompleteControlHost.ngSubmit.subscribe((value) => {
211
+ this.group.markAllAsTouched();
212
+ this.markAllAsTouched = true;
213
+ });
214
+ }
215
+ ngAfterViewInit() {
216
+ if (this.options.AttributeList != null) {
217
+ var element = document.getElementById(this.options.Name);
218
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
219
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
220
+ }
221
+ }
222
+ }
223
+ showGlobalError() {
224
+ this.controlUtility.showGlobalError();
225
+ }
226
+ getErrorValidation(ErrorList) {
227
+ if (this.markAllAsTouched && this.group.invalid) {
228
+ this.showGlobalError();
229
+ this.markAllAsTouched = false;
230
+ }
231
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
232
+ }
233
+ AutocompleteSelected(result) {
234
+ this.MapAutoCompleteModel == new MapAutocompleteDTO();
235
+ this.MapAutoCompleteModel.Text = result.formatted_address;
236
+ this.MapAutoCompleteModel.PlaceID = result.place_id;
237
+ this.MapAutoCompleteModel.GoogleMapsURL = result.url;
238
+ }
239
+ LocationSelected(location) {
240
+ this.MapAutoCompleteModel.Latitude = location.latitude;
241
+ this.MapAutoCompleteModel.Longitude = location.longitude;
242
+ this.MapAutoCompleteFormControl.setValue(null);
243
+ this.MapAutoCompleteFormControl.setValue(this.MapAutoCompleteModel);
244
+ }
245
+ GermanAddressMapped(result) {
246
+ this.MapAutoCompleteModel == new MapAutocompleteDTO();
247
+ this.MapAutoCompleteModel.Text = result.displayAddress;
248
+ this.MapAutoCompleteModel.PlaceID = result.placeID;
249
+ this.MapAutoCompleteModel.GoogleMapsURL = result.url;
250
+ this.MapAutoCompleteModel.Latitude = result.geoLocation.latitude;
251
+ this.MapAutoCompleteModel.Longitude = result.geoLocation.longitude;
252
+ this.MapAutoCompleteFormControl.setValue(this.MapAutoCompleteModel);
253
+ this.group.controls[this.options.Name].setValue(this.MapAutoCompleteModel);
254
+ this.OnChange.emit(this.MapAutoCompleteFormControl.value);
255
+ }
256
+ }
257
+ MapAutoCompleteComponent.controlContainerstatic = null;
258
+ MapAutoCompleteComponent.decorators = [
259
+ { type: Component, args: [{
260
+ selector: 'BBSF-MapAutoComplete',
261
+ template: "<div class=\"b-control b-map-auto-complete\">\r\n <div class=\"form-group row validate is-invalid\" [formGroup]=\"group\">\r\n <label class=\"b-label col-form-label col-sm-12 \" [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <input class=\"form-control bnsights-control {{options.ExtraClasses}} \"\r\n value=\"{{MapAutoCompleteModel}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n \r\n [class.is-invalid]=\"MapAutoCompleteFormControl.invalid && MapAutoCompleteFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\"\r\n matGoogleMapsAutocomplete #search\r\n (onAutocompleteSelected)=\"AutocompleteSelected($event)\"\r\n (onLocationSelected)=\"LocationSelected($event)\"\r\n (onGermanAddressMapped)=\"GermanAddressMapped($event)\" />\r\n\r\n \r\n\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(MapAutoCompleteFormControl.invalid && MapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(MapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"control-desc text-dark\">{{options.LabelDescription}}</div>\r\n </div>\r\n\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n",
262
+ styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}.flip_V{transform:scaleY(-1)}\n"]
263
+ },] }
264
+ ];
265
+ MapAutoCompleteComponent.ctorParameters = () => [
266
+ { type: MapsAPILoader },
267
+ { type: NgZone },
268
+ { type: Title },
269
+ { type: ErrorMassageValidation },
270
+ { type: ControlUtility },
271
+ { type: ControlContainer, decorators: [{ type: Optional }] },
272
+ { type: FormGroupDirective },
273
+ { type: UtilityService },
274
+ { type: BBSFTranslateService },
275
+ { type: ControlValidationService }
276
+ ];
277
+ MapAutoCompleteComponent.propDecorators = {
278
+ group: [{ type: Input }],
279
+ options: [{ type: Input }],
280
+ OnChange: [{ type: Output }],
281
+ searchElementRef: [{ type: ViewChild, args: ["search", { static: false },] }]
282
+ };
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVyxRQUFRLEVBQUUsTUFBTSxFQUFjLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUE4QixnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBaUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxSixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxELE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBUTFHLE1BQU0sT0FBTyx3QkFBd0I7SUFJbkMsWUFBb0IsYUFBNEIsRUFDdEMsTUFBYyxFQUFVLFlBQW1CLEVBQVUsWUFBb0MsRUFBVSxjQUE4QixFQUFzQixnQkFBa0MsRUFBUywwQkFBOEMsRUFBUyxjQUE2QixFQUFTLFNBQStCLEVBQVMsd0JBQWlEO1FBRDlXLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ3RDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxpQkFBWSxHQUFaLFlBQVks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cEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNELENBQUM7O0FBelFNLCtDQUFzQixHQUFHLElBQUksQ0FBQzs7WUFUdEMsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLDgwREFBK0M7O2FBRWhEOzs7WUFQUSxhQUFhO1lBUmdDLE1BQU07WUFNbkQsS0FBSztZQUpMLHNCQUFzQjtZQUN0QixjQUFjO1lBRnVDLGdCQUFnQix1QkFxQmtFLFFBQVE7WUFyQnhFLGtCQUFrQjtZQVF6QyxjQUFjO1lBQTlELG9CQUFvQjtZQUFFLHdCQUF3Qjs7O29CQWtCcEQsS0FBSztzQkFDTCxLQUFLO3VCQUNMLE1BQU07K0JBUU4sU0FBUyxTQUFDLFFBQVEsRUFBRSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIGNvbnN0IGdvb2dsZTogYW55XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRG9DaGVjaywgT3B0aW9uYWwsIE5nWm9uZSwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cERpcmVjdGl2ZSwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEVycm9yTWFzc2FnZVZhbGlkYXRpb24gfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvdmFsaWRhdGlvbkVycm9yTWFzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udHJvbFV0aWxpdHkgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvQ29udHJvbFV0aWxpdHknO1xyXG5pbXBvcnQgeyBNYXBBdXRvQ29tcGxldGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NYXBBdXRvQ29tcGxldGVPcHRpb25zJztcclxuaW1wb3J0IHsgTWFwQXV0b2NvbXBsZXRlRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NYXBBdXRvY29tcGxldGVEVE8nO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiwgQXBwZWFyYW5jZSwgR2VybWFuQWRkcmVzcywgTWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZUNvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyLW1hdGVyaWFsLWV4dGVuc2lvbnMvZ29vZ2xlLW1hcHMtYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWFwc0FQSUxvYWRlciwgTGF6eU1hcHNBUElMb2FkZXIgfSBmcm9tICdAYWdtL2NvcmUnO1xyXG5pbXBvcnQgeyBCQlNGVHJhbnNsYXRlU2VydmljZSwgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBVdGlsaXR5U2VydmljZSB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtTWFwQXV0b0NvbXBsZXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9NYXBBdXRvQ29tcGxldGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE1hcEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cclxuICBzdGF0aWMgY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IG51bGw7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXBzQVBJTG9hZGVyOiBNYXBzQVBJTG9hZGVyLFxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSB0aXRsZVNlcnZpY2U6IFRpdGxlLCBwcml2YXRlIEVycm9ySGFuZGxlcjogRXJyb3JNYXNzYWdlVmFsaWRhdGlvbiwgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lciwgcHVibGljIE1hcEF1dG9Db21wbGV0ZUNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUscHJpdmF0ZSBVdGlsaXR5U2VydmljZTpVdGlsaXR5U2VydmljZSxwcml2YXRlIHRyYW5zbGF0ZTogQkJTRlRyYW5zbGF0ZVNlcnZpY2UscHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6Q29udHJvbFZhbGlkYXRpb25TZXJ2aWNlKSB7XHJcbiAgICBNYXBBdXRvQ29tcGxldGVDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICAgIHRoaXMuQ3VycmVudExhbmd1YWdlID0gdHJhbnNsYXRlLmN1cnJlbnRMYW5nICE9IHVuZGVmaW5lZCA/IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyA6IHRyYW5zbGF0ZS5kZWZhdWx0TGFuZ1xyXG5cclxuICB9XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBNYXBBdXRvQ29tcGxldGVPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBNYXBBdXRvQ29tcGxldGVNb2RlbDogTWFwQXV0b2NvbXBsZXRlRFRPPW5ldyBNYXBBdXRvY29tcGxldGVEVE8oKTtcclxuICBDdXJyZW50TGFuZ3VhZ2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgb25BdXRvY29tcGxldGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBvbkdlcm1hbkFkZHJlc3NNYXBwZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgb25Mb2NhdGlvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBWaWV3Q2hpbGQoXCJzZWFyY2hcIiwge3N0YXRpYzpmYWxzZX0pXHJcbiAgcHVibGljIHNlYXJjaEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XHJcbiAgTWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZUNvbXBvbmVudDogTWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gIExhenlNYXBzQVBJTG9hZGVyOiBMYXp5TWFwc0FQSUxvYWRlclxyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6Ym9vbGVhbj1mYWxzZTtcclxuICB2YWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuaXNDcmVhdGVkQmVmb3IgPSBmYWxzZVxyXG5cclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWw9IG5ldyBNYXBBdXRvY29tcGxldGVEVE8oKTtcclxuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuQ3VycmVudExhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgICAgO1xyXG4gICAgICBpZiAodGhpcy5DdXJyZW50TGFuZ3VhZ2UgPT0gJ2FyJylcclxuICAgICAgICB0aGlzLm1hcHNBUElMb2FkZXJbXCJfY29uZmlnXCJdW1wibG9jYWxlSWRcIl0gPSBcImFyLUVHXCI7XHJcbiAgICAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnZW4nKVxyXG4gICAgICAgIHRoaXMubWFwc0FQSUxvYWRlcltcIl9jb25maWdcIl1bXCJsb2NhbGVJZFwiXSA9IFwiZW4tVVNcIjtcclxuICAgICAgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX3NjcmlwdExvYWRpbmdQcm9taXNlXCJdID0gbnVsbFxyXG4gICAgICB0aGlzLm1hcHNBUElMb2FkZXJbXCJfY29uZmlnXCJdW1wiYXBpS2V5XCJdID0gYEFJemFTeUE3NW9qaFpoRWhEYU8zdmZuM214VFkzMnNxNWZsQXdsWSZsYW5ndWFnZT0ke3RoaXMuQ3VycmVudExhbmd1YWdlfWA7XHJcbiAgICAgIHZhciBTY3JpcHRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1hcHNBUElMb2FkZXJbXCJfU0NSSVBUX0lEXCJdKTtcclxuICAgICAgaWYgKFNjcmlwdFRhZylcclxuICAgICAgICBTY3JpcHRUYWcucmVtb3ZlKCk7XHJcbiAgICAgIHZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJwYWMtY29udGFpbmVyXCIpO1xyXG4gICAgICB3aGlsZSAoZWxlbWVudHMubGVuZ3RoID4gMClcclxuICAgICAgICBlbGVtZW50c1swXS5yZW1vdmUoKTtcclxuXHJcbiAgICAgIGxldCB3aW5kb3cgPSB0aGlzLm1hcHNBUElMb2FkZXJbXCJfd2luZG93UmVmXCJdLmdldE5hdGl2ZVdpbmRvdygpO1xyXG4gICAgICB3aW5kb3cuZ29vZ2xlID0gbnVsbFxyXG5cclxuXHJcblxyXG4gICAgICB0aGlzLkxhenlNYXBzQVBJTG9hZGVyID0gbmV3IExhenlNYXBzQVBJTG9hZGVyKHtcclxuICAgICAgICAvLyAmbGFuZ3VhZ2U9JHtVdGlsaXR5U2VydmljZS5DdXJyZW50TGFuZ3VhZ2V9XHJcbiAgICAgICAgYXBpS2V5OiBgQUl6YVN5QTc1b2poWmhFaERhTzN2Zm4zbXhUWTMyc3E1ZmxBd2xZJmxhbmd1YWdlPSR7dGhpcy5DdXJyZW50TGFuZ3VhZ2V9YCxcclxuICAgICAgICBsaWJyYXJpZXM6IFsncGxhY2VzJ10sXHJcbiAgICAgIH0sIHRoaXMubWFwc0FQSUxvYWRlcltcIl93aW5kb3dSZWZcIl0sIHRoaXMubWFwc0FQSUxvYWRlcltcIl9kb2N1bWVudFJlZlwiXSwgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImxvY2FsZUlkXCJdKTtcclxuICAgICAgdGhpcy5MYXp5TWFwc0FQSUxvYWRlci5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgbGV0IGF1dG9jb21wbGV0ZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKHRoaXMuc2VhcmNoRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgICAgICB0eXBlczogW1wiYWRkcmVzc1wiXVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgICBhdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoLyoqXHJcbiAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99XHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgvKipcclxuICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99XHJcbiAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBsYWNlIHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2UgPSBhdXRvY29tcGxldGUuZ2V0UGxhY2UoKTtcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGdlcm1hbkFkZHJlc3MgPSB7XHJcbiAgICAgICAgICAgICAgICAgIGdtSUQ6IHBsYWNlLmlkLFxyXG4gICAgICAgICAgICAgICAgICBpY29uOiBwbGFjZS5pY29uLFxyXG4gICAgICAgICAgICAgICAgICB1cmw6IHBsYWNlLnVybCxcclxuICAgICAgICAgICAgICAgICAgcGxhY2VJRDogcGxhY2UucGxhY2VfaWQsXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlBZGRyZXNzOiBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogcGxhY2UubmFtZSxcclxuICAgICAgICAgICAgICAgICAgdmljaW5pdHk6IHBsYWNlLnZpY2luaXR5LFxyXG4gICAgICAgICAgICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiB7fSxcclxuICAgICAgICAgICAgICAgICAgY291bnRyeToge30sXHJcbiAgICAgICAgICAgICAgICAgIGdlb0xvY2F0aW9uOiB7IGxhdGl0dWRlOiAtMSwgbG9uZ2l0dWRlOiAtMSB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocGxhY2UuZ2VvbWV0cnkgJiYgcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5nZW9Mb2NhdGlvbi5sYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xyXG4gICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmdlb0xvY2F0aW9uLmxvbmdpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2goKC8qKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N0cmVldF9udW1iZXInKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3RyZWV0TnVtYmVyXCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3JvdXRlJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzc1tcInN0cmVldE5hbWVcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdwb3N0YWxfY29kZScpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJwb3N0YWxDb2RlXCJdID0gTnVtYmVyKHZhbHVlLnNob3J0X25hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3VibG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3VibG9jYWxpdHlcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdsb2NhbGl0eScpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MubG9jYWxpdHlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMScpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5zdGF0ZVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2NvdW50cnknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmNvdW50cnlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8zJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkdlcm1hbkFkZHJlc3NNYXBwZWQuZW1pdChnZXJtYW5BZGRyZXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuR2VybWFuQWRkcmVzc01hcHBlZChnZXJtYW5BZGRyZXNzKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFwbGFjZS5wbGFjZV9pZCB8fCBwbGFjZS5nZW9tZXRyeSA9PT0gdW5kZWZpbmVkIHx8IHBsYWNlLmdlb21ldHJ5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHBsYWNlIHJlc3VsdCBpcyBub3QgdmFsaWRcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHNob3cgZGlhbG9nIHRvIHNlbGVjdCBhIGFkZHJlc3MgZnJvbSB0aGUgaW5wdXRcclxuICAgICAgICAgICAgICAgICAgLy8gZW1pdCBmYWlsZWQgZXZlbnRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hZGRyZXNzID0gcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQuZW1pdChwbGFjZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkF1dG9jb21wbGV0ZVNlbGVjdGVkKHBsYWNlKVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25Mb2NhdGlvblNlbGVjdGVkLmVtaXQoe1xyXG4gICAgICAgICAgICAgICAgICBsYXRpdHVkZTogcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCksXHJcbiAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIDtcclxuICAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnYXInKVxyXG4gICAgICB0aGlzLm1hcHNBUElMb2FkZXJbXCJfY29uZmlnXCJdW1wibG9jYWxlSWRcIl0gPSBcImFyLUVHXCI7XHJcbiAgICBpZiAodGhpcy5DdXJyZW50TGFuZ3VhZ2UgPT0gJ2VuJylcclxuICAgICAgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImxvY2FsZUlkXCJdID0gXCJlbi1VU1wiO1xyXG4gICAgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX3NjcmlwdExvYWRpbmdQcm9taXNlXCJdID0gbnVsbFxyXG4gICAgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImFwaUtleVwiXSA9IGBBSXphU3lBNzVvamhaaEVoRGFPM3ZmbjNteFRZMzJzcTVmbEF3bFkmbGFuZ3VhZ2U9JHt0aGlzLkN1cnJlbnRMYW5ndWFnZX1gO1xyXG4gICAgdmFyIGxlZnRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tYXBzQVBJTG9hZGVyW1wiX1NDUklQVF9JRFwiXSk7XHJcbiAgICBpZiAobGVmdFNlY3Rpb24pXHJcbiAgICAgIGxlZnRTZWN0aW9uLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5MYXp5TWFwc0FQSUxvYWRlciA9IG5ldyBMYXp5TWFwc0FQSUxvYWRlcih7XHJcbiAgICAgIGFwaUtleTogYEFJemFTeUE3NW9qaFpoRWhEYU8zdmZuM214VFkzMnNxNWZsQXdsWSZsYW5ndWFnZT0ke3RoaXMuQ3VycmVudExhbmd1YWdlfWAsXHJcbiAgICAgIGxpYnJhcmllczogWydwbGFjZXMnXSxcclxuICAgIH0sIHRoaXMubWFwc0FQSUxvYWRlcltcIl93aW5kb3dSZWZcIl0sIHRoaXMubWFwc0FQSUxvYWRlcltcIl9kb2N1bWVudFJlZlwiXSwgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImxvY2FsZUlkXCJdKTtcclxuICAgIHRoaXMuTGF6eU1hcHNBUElMb2FkZXIubG9hZCgpO1xyXG4gICAgXHJcbiAgICB0aGlzLm1hcHNBUElMb2FkZXIubG9hZCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICBsZXQgYXV0b2NvbXBsZXRlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGUodGhpcy5zZWFyY2hFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgICB0eXBlczogW1wiYWRkcmVzc1wiXVxyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSlcclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMuTmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sID0gdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMuTmFtZV07IC8vICBuZXcgRm9ybUNvbnRyb2woJycsdmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIFxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLm9wdGlvbnMuTGFiZWxLZXkhPW51bGwmJnRoaXMub3B0aW9ucy5MYWJlbEtleSE9XCJcIilcclxuICAgIHRoaXMub3B0aW9ucy5MYWJlbFZhbHVlPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUodGhpcy5vcHRpb25zLkxhYmVsS2V5KTtcclxuXHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXNhc3luYyk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLklzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLm9wdGlvbnMuVmFsdWUgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMuVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSBcclxuICAgIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zPXRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcbiAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZUNvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpPT57XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpXHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZD10cnVlXHJcbiAgICB9KVxyXG5cclxuXHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLk5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3RbaW5kZXhdLktleSwgdGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3RbaW5kZXhdLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuIFxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PntcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLlJlbW92ZUdsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBzaG93R2xvYmFsRXJyb3IoKXtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKClcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmKHRoaXMubWFya0FsbEFzVG91Y2hlZCYmdGhpcy5ncm91cC5pbnZhbGlkKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKClcclxuICAgICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQ9ZmFsc2VcclxuICAgIH1cclxuICAgXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKEVycm9yTGlzdCwgdGhpcy5ncm91cCwgdGhpcy5vcHRpb25zKTtcclxufVxyXG5cclxuICBBdXRvY29tcGxldGVTZWxlY3RlZChyZXN1bHQpIHtcclxuXHJcblxyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbCA9PSBuZXcgTWFwQXV0b2NvbXBsZXRlRFRPKCk7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsLlRleHQgPSByZXN1bHQuZm9ybWF0dGVkX2FkZHJlc3M7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsLlBsYWNlSUQgPSByZXN1bHQucGxhY2VfaWQ7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsLkdvb2dsZU1hcHNVUkwgPSByZXN1bHQudXJsO1xyXG4gIH1cclxuICBMb2NhdGlvblNlbGVjdGVkKGxvY2F0aW9uKSB7XHJcblxyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5MYXRpdHVkZSA9IGxvY2F0aW9uLmxhdGl0dWRlO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5Mb25naXR1ZGUgPSBsb2NhdGlvbi5sb25naXR1ZGU7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xyXG5cclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgfVxyXG5cclxuICBHZXJtYW5BZGRyZXNzTWFwcGVkKHJlc3VsdCkge1xyXG4gIFxyXG4gICBcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwgPT0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0ID0gcmVzdWx0LmRpc3BsYXlBZGRyZXNzO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5QbGFjZUlEID0gcmVzdWx0LnBsYWNlSUQ7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsLkdvb2dsZU1hcHNVUkwgPSByZXN1bHQudXJsO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5MYXRpdHVkZSA9IHJlc3VsdC5nZW9Mb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwuTG9uZ2l0dWRlID0gcmVzdWx0Lmdlb0xvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXS5zZXRWYWx1ZSh0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsKVxyXG4gICAgdGhpcy5PbkNoYW5nZS5lbWl0KHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wudmFsdWUpXHJcbiAgfVxyXG5cclxuICAgIC8vRXh0ZXJuYWwgTWV0aG9kXHJcblxyXG4gIFJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG4gICAgLy9FeHRlcm5hbCBNZXRob2RcclxuXHJcbiAgQWRkUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucylcclxuICB9XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZEN1c3RvbVZhbGlkYXRpb24odGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsQ3VzdG9tVmFsaWRhdGlvbilcclxuICB9XHJcblxyXG4gICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gICBJc1ZhbGlkID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Jc1ZhbGlkKHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wpXHJcbiAgfVxyXG59XHJcblxyXG5cclxuIl19