@bpost/bp-address-auto-complete-by-component 1.1.7 → 1.1.9

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 (106) hide show
  1. package/esm2020/lib/box-number/box-number.component.mjs +921 -0
  2. package/esm2020/lib/lib-address-autocomplete-by-component.component.mjs +1420 -0
  3. package/esm2020/lib/lib-address-autocomplete-by-component.module.mjs +65 -0
  4. package/esm2020/lib/lib-address-autocomplete-by-component.service.mjs +14 -0
  5. package/esm2020/lib/locality/locality.component.mjs +777 -0
  6. package/esm2020/lib/model/Box.mjs +30 -0
  7. package/esm2020/lib/model/Locality.mjs +30 -0
  8. package/esm2020/lib/model/Street.mjs +30 -0
  9. package/esm2020/lib/model/query-parameters.model.mjs +21 -0
  10. package/esm2020/lib/services/adress.service.mjs +64 -0
  11. package/esm2020/lib/services/http.service.mjs +57 -0
  12. package/esm2020/lib/services/locale.service.mjs +37 -0
  13. package/esm2020/lib/services/nis9.service.mjs +26 -0
  14. package/esm2020/lib/services/unicode.service.mjs +376 -0
  15. package/esm2020/lib/street/street.component.mjs +766 -0
  16. package/esm2020/lib/street-number/street-number.component.mjs +1008 -0
  17. package/{esm2022 → esm2020}/lib/utils/constants.mjs +2 -2
  18. package/esm2020/lib/utils/domhandler.mjs +47 -0
  19. package/esm2020/lib/utils/highlight-suggestion.pipe.mjs +62 -0
  20. package/esm2020/lib/utils/prefill-data.mjs +24 -0
  21. package/esm2020/lib/utils/prefilled-parameters.mjs +23 -0
  22. package/esm2020/lib/utils/preflll.event.mjs +7 -0
  23. package/esm2020/lib/utils/visible-suggestion.directive.mjs +39 -0
  24. package/{fesm2022 → fesm2015}/bpost-bp-address-auto-complete-by-component.mjs +1257 -1437
  25. package/fesm2015/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  26. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs +5779 -0
  27. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  28. package/lib/lib-address-autocomplete-by-component.component.d.ts +1 -1
  29. package/lib/lib-address-autocomplete-by-component.module.d.ts +15 -0
  30. package/package.json +11 -5
  31. package/VERSION.md +0 -197
  32. package/esm2022/lib/box-number/box-number.component.mjs +0 -939
  33. package/esm2022/lib/lib-address-autocomplete-by-component.component.mjs +0 -1432
  34. package/esm2022/lib/lib-address-autocomplete-by-component.module.mjs +0 -45
  35. package/esm2022/lib/lib-address-autocomplete-by-component.service.mjs +0 -17
  36. package/esm2022/lib/locality/locality.component.mjs +0 -832
  37. package/esm2022/lib/model/Box.mjs +0 -35
  38. package/esm2022/lib/model/Locality.mjs +0 -35
  39. package/esm2022/lib/model/Street.mjs +0 -35
  40. package/esm2022/lib/model/query-parameters.model.mjs +0 -23
  41. package/esm2022/lib/services/adress.service.mjs +0 -69
  42. package/esm2022/lib/services/http.service.mjs +0 -61
  43. package/esm2022/lib/services/locale.service.mjs +0 -39
  44. package/esm2022/lib/services/nis9.service.mjs +0 -28
  45. package/esm2022/lib/services/unicode.service.mjs +0 -380
  46. package/esm2022/lib/street/street.component.mjs +0 -809
  47. package/esm2022/lib/street-number/street-number.component.mjs +0 -1026
  48. package/esm2022/lib/utils/domhandler.mjs +0 -51
  49. package/esm2022/lib/utils/highlight-suggestion.pipe.mjs +0 -76
  50. package/esm2022/lib/utils/prefill-data.mjs +0 -26
  51. package/esm2022/lib/utils/prefilled-parameters.mjs +0 -25
  52. package/esm2022/lib/utils/preflll.event.mjs +0 -9
  53. package/esm2022/lib/utils/visible-suggestion.directive.mjs +0 -41
  54. package/fesm2022/bpost-bp-address-auto-complete-by-component.mjs.map +0 -1
  55. package/install-and-start-demo.bat +0 -11
  56. package/tutorial/aacwidget-tutorial/.editorconfig +0 -16
  57. package/tutorial/aacwidget-tutorial/angular.json +0 -128
  58. package/tutorial/aacwidget-tutorial/browserslist +0 -13
  59. package/tutorial/aacwidget-tutorial/e2e/protractor.conf.js +0 -32
  60. package/tutorial/aacwidget-tutorial/e2e/src/app.e2e-spec.ts +0 -23
  61. package/tutorial/aacwidget-tutorial/e2e/src/app.po.ts +0 -11
  62. package/tutorial/aacwidget-tutorial/e2e/tsconfig.json +0 -13
  63. package/tutorial/aacwidget-tutorial/karma.conf.js +0 -32
  64. package/tutorial/aacwidget-tutorial/package-lock.json +0 -13314
  65. package/tutorial/aacwidget-tutorial/src/app/app-routing.module.ts +0 -18
  66. package/tutorial/aacwidget-tutorial/src/app/app.component.html +0 -6
  67. package/tutorial/aacwidget-tutorial/src/app/app.component.scss +0 -0
  68. package/tutorial/aacwidget-tutorial/src/app/app.component.spec.ts +0 -35
  69. package/tutorial/aacwidget-tutorial/src/app/app.component.ts +0 -28
  70. package/tutorial/aacwidget-tutorial/src/app/app.module.ts +0 -47
  71. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.html +0 -57
  72. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.scss +0 -0
  73. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.ts +0 -160
  74. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.html +0 -20
  75. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.scss +0 -0
  76. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.spec.ts +0 -25
  77. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.ts +0 -49
  78. package/tutorial/aacwidget-tutorial/src/assets/.gitkeep +0 -0
  79. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/de.json +0 -62
  80. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/en.json +0 -62
  81. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/fr.json +0 -62
  82. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/nl.json +0 -62
  83. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/scss/aacwidget-custom.scss +0 -81
  84. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/scss/aacwidget-default.scss +0 -424
  85. package/tutorial/aacwidget-tutorial/src/environments/environment.prod.ts +0 -3
  86. package/tutorial/aacwidget-tutorial/src/environments/environment.ts +0 -16
  87. package/tutorial/aacwidget-tutorial/src/favicon.ico +0 -0
  88. package/tutorial/aacwidget-tutorial/src/index.html +0 -45
  89. package/tutorial/aacwidget-tutorial/src/main.ts +0 -12
  90. package/tutorial/aacwidget-tutorial/src/polyfills.ts +0 -63
  91. package/tutorial/aacwidget-tutorial/src/styles.scss +0 -4
  92. package/tutorial/aacwidget-tutorial/src/test.ts +0 -25
  93. package/tutorial/aacwidget-tutorial/tsconfig.app.json +0 -15
  94. package/tutorial/aacwidget-tutorial/tsconfig.json +0 -23
  95. package/tutorial/aacwidget-tutorial/tsconfig.spec.json +0 -18
  96. package/tutorial/aacwidget-tutorial/tslint.json +0 -148
  97. package/tutorial/tutorial-videos.txt +0 -41
  98. /package/{esm2022 → esm2020}/bpost-bp-address-auto-complete-by-component.mjs +0 -0
  99. /package/{esm2022 → esm2020}/lib/enum/address-level.enum.mjs +0 -0
  100. /package/{esm2022 → esm2020}/lib/enum/index.mjs +0 -0
  101. /package/{esm2022 → esm2020}/lib/enum/input-name.enum.mjs +0 -0
  102. /package/{esm2022 → esm2020}/lib/enum/source-type.enum.mjs +0 -0
  103. /package/{esm2022 → esm2020}/lib/enum/suggestion-level-type.enum.mjs +0 -0
  104. /package/{esm2022 → esm2020}/lib/enum/validation-message-option-type.enum.mjs +0 -0
  105. /package/{esm2022 → esm2020}/lib/enum/validation-message-type.enum.mjs +0 -0
  106. /package/{esm2022 → esm2020}/public-api.mjs +0 -0
@@ -1,809 +0,0 @@
1
- import { __values } from "tslib";
2
- import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
3
- import { ValidationMessageType } from '../enum/validation-message-type.enum';
4
- import { DomHandler } from '../utils/domhandler';
5
- import { ADDRESSLEVEL } from '../enum/address-level.enum';
6
- import { QueryParameters } from '../model/query-parameters.model';
7
- import { SourceType } from '../enum/source-type.enum';
8
- import { PrefillEvent } from '../utils/preflll.event';
9
- import { InputNameType } from '../enum/input-name.enum';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../services/adress.service";
12
- import * as i2 from "../services/locale.service";
13
- import * as i3 from "@ngx-translate/core";
14
- import * as i4 from "../services/unicode.service";
15
- var StreetComponent = /** @class */ (function () {
16
- function StreetComponent(addressService, localeService, translateService, unicodeService) {
17
- this.addressService = addressService;
18
- this.localeService = localeService;
19
- this.translateService = translateService;
20
- this.unicodeService = unicodeService;
21
- this.subscription = null;
22
- // 2020-06-15
23
- /* @Input()
24
- onFocusShowSuggestionsAfterPrefill = true; */
25
- this.labelResourceKey = 'common.label.streetName';
26
- this.maxSuggesionCount = 5;
27
- this.visibleSuggesionCount = 5;
28
- this.sortCriteria = '';
29
- this.showDebugMessageToConsole = true;
30
- this.messageOption = 'Y';
31
- this.isReadonly = false;
32
- this.messageChanged = new EventEmitter();
33
- this.addressChanged = new EventEmitter();
34
- this.focusEvent = new EventEmitter();
35
- this.blurEvent = new EventEmitter();
36
- this.textChangeEvent = new EventEmitter();
37
- this.clearInputEventEmitter = new EventEmitter();
38
- this.prefillEventEmitter = new EventEmitter();
39
- this.numberOfExceptionsEmitter = new EventEmitter();
40
- this.validationMessageCode = null;
41
- this.validationMessageOptions = null;
42
- this.prefilling = false;
43
- this.isPrefillWithNoMatch = false;
44
- }
45
- Object.defineProperty(StreetComponent.prototype, "inputLang", {
46
- // @ts-ignore
47
- set: function (val) {
48
- var _this = this;
49
- this.localeService.changeLang(val);
50
- this.translateService.use(val).subscribe(function (res) {
51
- _this.onChangedLanguage();
52
- });
53
- },
54
- enumerable: false,
55
- configurable: true
56
- });
57
- StreetComponent.prototype.ngOnInit = function () {
58
- this.searchText = '';
59
- // instance properties
60
- this.addressIsValidated = false;
61
- this.suggestionValidationMessage = '';
62
- this.suggestions = [];
63
- this.previousIndex = -1;
64
- this.lastSearchValue = '';
65
- this.wordList = [];
66
- this.suggestionsWordList = [];
67
- this.bpTypeAhead = '';
68
- this.placeHolderText = '';
69
- this.skipNextBlur = false; // OnBlur is triggered when the user clicks suggestion/validator button
70
- this.errorCode = null;
71
- // scope properties
72
- this.selectedIndex = -1;
73
- // properties
74
- this.typeAheadWord = '';
75
- this.collapseDropdown = false;
76
- this.sequenceNumber = 1;
77
- this.consumedNumber = 1;
78
- // initialization
79
- this.setSearchText('');
80
- // this.setPlaceHolderText();
81
- this.onChangedLanguage();
82
- };
83
- StreetComponent.prototype.ngOnDestroy = function () {
84
- if (this.subscription) {
85
- this.subscription.unsubscribe();
86
- }
87
- };
88
- StreetComponent.prototype.onChangedLanguage = function () {
89
- var _this = this;
90
- // this.placeHolderText = this.translateService.instant('street.placeholder.input-placeholder');
91
- this.translateService.get('street.placeholder.input-placeholder')
92
- .subscribe(function (res) {
93
- // console.log('new placeholder', res);
94
- // => 'hello world'
95
- _this.placeHolderText = res;
96
- });
97
- };
98
- StreetComponent.prototype.ngAfterViewChecked = function () {
99
- if (this.selectionChanged) {
100
- var overlay_1 = this.streetList.nativeElement;
101
- setTimeout(function () {
102
- var listItem = DomHandler.findSingle(overlay_1, 'li.active');
103
- if (listItem) {
104
- DomHandler.scrollInView(overlay_1, listItem);
105
- }
106
- }, 1);
107
- this.selectionChanged = false;
108
- }
109
- };
110
- StreetComponent.prototype.ngOnChanges = function (changes) {
111
- if (changes) {
112
- if (changes.hasOwnProperty('prefillData') && !changes.prefillData.firstChange) {
113
- this.prefilling = true;
114
- this.searchText = this.loadParams(changes.prefillData.currentValue);
115
- if (this.searchText !== '' && this.minLevel === ADDRESSLEVEL.STREET) {
116
- /*
117
- this.onInputChange('prefilled');
118
- this.streetSearchInput.nativeElement.focus();
119
- */
120
- /*
121
- this.prefilling = true;
122
- this.collapseDropdown = true;
123
- this.prefillMunicipalityName = this.transformMunicipalityInLowercaseAndWithoutDiacritics(this.addressParams.municipalityName);
124
- this.onInputChange(/*'prefilled'* / // this.SOURCE_PREFILLED );
125
- */
126
- this.collapseDropdown = true;
127
- this.prefillData.prefillStreetName
128
- = this.transformStreetNameInLowercaseAndWithoutDiacritics(this.prefillData.parameters.streetName);
129
- this.onInputChange(/*'prefilled'*/ SourceType.SOURCE_PREFILLED);
130
- }
131
- }
132
- if (changes.hasOwnProperty('inputText') && !changes.inputText.firstChange) {
133
- if (this.notEqualIgnoreCase(this.searchText, changes.inputText.currentValue)) {
134
- this.clearWidget();
135
- this.searchText = changes.inputText.currentValue;
136
- }
137
- }
138
- // Reset Street search bar on locality change/reset
139
- if (changes.hasOwnProperty('postalCode') && !changes.postalCode.firstChange && !changes.hasOwnProperty('prefillData')) {
140
- this.minLevel = ADDRESSLEVEL.STREET;
141
- if (changes.postalCode.currentValue === '') {
142
- this.clearWidget();
143
- this.valueChanged();
144
- }
145
- }
146
- }
147
- };
148
- StreetComponent.prototype.transformStreetNameInLowercaseAndWithoutDiacritics = function (streetName) {
149
- var result = null;
150
- if (streetName !== null && streetName !== undefined) {
151
- result = this.unicodeService.removeDiacritics(streetName);
152
- result = result.toLowerCase();
153
- }
154
- if (this.showDebugMessageToConsole) {
155
- console.log('prefill streetName', result);
156
- }
157
- return result;
158
- };
159
- StreetComponent.prototype.onClearInputEvent = function (event, focus) {
160
- this.clearInput(focus);
161
- };
162
- StreetComponent.prototype.onBlur = function (ev) {
163
- if (this.isBrowserIE() && this.isDropdownClicked(ev)) {
164
- this.streetSearchInput.nativeElement.focus();
165
- return;
166
- }
167
- if (this.skipNextBlur) {
168
- this.skipNextBlur = false;
169
- }
170
- else {
171
- this.collapseDropdown = true;
172
- this.blurEvent.emit(ADDRESSLEVEL.STREET);
173
- }
174
- };
175
- StreetComponent.prototype.isBrowserIE = function () {
176
- return /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
177
- };
178
- StreetComponent.prototype.isDropdownClicked = function (ev) {
179
- var target = ev.explicitOriginalTarget || document.activeElement;
180
- return (target.id === 'bpaac-street-dropdown');
181
- };
182
- StreetComponent.prototype.onFocus = function () {
183
- this.collapseDropdown = false;
184
- // this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
185
- // ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
186
- if (this.showDebugMessageToConsole) {
187
- console.log('street comp - onFocus', this.prefilling, this.prefillData, this.collapseDropdown);
188
- }
189
- // this.prefilling = false;
190
- this.skipNextBlur = false;
191
- this.focusEvent.emit(ADDRESSLEVEL.STREET);
192
- };
193
- StreetComponent.prototype.mayShowDropdown = function () {
194
- return this.suggestions.length > 0 && !this.collapseDropdown;
195
- };
196
- StreetComponent.prototype.buildInputWordList = function () {
197
- var e_1, _a, e_2, _b;
198
- this.wordList = this.searchText.split(/[\s, ]+/);
199
- // console.log('word list - street:', this.wordList);
200
- if (this.suggestions && this.wordList) {
201
- try {
202
- for (var _c = __values(this.suggestions), _d = _c.next(); !_d.done; _d = _c.next()) {
203
- var sug = _d.value;
204
- if (!sug || !sug.hasOwnProperty('string')) {
205
- continue;
206
- }
207
- var _loop_1 = function (w) {
208
- var start = this_1.startsWithIgnoreDiacritics(sug.string, w);
209
- if (start >= 0) {
210
- var ww_1 = sug.string.substr(start, w.length);
211
- // console.log('adding word:' + ww);
212
- // ww is a candidate to be added to the wordlist if not already present in it
213
- var present = this_1.wordList.find(function (w1) { return w1.toLowerCase() === ww_1.toLowerCase(); });
214
- if (present === null || present === undefined) {
215
- this_1.wordList.push(ww_1);
216
- }
217
- }
218
- };
219
- var this_1 = this;
220
- try {
221
- for (var _e = (e_2 = void 0, __values(this.wordList)), _f = _e.next(); !_f.done; _f = _e.next()) {
222
- var w = _f.value;
223
- _loop_1(w);
224
- }
225
- }
226
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
227
- finally {
228
- try {
229
- if (_f && !_f.done && (_b = _e["return"])) _b.call(_e);
230
- }
231
- finally { if (e_2) throw e_2.error; }
232
- }
233
- }
234
- }
235
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
236
- finally {
237
- try {
238
- if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
239
- }
240
- finally { if (e_1) throw e_1.error; }
241
- }
242
- }
243
- };
244
- StreetComponent.prototype.startsWithIgnoreDiacritics = function (value, prefix) {
245
- // console.log('Searching for prefix "' + prefix + '" inside suggestion: ' + value);
246
- // tslint:disable-next-line:variable-name
247
- var _value = this.unicodeService.removeDiacritics((value !== null && value !== undefined) ? value.toLowerCase() : value);
248
- // tslint:disable-next-line:variable-name
249
- var _prefix = this.unicodeService.removeDiacritics((prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix);
250
- var start = _value.indexOf(_prefix);
251
- // console.log('startsWithIgnoreDiacritics: ' + start);
252
- return start;
253
- };
254
- StreetComponent.prototype.mayAddTypeAhead = function () {
255
- if (this.searchText.length === 0) {
256
- return false;
257
- }
258
- return (/[^\s, \\\/]$/).test(this.searchText);
259
- };
260
- StreetComponent.prototype.valueChanged = function () {
261
- this.textChangeEvent.emit(this.searchText);
262
- };
263
- StreetComponent.prototype.buildTypeAhead = function (source) {
264
- if (source === SourceType.SOURCE_PREFILLED) {
265
- return false;
266
- }
267
- if (!this.mayAddTypeAhead()) {
268
- return;
269
- }
270
- var searchTextWords = this.searchText.split(/[\s, ]+/);
271
- var lastWord = searchTextWords[searchTextWords.length - 1];
272
- if (this.suggestions.some(function (sug) {
273
- if (!sug || !sug.hasOwnProperty('string')) {
274
- return false;
275
- }
276
- return sug.string.split(/[\s-]+/).some(function (word) {
277
- if (this.stringStartsWithIgnoreDiacritics(word, lastWord)) {
278
- this.typeAheadWord = word;
279
- return true;
280
- }
281
- }.bind(this));
282
- }.bind(this))) {
283
- var appendix = this.typeAheadWord.slice(lastWord.length, this.typeAheadWord.length).toLowerCase();
284
- this.bpTypeAhead = this.searchText + appendix;
285
- }
286
- };
287
- StreetComponent.prototype.stringStartsWithIgnoreDiacritics = function (value, prefix) {
288
- // tslint:disable-next-line:variable-name
289
- var _value = this.unicodeService.removeDiacritics((value !== null && value !== undefined) ? value.toLowerCase() : value);
290
- // tslint:disable-next-line:variable-name
291
- var _prefix = this.unicodeService.removeDiacritics((prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix);
292
- var start = _value.slice(0, _prefix.length).toLowerCase().indexOf(_prefix) !== -1;
293
- return start;
294
- };
295
- StreetComponent.prototype.getTopSuggestions = function (source) {
296
- var _this = this;
297
- this.sequenceNumber += 1;
298
- var param = this.generateParameters();
299
- if (this.showDebugMessageToConsole) {
300
- console.log('STREET calling service params', param);
301
- }
302
- if (this.searchText) {
303
- this.subscription = this.addressService.getStreet(this.baseUrl, this.locality, this.postalCode, param)
304
- .subscribe(function (response) {
305
- _this.handleGetStreetResponse(response, source);
306
- if (source === SourceType.SOURCE_PREFILLED) {
307
- _this.isPrefillWithNoMatch = _this.prefillData.prefillStreetPerfectMatchFound === true ? false : true;
308
- _this.prefillAnalyzeData();
309
- }
310
- else {
311
- _this.isPrefillWithNoMatch = false;
312
- }
313
- }, function () { return _this.handleGetStreetError(); });
314
- }
315
- };
316
- StreetComponent.prototype.getTextColor = function () {
317
- return (this.isPrefillWithNoMatch === true) ? 'orangered' : '';
318
- };
319
- StreetComponent.prototype.loadParams = function (prefillData) {
320
- var concatStr = '';
321
- if (prefillData !== null && prefillData.parameters !== null) {
322
- if (prefillData.parameters.hasOwnProperty('minLevel')) {
323
- this.minLevel = prefillData.parameters.minLevel;
324
- }
325
- /*
326
- if (params.hasOwnProperty('unstructuredAddress') && this.isString(params.unstructuredAddress)) {
327
- this.valueChanged();
328
- }
329
- */
330
- if (prefillData.parameters.hasOwnProperty('postalCode') && this.isString(prefillData.parameters.postalCode)) {
331
- this.postalCode = prefillData.parameters.postalCode;
332
- }
333
- if (prefillData.parameters.hasOwnProperty('municipalityName') && this.isString(prefillData.parameters.municipalityName)) {
334
- this.locality = prefillData.parameters.municipalityName;
335
- }
336
- if (prefillData.parameters.hasOwnProperty('streetName')
337
- && this.isString(prefillData.parameters.streetName) && this.isParamsComplete()) {
338
- concatStr = prefillData.parameters.streetName;
339
- }
340
- }
341
- return concatStr;
342
- };
343
- StreetComponent.prototype.isString = function (val) {
344
- if (val === null || val === undefined) {
345
- return false;
346
- }
347
- return val.constructor === String;
348
- };
349
- StreetComponent.prototype.isValid = function (val) {
350
- return this.isString(val) && val !== '';
351
- };
352
- StreetComponent.prototype.isParamsComplete = function () {
353
- if (!this.validatedByBackend) {
354
- return this.isValid(this.postalCode) || this.isValid(this.locality);
355
- }
356
- else {
357
- return this.isValid(this.postalCode) && this.isValid(this.locality);
358
- }
359
- };
360
- StreetComponent.prototype.generateParameters = function () {
361
- var param = new QueryParameters({
362
- id: this.sequenceNumber,
363
- q: this.searchText,
364
- postalCode: this.postalCode,
365
- locality: this.locality,
366
- maxNumberOfSuggestions: this.maxSuggesionCount
367
- });
368
- if (this.sortCriteria === 'S') {
369
- param.sortByStreet(true);
370
- }
371
- return param;
372
- };
373
- StreetComponent.prototype.handleGetStreetResponse = function (data, source) {
374
- if (data && data.response && data.response.sequenceNumber && data.response.sequenceNumber >= this.consumedNumber &&
375
- data.response.topSuggestions) {
376
- this.consumedNumber = data.response.sequenceNumber;
377
- this.clearSuggestions();
378
- this.parseTopSuggestions(data.response.topSuggestions, source);
379
- this.buildTypeAhead(source);
380
- this.clearConnectionErrorMessage();
381
- this.buildInputWordList();
382
- }
383
- this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
384
- ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
385
- };
386
- StreetComponent.prototype.handleGetStreetError = function () {
387
- if (this.allowNoValidation && this.validatedByBackend) {
388
- this.numberOfExceptions += 1;
389
- this.numberOfExceptionsEmitter.emit(this.numberOfExceptions);
390
- }
391
- this.setConnectionErrorMessage();
392
- };
393
- StreetComponent.prototype.setConnectionErrorMessage = function () {
394
- this.errorCode = /*'service-unavailable'*/ ValidationMessageType.Service_Unavailable;
395
- // this.setValidationMessage(this.errorCode);
396
- this.emitTranslatedValidationMessage(ValidationMessageType.Service_Unavailable);
397
- };
398
- StreetComponent.prototype.clearConnectionErrorMessage = function () {
399
- if (this.errorCode) {
400
- var res = this.translateService.instant(this.errorCode);
401
- if (this.suggestionValidationMessage === res) {
402
- this.clearSuggestionValidationMessage();
403
- }
404
- this.errorCode = null;
405
- }
406
- };
407
- StreetComponent.prototype.parseTopSuggestions = function (topSuggestions, source) {
408
- var e_3, _a;
409
- if (topSuggestions.constructor === Array) {
410
- try {
411
- // topSuggestions.forEach(this.parseSingleSuggestion.bind(this));
412
- for (var topSuggestions_1 = __values(topSuggestions), topSuggestions_1_1 = topSuggestions_1.next(); !topSuggestions_1_1.done; topSuggestions_1_1 = topSuggestions_1.next()) {
413
- var sug = topSuggestions_1_1.value;
414
- this.parseSingleSuggestion(sug, source);
415
- }
416
- }
417
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
418
- finally {
419
- try {
420
- if (topSuggestions_1_1 && !topSuggestions_1_1.done && (_a = topSuggestions_1["return"])) _a.call(topSuggestions_1);
421
- }
422
- finally { if (e_3) throw e_3.error; }
423
- }
424
- }
425
- else {
426
- this.parseSingleSuggestion(topSuggestions, source);
427
- }
428
- };
429
- StreetComponent.prototype.parseSingleSuggestion = function (suggestion, source) {
430
- var suggestionToAdd;
431
- if (this.localeService.isLocaleFrench() && suggestion.hasOwnProperty('french')) {
432
- suggestionToAdd = suggestion.french;
433
- }
434
- else if (this.localeService.isLocaleDutch() && suggestion.hasOwnProperty('dutch')) {
435
- suggestionToAdd = suggestion.dutch;
436
- }
437
- else if (this.localeService.isLocaleGerman() && suggestion.hasOwnProperty('german')) {
438
- suggestionToAdd = suggestion.german;
439
- }
440
- else if (suggestion.hasOwnProperty('address')) {
441
- suggestionToAdd = suggestion.address;
442
- }
443
- if (suggestionToAdd) {
444
- if (suggestion.messages) {
445
- suggestionToAdd.messages = suggestion.messages;
446
- }
447
- this.suggestions.push(suggestionToAdd);
448
- if (source === SourceType.SOURCE_PREFILLED) {
449
- suggestion.address = suggestionToAdd;
450
- this.prefillCheckForPerfectMatch(suggestion);
451
- }
452
- }
453
- };
454
- StreetComponent.prototype.prefillCheckForPerfectMatch = function (suggestion) {
455
- if (this.showDebugMessageToConsole) {
456
- console.log('street - checking suggestion for perfect match', this.prefillData, suggestion);
457
- }
458
- var sugAddress = suggestion.address;
459
- // if (sugAddress.streetName === this.prefillData.parameters.streetName )
460
- var suggestionLocality = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.localityName);
461
- var suggestionMunicipality = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.municipalityName);
462
- if (suggestionLocality === this.prefillData.prefillMunicipalityName
463
- || suggestionMunicipality === this.prefillData.prefillMunicipalityName) {
464
- var suggestionStreetName = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.streetName);
465
- // console.log('comparing street names', suggestionStreetName, this.prefillData.prefillStreetName);
466
- if (suggestionStreetName === this.prefillData.prefillStreetName) {
467
- this.prefillData.prefillStreetPerfectMatchFound = true;
468
- this.prefillData.prefillStreetPerfectMatchSuggestion = suggestion;
469
- this.searchText = sugAddress.streetName;
470
- }
471
- if (this.prefillData.prefillStreetPerfectMatchFound === true) {
472
- if (this.showDebugMessageToConsole) {
473
- console.log('STREET - PREFILL - Perfect match - street:', suggestion);
474
- }
475
- }
476
- else {
477
- if (this.showDebugMessageToConsole) {
478
- console.log('STREET - PREFILL - NO Perfect match:', suggestion);
479
- }
480
- }
481
- }
482
- };
483
- StreetComponent.prototype.onInputChange = function (source) {
484
- // console.log('street onInputChange : source ', source);
485
- this.collapseDropdown = false;
486
- this.resetArrowSelectedIndex();
487
- if (!source) {
488
- this.prefilling = false;
489
- this.valueChanged();
490
- }
491
- this.clearSuggestionValidationMessage();
492
- if (this.searchText === '') {
493
- this.sequenceNumber += 1;
494
- this.consumedNumber = this.sequenceNumber;
495
- this.clearSuggestions();
496
- }
497
- else {
498
- if (!this.validatedByBackend) {
499
- var suggestion = {
500
- 'string': this.searchText.toUpperCase(),
501
- 'municipalityName': this.locality ? this.locality.toLocaleUpperCase() : '',
502
- 'localityName': this.locality ? this.locality.toLocaleUpperCase() : '',
503
- 'postalCode': this.postalCode,
504
- 'searchBarString': this.searchText.toUpperCase(),
505
- 'streetName': this.searchText.toUpperCase()
506
- };
507
- this.setSelectedAddress(suggestion);
508
- }
509
- else {
510
- this.getTopSuggestions(source);
511
- }
512
- }
513
- this.buildInputWordList();
514
- };
515
- StreetComponent.prototype.prefillAnalyzeData = function () {
516
- if (this.prefillData.prefillStreetPerfectMatchFound === true) {
517
- this.collapseDropdown = true;
518
- }
519
- this.prefillEventEmitter.emit(new PrefillEvent(ADDRESSLEVEL.STREET, this.prefillData));
520
- };
521
- StreetComponent.prototype.clickSuggestion = function (event, suggestion) {
522
- this.isPrefillWithNoMatch = false;
523
- if (this.showDebugMessageToConsole) {
524
- console.log('streetNumber::clickSuggestion', event, suggestion);
525
- }
526
- event === null || event === void 0 ? void 0 : event.preventDefault();
527
- this.clearTypeAhead();
528
- this.resetArrowSelectedIndex();
529
- this.setSearchText(suggestion.string);
530
- this.collapseDropdown = true;
531
- // if (suggestion.hasOwnProperty('isComplete')) {
532
- // this.showAddressIsValidated();
533
- // }
534
- this.addressIsValidated = true;
535
- if (event) {
536
- this.clearSuggestions();
537
- }
538
- this.setSelectedAddress(suggestion);
539
- };
540
- StreetComponent.prototype.setSelectedAddress = function (suggestion) {
541
- this.addressChanged.emit(suggestion);
542
- };
543
- StreetComponent.prototype.clearSelectedAddress = function () {
544
- this.addressChanged.emit(null);
545
- this.addressIsValidated = false;
546
- };
547
- StreetComponent.prototype.emitTranslatedValidationMessage = function (validationMessageType, options) {
548
- // Momently, options are NOT used; so data type of these options will be reviewed once needed.
549
- if (validationMessageType === null || validationMessageType === undefined) {
550
- console.warn('Unable to emit validation message - message key is invalid!', validationMessageType);
551
- return;
552
- }
553
- switch (validationMessageType) {
554
- case ValidationMessageType.Address_Not_Found:
555
- case ValidationMessageType.Address_Validated:
556
- case ValidationMessageType.Service_Unavailable:
557
- {
558
- var message = this.translateService.instant(validationMessageType);
559
- // this.messageChanged.emit(message);
560
- this.messageChanged.emit({ messageType: validationMessageType, translatedMessage: message });
561
- }
562
- // tslint:disable-next-line:align
563
- break;
564
- default:
565
- {
566
- console.error('Unable to emit validation message - message key NOT supported!', validationMessageType);
567
- }
568
- // tslint:disable-next-line:align
569
- break;
570
- }
571
- };
572
- StreetComponent.prototype.showAddressIsValidated = function () {
573
- // this.setValidationMessage('address-validated');
574
- this.emitTranslatedValidationMessage(ValidationMessageType.Address_Validated);
575
- };
576
- StreetComponent.prototype.checkKeyDown = function (event) {
577
- switch (event.which) {
578
- // down key, increment selectedIndex
579
- case 40:
580
- event.preventDefault();
581
- this.moveArrowSelectedIndexDown();
582
- break;
583
- // up key, decrement selectedIndex
584
- case 38:
585
- event.preventDefault();
586
- this.moveArrowSelectedIndexUp();
587
- break;
588
- // right arrow key
589
- case 39:
590
- event.preventDefault();
591
- if (this.cursorIsOnSuggestionList()) {
592
- this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
593
- }
594
- else {
595
- if (this.typeAheadWord && this.typeAheadIsShown()) {
596
- this.setSearchText(this.bpTypeAhead);
597
- this.typeAheadWord = '';
598
- }
599
- }
600
- break;
601
- // tab key
602
- case 9:
603
- if (!this.addressIsValidated && !event.shiftKey) {
604
- event.preventDefault();
605
- this.selectFirstInListOfSuggesions();
606
- }
607
- break;
608
- case 46:
609
- if (event.ctrlKey) {
610
- this.clearWidget();
611
- }
612
- break;
613
- // enter pressed
614
- case 13:
615
- event.preventDefault();
616
- if (this.cursorIsOnSuggestionList()) {
617
- this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
618
- }
619
- else {
620
- }
621
- break;
622
- default:
623
- this.clearTypeAhead();
624
- break;
625
- }
626
- };
627
- StreetComponent.prototype.clearWidget = function () {
628
- this.addressIsValidated = false;
629
- this.clearSearchText();
630
- this.clearSuggestions();
631
- this.clearTypeAhead();
632
- this.prefillData = null;
633
- this.prefilling = false;
634
- };
635
- StreetComponent.prototype.clearSearchText = function () {
636
- this.searchText = '';
637
- };
638
- StreetComponent.prototype.typeAheadIsShown = function () {
639
- return this.bpTypeAhead && this.bpTypeAhead.length > 0;
640
- };
641
- StreetComponent.prototype.resetArrowSelectedIndex = function () {
642
- this.selectedIndex = -1;
643
- };
644
- StreetComponent.prototype.moveArrowSelectedIndexDown = function () {
645
- if (this.selectedIndex + 1 !== this.suggestions.length) {
646
- this.selectedIndex++;
647
- this.changeSelection();
648
- this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
649
- }
650
- };
651
- StreetComponent.prototype.moveArrowSelectedIndexUp = function () {
652
- if (this.selectedIndex - 1 !== -2) {
653
- this.selectedIndex--;
654
- this.changeSelection();
655
- this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex + 1);
656
- }
657
- };
658
- StreetComponent.prototype.cursorIsOnSuggestionList = function () {
659
- return this.selectedIndex >= 0;
660
- };
661
- StreetComponent.prototype.setSearchTextBasedOnArrowSelection = function (newVal, oldVal) {
662
- if (newVal === undefined || this.suggestions.length <= 0) {
663
- return;
664
- }
665
- if (newVal !== -1) {
666
- if (oldVal === -1) {
667
- this.lastSearchValue = this.searchText;
668
- }
669
- this.setSearchText(this.suggestions[this.selectedIndex].string);
670
- this.clearTypeAhead();
671
- }
672
- else {
673
- this.setSearchText(this.lastSearchValue);
674
- }
675
- };
676
- StreetComponent.prototype.mayShowClearButton = function () {
677
- return this.searchText.length > 0;
678
- };
679
- StreetComponent.prototype.clearInput = function (focus, emit) {
680
- if (emit === void 0) { emit = true; }
681
- // console.warn('street clearInput called ...', focus, emit);
682
- this.clearWidget();
683
- this.resetArrowSelectedIndex();
684
- this.previousIndex = -1;
685
- this.lastSearchValue = '';
686
- this.clearSuggestionValidationMessage();
687
- this.valueChanged();
688
- this.clearConnectionErrorMessage();
689
- if (focus === true) {
690
- // console.warn('street clearInput - set focus !!!', focus);
691
- this.streetSearchInput.nativeElement.focus();
692
- }
693
- if (emit) {
694
- this.clearInputEventEmitter.emit(/*'STREET'*/ InputNameType.STREET);
695
- }
696
- };
697
- StreetComponent.prototype.clearSuggestions = function () {
698
- this.wordList = [];
699
- this.suggestions = [];
700
- this.suggestionsWordList = [];
701
- };
702
- StreetComponent.prototype.clearTypeAhead = function () {
703
- this.bpTypeAhead = '';
704
- };
705
- StreetComponent.prototype.clearSuggestionValidationMessage = function () {
706
- this.suggestionValidationMessage = '';
707
- this.addressIsValidated = false;
708
- // this.messageChanged.emit(this.suggestionValidationMessage);
709
- this.messageChanged.emit({ messageType: null, translatedMessage: this.suggestionValidationMessage });
710
- this.validationMessageOptions = null;
711
- this.validationMessageCode = null;
712
- };
713
- StreetComponent.prototype.setSearchText = function (value) {
714
- this.searchText = value;
715
- };
716
- StreetComponent.prototype.selectFirstInListOfSuggesions = function () {
717
- this.selectedIndex = 0;
718
- this.changeSelection();
719
- this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
720
- };
721
- StreetComponent.prototype.changeSelection = function () {
722
- if (this.suggestions.length > 0) {
723
- this.selectionChanged = true;
724
- }
725
- };
726
- StreetComponent.prototype.suggestionMouseLeave = function () {
727
- this.selectedIndex = -1;
728
- };
729
- StreetComponent.prototype.notEqualIgnoreCase = function (oldVal, newVal) {
730
- return oldVal.toLowerCase() !== newVal.toLowerCase();
731
- };
732
- StreetComponent.prototype.showAddressNotFoundMessage = function () {
733
- // this.setValidationMessage('address-not-found');
734
- this.emitTranslatedValidationMessage(ValidationMessageType.Address_Not_Found);
735
- };
736
- StreetComponent.prototype.isDisabled = function () {
737
- return (this.locality === '' || this.postalCode === '' || this.minLevel > ADDRESSLEVEL.STREET);
738
- };
739
- StreetComponent.prototype.onInputClick = function () {
740
- if (this.showDebugMessageToConsole) {
741
- console.log('street click');
742
- }
743
- this.prefilling = false;
744
- this.collapseDropdown = false;
745
- };
746
- StreetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: StreetComponent, deps: [{ token: i1.AddressService }, { token: i2.LocaleService }, { token: i3.TranslateService }, { token: i4.UnicodeService }], target: i0.ɵɵFactoryTarget.Component });
747
- StreetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: StreetComponent, selector: "bp-street", inputs: { labelResourceKey: "labelResourceKey", maxSuggesionCount: "maxSuggesionCount", visibleSuggesionCount: "visibleSuggesionCount", sortCriteria: "sortCriteria", baseUrl: "baseUrl", prefillData: "prefillData", showDebugMessageToConsole: "showDebugMessageToConsole", postalCode: "postalCode", locality: "locality", inputText: "inputText", messageOption: "messageOption", allowNoValidation: "allowNoValidation", validatedByBackend: "validatedByBackend", numberOfExceptions: "numberOfExceptions", inputLang: "inputLang", isReadonly: "isReadonly" }, outputs: { messageChanged: "messageChanged", addressChanged: "addressChanged", focusEvent: "focusEvent", blurEvent: "blurEvent", textChangeEvent: "textChangeEvent", clearInputEventEmitter: "clearInputEventEmitter", prefillEventEmitter: "prefillEventEmitter", numberOfExceptionsEmitter: "numberOfExceptionsEmitter" }, viewQueries: [{ propertyName: "streetSearchInput", first: true, predicate: ["streetSearchInput"], descendants: true }, { propertyName: "streetList", first: true, predicate: ["streetList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #streetSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"(validatedByBackend && (!locality || locality.trim().length === 0)) \n || (!validatedByBackend && ((!postalCode || postalCode.trim().length === 0) && (!locality || locality.trim().length === 0)))\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"streetInputField\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-street-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-street-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #streetList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-street-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-street-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [""] });
748
- return StreetComponent;
749
- }());
750
- export { StreetComponent };
751
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: StreetComponent, decorators: [{
752
- type: Component,
753
- args: [{ selector: 'bp-street', template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #streetSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"(validatedByBackend && (!locality || locality.trim().length === 0)) \n || (!validatedByBackend && ((!postalCode || postalCode.trim().length === 0) && (!locality || locality.trim().length === 0)))\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"streetInputField\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-street-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-street-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #streetList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-street-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-street-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [""] }]
754
- }], ctorParameters: function () { return [{ type: i1.AddressService }, { type: i2.LocaleService }, { type: i3.TranslateService }, { type: i4.UnicodeService }]; }, propDecorators: { streetSearchInput: [{
755
- type: ViewChild,
756
- args: ['streetSearchInput', { static: false }]
757
- }], streetList: [{
758
- type: ViewChild,
759
- args: ['streetList', { static: false }]
760
- }], labelResourceKey: [{
761
- type: Input
762
- }], maxSuggesionCount: [{
763
- type: Input
764
- }], visibleSuggesionCount: [{
765
- type: Input
766
- }], sortCriteria: [{
767
- type: Input
768
- }], baseUrl: [{
769
- type: Input
770
- }], prefillData: [{
771
- type: Input
772
- }], showDebugMessageToConsole: [{
773
- type: Input
774
- }], postalCode: [{
775
- type: Input
776
- }], locality: [{
777
- type: Input
778
- }], inputText: [{
779
- type: Input
780
- }], messageOption: [{
781
- type: Input
782
- }], allowNoValidation: [{
783
- type: Input
784
- }], validatedByBackend: [{
785
- type: Input
786
- }], numberOfExceptions: [{
787
- type: Input
788
- }], inputLang: [{
789
- type: Input
790
- }], isReadonly: [{
791
- type: Input
792
- }], messageChanged: [{
793
- type: Output
794
- }], addressChanged: [{
795
- type: Output
796
- }], focusEvent: [{
797
- type: Output
798
- }], blurEvent: [{
799
- type: Output
800
- }], textChangeEvent: [{
801
- type: Output
802
- }], clearInputEventEmitter: [{
803
- type: Output
804
- }], prefillEventEmitter: [{
805
- type: Output
806
- }], numberOfExceptionsEmitter: [{
807
- type: Output
808
- }] } });
809
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQvc3JjL2xpYi9zdHJlZXQvc3RyZWV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQvc3JjL2xpYi9zdHJlZXQvc3RyZWV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUQsTUFBTSxlQUFlLENBQUM7QUFHN0osT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFLN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQUV4RDtJQW9GRSx5QkFDVSxjQUE4QixFQUM5QixhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsY0FBOEI7UUFIOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBOUVoQyxpQkFBWSxHQUFpQixJQUFJLENBQUM7UUFFMUMsYUFBYTtR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aW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcmVmaWxsZWRQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvcHJlZmlsbGVkLXBhcmFtZXRlcnMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi4vZW51bS92YWxpZGF0aW9uLW1lc3NhZ2UtdHlwZS5lbnVtJztcbmltcG9ydCB7IEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWRyZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdW5pY29kZS5zZXJ2aWNlJztcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICcuLi91dGlscy9kb21oYW5kbGVyJztcbmltcG9ydCB7IEFERFJFU1NMRVZFTCB9IGZyb20gJy4uL2VudW0vYWRkcmVzcy1sZXZlbC5lbnVtJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1ldGVycyB9IGZyb20gJy4uL21vZGVsL3F1ZXJ5LXBhcmFtZXRlcnMubW9kZWwnO1xuaW1wb3J0IHsgUHJlZmlsbERhdGEgfSBmcm9tICcuLi91dGlscy9wcmVmaWxsLWRhdGEnO1xuaW1wb3J0IHsgU291cmNlVHlwZSB9IGZyb20gJy4uL2VudW0vc291cmNlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQcmVmaWxsRXZlbnQgfSBmcm9tICcuLi91dGlscy9wcmVmbGxsLmV2ZW50JztcbmltcG9ydCB7IElucHV0TmFtZVR5cGUgfSBmcm9tICcuLi9lbnVtL2lucHV0LW5hbWUuZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLXN0cmVldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdHJlZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHJlZXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdHJlZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdzdHJlZXRTZWFyY2hJbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSApIHN0cmVldFNlYXJjaElucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzdHJlZXRMaXN0Jywge3N0YXRpYzogZmFsc2V9ICkgc3RyZWV0TGlzdDogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAvLyAyMDIwLTA2LTE1XG4gIC8qICBASW5wdXQoKVxuICBvbkZvY3VzU2hvd1N1Z2dlc3Rpb25zQWZ0ZXJQcmVmaWxsID0gdHJ1ZTsgKi9cblxuICBASW5wdXQoKSBsYWJlbFJlc291cmNlS2V5ID0gJ2NvbW1vbi5sYWJlbC5zdHJlZXROYW1lJztcbiAgQElucHV0KCkgbWF4U3VnZ2VzaW9uQ291bnQgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzaW9uQ291bnQgPSA1O1xuICBASW5wdXQoKSBzb3J0Q3JpdGVyaWEgPSAnJztcbiAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nO1xuICAvLyBASW5wdXQoKSBhZGRyZXNzUGFyYW1zOiBQcmVmaWxsZWRQYXJhbWV0ZXJzO1xuICBASW5wdXQoKSBwcmVmaWxsRGF0YTogUHJlZmlsbERhdGE7XG4gIEBJbnB1dCgpIHNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHBvc3RhbENvZGU6IHN0cmluZztcbiAgQElucHV0KCkgbG9jYWxpdHk6IHN0cmluZztcbiAgQElucHV0KCkgaW5wdXRUZXh0OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbWVzc2FnZU9wdGlvbiA9ICdZJztcbiAgQElucHV0KCkgYWxsb3dOb1ZhbGlkYXRpb246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHZhbGlkYXRlZEJ5QmFja2VuZDogYm9vbGVhbjtcbiAgQElucHV0KCkgbnVtYmVyT2ZFeGNlcHRpb25zOiBudW1iZXI7XG4gIC8vIEB0cy1pZ25vcmVcbiAgQElucHV0KCkgc2V0IGlucHV0TGFuZyh2YWw6IHN0cmluZykge1xuICAgIHRoaXMubG9jYWxlU2VydmljZS5jaGFuZ2VMYW5nKHZhbCk7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZSh2YWwpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlZExhbmd1YWdlKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGlzUmVhZG9ubHk9ZmFsc2U7XG5cbiAgQE91dHB1dCgpIG1lc3NhZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8e21lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmd9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFkZHJlc3NDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgYmx1ckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRleHRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGNsZWFySW5wdXRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBwcmVmaWxsRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8UHJlZmlsbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UHJlZmlsbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgbnVtYmVyT2ZFeGNlcHRpb25zRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPW5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBcbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xuXG4gIGFkZHJlc3NJc1ZhbGlkYXRlZDogYm9vbGVhbjtcbiAgc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gIHN1Z2dlc3Rpb25zOiBhbnk7XG4gIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgbGFzdFNlYXJjaFZhbHVlOiBzdHJpbmc7XG4gIHdvcmRMaXN0OiBhbnk7XG4gIHN1Z2dlc3Rpb25zV29yZExpc3Q6IGFueTtcbiAgYnBUeXBlQWhlYWQ6IHN0cmluZztcbiAgcGxhY2VIb2xkZXJUZXh0OiBzdHJpbmc7XG4gIHNraXBOZXh0Qmx1cjogYm9vbGVhbjsgLy8gT25CbHVyIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzdWdnZXN0aW9uL3ZhbGlkYXRvciBidXR0b25cbiAgZXJyb3JDb2RlOiBhbnk7XG5cbiAgbWluTGV2ZWw6IG51bWJlcjtcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICBjb2xsYXBzZURyb3Bkb3duOiBib29sZWFuO1xuICB0eXBlQWhlYWRXb3JkOiBzdHJpbmc7XG4gIHNlcXVlbmNlTnVtYmVyOiBudW1iZXI7XG4gIGNvbnN1bWVkTnVtYmVyOiBudW1iZXI7XG4gIHNlbGVjdGlvbkNoYW5nZWQ6IGJvb2xlYW47XG4gIHZhbGlkYXRpb25NZXNzYWdlQ29kZSA9IG51bGw7XG4gIHZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG5cbiAgcHJlZmlsbGluZyA9IGZhbHNlO1xuICBpc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWRkcmVzc1NlcnZpY2U6IEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1bmljb2RlU2VydmljZTogVW5pY29kZVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAvLyBpbnN0YW5jZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSAtMTtcbiAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMud29yZExpc3QgPSBbXTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zV29yZExpc3QgPSBbXTtcbiAgICB0aGlzLmJwVHlwZUFoZWFkID0gJyc7XG4gICAgdGhpcy5wbGFjZUhvbGRlclRleHQgPSAnJztcbiAgICB0aGlzLnNraXBOZXh0Qmx1ciA9IGZhbHNlOyAvLyBPbkJsdXIgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHN1Z2dlc3Rpb24vdmFsaWRhdG9yIGJ1dHRvblxuICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICAvLyBzY29wZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgLy8gcHJvcGVydGllc1xuICAgIHRoaXMudHlwZUFoZWFkV29yZCA9ICcnO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgPSAxO1xuICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSAxO1xuICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5zZXRTZWFyY2hUZXh0KCcnKTtcbiAgICAvLyB0aGlzLnNldFBsYWNlSG9sZGVyVGV4dCgpO1xuICAgIHRoaXMub25DaGFuZ2VkTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZWRMYW5ndWFnZSgpIHtcbiAgICAvLyB0aGlzLnBsYWNlSG9sZGVyVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzdHJlZXQucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdzdHJlZXQucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ25ldyBwbGFjZWhvbGRlcicsIHJlcyk7XG4gICAgICAgIC8vID0+ICdoZWxsbyB3b3JsZCdcbiAgICAgICAgdGhpcy5wbGFjZUhvbGRlclRleHQgPSByZXM7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCkge1xuICAgICAgY29uc3Qgb3ZlcmxheTogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnN0cmVldExpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShvdmVybGF5LCAnbGkuYWN0aXZlJyk7XG4gICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgIERvbUhhbmRsZXIuc2Nyb2xsSW5WaWV3KG92ZXJsYXksIGxpc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSwgMSk7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdwcmVmaWxsRGF0YScpICYmICFjaGFuZ2VzLnByZWZpbGxEYXRhLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMucHJlZmlsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMubG9hZFBhcmFtcyhjaGFuZ2VzLnByZWZpbGxEYXRhLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRleHQgIT09ICcnICYmIHRoaXMubWluTGV2ZWwgPT09IEFERFJFU1NMRVZFTC5TVFJFRVQpIHtcbiAgICAgICAgICAvKlxuICAgICAgICAgIHRoaXMub25JbnB1dENoYW5nZSgncHJlZmlsbGVkJyk7XG4gICAgICAgICAgdGhpcy5zdHJlZXRTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgKi9cbiAgICAgICAgIC8qXG4gICAgICAgICAgdGhpcy5wcmVmaWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSB0cnVlO1xuICAgICAgICAgIHRoaXMucHJlZmlsbE11bmljaXBhbGl0eU5hbWUgID0gdGhpcy50cmFuc2Zvcm1NdW5pY2lwYWxpdHlJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHRoaXMuYWRkcmVzc1BhcmFtcy5tdW5pY2lwYWxpdHlOYW1lKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyogLyAvLyB0aGlzLlNPVVJDRV9QUkVGSUxMRUQgKTtcbiAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TmFtZVxuICAgICAgICAgICAgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyovIFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdpbnB1dFRleHQnKSAmJiAhY2hhbmdlcy5pbnB1dFRleHQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMubm90RXF1YWxJZ25vcmVDYXNlKHRoaXMuc2VhcmNoVGV4dCwgY2hhbmdlcy5pbnB1dFRleHQuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBjaGFuZ2VzLmlucHV0VGV4dC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgU3RyZWV0IHNlYXJjaCBiYXIgb24gbG9jYWxpdHkgY2hhbmdlL3Jlc2V0XG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgncG9zdGFsQ29kZScpICYmICFjaGFuZ2VzLnBvc3RhbENvZGUuZmlyc3RDaGFuZ2UgJiYgIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3ByZWZpbGxEYXRhJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5TVFJFRVQ7XG4gICAgICAgIGlmIChjaGFuZ2VzLnBvc3RhbENvZGUuY3VycmVudFZhbHVlID09PSAnJykge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhbnNmb3JtU3RyZWV0TmFtZUluTG93ZXJjYXNlQW5kV2l0aG91dERpYWNyaXRpY3Moc3RyZWV0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xuICAgIGlmIChzdHJlZXROYW1lICE9PSBudWxsICYmIHN0cmVldE5hbWUgIT09IHVuZGVmaW5lZCApXG4gICAge1xuICAgICAgcmVzdWx0ID0gdGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKHN0cmVldE5hbWUpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3ByZWZpbGwgc3RyZWV0TmFtZScsIHJlc3VsdCk7IH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25DbGVhcklucHV0RXZlbnQoZXZlbnQsIGZvY3VzKSB7XG4gICAgdGhpcy5jbGVhcklucHV0KGZvY3VzKTtcbiAgfVxuXG4gIG9uQmx1cihldjogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VySUUoKSAmJiB0aGlzLmlzRHJvcGRvd25DbGlja2VkKGV2KSkge1xuICAgICAgdGhpcy5zdHJlZXRTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNraXBOZXh0Qmx1cikge1xuICAgICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gICAgfVxuICB9XG5cbiAgaXNCcm93c2VySUUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9tc2llXFxzfHRyaWRlbnRcXC98ZWRnZVxcLy9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgaXNEcm9wZG93bkNsaWNrZWQoZXYpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldi5leHBsaWNpdE9yaWdpbmFsVGFyZ2V0IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuICh0YXJnZXQuaWQgPT09ICdicGFhYy1zdHJlZXQtZHJvcGRvd24nKTtcbiAgfVxuXG4gIG9uRm9jdXMoKSB7XG4gICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gZmFsc2U7XG4gICAgLy8gdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gKHRoaXMucHJlZmlsbGluZyA9PT0gdHJ1ZSAmJiB0aGlzLnByZWZpbGxEYXRhICE9PSBudWxsKVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgPyAhdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm9uRm9jdXNTaG93U3VnZ2VzdGlvbnNBZnRlclByZWZpbGwgOiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3N0cmVldCBjb21wIC0gb25Gb2N1cycsIHRoaXMucHJlZmlsbGluZywgdGhpcy5wcmVmaWxsRGF0YSwgdGhpcy5jb2xsYXBzZURyb3Bkb3duKTsgfVxuXG4gICAgLy8gdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgfVxuXG4gIG1heVNob3dEcm9wZG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggPiAwICYmICF0aGlzLmNvbGxhcHNlRHJvcGRvd247XG4gIH1cblxuICBidWlsZElucHV0V29yZExpc3QoKSB7XG4gICAgdGhpcy53b3JkTGlzdCA9IHRoaXMuc2VhcmNoVGV4dC5zcGxpdCgvW1xccywgXSsvKTtcbiAgICAvLyBjb25zb2xlLmxvZygnd29yZCBsaXN0IC0gc3RyZWV0OicsIHRoaXMud29yZExpc3QpO1xuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zICYmIHRoaXMud29yZExpc3QpIHtcbiAgICAgIGZvciAoY29uc3Qgc3VnIG9mIHRoaXMuc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgaWYgKCFzdWcgfHwgIXN1Zy5oYXNPd25Qcm9wZXJ0eSgnc3RyaW5nJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgdGhpcy53b3JkTGlzdCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyhzdWcuc3RyaW5nIGFzIHN0cmluZywgdyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCB3dyA9IHN1Zy5zdHJpbmcuc3Vic3RyKHN0YXJ0LCB3Lmxlbmd0aCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYWRkaW5nIHdvcmQ6JyArIHd3KTtcbiAgICAgICAgICAgIC8vIHd3IGlzIGEgY2FuZGlkYXRlIHRvIGJlIGFkZGVkIHRvIHRoZSB3b3JkbGlzdCBpZiBub3QgYWxyZWFkeSBwcmVzZW50IGluIGl0XG4gICAgICAgICAgICBjb25zdCBwcmVzZW50ID0gdGhpcy53b3JkTGlzdC5maW5kKCAodzE6IHN0cmluZykgID0+IHcxLnRvTG93ZXJDYXNlKCkgPT09IHd3LnRvTG93ZXJDYXNlKCkgKTtcbiAgICAgICAgICAgIGlmIChwcmVzZW50ID09PSBudWxsIHx8IHByZXNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLndvcmRMaXN0LnB1c2god3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXJ0c1dpdGhJZ25vcmVEaWFjcml0aWNzKHZhbHVlOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBjb25zb2xlLmxvZygnU2VhcmNoaW5nIGZvciBwcmVmaXggXCInICsgcHJlZml4ICsgJ1wiIGluc2lkZSBzdWdnZXN0aW9uOiAnICsgdmFsdWUpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgY29uc3QgX3ZhbHVlID0gdGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKCAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWUgKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIGNvbnN0IF9wcmVmaXggPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoIChwcmVmaXggIT09IG51bGwgJiYgcHJlZml4ICE9PSB1bmRlZmluZWQpID8gcHJlZml4LnRvTG93ZXJDYXNlKCkgOiBwcmVmaXgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gX3ZhbHVlLmluZGV4T2YoX3ByZWZpeCk7XG4gICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0c1dpdGhJZ25vcmVEaWFjcml0aWNzOiAnICsgc3RhcnQpO1xuICAgIHJldHVybiBzdGFydDtcbiAgfVxuXG4gIG1heUFkZFR5cGVBaGVhZCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKC9bXlxccywgXFxcXFxcL10kLykudGVzdCh0aGlzLnNlYXJjaFRleHQpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2VkKCkge1xuICAgIHRoaXMudGV4dENoYW5nZUV2ZW50LmVtaXQodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIGJ1aWxkVHlwZUFoZWFkKHNvdXJjZTogU291cmNlVHlwZSkge1xuICAgIGlmIChzb3VyY2UgPT09IFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAoIXRoaXMubWF5QWRkVHlwZUFoZWFkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoVGV4dFdvcmRzID0gdGhpcy5zZWFyY2hUZXh0LnNwbGl0KC9bXFxzLCBdKy8pO1xuICAgIGNvbnN0IGxhc3RXb3JkID0gc2VhcmNoVGV4dFdvcmRzW3NlYXJjaFRleHRXb3Jkcy5sZW5ndGggLSAxXTtcblxuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLnNvbWUoZnVuY3Rpb24oc3VnKSB7XG4gICAgICBpZiAoIXN1ZyB8fCAhc3VnLmhhc093blByb3BlcnR5KCdzdHJpbmcnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VnLnN0cmluZy5zcGxpdCgvW1xccy1dKy8pLnNvbWUoZnVuY3Rpb24od29yZCkge1xuICAgICAgICBpZiAodGhpcy5zdHJpbmdTdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyh3b3JkLCBsYXN0V29yZCkpIHtcbiAgICAgICAgICB0aGlzLnR5cGVBaGVhZFdvcmQgPSB3b3JkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0uYmluZCh0aGlzKSkpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGl4ID0gdGhpcy50eXBlQWhlYWRXb3JkLnNsaWNlKGxhc3RXb3JkLmxlbmd0aCwgdGhpcy50eXBlQWhlYWRXb3JkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMuYnBUeXBlQWhlYWQgPSB0aGlzLnNlYXJjaFRleHQgKyBhcHBlbmRpeDtcbiAgICB9XG4gIH1cblxuICBzdHJpbmdTdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyh2YWx1ZSwgcHJlZml4KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZSApO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgY29uc3QgX3ByZWZpeCA9IHRoaXMudW5pY29kZVNlcnZpY2UucmVtb3ZlRGlhY3JpdGljcyggKHByZWZpeCAhPT0gbnVsbCAmJiBwcmVmaXggIT09IHVuZGVmaW5lZCkgPyBwcmVmaXgudG9Mb3dlckNhc2UoKSA6IHByZWZpeCk7XG4gICAgY29uc3Qgc3RhcnQgPSBfdmFsdWUuc2xpY2UoMCwgX3ByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihfcHJlZml4KSAhPT0gLTE7XG4gICAgcmV0dXJuIHN0YXJ0O1xuICB9XG5cbiAgZ2V0VG9wU3VnZ2VzdGlvbnMoc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgKz0gMTtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMuZ2VuZXJhdGVQYXJhbWV0ZXJzKCk7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnU1RSRUVUIGNhbGxpbmcgc2VydmljZSBwYXJhbXMnLCBwYXJhbSk7IH1cbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuYWRkcmVzc1NlcnZpY2UuZ2V0U3RyZWV0KHRoaXMuYmFzZVVybCwgdGhpcy5sb2NhbGl0eSwgdGhpcy5wb3N0YWxDb2RlLCBwYXJhbSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdldFN0cmVldFJlc3BvbnNlKHJlc3BvbnNlLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gU291cmNlVHlwZS5TT1VSQ0VfUFJFRklMTEVEKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGlzLmlzUHJlZmlsbFdpdGhOb01hdGNoID0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucHJlZmlsbEFuYWx5emVEYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuaXNQcmVmaWxsV2l0aE5vTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLFxuICAgICAgICAgICgpID0+IHRoaXMuaGFuZGxlR2V0U3RyZWV0RXJyb3IoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXRUZXh0Q29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKCB0aGlzLmlzUHJlZmlsbFdpdGhOb01hdGNoID09PSB0cnVlICkgPyAnb3JhbmdlcmVkJyA6ICcnO1xuICB9XG5cbiAgbG9hZFBhcmFtcyhwcmVmaWxsRGF0YTogUHJlZmlsbERhdGEpIHtcbiAgICBsZXQgY29uY2F0U3RyID0gJyc7XG4gICAgaWYgKHByZWZpbGxEYXRhICE9PSBudWxsICYmIHByZWZpbGxEYXRhLnBhcmFtZXRlcnMgIT09IG51bGwpXG4gICAge1xuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ21pbkxldmVsJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubWluTGV2ZWw7XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgndW5zdHJ1Y3R1cmVkQWRkcmVzcycpICYmIHRoaXMuaXNTdHJpbmcocGFyYW1zLnVuc3RydWN0dXJlZEFkZHJlc3MpKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgICAqL1xuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ3Bvc3RhbENvZGUnKSAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSkpIHtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlO1xuICAgICAgfVxuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ211bmljaXBhbGl0eU5hbWUnKSAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2NhbGl0eSA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KCdzdHJlZXROYW1lJylcbiAgICAgICAgICAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TmFtZSkgJiYgdGhpcy5pc1BhcmFtc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgY29uY2F0U3RyID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uY2F0U3RyO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yID09PSBTdHJpbmc7XG4gIH1cblxuICBpc1ZhbGlkKHZhbCkge1xuICAgIHJldHVybiB0aGlzLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbiAgfVxuXG4gIGlzUGFyYW1zQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgaWYoIXRoaXMudmFsaWRhdGVkQnlCYWNrZW5kKXtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQodGhpcy5wb3N0YWxDb2RlKSB8fCB0aGlzLmlzVmFsaWQodGhpcy5sb2NhbGl0eSk7XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKHRoaXMucG9zdGFsQ29kZSkgJiYgdGhpcy5pc1ZhbGlkKHRoaXMubG9jYWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUGFyYW1ldGVycygpOiBRdWVyeVBhcmFtZXRlcnMge1xuICAgIGNvbnN0IHBhcmFtID0gbmV3IFF1ZXJ5UGFyYW1ldGVycyh7XG4gICAgICBpZDogdGhpcy5zZXF1ZW5jZU51bWJlcixcbiAgICAgIHE6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIHBvc3RhbENvZGU6IHRoaXMucG9zdGFsQ29kZSxcbiAgICAgIGxvY2FsaXR5OiB0aGlzLmxvY2FsaXR5LFxuICAgICAgbWF4TnVtYmVyT2ZTdWdnZXN0aW9uczogdGhpcy5tYXhTdWdnZXNpb25Db3VudFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydENyaXRlcmlhID09PSAnUycpIHtcbiAgICAgIHBhcmFtLnNvcnRCeVN0cmVldCh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtO1xuICB9XG5cbiAgaGFuZGxlR2V0U3RyZWV0UmVzcG9uc2UoZGF0YTogYW55LCBzb3VyY2U/OiBTb3VyY2VUeXBlKSB7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5yZXNwb25zZSAmJiBkYXRhLnJlc3BvbnNlLnNlcXVlbmNlTnVtYmVyICYmIGRhdGEucmVzcG9uc2Uuc2VxdWVuY2VOdW1iZXIgPj0gdGhpcy5jb25zdW1lZE51bWJlciAmJlxuICAgICAgZGF0YS5yZXNwb25zZS50b3BTdWdnZXN0aW9ucykge1xuICAgICAgdGhpcy5jb25zdW1lZE51bWJlciA9IGRhdGEucmVzcG9uc2Uuc2VxdWVuY2VOdW1iZXI7XG4gICAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvbnMoKTtcbiAgICAgIHRoaXMucGFyc2VUb3BTdWdnZXN0aW9ucyhkYXRhLnJlc3BvbnNlLnRvcFN1Z2dlc3Rpb25zLCBzb3VyY2UpO1xuICAgICAgdGhpcy5idWlsZFR5cGVBaGVhZChzb3VyY2UpO1xuICAgICAgdGhpcy5jbGVhckNvbm5lY3Rpb25FcnJvck1lc3NhZ2UoKTtcbiAgICAgIHRoaXMuYnVpbGRJbnB1dFdvcmRMaXN0KCk7XG4gICAgfVxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9ICh0aGlzLnByZWZpbGxpbmcgPT09IHRydWUgJiYgdGhpcy5wcmVmaWxsRGF0YSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICF0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMub25Gb2N1c1Nob3dTdWdnZXN0aW9uc0FmdGVyUHJlZmlsbCA6IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlR2V0U3RyZWV0RXJyb3IoKSB7XG4gICAgaWYodGhpcy5hbGxvd05vVmFsaWRhdGlvbiAmJiB0aGlzLnZhbGlkYXRlZEJ5QmFja2VuZCl7XG4gICAgICB0aGlzLm51bWJlck9mRXhjZXB0aW9ucys9MTtcbiAgICAgIHRoaXMubnVtYmVyT2ZFeGNlcHRpb25zRW1pdHRlci5lbWl0KHRoaXMubnVtYmVyT2ZFeGNlcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5zZXRDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gIH1cblxuICBzZXRDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIHRoaXMuZXJyb3JDb2RlID0gLyonc2VydmljZS11bmF2YWlsYWJsZScqLyBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuU2VydmljZV9VbmF2YWlsYWJsZTtcbiAgICAvLyB0aGlzLnNldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZXJyb3JDb2RlKTtcbiAgICB0aGlzLmVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGUpO1xuICB9XG5cbiAgY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5lcnJvckNvZGUpO1xuICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlID09PSByZXMgKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwYXJzZVRvcFN1Z2dlc3Rpb25zKHRvcFN1Z2dlc3Rpb25zLCBzb3VyY2U6IFNvdXJjZVR5cGUpIHtcbiAgICBpZiAodG9wU3VnZ2VzdGlvbnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICAvLyB0b3BTdWdnZXN0aW9ucy5mb3JFYWNoKHRoaXMucGFyc2VTaW5nbGVTdWdnZXN0aW9uLmJpbmQodGhpcykpO1xuICAgICAgZm9yIChjb25zdCBzdWcgb2YgdG9wU3VnZ2VzdGlvbnMpXG4gICAgICB7XG4gICAgICAgIHRoaXMucGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Zywgc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJzZVNpbmdsZVN1Z2dlc3Rpb24odG9wU3VnZ2VzdGlvbnMsIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IGFueSwgc291cmNlOiBTb3VyY2VUeXBlKSB7XG4gICAgbGV0IHN1Z2dlc3Rpb25Ub0FkZDogYW55O1xuICAgIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVGcmVuY2goKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdmcmVuY2gnKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5mcmVuY2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVEdXRjaCgpICYmIHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2R1dGNoJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uZHV0Y2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVHZXJtYW4oKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdnZXJtYW4nKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5nZXJtYW47XG4gICAgfSBlbHNlIGlmIChzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdhZGRyZXNzJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICB9XG4gICAgaWYgKHN1Z2dlc3Rpb25Ub0FkZCkge1xuICAgICAgaWYgKHN1Z2dlc3Rpb24ubWVzc2FnZXMpIHtcbiAgICAgICAgc3VnZ2VzdGlvblRvQWRkLm1lc3NhZ2VzID0gc3VnZ2VzdGlvbi5tZXNzYWdlcztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3VnZ2VzdGlvbnMucHVzaChzdWdnZXN0aW9uVG9BZGQpO1xuICAgICAgaWYgKHNvdXJjZSA9PT0gU291cmNlVHlwZS5TT1VSQ0VfUFJFRklMTEVEKVxuICAgICAge1xuICAgICAgICBzdWdnZXN0aW9uLmFkZHJlc3MgPSBzdWdnZXN0aW9uVG9BZGQ7XG4gICAgICAgIHRoaXMucHJlZmlsbENoZWNrRm9yUGVyZmVjdE1hdGNoKHN1Z2dlc3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByZWZpbGxDaGVja0ZvclBlcmZlY3RNYXRjaChzdWdnZXN0aW9uKVxuICB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdzdHJlZXQgLSBjaGVja2luZyBzdWdnZXN0aW9uIGZvciBwZXJmZWN0IG1hdGNoJywgdGhpcy5wcmVmaWxsRGF0YSwgc3VnZ2VzdGlvbik7IH1cbiAgICBjb25zdCBzdWdBZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgIC8vIGlmIChzdWdBZGRyZXNzLnN0cmVldE5hbWUgPT09IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lIClcbiAgICBjb25zdCBzdWdnZXN0aW9uTG9jYWxpdHkgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHN1Z0FkZHJlc3MubG9jYWxpdHlOYW1lKTtcbiAgICBjb25zdCBzdWdnZXN0aW9uTXVuaWNpcGFsaXR5ID0gdGhpcy50cmFuc2Zvcm1TdHJlZXROYW1lSW5Mb3dlcmNhc2VBbmRXaXRob3V0RGlhY3JpdGljcyhzdWdBZGRyZXNzLm11bmljaXBhbGl0eU5hbWUpO1xuICAgIGlmIChzdWdnZXN0aW9uTG9jYWxpdHkgPT09IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eU5hbWVcbiAgICAgIHx8IHN1Z2dlc3Rpb25NdW5pY2lwYWxpdHkgPT09IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eU5hbWUpXG4gICAge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvblN0cmVldE5hbWUgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHN1Z0FkZHJlc3Muc3RyZWV0TmFtZSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnY29tcGFyaW5nIHN0cmVldCBuYW1lcycsIHN1Z2dlc3Rpb25TdHJlZXROYW1lLCB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXROYW1lKTtcbiAgICAgIGlmIChzdWdnZXN0aW9uU3RyZWV0TmFtZSA9PT0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TmFtZSlcbiAgICAgIHtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uID0gc3VnZ2VzdGlvbjtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc3VnQWRkcmVzcy5zdHJlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgID09PSB0cnVlKVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdTVFJFRVQgLSBQUkVGSUxMIC0gUGVyZmVjdCBtYXRjaCAtIHN0cmVldDonLCBzdWdnZXN0aW9uKTsgfVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdTVFJFRVQgLSBQUkVGSUxMIC0gTk8gUGVyZmVjdCBtYXRjaDonLCBzdWdnZXN0aW9uKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRDaGFuZ2Uoc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdzdHJlZXQgb25JbnB1dENoYW5nZSA6IHNvdXJjZSAnLCBzb3VyY2UpO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgKz0gMTtcbiAgICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSB0aGlzLnNlcXVlbmNlTnVtYmVyO1xuICAgICAgdGhpcy5jbGVhclN1Z2dlc3Rpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLnZhbGlkYXRlZEJ5QmFja2VuZCl7XG4gICAgICAgIGxldCBzdWdnZXN0aW9uID0ge1xuICAgICAgICAgICdzdHJpbmcnOiB0aGlzLnNlYXJjaFRleHQudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAnbXVuaWNpcGFsaXR5TmFtZSc6IHRoaXMubG9jYWxpdHkgPyB0aGlzLmxvY2FsaXR5LnRvTG9jYWxlVXBwZXJDYXNlKCkgOicnLFxuICAgICAgICAgICdsb2NhbGl0eU5hbWUnOiB0aGlzLmxvY2FsaXR5ID8gdGhpcy5sb2NhbGl0eS50b0xvY2FsZVVwcGVyQ2FzZSgpIDonJyxcbiAgICAgICAgICAncG9zdGFsQ29kZSc6IHRoaXMucG9zdGFsQ29kZSxcbiAgICAgICAgICAnc2VhcmNoQmFyU3RyaW5nJzogdGhpcy5zZWFyY2hUZXh0LnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgJ3N0cmVldE5hbWUnOiB0aGlzLnNlYXJjaFRleHQudG9VcHBlckNhc2UoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRBZGRyZXNzKHN1Z2dlc3Rpb24pO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHRoaXMuZ2V0VG9wU3VnZ2VzdGlvbnMoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWlsZElucHV0V29yZExpc3QoKTtcbiAgfVxuXG4gIHByZWZpbGxBbmFseXplRGF0YSgpXG4gIHtcbiAgICBpZiAodGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUpXG4gICAge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wcmVmaWxsRXZlbnRFbWl0dGVyLmVtaXQobmV3IFByZWZpbGxFdmVudChBRERSRVNTTEVWRUwuU1RSRUVULCB0aGlzLnByZWZpbGxEYXRhKSApO1xuICB9XG5cblxuICBjbGlja1N1Z2dlc3Rpb24oZXZlbnQ6IGFueSwgc3VnZ2VzdGlvbjogYW55KSB7XG4gICAgdGhpcy5pc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3N0cmVldE51bWJlcjo6Y2xpY2tTdWdnZXN0aW9uJywgZXZlbnQsIHN1Z2dlc3Rpb24pOyB9XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICB0aGlzLnNldFNlYXJjaFRleHQoc3VnZ2VzdGlvbi5zdHJpbmcpO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgLy8gaWYgKHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2lzQ29tcGxldGUnKSkge1xuICAgIC8vICAgdGhpcy5zaG93QWRkcmVzc0lzVmFsaWRhdGVkKCk7XG4gICAgLy8gfVxuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLnNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uOiBhbnkpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQoc3VnZ2VzdGlvbik7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkQWRkcmVzcygpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQobnVsbCk7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIG9wdGlvbnM/OiBzdHJpbmdbXSkge1xuICAgIC8vIE1vbWVudGx5LCBvcHRpb25zIGFyZSBOT1QgdXNlZDsgc28gZGF0YSB0eXBlIG9mIHRoZXNlIG9wdGlvbnMgd2lsbCBiZSByZXZpZXdlZCBvbmNlIG5lZWRlZC5cbiAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VUeXBlID09PSBudWxsIHx8IHZhbGlkYXRpb25NZXNzYWdlVHlwZSA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gZW1pdCB2YWxpZGF0aW9uIG1lc3NhZ2UgLSBtZXNzYWdlIGtleSBpcyBpbnZhbGlkIScsIHZhbGlkYXRpb25NZXNzYWdlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh2YWxpZGF0aW9uTWVzc2FnZVR5cGUpIHtcblxuICAgICAgY2FzZSBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuQWRkcmVzc19Ob3RfRm91bmQ6XG4gICAgICBjYXNlIFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX1ZhbGlkYXRlZDpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGU6IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodmFsaWRhdGlvbk1lc3NhZ2VUeXBlKTtcbiAgICAgICAgICAvLyB0aGlzLm1lc3NhZ2VDaGFuZ2VkLmVtaXQobWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHttZXNzYWdlVHlwZTogdmFsaWRhdGlvbk1lc3NhZ2VUeXBlLCB0cmFuc2xhdGVkTWVzc2FnZTogbWVzc2FnZX0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTphbGlnblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBlbWl0IHZhbGlkYXRpb24gbWVzc2FnZSAtIG1lc3NhZ2Uga2V5IE5PVCBzdXBwb3J0ZWQhJywgdmFsaWRhdGlvbk1lc3NhZ2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gIH1cblxuICBzaG93QWRkcmVzc0lzVmFsaWRhdGVkKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3MtdmFsaWRhdGVkJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX1ZhbGlkYXRlZCk7XG4gIH1cblxuICBjaGVja0tleURvd24oZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAvLyBkb3duIGtleSwgaW5jcmVtZW50IHNlbGVjdGVkSW5kZXhcbiAgICAgIGNhc2UgNDA6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUFycm93U2VsZWN0ZWRJbmRleERvd24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIHVwIGtleSwgZGVjcmVtZW50IHNlbGVjdGVkSW5kZXhcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUFycm93U2VsZWN0ZWRJbmRleFVwKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gcmlnaHQgYXJyb3cga2V5XG4gICAgICBjYXNlIDM5OlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5jdXJzb3JJc09uU3VnZ2VzdGlvbkxpc3QoKSkge1xuICAgICAgICAgIHRoaXMuY2xpY2tTdWdnZXN0aW9uKGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGVBaGVhZFdvcmQgJiYgdGhpcy50eXBlQWhlYWRJc1Nob3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dCh0aGlzLmJwVHlwZUFoZWFkKTtcbiAgICAgICAgICAgIHRoaXMudHlwZUFoZWFkV29yZCA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIHRhYiBrZXlcbiAgICAgIGNhc2UgOTpcbiAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NJc1ZhbGlkYXRlZCAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RJbkxpc3RPZlN1Z2dlc2lvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0NjpcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBlbnRlciBwcmVzc2VkXG4gICAgICBjYXNlIDEzOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5jdXJzb3JJc09uU3VnZ2VzdGlvbkxpc3QoKSkge1xuICAgICAgICAgIHRoaXMuY2xpY2tTdWdnZXN0aW9uKGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmNsZWFyVHlwZUFoZWFkKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgfVxuICB9XG5cbiAgY2xlYXJXaWRnZXQoKSB7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyU2VhcmNoVGV4dCgpO1xuICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIHRoaXMuY2xlYXJUeXBlQWhlYWQoKTtcbiAgICB0aGlzLnByZWZpbGxEYXRhID0gbnVsbDtcbiAgICB0aGlzLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoVGV4dCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgfVxuXG4gIHR5cGVBaGVhZElzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYnBUeXBlQWhlYWQgJiYgdGhpcy5icFR5cGVBaGVhZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgcmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cblxuICBtb3ZlQXJyb3dTZWxlY3RlZEluZGV4RG93bigpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ICsgMSAhPT0gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xuICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVBcnJvd1NlbGVjdGVkSW5kZXhVcCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4IC0gMSAhPT0gLTIpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleC0tO1xuICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvcklzT25TdWdnZXN0aW9uTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGV4ID49IDA7XG4gIH1cblxuICBzZXRTZWFyY2hUZXh0QmFzZWRPbkFycm93U2VsZWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgaWYgKG5ld1ZhbCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5ld1ZhbCAhPT0gLTEpIHtcbiAgICAgIGlmIChvbGRWYWwgPT09IC0xKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hUZXh0O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTZWFyY2hUZXh0KHRoaXMuc3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS5zdHJpbmcpO1xuICAgICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFNlYXJjaFRleHQodGhpcy5sYXN0U2VhcmNoVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG1heVNob3dDbGVhckJ1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBjbGVhcklucHV0KGZvY3VzPywgZW1pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBjb25zb2xlLndhcm4oJ3N0cmVldCBjbGVhcklucHV0IGNhbGxlZCAuLi4nLCBmb2N1cywgZW1pdCk7XG4gICAgdGhpcy5jbGVhcldpZGdldCgpO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSAtMTtcbiAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMuY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gICAgaWYgKGZvY3VzID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLndhcm4oJ3N0cmVldCBjbGVhcklucHV0IC0gc2V0IGZvY3VzICEhIScsIGZvY3VzKTtcbiAgICAgIHRoaXMuc3RyZWV0U2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5jbGVhcklucHV0RXZlbnRFbWl0dGVyLmVtaXQoLyonU1RSRUVUJyovIElucHV0TmFtZVR5cGUuU1RSRUVUKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclN1Z2dlc3Rpb25zKCkge1xuICAgIHRoaXMud29yZExpc3QgPSBbXTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5zdWdnZXN0aW9uc1dvcmRMaXN0ID0gW107XG4gIH1cblxuICBjbGVhclR5cGVBaGVhZCgpIHtcbiAgICB0aGlzLmJwVHlwZUFoZWFkID0gJyc7XG4gIH1cblxuICBjbGVhclN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSgpIHtcbiAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB0aGlzLm1lc3NhZ2VDaGFuZ2VkLmVtaXQoe21lc3NhZ2VUeXBlOiBudWxsLCB0cmFuc2xhdGVkTWVzc2FnZTogdGhpcy5zdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2V9KTtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZUNvZGUgPSBudWxsO1xuICB9XG5cbiAgc2V0U2VhcmNoVGV4dCh2YWx1ZSkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlO1xuICB9XG5cbiAgc2VsZWN0Rmlyc3RJbkxpc3RPZlN1Z2dlc2lvbnMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIDEpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc3VnZ2VzdGlvbk1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cblxuICBub3RFcXVhbElnbm9yZUNhc2Uob2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG9sZFZhbC50b0xvd2VyQ2FzZSgpICE9PSBuZXdWYWwudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHNob3dBZGRyZXNzTm90Rm91bmRNZXNzYWdlKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3Mtbm90LWZvdW5kJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX05vdF9Gb3VuZCk7XG4gIH1cblxuICBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiAodGhpcy5sb2NhbGl0eSA9PT0gJycgfHwgdGhpcy5wb3N0YWxDb2RlID09PSAnJyB8fCB0aGlzLm1pbkxldmVsID4gQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gIH1cblxuICBvbklucHV0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnc3RyZWV0IGNsaWNrJyk7IH1cbiAgICB0aGlzLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSBmYWxzZTtcbiAgfVxuXG59XG4iLCI8c3BhbiAqbmdJZj1cImxhYmVsUmVzb3VyY2VLZXlcIj57eyBsYWJlbFJlc291cmNlS2V5IHwgdHJhbnNsYXRlfX08L3NwYW4+XG48ZGl2IGNsYXNzPVwiYnBhYWMtZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiYnBhYWMtc2VhcmNoLWJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnBhYWMtaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIiAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICNzdHJlZXRTZWFyY2hJbnB1dCBjbGFzcz1cImJwYWFjLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiIWlzUGFyYW1zQ29tcGxldGUoKSA/ICdsaWdodGdyZXknIDogJydcIiBcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIiBnZXRUZXh0Q29sb3IoKSBcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKHZhbGlkYXRlZEJ5QmFja2VuZCAmJiAoIWxvY2FsaXR5IHx8IGxvY2FsaXR5LnRyaW0oKS5sZW5ndGggPT09IDApKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIXZhbGlkYXRlZEJ5QmFja2VuZCAmJiAoKCFwb3N0YWxDb2RlIHx8IHBvc3RhbENvZGUudHJpbSgpLmxlbmd0aCA9PT0gMCkgJiYgKCFsb2NhbGl0eSB8fCBsb2NhbGl0eS50cmltKCkubGVuZ3RoID09PSAwKSkpXCIgKGtleWRvd24pPVwiY2hlY2tLZXlEb3duKCRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoKVwiIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIGlkPVwic3RyZWV0SW5wdXRGaWVsZFwiIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyVGV4dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIC8+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiYnBhYWMtY2xlYXItc3RyZWV0LWJ1dHRvblwiICpuZ0lmPVwibWF5U2hvd0NsZWFyQnV0dG9uKClcIiAoY2xpY2spPVwiY2xlYXJJbnB1dCh0cnVlKVwiIGNsYXNzPVwiYnBhYWMtY2xlYXJcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLTxkaXYgbmctdHJhbnNjbHVkZT48L2Rpdj4tLT5cbiAgICAgICAgPGlucHV0IGlkPVwiYnBhYWMtc3RyZWV0LXR5cGVhaGVhZFwiIHR5cGU9XCJ0ZXh0XCIgZGlzYWJsZWQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgWyhuZ01vZGVsKV09XCJicFR5cGVBaGVhZFwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBbaGlkZGVuXT1cImNvbGxhcHNlRHJvcGRvd25cIiBjbGFzcz1cImJwYWFjLWRyb3Bkb3duLW1lbnUtY29udGFpbmVyXCIgKm5nSWY9XCJzdWdnZXN0aW9ucyAmJiBzdWdnZXN0aW9ucy5sZW5ndGg+MFwiPlxuICAgICAgICA8ZGl2ICNzdHJlZXRMaXN0IFthcHBWaXNpYmxlU3VnZ2VzdGlvbl09XCJ2aXNpYmxlU3VnZ2VzaW9uQ291bnRcIiBpZD1cImJwYWFjLXN0cmVldC1kcm9wZG93blwiIGNsYXNzPVwiYnBhYWMtZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgPHVsIHJvbGU9XCJsaXN0Ym94XCIgaWQ9XCJicGFhYy1zdHJlZXQtc3VnZ2VzdGlvbnNMaXN0XCIgY2xhc3M9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgICAgICAgICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN1Z2dlc3Rpb25zOyBsZXQgaWR4ID0gaW5kZXhcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6KHNlbGVjdGVkSW5kZXg9PWlkeCl9XCIgKG1vdXNlZG93bik9XCJjbGlja1N1Z2dlc3Rpb24oJGV2ZW50LCBvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3RlZEluZGV4PWlkeFwiIChtb3VzZWxlYXZlKT1cInNlbGVjdGVkSW5kZXg9LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJvcHRpb25cIiBbaW5uZXJIdG1sXT1cIm9wdGlvbi5zdHJpbmcgfCBoaWdobGlnaHRTdWdnZXN0aW9uIDogd29yZExpc3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=