@snabcentr/client-ui 4.20.1 → 4.23.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 (127) hide show
  1. package/alerts/confirm-alert/sc-confirm-alert.component.d.ts +22 -0
  2. package/alerts/index.d.ts +1 -0
  3. package/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.d.ts +1 -1
  4. package/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.d.ts +3 -3
  5. package/catalog/input-quantity/sc-input-quantity.component.d.ts +17 -1
  6. package/contragents/sc-contragents.module.d.ts +1 -1
  7. package/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.d.ts +5 -0
  8. package/delivery-address/sc-delivery-address.module.d.ts +1 -1
  9. package/directives/address-quality/sc-address-quality.directive.d.ts +5 -0
  10. package/directives/address-quality/sc-address-quality.service.d.ts +9 -1
  11. package/esm2022/alerts/confirm-alert/sc-confirm-alert.component.mjs +29 -0
  12. package/esm2022/alerts/index.mjs +2 -0
  13. package/esm2022/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.mjs +1 -1
  14. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +1 -1
  15. package/esm2022/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.mjs +4 -3
  16. package/esm2022/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.mjs +5 -16
  17. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +24 -4
  18. package/esm2022/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.mjs +2 -2
  19. package/esm2022/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +3 -3
  20. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +1 -1
  21. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +1 -1
  22. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +3 -3
  23. package/esm2022/contragents/sc-contragents.module.mjs +5 -2
  24. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +10 -3
  25. package/esm2022/delivery-address/sc-delivery-address.module.mjs +5 -2
  26. package/esm2022/directives/address-quality/sc-address-quality.directive.mjs +8 -1
  27. package/esm2022/directives/address-quality/sc-address-quality.service.mjs +14 -6
  28. package/esm2022/feedback/feedback-form/sc-feedback-form.component.mjs +21 -11
  29. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +6 -31
  30. package/esm2022/helpers/sc-api-error-helper.mjs +25 -0
  31. package/esm2022/helpers/sc-file-helper.mjs +29 -0
  32. package/esm2022/order/draft/helpers/sc-draft-list-helper.mjs +83 -0
  33. package/esm2022/order/draft/models/sc-i-draft-list-item.mjs +2 -0
  34. package/esm2022/order/draft/profstroy/actualization-panel/sc-profstroy-actualization-panel.component.mjs +73 -0
  35. package/esm2022/order/draft/profstroy/badge/sc-profstroy-badge.component.mjs +21 -0
  36. package/esm2022/order/draft/profstroy/badges/sc-profstroy-draft-badges.component.mjs +31 -0
  37. package/esm2022/order/draft/profstroy/create-dialog/sc-profstroy-draft-create-dialog.component.mjs +139 -0
  38. package/esm2022/order/draft/profstroy/enums/sc-profstroy-draft-state.mjs +32 -0
  39. package/esm2022/order/draft/profstroy/helpers/sc-profstroy-draft-helper.mjs +94 -0
  40. package/esm2022/order/draft/profstroy/index.mjs +8 -0
  41. package/esm2022/order/draft/profstroy/models/sc-i-profstroy-draft-state-view.mjs +2 -0
  42. package/esm2022/order/draft/sc-draft.component.mjs +148 -14
  43. package/esm2022/order/draft/services/sc-draft-expiration-clock.service.mjs +42 -0
  44. package/esm2022/order/draft/services/sc-draft-list-updates.service.mjs +288 -0
  45. package/esm2022/order/index.mjs +6 -1
  46. package/esm2022/order/new-order-items/sc-new-order-items.component.mjs +11 -3
  47. package/esm2022/order/order-form/sc-order-form.component.mjs +4 -2
  48. package/esm2022/order/order-item/sc-order-item.component.mjs +37 -5
  49. package/esm2022/order/order-items-list/sc-order-items-list.component.mjs +282 -44
  50. package/esm2022/order/order-items-list-by-stock/sc-order-items-list-by-stock.component.mjs +1 -1
  51. package/esm2022/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.mjs +15 -3
  52. package/esm2022/pipes/sc-format-date.mjs +1 -1
  53. package/esm2022/providers/cleanup-recaptcha-artifacts.mjs +30 -0
  54. package/esm2022/providers/index.mjs +2 -1
  55. package/esm2022/providers/sc-block-incomplete-address.mjs +3 -3
  56. package/esm2022/providers/sc-date-formatter.mjs +1 -1
  57. package/esm2022/public-api.mjs +2 -2
  58. package/esm2022/samples/sc-sample.module.mjs +10 -3
  59. package/esm2022/services/index.mjs +1 -2
  60. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +3 -3
  61. package/feedback/feedback-form/sc-feedback-form.component.d.ts +1 -1
  62. package/fesm2022/snabcentr-client-ui.mjs +1483 -527
  63. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  64. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +3 -14
  65. package/helpers/sc-api-error-helper.d.ts +18 -0
  66. package/helpers/sc-file-helper.d.ts +13 -0
  67. package/order/draft/helpers/sc-draft-list-helper.d.ts +51 -0
  68. package/order/draft/models/sc-i-draft-list-item.d.ts +14 -0
  69. package/order/draft/profstroy/actualization-panel/sc-profstroy-actualization-panel.component.d.ts +58 -0
  70. package/order/draft/profstroy/badge/sc-profstroy-badge.component.d.ts +12 -0
  71. package/order/draft/profstroy/badges/sc-profstroy-draft-badges.component.d.ts +21 -0
  72. package/order/draft/profstroy/create-dialog/sc-profstroy-draft-create-dialog.component.d.ts +65 -0
  73. package/order/draft/profstroy/enums/sc-profstroy-draft-state.d.ts +29 -0
  74. package/order/draft/profstroy/helpers/sc-profstroy-draft-helper.d.ts +33 -0
  75. package/order/draft/profstroy/index.d.ts +7 -0
  76. package/order/draft/profstroy/models/sc-i-profstroy-draft-state-view.d.ts +17 -0
  77. package/order/draft/sc-draft.component.d.ts +73 -1
  78. package/order/draft/services/sc-draft-expiration-clock.service.d.ts +29 -0
  79. package/order/draft/services/sc-draft-list-updates.service.d.ts +158 -0
  80. package/order/index.d.ts +5 -0
  81. package/order/new-order-items/sc-new-order-items.component.d.ts +9 -1
  82. package/order/order-form/sc-order-form.component.d.ts +1 -0
  83. package/order/order-item/sc-order-item.component.d.ts +25 -1
  84. package/order/order-items-list/sc-order-items-list.component.d.ts +140 -7
  85. package/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.d.ts +13 -1
  86. package/package.json +3 -2
  87. package/pipes/sc-format-date.d.ts +1 -1
  88. package/providers/cleanup-recaptcha-artifacts.d.ts +7 -0
  89. package/providers/index.d.ts +1 -0
  90. package/providers/sc-block-incomplete-address.d.ts +1 -1
  91. package/providers/sc-date-formatter.d.ts +1 -1
  92. package/public-api.d.ts +1 -1
  93. package/release_notes.tmp +8 -3
  94. package/samples/sc-sample.module.d.ts +2 -1
  95. package/services/index.d.ts +0 -1
  96. package/styles/taiga/variables.less +16 -1
  97. package/styles/tailwind/tailwind.scss +43 -40
  98. package/esm2022/services/sc-scripts.service.mjs +0 -106
  99. package/esm2022/smart-captcha/index.mjs +0 -5
  100. package/esm2022/smart-captcha/interfaces/index.mjs +0 -6
  101. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-api.mjs +0 -2
  102. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-event.mjs +0 -2
  103. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-language.mjs +0 -2
  104. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-render-params.mjs +0 -2
  105. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-settings.mjs +0 -2
  106. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-window.mjs +0 -2
  107. package/esm2022/smart-captcha/sc-smart-captcha.component.mjs +0 -167
  108. package/esm2022/smart-captcha/services/index.mjs +0 -2
  109. package/esm2022/smart-captcha/services/sc-smart-captcha-loader.service.mjs +0 -87
  110. package/esm2022/smart-captcha/tokens/index.mjs +0 -3
  111. package/esm2022/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.mjs +0 -8
  112. package/esm2022/smart-captcha/tokens/sc-smart-captcha-settings.token.mjs +0 -6
  113. package/services/sc-scripts.service.d.ts +0 -51
  114. package/smart-captcha/index.d.ts +0 -4
  115. package/smart-captcha/interfaces/index.d.ts +0 -5
  116. package/smart-captcha/interfaces/sc-smart-captcha-api.d.ts +0 -36
  117. package/smart-captcha/interfaces/sc-smart-captcha-event.d.ts +0 -4
  118. package/smart-captcha/interfaces/sc-smart-captcha-language.d.ts +0 -4
  119. package/smart-captcha/interfaces/sc-smart-captcha-render-params.d.ts +0 -16
  120. package/smart-captcha/interfaces/sc-smart-captcha-settings.d.ts +0 -16
  121. package/smart-captcha/interfaces/sc-smart-captcha-window.d.ts +0 -14
  122. package/smart-captcha/sc-smart-captcha.component.d.ts +0 -92
  123. package/smart-captcha/services/index.d.ts +0 -1
  124. package/smart-captcha/services/sc-smart-captcha-loader.service.d.ts +0 -50
  125. package/smart-captcha/tokens/index.d.ts +0 -2
  126. package/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.d.ts +0 -5
  127. package/smart-captcha/tokens/sc-smart-captcha-settings.token.d.ts +0 -6
@@ -12,17 +12,18 @@ import { TuiButtonLoading, TuiCheckbox, TuiFieldErrorPipe, TuiFiles, tuiFilesAcc
12
12
  import { TuiInputModule, TuiInputPhoneModule, TuiTextareaModule } from '@taiga-ui/legacy';
13
13
  import { POLYMORPHEUS_CONTEXT } from '@taiga-ui/polymorpheus';
14
14
  import { getCountries } from 'libphonenumber-js';
15
+ import { RecaptchaComponent, RecaptchaFormsModule, RecaptchaModule } from 'ng-recaptcha-2';
15
16
  import { catchError, filter, map, merge, of, share, startWith, Subject, switchMap, tap } from 'rxjs';
16
17
  import { ScFormFieldsModule } from '../../form-fields';
17
18
  import { MAX_FILES_IN_FORM_INPUT } from '../../providers/sc-max-files-in-form-input';
18
- import { ScSmartCaptchaComponent } from '../../smart-captcha/sc-smart-captcha.component';
19
19
  import { phoneValidator } from '../../validators/sc-phone-validator';
20
20
  import * as i0 from "@angular/core";
21
21
  import * as i1 from "@angular/forms";
22
22
  import * as i2 from "../../form-fields/suggestion-field/sc-suggestion-field.component";
23
23
  import * as i3 from "@taiga-ui/legacy";
24
- import * as i4 from "@taiga-ui/kit";
25
- import * as i5 from "@taiga-ui/core";
24
+ import * as i4 from "ng-recaptcha-2";
25
+ import * as i5 from "@taiga-ui/kit";
26
+ import * as i6 from "@taiga-ui/core";
26
27
  /**
27
28
  * Компонент формы обратной связи.
28
29
  */
@@ -94,7 +95,7 @@ export class ScFeedbackFormComponent {
94
95
  }
95
96
  }));
96
97
  /**
97
- * Поле ввода токена капчи, имя `recaptcha` задано API.
98
+ * Поле ввода для recaptcha.
98
99
  */
99
100
  this.recaptchaControl = new FormControl(null, Validators.required);
100
101
  /**
@@ -136,10 +137,8 @@ export class ScFeedbackFormComponent {
136
137
  }),
137
138
  // eslint-disable-next-line rxjs/no-implicit-any-catch
138
139
  catchError((error) => {
139
- // Токен капчи одноразовый: для повторной отправки нужна новая проверка.
140
- this.recaptchaControl.reset();
141
140
  this.form.markAllAsTouched();
142
- const { errors, message } = (error.error ?? {});
141
+ const { errors, message } = error.error;
143
142
  if (errors) {
144
143
  Object.keys(errors).forEach((key) => {
145
144
  const control = this.form.get(key);
@@ -176,6 +175,16 @@ export class ScFeedbackFormComponent {
176
175
  * Список стран.
177
176
  */
178
177
  this.countries = getCountries();
178
+ /**
179
+ * Это решение ошибки #4940, было @see [предложено](https://github.com/DethAriel/ng-recaptcha/issues/123#issuecomment-426112101) автором {@link RecaptchaComponent}.
180
+ */
181
+ RecaptchaComponent.prototype.ngOnDestroy = function () {
182
+ // eslint-disable-next-line @typescript-eslint/dot-notation
183
+ if (this['subscription']) {
184
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/dot-notation
185
+ this['subscription'].unsubscribe();
186
+ }
187
+ };
179
188
  merge(this.user$, this.accepted$.pipe(tap((files) => {
180
189
  this.form.controls.files.reset([]);
181
190
  this.onUploadFile(files);
@@ -299,7 +308,7 @@ export class ScFeedbackFormComponent {
299
308
  return ScPhoneService.isValidPhoneNumberForMessenger(value);
300
309
  }
301
310
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScFeedbackFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
302
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScFeedbackFormComponent, isStandalone: true, selector: "sc-feedback-form", inputs: { slugInput: { classPropertyName: "slugInput", publicName: "slug", isSignal: true, isRequired: false, transformFunction: null }, fieldsInput: { classPropertyName: "fieldsInput", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickOffer: "clickOffer", sendSuccess: "sendSuccess" }, ngImport: i0, template: "@let fieldsList = fields();\n<form\n *ngIf=\"fieldsList.length > 0\"\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col justify-between gap-4\"\n>\n <!-- \u0424\u0418\u041E -->\n <label\n *ngIf=\"fieldsList.includes('name')\"\n tuiLabel\n >\n \u0424\u0418\u041E\n <tui-input formControlName=\"name\"> \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0412\u0430\u0448\u0438 \u0424.\u0418.\u041E. </tui-input>\n <tui-error\n formControlName=\"name\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0422\u0435\u043B\u0435\u0444\u043E\u043D -->\n @if (fieldsList.includes('phone')) {\n <label tuiLabel>\n \u0422\u0435\u043B\u0435\u0444\u043E\u043D\n <tui-textfield>\n <input\n formControlName=\"phone\"\n tuiInputPhoneInternational\n [countrySearch]=\"true\"\n [countries]=\"(countries | tuiSortCountries | async) || []\"\n autocomplete=\"phone\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"phone\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label\n *ngIf=\"fieldsList.includes('isShouldUseMessenger') && form.controls.phone.value && isValidPhoneNumberForMessenger(form.controls.phone.value)\"\n tuiLabel\n >\n <input\n formControlName=\"isShouldUseMessenger\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span tuiTitle> \u041D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432 \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u0430\u0445, \u0430 \u043D\u0435 \u0437\u0432\u043E\u043D\u0438\u0442\u044C </span>\n </label>\n }\n <!-- \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B -->\n <label\n *ngIf=\"fieldsList.includes('email')\"\n tuiLabel\n >\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <tui-input formControlName=\"email\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <sc-suggestion-field\n *tuiDataList\n [type]=\"suggestionType.email\"\n />\n </tui-input>\n <tui-error\n formControlName=\"email\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 -->\n <label\n *ngIf=\"fieldsList.includes('message')\"\n tuiLabel\n >\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\n <tui-textarea formControlName=\"message\"> \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 </tui-textarea>\n <tui-error\n formControlName=\"message\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0424\u0430\u0439\u043B\u044B -->\n <div\n *ngIf=\"fieldsList.includes('files')\"\n class=\"flex flex-col gap-1\"\n >\n <label tuiInputFiles>\n <input\n #validator=\"tuiInputFilesValidator\"\n accept=\".doc,.docx,.pdf,image/*\"\n tuiInputFiles\n [formControl]=\"loadedFile\"\n [multiple]=\"true\"\n (reject)=\"onReject($event)\"\n />\n </label>\n\n <tui-error\n *ngIf=\"loadedFile.invalid\"\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"loadedFile\"\n />\n\n @let accepted = accepted$ | async;\n <tui-files\n *ngIf=\"accepted?.length || rejected.length\"\n class=\"tui-space_top-1\"\n >\n <tui-file\n *ngFor=\"let file of accepted\"\n [file]=\"file\"\n (remove)=\"onRemove(file)\"\n />\n <tui-file\n *ngFor=\"let file of rejected\"\n state=\"error\"\n [file]=\"(file | tuiFileRejected: validator | async) || file\"\n (remove)=\"onRemove(file)\"\n />\n </tui-files>\n </div>\n\n <!-- \u041A\u0430\u043F\u0447\u0430 -->\n @if (form.get('recaptcha'); as recaptcha) {\n <div\n class=\"mb-3 max-h-[7.5rem] overflow-hidden duration-500\"\n [ngClass]=\"{ '!max-h-0 !-m-2': recaptcha.valid }\"\n [attr.inert]=\"recaptcha.valid ? '' : null\"\n >\n <sc-smart-captcha formControlName=\"recaptcha\" />\n </div>\n @if (recaptcha.getError('serverResponse'); as serverErrors) {\n <tui-error [error]=\"serverErrors.join(' ')\" />\n }\n }\n\n <!-- \u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F -->\n <div class=\"flex flex-wrap items-center gap-3\">\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n >\n \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\n </button>\n <div class=\"grow basis-60 text-body-s\">\n \u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443, \u0432\u044B \u0441\u043E\u0433\u043B\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044C \u0441\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"context?.data?.onClickOfferHandler(); clickOffer.emit()\"\n >\n \u041F\u043E\u043B\u0438\u0442\u0438\u043A\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n </button>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "ngmodule", type: ScFormFieldsModule }, { kind: "component", type: i2.ScSuggestionFieldComponent, selector: "sc-suggestion-field", inputs: ["type", "showAddressQuality"], outputs: ["selectedClick"] }, { kind: "ngmodule", type: TuiInputModule }, { kind: "component", type: i3.TuiInputComponent, selector: "tui-input" }, { kind: "directive", type: i3.TuiInputDirective, selector: "tui-input" }, { kind: "ngmodule", type: TuiInputPhoneModule }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: ScSmartCaptchaComponent, selector: "sc-smart-captcha" }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TuiTextareaModule }, { kind: "component", type: i3.TuiTextareaComponent, selector: "tui-textarea", inputs: ["rows", "maxLength", "expandable"] }, { kind: "directive", type: i3.TuiTextareaDirective, selector: "tui-textarea" }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: TuiTitle, selector: "[tuiTitle]", inputs: ["tuiTitle"] }, { kind: "component", type: i4.TuiFile, selector: "tui-file,a[tuiFile],button[tuiFile]", inputs: ["file", "state", "size", "showDelete", "showSize", "leftContent"], outputs: ["remove"] }, { kind: "component", type: i4.TuiInputFiles, selector: "label[tuiInputFiles]" }, { kind: "component", type: i4.TuiFilesComponent, selector: "tui-files", inputs: ["max", "expanded"], outputs: ["expandedChange"] }, { kind: "pipe", type: i4.TuiFileRejectedPipe, name: "tuiFileRejected" }, { kind: "directive", type: i4.TuiInputFilesDirective, selector: "input[tuiInputFiles]", outputs: ["reject"] }, { kind: "component", type: TuiInputPhoneInternational, selector: "input[tuiInputPhoneInternational]", inputs: ["countrySearch", "countries", "countryIsoCode"], outputs: ["countryIsoCodeChange"] }, { kind: "component", type: i5.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "pipe", type: TuiSortCountriesPipe, name: "tuiSortCountries" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
311
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScFeedbackFormComponent, isStandalone: true, selector: "sc-feedback-form", inputs: { slugInput: { classPropertyName: "slugInput", publicName: "slug", isSignal: true, isRequired: false, transformFunction: null }, fieldsInput: { classPropertyName: "fieldsInput", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickOffer: "clickOffer", sendSuccess: "sendSuccess" }, ngImport: i0, template: "@let fieldsList = fields();\n<form\n *ngIf=\"fieldsList.length > 0\"\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col justify-between gap-4\"\n>\n <!-- \u0424\u0418\u041E -->\n <label\n *ngIf=\"fieldsList.includes('name')\"\n tuiLabel\n >\n \u0424\u0418\u041E\n <tui-input formControlName=\"name\"> \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0412\u0430\u0448\u0438 \u0424.\u0418.\u041E. </tui-input>\n <tui-error\n formControlName=\"name\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0422\u0435\u043B\u0435\u0444\u043E\u043D -->\n @if (fieldsList.includes('phone')) {\n <label tuiLabel>\n \u0422\u0435\u043B\u0435\u0444\u043E\u043D\n <tui-textfield>\n <input\n formControlName=\"phone\"\n tuiInputPhoneInternational\n [countrySearch]=\"true\"\n [countries]=\"(countries | tuiSortCountries | async) || []\"\n autocomplete=\"phone\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"phone\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label\n *ngIf=\"fieldsList.includes('isShouldUseMessenger') && form.controls.phone.value && isValidPhoneNumberForMessenger(form.controls.phone.value)\"\n tuiLabel\n >\n <input\n formControlName=\"isShouldUseMessenger\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span tuiTitle> \u041D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432 \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u0430\u0445, \u0430 \u043D\u0435 \u0437\u0432\u043E\u043D\u0438\u0442\u044C </span>\n </label>\n }\n <!-- \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B -->\n <label\n *ngIf=\"fieldsList.includes('email')\"\n tuiLabel\n >\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <tui-input formControlName=\"email\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <sc-suggestion-field\n *tuiDataList\n [type]=\"suggestionType.email\"\n />\n </tui-input>\n <tui-error\n formControlName=\"email\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 -->\n <label\n *ngIf=\"fieldsList.includes('message')\"\n tuiLabel\n >\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\n <tui-textarea formControlName=\"message\"> \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 </tui-textarea>\n <tui-error\n formControlName=\"message\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0424\u0430\u0439\u043B\u044B -->\n <div\n *ngIf=\"fieldsList.includes('files')\"\n class=\"flex flex-col gap-1\"\n >\n <label tuiInputFiles>\n <input\n #validator=\"tuiInputFilesValidator\"\n accept=\".doc,.docx,.pdf,image/*\"\n tuiInputFiles\n [formControl]=\"loadedFile\"\n [multiple]=\"true\"\n (reject)=\"onReject($event)\"\n />\n </label>\n\n <tui-error\n *ngIf=\"loadedFile.invalid\"\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"loadedFile\"\n />\n\n @let accepted = accepted$ | async;\n <tui-files\n *ngIf=\"accepted?.length || rejected.length\"\n class=\"tui-space_top-1\"\n >\n <tui-file\n *ngFor=\"let file of accepted\"\n [file]=\"file\"\n (remove)=\"onRemove(file)\"\n />\n <tui-file\n *ngFor=\"let file of rejected\"\n state=\"error\"\n [file]=\"(file | tuiFileRejected: validator | async) || file\"\n (remove)=\"onRemove(file)\"\n />\n </tui-files>\n </div>\n\n <!-- recaptcha -->\n @if (form.get('recaptcha')) {\n <div\n class=\"mb-3 max-h-20 overflow-hidden duration-500\"\n [ngClass]=\"{ '!max-h-0 !-m-2': form.get('recaptcha')?.valid }\"\n >\n <re-captcha formControlName=\"recaptcha\" />\n </div>\n }\n\n <!-- \u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F -->\n <div class=\"flex flex-wrap items-center gap-3\">\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n >\n \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\n </button>\n <div class=\"grow basis-60 text-body-s\">\n \u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443, \u0432\u044B \u0441\u043E\u0433\u043B\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044C \u0441\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"context?.data?.onClickOfferHandler(); clickOffer.emit()\"\n >\n \u041F\u043E\u043B\u0438\u0442\u0438\u043A\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n </button>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "ngmodule", type: ScFormFieldsModule }, { kind: "component", type: i2.ScSuggestionFieldComponent, selector: "sc-suggestion-field", inputs: ["type"], outputs: ["selectedClick"] }, { kind: "ngmodule", type: TuiInputModule }, { kind: "component", type: i3.TuiInputComponent, selector: "tui-input" }, { kind: "directive", type: i3.TuiInputDirective, selector: "tui-input" }, { kind: "ngmodule", type: TuiInputPhoneModule }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "ngmodule", type: RecaptchaFormsModule }, { kind: "directive", type: i4.RecaptchaValueAccessorDirective, selector: "re-captcha[formControlName],re-captcha[formControl],re-captcha[ngModel]" }, { kind: "ngmodule", type: RecaptchaModule }, { kind: "component", type: i4.RecaptchaComponent, selector: "re-captcha", inputs: ["id", "siteKey", "theme", "type", "size", "tabIndex", "badge", "errorMode"], outputs: ["resolved", "error", "errored"], exportAs: ["reCaptcha"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TuiTextareaModule }, { kind: "component", type: i3.TuiTextareaComponent, selector: "tui-textarea", inputs: ["rows", "maxLength", "expandable"] }, { kind: "directive", type: i3.TuiTextareaDirective, selector: "tui-textarea" }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: TuiTitle, selector: "[tuiTitle]", inputs: ["tuiTitle"] }, { kind: "component", type: i5.TuiFile, selector: "tui-file,a[tuiFile],button[tuiFile]", inputs: ["file", "state", "size", "showDelete", "showSize", "leftContent"], outputs: ["remove"] }, { kind: "component", type: i5.TuiInputFiles, selector: "label[tuiInputFiles]" }, { kind: "component", type: i5.TuiFilesComponent, selector: "tui-files", inputs: ["max", "expanded"], outputs: ["expandedChange"] }, { kind: "pipe", type: i5.TuiFileRejectedPipe, name: "tuiFileRejected" }, { kind: "directive", type: i5.TuiInputFilesDirective, selector: "input[tuiInputFiles]", outputs: ["reject"] }, { kind: "component", type: TuiInputPhoneInternational, selector: "input[tuiInputPhoneInternational]", inputs: ["countrySearch", "countries", "countryIsoCode"], outputs: ["countryIsoCodeChange"] }, { kind: "component", type: i6.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "pipe", type: TuiSortCountriesPipe, name: "tuiSortCountries" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
303
312
  }
304
313
  __decorate([
305
314
  tuiPure
@@ -319,7 +328,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
319
328
  TuiButton,
320
329
  TuiButtonLoading,
321
330
  TuiLabel,
322
- ScSmartCaptchaComponent,
331
+ RecaptchaFormsModule,
332
+ RecaptchaModule,
323
333
  TuiLink,
324
334
  NgIf,
325
335
  TuiTextareaModule,
@@ -329,6 +339,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
329
339
  TuiInputPhoneInternational,
330
340
  ...TuiTextfield,
331
341
  TuiSortCountriesPipe,
332
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let fieldsList = fields();\n<form\n *ngIf=\"fieldsList.length > 0\"\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col justify-between gap-4\"\n>\n <!-- \u0424\u0418\u041E -->\n <label\n *ngIf=\"fieldsList.includes('name')\"\n tuiLabel\n >\n \u0424\u0418\u041E\n <tui-input formControlName=\"name\"> \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0412\u0430\u0448\u0438 \u0424.\u0418.\u041E. </tui-input>\n <tui-error\n formControlName=\"name\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0422\u0435\u043B\u0435\u0444\u043E\u043D -->\n @if (fieldsList.includes('phone')) {\n <label tuiLabel>\n \u0422\u0435\u043B\u0435\u0444\u043E\u043D\n <tui-textfield>\n <input\n formControlName=\"phone\"\n tuiInputPhoneInternational\n [countrySearch]=\"true\"\n [countries]=\"(countries | tuiSortCountries | async) || []\"\n autocomplete=\"phone\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"phone\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label\n *ngIf=\"fieldsList.includes('isShouldUseMessenger') && form.controls.phone.value && isValidPhoneNumberForMessenger(form.controls.phone.value)\"\n tuiLabel\n >\n <input\n formControlName=\"isShouldUseMessenger\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span tuiTitle> \u041D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432 \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u0430\u0445, \u0430 \u043D\u0435 \u0437\u0432\u043E\u043D\u0438\u0442\u044C </span>\n </label>\n }\n <!-- \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B -->\n <label\n *ngIf=\"fieldsList.includes('email')\"\n tuiLabel\n >\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <tui-input formControlName=\"email\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <sc-suggestion-field\n *tuiDataList\n [type]=\"suggestionType.email\"\n />\n </tui-input>\n <tui-error\n formControlName=\"email\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 -->\n <label\n *ngIf=\"fieldsList.includes('message')\"\n tuiLabel\n >\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\n <tui-textarea formControlName=\"message\"> \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 </tui-textarea>\n <tui-error\n formControlName=\"message\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0424\u0430\u0439\u043B\u044B -->\n <div\n *ngIf=\"fieldsList.includes('files')\"\n class=\"flex flex-col gap-1\"\n >\n <label tuiInputFiles>\n <input\n #validator=\"tuiInputFilesValidator\"\n accept=\".doc,.docx,.pdf,image/*\"\n tuiInputFiles\n [formControl]=\"loadedFile\"\n [multiple]=\"true\"\n (reject)=\"onReject($event)\"\n />\n </label>\n\n <tui-error\n *ngIf=\"loadedFile.invalid\"\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"loadedFile\"\n />\n\n @let accepted = accepted$ | async;\n <tui-files\n *ngIf=\"accepted?.length || rejected.length\"\n class=\"tui-space_top-1\"\n >\n <tui-file\n *ngFor=\"let file of accepted\"\n [file]=\"file\"\n (remove)=\"onRemove(file)\"\n />\n <tui-file\n *ngFor=\"let file of rejected\"\n state=\"error\"\n [file]=\"(file | tuiFileRejected: validator | async) || file\"\n (remove)=\"onRemove(file)\"\n />\n </tui-files>\n </div>\n\n <!-- \u041A\u0430\u043F\u0447\u0430 -->\n @if (form.get('recaptcha'); as recaptcha) {\n <div\n class=\"mb-3 max-h-[7.5rem] overflow-hidden duration-500\"\n [ngClass]=\"{ '!max-h-0 !-m-2': recaptcha.valid }\"\n [attr.inert]=\"recaptcha.valid ? '' : null\"\n >\n <sc-smart-captcha formControlName=\"recaptcha\" />\n </div>\n @if (recaptcha.getError('serverResponse'); as serverErrors) {\n <tui-error [error]=\"serverErrors.join(' ')\" />\n }\n }\n\n <!-- \u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F -->\n <div class=\"flex flex-wrap items-center gap-3\">\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n >\n \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\n </button>\n <div class=\"grow basis-60 text-body-s\">\n \u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443, \u0432\u044B \u0441\u043E\u0433\u043B\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044C \u0441\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"context?.data?.onClickOfferHandler(); clickOffer.emit()\"\n >\n \u041F\u043E\u043B\u0438\u0442\u0438\u043A\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n </button>\n </div>\n </div>\n</form>\n" }]
342
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let fieldsList = fields();\n<form\n *ngIf=\"fieldsList.length > 0\"\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col justify-between gap-4\"\n>\n <!-- \u0424\u0418\u041E -->\n <label\n *ngIf=\"fieldsList.includes('name')\"\n tuiLabel\n >\n \u0424\u0418\u041E\n <tui-input formControlName=\"name\"> \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0412\u0430\u0448\u0438 \u0424.\u0418.\u041E. </tui-input>\n <tui-error\n formControlName=\"name\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0422\u0435\u043B\u0435\u0444\u043E\u043D -->\n @if (fieldsList.includes('phone')) {\n <label tuiLabel>\n \u0422\u0435\u043B\u0435\u0444\u043E\u043D\n <tui-textfield>\n <input\n formControlName=\"phone\"\n tuiInputPhoneInternational\n [countrySearch]=\"true\"\n [countries]=\"(countries | tuiSortCountries | async) || []\"\n autocomplete=\"phone\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"phone\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label\n *ngIf=\"fieldsList.includes('isShouldUseMessenger') && form.controls.phone.value && isValidPhoneNumberForMessenger(form.controls.phone.value)\"\n tuiLabel\n >\n <input\n formControlName=\"isShouldUseMessenger\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span tuiTitle> \u041D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432 \u043C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u0430\u0445, \u0430 \u043D\u0435 \u0437\u0432\u043E\u043D\u0438\u0442\u044C </span>\n </label>\n }\n <!-- \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B -->\n <label\n *ngIf=\"fieldsList.includes('email')\"\n tuiLabel\n >\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <tui-input formControlName=\"email\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <sc-suggestion-field\n *tuiDataList\n [type]=\"suggestionType.email\"\n />\n </tui-input>\n <tui-error\n formControlName=\"email\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 -->\n <label\n *ngIf=\"fieldsList.includes('message')\"\n tuiLabel\n >\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439\n <tui-textarea formControlName=\"message\"> \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 </tui-textarea>\n <tui-error\n formControlName=\"message\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0424\u0430\u0439\u043B\u044B -->\n <div\n *ngIf=\"fieldsList.includes('files')\"\n class=\"flex flex-col gap-1\"\n >\n <label tuiInputFiles>\n <input\n #validator=\"tuiInputFilesValidator\"\n accept=\".doc,.docx,.pdf,image/*\"\n tuiInputFiles\n [formControl]=\"loadedFile\"\n [multiple]=\"true\"\n (reject)=\"onReject($event)\"\n />\n </label>\n\n <tui-error\n *ngIf=\"loadedFile.invalid\"\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"loadedFile\"\n />\n\n @let accepted = accepted$ | async;\n <tui-files\n *ngIf=\"accepted?.length || rejected.length\"\n class=\"tui-space_top-1\"\n >\n <tui-file\n *ngFor=\"let file of accepted\"\n [file]=\"file\"\n (remove)=\"onRemove(file)\"\n />\n <tui-file\n *ngFor=\"let file of rejected\"\n state=\"error\"\n [file]=\"(file | tuiFileRejected: validator | async) || file\"\n (remove)=\"onRemove(file)\"\n />\n </tui-files>\n </div>\n\n <!-- recaptcha -->\n @if (form.get('recaptcha')) {\n <div\n class=\"mb-3 max-h-20 overflow-hidden duration-500\"\n [ngClass]=\"{ '!max-h-0 !-m-2': form.get('recaptcha')?.valid }\"\n >\n <re-captcha formControlName=\"recaptcha\" />\n </div>\n }\n\n <!-- \u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F -->\n <div class=\"flex flex-wrap items-center gap-3\">\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n >\n \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\n </button>\n <div class=\"grow basis-60 text-body-s\">\n \u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443, \u0432\u044B \u0441\u043E\u0433\u043B\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044C \u0441\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"context?.data?.onClickOfferHandler(); clickOffer.emit()\"\n >\n \u041F\u043E\u043B\u0438\u0442\u0438\u043A\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n </button>\n </div>\n </div>\n</form>\n" }]
333
343
  }], ctorParameters: () => [], propDecorators: { isValidPhoneNumberForMessenger: [] } });
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtZmVlZGJhY2stZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZmVlZGJhY2svZmVlZGJhY2stZm9ybS9zYy1mZWVkYmFjay1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9mZWVkYmFjay9mZWVkYmFjay1mb3JtL3NjLWZlZWRiYWNrLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZFQUE2RTtBQUU3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkgsT0FBTyxFQUNILG1CQUFtQixFQUVuQixpQkFBaUIsRUFHakIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxjQUFjLEVBRWQsYUFBYSxHQUNoQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBaUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRSxPQUFP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Q3BFcEMsbXZNQW1LQSx1Q0R4SFEsU0FBUyw2Q0FDVCxtQkFBbUIsaXpDQUNuQixPQUFPLG9GQUNQLEtBQUssbUhBQ0wsUUFBUSxvRUFDUixpQkFBaUIscURBQ2pCLGtCQUFrQiwrTEFDbEIsY0FBYyxrTEFDZCxtQkFBbUIsK0JBQ25CLFNBQVMsb0lBQ1QsZ0JBQWdCLHVIQUNoQixRQUFRLDREQUNSLHVCQUF1Qiw2REFDdkIsT0FBTyw0RkFDUCxJQUFJLDRGQUNKLGlCQUFpQiw0T0FDakIsV0FBVyxvR0FDWCxRQUFRLHFwQkFFUiwwQkFBMEIscVFBRTFCLG9CQUFvQjs7QUEwVWQ7SUFEVCxPQUFPOzZFQUdQOzRGQXhVUSx1QkFBdUI7a0JBOUJuQyxTQUFTO2lDQUNNLElBQUksWUFDTixrQkFBa0IsV0FFbkI7d0JBQ0wsU0FBUzt3QkFDVCxtQkFBbUI7d0JBQ25CLE9BQU87d0JBQ1AsS0FBSzt3QkFDTCxRQUFRO3dCQUNSLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLFFBQVE7d0JBQ1IsdUJBQXVCO3dCQUN2QixPQUFPO3dCQUNQLElBQUk7d0JBQ0osaUJBQWlCO3dCQUNqQixXQUFXO3dCQUNYLFFBQVE7d0JBQ1IsUUFBUTt3QkFDUiwwQkFBMEI7d0JBQzFCLEdBQUcsWUFBWTt3QkFDZixvQkFBb0I7cUJBQ3ZCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNO3dEQXdVckMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyxAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2QgKi9cblxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIElucHV0U2lnbmFsLCBvdXRwdXQsIE91dHB1dEVtaXR0ZXJSZWYsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgU2NDb252ZXJ0ZXJzU2VydmljZSxcbiAgICBTY0ZlZWRiYWNrRm9ybXMsXG4gICAgU2NGZWVkYmFja1NlcnZpY2UsXG4gICAgU2NJQXBpRXJyb3JSZXNwb25zZSxcbiAgICBTY0lGZWVkYmFja01lc3NhZ2UsXG4gICAgU2NJU3VnZ2VzdGlvblR5cGUsXG4gICAgU2NQaG9uZVNlcnZpY2UsXG4gICAgU2NVcGxvYWRlZEZpbGUsXG4gICAgU2NVc2VyLFxuICAgIFNjVXNlclNlcnZpY2UsXG59IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVHVpTG9vc2VVbmlvbiwgdHVpUHVyZSwgVHVpVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUdWlCdXR0b24sIFR1aURpYWxvZ0NvbnRleHQsIFR1aUVycm9yLCBUdWlMYWJlbCwgVHVpTGluaywgVHVpVGV4dGZpZWxkLCBUdWlUaXRsZSB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aUlucHV0UGhvbmVJbnRlcm5hdGlvbmFsIH0gZnJvbSAnQHRhaWdhLXVpL2V4cGVyaW1lbnRhbCc7XG5pbXBvcnQgeyBUdWlDb3VudHJ5SXNvQ29kZSB9IGZyb20gJ0B0YWlnYS11aS9pMThuJztcbmltcG9ydCB7IFR1aUJ1dHRvbkxvYWRpbmcsIFR1aUNoZWNrYm94LCBUdWlGaWVsZEVycm9yUGlwZSwgVHVpRmlsZUxpa2UsIFR1aUZpbGVzLCB0dWlGaWxlc0FjY2VwdGVkLCBUdWlTb3J0Q291bnRyaWVzUGlwZSB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuaW1wb3J0IHsgVHVpSW5wdXRNb2R1bGUsIFR1aUlucHV0UGhvbmVNb2R1bGUsIFR1aVRleHRhcmVhTW9kdWxlIH0gZnJvbSAnQHRhaWdhLXVpL2xlZ2FjeSc7XG5pbXBvcnQgeyBQT0xZTU9SUEhFVVNfQ09OVEVYVCB9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHsgZ2V0Q291bnRyaWVzIH0gZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmUsIHN0YXJ0V2l0aCwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2NGb3JtRmllbGRzTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZHMnO1xuaW1wb3J0IHsgTUFYX0ZJTEVTX0lOX0ZPUk1fSU5QVVQgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvc2MtbWF4LWZpbGVzLWluLWZvcm0taW5wdXQnO1xuaW1wb3J0IHsgU2NTbWFydENhcHRjaGFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zbWFydC1jYXB0Y2hhL3NjLXNtYXJ0LWNhcHRjaGEuY29tcG9uZW50JztcbmltcG9ydCB7IHBob25lVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9zYy1waG9uZS12YWxpZGF0b3InO1xuaW1wb3J0IHsgU2NGZWVkYmFja0Zvcm1Db25maWcsIFNjRmVlZGJhY2tGb3JtRmllbGRUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINGE0L7RgNC80Ysg0L7QsdGA0LDRgtC90L7QuSDRgdCy0Y/Qt9C4LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2MtZmVlZGJhY2stZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWZlZWRiYWNrLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgVHVpRXJyb3IsXG4gICAgICAgIFR1aUZpZWxkRXJyb3JQaXBlLFxuICAgICAgICBTY0Zvcm1GaWVsZHNNb2R1bGUsXG4gICAgICAgIFR1aUlucHV0TW9kdWxlLFxuICAgICAgICBUdWlJbnB1dFBob25lTW9kdWxlLFxuICAgICAgICBUdWlCdXR0b24sXG4gICAgICAgIFR1aUJ1dHRvbkxvYWRpbmcsXG4gICAgICAgIFR1aUxhYmVsLFxuICAgICAgICBTY1NtYXJ0Q2FwdGNoYUNvbXBvbmVudCxcbiAgICAgICAgVHVpTGluayxcbiAgICAgICAgTmdJZixcbiAgICAgICAgVHVpVGV4dGFyZWFNb2R1bGUsXG4gICAgICAgIFR1aUNoZWNrYm94LFxuICAgICAgICBUdWlUaXRsZSxcbiAgICAgICAgVHVpRmlsZXMsXG4gICAgICAgIFR1aUlucHV0UGhvbmVJbnRlcm5hdGlvbmFsLFxuICAgICAgICAuLi5UdWlUZXh0ZmllbGQsXG4gICAgICAgIFR1aVNvcnRDb3VudHJpZXNQaXBlLFxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjRmVlZGJhY2tGb3JtQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQmtC+0L3RgtC10LrRgdGCINC00LjQsNC70L7Qs9C+0LLQvtCz0L4g0L7QutC90LAsINCyINC60L7RgtC+0YDQvtC8INC+0YLQutGA0YvRgiDQutC+0LzQv9C+0L3QtdC90YIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRleHQ6IFR1aURpYWxvZ0NvbnRleHQ8dm9pZCwgeyBvbkNsaWNrT2ZmZXJIYW5kbGVyOiAoKSA9PiB2b2lkIH0gJiBTY0ZlZWRiYWNrRm9ybUNvbmZpZz4gfCBudWxsID0gaW5qZWN0PFxuICAgICAgICBUdWlEaWFsb2dDb250ZXh0PHZvaWQsIHsgb25DbGlja09mZmVySGFuZGxlcjogKCkgPT4gdm9pZCB9ICYgU2NGZWVkYmFja0Zvcm1Db25maWc+XG4gICAgPihQT0xZTU9SUEhFVVNfQ09OVEVYVCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKlxuICAgICAqINCh0LjQvNCy0L7Qu9GM0L3QvtC1INC+0LHQvtC30L3QsNGH0LXQvdC40LUgKHNsdWcpINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2x1Z0lucHV0OiBJbnB1dFNpZ25hbDxUdWlMb29zZVVuaW9uPFNjRmVlZGJhY2tGb3Jtcz4+ID0gaW5wdXQ8VHVpTG9vc2VVbmlvbjxTY0ZlZWRiYWNrRm9ybXM+PignY29tbW9uJywgeyBhbGlhczogJ3NsdWcnIH0pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INC/0L7Qu9C10LksINC00L7RgdGC0YPQv9C90YvRhSDQsiDQtNCw0L3QvdC+0Lkg0YTQvtGA0LzQtS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZHNJbnB1dDogSW5wdXRTaWduYWw8U2NGZWVkYmFja0Zvcm1GaWVsZFR5cGVbXT4gPSBpbnB1dDxTY0ZlZWRiYWNrRm9ybUZpZWxkVHlwZVtdPihbJ25hbWUnLCAnZW1haWwnLCAncGhvbmUnLCAnbWVzc2FnZScsICdmaWxlcyddLCB7IGFsaWFzOiAnZmllbGRzJyB9KTtcblxuICAgIC8qKlxuICAgICAqINCh0LjQvNCy0L7Qu9GM0L3QvtC1INC+0LHQvtC30L3QsNGH0LXQvdC40LUgKHNsdWcpINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNsdWc6IFNpZ25hbDxUdWlMb29zZVVuaW9uPFNjRmVlZGJhY2tGb3Jtcz4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb250ZXh0Py5kYXRhLnNsdWcgPz8gdGhpcy5zbHVnSW5wdXQoKSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0L/QvtC70LXQuSwg0LTQvtGB0YLRg9C/0L3Ri9GFINCyINC00LDQvdC90L7QuSDRhNC+0YDQvNC1LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmaWVsZHM6IFNpZ25hbDxTY0ZlZWRiYWNrRm9ybUZpZWxkVHlwZVtdPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29udGV4dD8uZGF0YS5maWVsZHMgPz8gdGhpcy5maWVsZHNJbnB1dCgpKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0LrQvdC+0L/QutGDINC00L7Qs9C+0LLQvtGA0LAg0L7RhNC10YDRgtGLLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjbGlja09mZmVyOiBPdXRwdXRFbWl0dGVyUmVmPHZvaWQ+ID0gb3V0cHV0KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDRg9GB0L/QtdGI0L3QvtC5INC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VuZFN1Y2Nlc3M6IE91dHB1dEVtaXR0ZXJSZWY8dm9pZD4gPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQvtCx0YDQsNGC0L3QvtC5INGB0LLRj9C30LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBmZWVkYmFja1NlcnZpY2U6IFNjRmVlZGJhY2tTZXJ2aWNlID0gaW5qZWN0KFNjRmVlZGJhY2tTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQutC+0L3QstC10YDRgtCw0YbQuNC4INC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnZlcnRlcnNTZXJ2aWNlOiBTY0NvbnZlcnRlcnNTZXJ2aWNlID0gaW5qZWN0KFNjQ29udmVydGVyc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGE0LDQudC70L7Qsiwg0L7RgtC/0YDQsNCy0LvRj9C10LzRi9GFINCyINGE0L7RgNC80LUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlc0luRm9ybTogbnVtYmVyID0gaW5qZWN0KE1BWF9GSUxFU19JTl9GT1JNX0lOUFVUKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNCw0L3QvdGL0YUg0L4g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlciQ6IE9ic2VydmFibGU8U2NVc2VyPiA9IGluamVjdChTY1VzZXJTZXJ2aWNlKVxuICAgICAgICAuZ2V0VXNlckNoYW5nZSQoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcCgodXNlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1c2VyLmlzR3Vlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZm9ybSBhcyBGb3JtR3JvdXApLmFkZENvbnRyb2woJ3JlY2FwdGNoYScsIHRoaXMucmVjYXB0Y2hhQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZm9ybSBhcyBGb3JtR3JvdXApLnJlbW92ZUNvbnRyb2woJ3JlY2FwdGNoYScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpZWxkcy5pbmNsdWRlcygnbmFtZScpID8gdXNlci5uYW1lIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lOiBmaWVsZHMuaW5jbHVkZXMoJ3Bob25lJykgPyB1c2VyLmNvbnRhY3RzLnBob25lLnZhbHVlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBmaWVsZHMuaW5jbHVkZXMoJ2VtYWlsJykgPyB1c2VyLmNvbnRhY3RzLmVtYWlsLnZhbHVlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgIC8qKlxuICAgICAqINCf0L7Qu9C1INCy0LLQvtC00LAg0YLQvtC60LXQvdCwINC60LDQv9GH0LgsINC40LzRjyBgcmVjYXB0Y2hhYCDQt9Cw0LTQsNC90L4gQVBJLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByZWNhcHRjaGFDb250cm9sOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPiA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcblxuICAgIC8qKlxuICAgICAqINCT0YDRg9C/0L/QsCDQv9C+0LvQtdC5INCy0LLQvtC00LAg0LTQu9GPINGE0L7RgNC80YsgwqvQn9C+0LbQtdC70LDQvdC40Y8g0Lgg0L/RgNC10LTQu9C+0LbQtdC90LjRjyDQv9C+INGD0LvRg9GH0YjQtdC90LjRjiDRgdCw0LnRgtCwwrsuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgbmFtZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpLFxuICAgICAgICBwaG9uZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpLFxuICAgICAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpLFxuICAgICAgICBtZXNzYWdlOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCksXG4gICAgICAgIGZpbGVzOiBuZXcgRm9ybUNvbnRyb2w8U2NVcGxvYWRlZEZpbGVbXSB8IG51bGw+KFtdKSxcbiAgICAgICAgaXNTaG91bGRVc2VNZXNzZW5nZXI6IG5ldyBGb3JtQ29udHJvbDxib29sZWFuIHwgbnVsbD4oZmFsc2UpLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXRh9C40YHQu9C10L3QuNC1INGC0LjQv9C+0LIg0L/QvtC00YHQutCw0LfQvtC6LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzdWdnZXN0aW9uVHlwZTogdHlwZW9mIFNjSVN1Z2dlc3Rpb25UeXBlID0gU2NJU3VnZ2VzdGlvblR5cGU7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgU3ViamVjdH0g0YHQvtCx0YvRgtC40Y8g0L7RgtC/0YDQsNCy0LrQuCDRhNC+0YDQvNGLLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvblN1Ym1pdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0LfQsNC/0YDQvtGB0LAg0L3QsCDQvtGC0L/RgNCw0LLQutGDINC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdCQ6IE9ic2VydmFibGU8dW5kZWZpbmVkIHwgbnVsbD4gPSB0aGlzLm9uU3VibWl0LnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmZvcm0udmFsaWQpLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5mb3JtLnZhbHVlIGFzIFNjSUZlZWRiYWNrTWVzc2FnZSksXG4gICAgICAgIHRhcCgodmFsdWU6IFNjSUZlZWRiYWNrTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnBob25lICYmICFTY1Bob25lU2VydmljZS5pc1ZhbGlkUGhvbmVOdW1iZXJGb3JNZXNzZW5nZXIodmFsdWUucGhvbmUpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlLmlzU2hvdWxkVXNlTWVzc2VuZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tTZXJ2aWNlLnNlbmRGZWVkYmFjayh0aGlzLnNsdWcoKSBhcyBTY0ZlZWRiYWNrRm9ybXMsIHRoaXMuY29udmVydGVyc1NlcnZpY2UucmVtb3ZlTnVsbFJlY3Vyc2l2ZSh2YWx1ZSkpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmNvbXBsZXRlV2l0aCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25SZW1vdmVBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZFN1Y2Nlc3MuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMvbm8taW1wbGljaXQtYW55LWNhdGNoXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vINCi0L7QutC10L0g0LrQsNC/0YfQuCDQvtC00L3QvtGA0LDQt9C+0LLRi9C5OiDQtNC70Y8g0L/QvtCy0YLQvtGA0L3QvtC5INC+0YLQv9GA0LDQstC60Lgg0L3Rg9C20L3QsCDQvdC+0LLQsNGPINC/0YDQvtCy0LXRgNC60LAuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjYXB0Y2hhQ29udHJvbC5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCBtZXNzYWdlIH0gPSAoZXJyb3IuZXJyb3IgPz8ge30pIGFzIFNjSUFwaUVycm9yUmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IGVycm9yc1trZXldIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogW21lc3NhZ2VdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVzZWxlc3MtdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgc2hhcmUoKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0LjQt9C80LXQvdC10L3QuNGPINGB0L7RgdGC0L7Rj9C90LjRjyDQt9Cw0LPRgNGD0LfQutC4INC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnJlcXVlc3QkLnBpcGUobWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCkpO1xuXG4gICAgLyoqXG4gICAgICog0KPQv9GA0LDQstC70Y/QtdGCINGB0L7RgdGC0L7Rj9C90LjQtdC8INC30LDQs9GA0YPQttC10L3QvdGL0YUg0YTQsNC50LvQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBsb2FkZWRGaWxlOiBGb3JtQ29udHJvbDxUdWlGaWxlTGlrZVtdIHwgbnVsbD4gPSBuZXcgRm9ybUNvbnRyb2w8VHVpRmlsZUxpa2VbXSB8IG51bGw+KFtdLCBbdGhpcy5tYXhGaWxlc0xlbmd0aCgpXSk7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlLCDQutC+0YLQvtGA0YvQuSDQvtGC0YHQu9C10LbQuNCy0LDQtdGCLCDQv9GA0LjQvdGP0YLRiyDQu9C4INGE0LDQudC70Ysg0LIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC4INGBINGC0YDQtdCx0L7QstCw0L3QuNGP0LzQuCDQv9C+INGC0LjQv9GDINGA0LDQt9C80LXRgNGDINC4INGCLtC0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhY2NlcHRlZCQ6IE9ic2VydmFibGU8RmlsZVtdPiA9IHRoaXMubG9hZGVkRmlsZS52YWx1ZUNoYW5nZXMucGlwZShtYXAoKCkgPT4gdHVpRmlsZXNBY2NlcHRlZCh0aGlzLmxvYWRlZEZpbGUpKSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0YTQsNC50LvQvtCyLCDQutC+0YLQvtGA0YvQtSDQsdGL0LvQuCDQvtGC0LrQu9C+0L3QtdC90Ysg0L/RgNC4INC30LDQs9GA0YPQt9C60LUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlamVjdGVkOiByZWFkb25seSBGaWxlW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqINCh0L/QuNGB0L7QuiDRgdGC0YDQsNC9LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb3VudHJpZXM6IHJlYWRvbmx5IFR1aUNvdW50cnlJc29Db2RlW10gPSBnZXRDb3VudHJpZXMoKTtcblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NGZWVkYmFja0Zvcm1Db21wb25lbnR9LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICB0aGlzLnVzZXIkLFxuICAgICAgICAgICAgdGhpcy5hY2NlcHRlZCQucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5maWxlcy5yZXNldChbXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25VcGxvYWRGaWxlKGZpbGVzKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvLyDQktCw0LvQuNC00LDRhtC40Y8g0L/QvtC70LXQuSDQstCy0L7QtNCwINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDRhNC+0YDQvNGLLlxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhckFsbFZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QWxsVmFsaWRhdG9ycyh0aGlzLmZpZWxkcygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQtNCw0LvRj9C10YIg0LLQsNC70LjQtNCw0YbQuNGOINGB0L4g0LLRgdC10YUg0L/QvtC70LXQuSDQstCy0L7QtNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgY2xlYXJBbGxWYWxpZGF0b3JzKCk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcblxuICAgICAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbCAhPT0gdGhpcy5yZWNhcHRjaGFDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LLQsNC70LjQtNCw0YbQuNGOINGB0L4g0LTQu9GPINGD0LrQsNC30LDQvdC90YvRhSDQv9C+0LvQtdC5INCy0LLQvtC00LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRzINCf0L7Qu9GPLCDQtNC70Y8g0LrQvtGC0L7RgNGL0YUg0L3Rg9C20L3QviDRg9GB0YLQsNC90L7QstC40YLRjCDQstCw0LvQuNC00LDRhtC40Y4uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRBbGxWYWxpZGF0b3JzKGZpZWxkczogU2NGZWVkYmFja0Zvcm1GaWVsZFR5cGVbXSk6IHZvaWQge1xuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmlsZWQ6IFNjRmVlZGJhY2tGb3JtRmllbGRUeXBlKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXG4gICAgICAgICAgICBzd2l0Y2ggKGZpbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ25hbWUnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMyldKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGhvbmUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwaG9uZScpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBwaG9uZVZhbGlkYXRvcigpXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZW1haWwnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbWVzc2FnZScpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpbGVzJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZmlsZXMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5tYXhGaWxlc0xlbmd0aCg1KV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINC+0YLQutC70L7QvdC10L3QvdGL0LUg0YTQsNC50LvRiy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlcyDQodC/0LjRgdC+0Log0YTQsNC50LvQvtCyLCDQutC+0YLQvtGA0YvQtSDQsdGL0LvQuCDQvtGC0LrQu9C+0L3QtdC90YsuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUmVqZWN0KGZpbGVzOiByZWFkb25seSBGaWxlW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWplY3RlZCA9IFsuLi5uZXcgU2V0KFsuLi50aGlzLnJlamVjdGVkLCAuLi5maWxlc10pXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9GP0LXRgiDRhNCw0LnQuyDQuNC3INGB0L/QuNGB0LrQsCDQt9Cw0LPRgNGD0LbQtdC90L3Ri9GFINC4INC+0YLQutC70L7QvdC10L3QvdGL0YUg0YTQsNC50LvQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGUg0KTQsNC50LssINC60L7RgtC+0YDRi9C5INC90YPQttC90L4g0YPQtNCw0LvQuNGC0YwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUmVtb3ZlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWplY3RlZCA9IHRoaXMucmVqZWN0ZWQuZmlsdGVyKChyZWplY3RlZCkgPT4gcmVqZWN0ZWQgIT09IGZpbGUpO1xuICAgICAgICB0aGlzLmxvYWRlZEZpbGUuc2V0VmFsdWUodGhpcy5sb2FkZWRGaWxlLnZhbHVlPy5maWx0ZXIoKGN1cnJlbnQpID0+IGN1cnJlbnQgIT09IGZpbGUpID8/IFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGH0LjRidCw0LXRgiDRgdC/0LjRgdC+0Log0YTQsNC50LvQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvblJlbW92ZUFsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWplY3RlZCA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRlZEZpbGUuc2V0VmFsdWUoW10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQs9GA0YPQttCw0LXRgiDRhNCw0LnQuyDQsiDRhNC+0YDQvNGDINC+0LHRgNCw0YLQvdC+0Lkg0YHQstGP0LfQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlcyDQndCw0LHQvtGAINGE0LDQudC70L7Qsi5cbiAgICAgKi9cbiAgICBwcml2YXRlIG9uVXBsb2FkRmlsZShmaWxlczogVHVpRmlsZUxpa2VbXSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgZmlsZXM/LmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZWFkZXIucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmZpbGVzLnNldFZhbHVlKFsuLi4odGhpcy5mb3JtLmNvbnRyb2xzLmZpbGVzLnZhbHVlID8/IFtdKSwgbmV3IFNjVXBsb2FkZWRGaWxlKGZpbGUubmFtZSwgcmVhZGVyLnJlc3VsdC50b1N0cmluZygpKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlIGFzIHVua25vd24gYXMgQmxvYik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNGP0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDRhNCw0LnQu9C+0LIg0LfQsNCz0YDRg9C20LXQvdC90YvRhSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQvC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXhMZW5ndGgg0LzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC00L7Qv9GD0YHRgtC40LzQvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGE0LDQudC70L7QsiDQtNC70Y8g0L7RgtC/0YDQsNCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1heEZpbGVzTGVuZ3RoKG1heExlbmd0aDogbnVtYmVyID0gdGhpcy5tYXhGaWxlc0luRm9ybSk6IFZhbGlkYXRvckZuIHtcbiAgICAgICAgcmV0dXJuICh7IHZhbHVlIH06IEFic3RyYWN0Q29udHJvbDxUdWlGaWxlTGlrZVtdPikgPT5cbiAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCA/IHsgbWF4TGVuZ3RoOiBuZXcgVHVpVmFsaWRhdGlvbkVycm9yKGDQnNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0YTQsNC50LvQvtCyIC0gJHttYXhMZW5ndGh9YCkgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRi9C/0L7Qu9C90Y/QtdGCINC+0YfQuNGB0YLQutGDINC/0L7Qu9C10Lkg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KHtcbiAgICAgICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIHBob25lOiBudWxsLFxuICAgICAgICAgICAgbWVzc2FnZTogbnVsbCxcbiAgICAgICAgICAgIGZpbGVzOiBbXSxcbiAgICAgICAgICAgIGlzU2hvdWxkVXNlTWVzc2VuZ2VyOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDRh9GC0L4g0L3QvtC80LXRgCDRgtC10LvQtdGE0L7QvdCwINC/0L7QtNGF0L7QtNC40YIg0LTQu9GPINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINCyINC80LXRgdGB0LXQvdC00LbQtdGA0LDRhS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSDQndC+0LzQtdGAINGC0LXQu9C10YTQvtC90LAsINC60L7RgtC+0YDRi9C5INC90LXQvtCx0YXQvtC00LjQvNC+INC/0YDQvtCy0LXRgNC40YLRjC5cbiAgICAgKiBAcmV0dXJucyDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INC90L7QvNC10YAg0YLQtdC70LXRhNC+0L3QsCDQv9C+0LTRhdC+0LTQuNGCINC00LvRjyDQvNC10YHRgdC10L3QtNC20LXRgNC+0LIuXG4gICAgICovXG4gICAgQHR1aVB1cmVcbiAgICBwcm90ZWN0ZWQgaXNWYWxpZFBob25lTnVtYmVyRm9yTWVzc2VuZ2VyKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFNjUGhvbmVTZXJ2aWNlLmlzVmFsaWRQaG9uZU51bWJlckZvck1lc3Nlbmdlcih2YWx1ZSk7XG4gICAgfVxufVxuIiwiQGxldCBmaWVsZHNMaXN0ID0gZmllbGRzKCk7XG48Zm9ybVxuICAgICpuZ0lmPVwiZmllbGRzTGlzdC5sZW5ndGggPiAwXCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdC5uZXh0KClcIlxuICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIlxuPlxuICAgIDwhLS0g0KTQmNCeIC0tPlxuICAgIDxsYWJlbFxuICAgICAgICAqbmdJZj1cImZpZWxkc0xpc3QuaW5jbHVkZXMoJ25hbWUnKVwiXG4gICAgICAgIHR1aUxhYmVsXG4gICAgPlxuICAgICAgICDQpNCY0J5cbiAgICAgICAgPHR1aS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+INCj0LrQsNC20LjRgtC1INCS0LDRiNC4INCkLtCYLtCeLiA8L3R1aS1pbnB1dD5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCi0LXQu9C10YTQvtC9IC0tPlxuICAgIEBpZiAoZmllbGRzTGlzdC5pbmNsdWRlcygncGhvbmUnKSkge1xuICAgICAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgICAgICDQotC10LvQtdGE0L7QvVxuICAgICAgICAgICAgPHR1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBob25lXCJcbiAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXRQaG9uZUludGVybmF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgW2NvdW50cnlTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb3VudHJpZXNdPVwiKGNvdW50cmllcyB8IHR1aVNvcnRDb3VudHJpZXMgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJwaG9uZVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaG9uZVwiXG4gICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAqbmdJZj1cImZpZWxkc0xpc3QuaW5jbHVkZXMoJ2lzU2hvdWxkVXNlTWVzc2VuZ2VyJykgJiYgZm9ybS5jb250cm9scy5waG9uZS52YWx1ZSAmJiBpc1ZhbGlkUGhvbmVOdW1iZXJGb3JNZXNzZW5nZXIoZm9ybS5jb250cm9scy5waG9uZS52YWx1ZSlcIlxuICAgICAgICAgICAgdHVpTGFiZWxcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaXNTaG91bGRVc2VNZXNzZW5nZXJcIlxuICAgICAgICAgICAgICAgIHR1aUNoZWNrYm94XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiB0dWlUaXRsZT4g0J3QsNC/0LjRgdCw0YLRjCDQsiDQvNC10YHRgdC10L3QtNC20LXRgNCw0YUsINCwINC90LUg0LfQstC+0L3QuNGC0YwgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgIH1cbiAgICA8IS0tINCQ0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLIC0tPlxuICAgIDxsYWJlbFxuICAgICAgICAqbmdJZj1cImZpZWxkc0xpc3QuaW5jbHVkZXMoJ2VtYWlsJylcIlxuICAgICAgICB0dWlMYWJlbFxuICAgID5cbiAgICAgICAg0JDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YtcbiAgICAgICAgPHR1aS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiPlxuICAgICAgICAgICAg0JDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YtcbiAgICAgICAgICAgIDxzYy1zdWdnZXN0aW9uLWZpZWxkXG4gICAgICAgICAgICAgICAgKnR1aURhdGFMaXN0XG4gICAgICAgICAgICAgICAgW3R5cGVdPVwic3VnZ2VzdGlvblR5cGUuZW1haWxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC90dWktaW5wdXQ+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgPC9sYWJlbD5cblxuICAgIDwhLS0g0JrQvtC80LzQtdC90YLQsNGA0LjQuSAtLT5cbiAgICA8bGFiZWxcbiAgICAgICAgKm5nSWY9XCJmaWVsZHNMaXN0LmluY2x1ZGVzKCdtZXNzYWdlJylcIlxuICAgICAgICB0dWlMYWJlbFxuICAgID5cbiAgICAgICAg0JrQvtC80LzQtdC90YLQsNGA0LjQuVxuICAgICAgICA8dHVpLXRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cIm1lc3NhZ2VcIj4g0JrQvtC80LzQtdC90YLQsNGA0LjQuSA8L3R1aS10ZXh0YXJlYT5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCk0LDQudC70YsgLS0+XG4gICAgPGRpdlxuICAgICAgICAqbmdJZj1cImZpZWxkc0xpc3QuaW5jbHVkZXMoJ2ZpbGVzJylcIlxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTFcIlxuICAgID5cbiAgICAgICAgPGxhYmVsIHR1aUlucHV0RmlsZXM+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjdmFsaWRhdG9yPVwidHVpSW5wdXRGaWxlc1ZhbGlkYXRvclwiXG4gICAgICAgICAgICAgICAgYWNjZXB0PVwiLmRvYywuZG9jeCwucGRmLGltYWdlLypcIlxuICAgICAgICAgICAgICAgIHR1aUlucHV0RmlsZXNcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibG9hZGVkRmlsZVwiXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChyZWplY3QpPVwib25SZWplY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICpuZ0lmPVwibG9hZGVkRmlsZS5pbnZhbGlkXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbJ21heExlbmd0aCddIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJsb2FkZWRGaWxlXCJcbiAgICAgICAgLz5cblxuICAgICAgICBAbGV0IGFjY2VwdGVkID0gYWNjZXB0ZWQkIHwgYXN5bmM7XG4gICAgICAgIDx0dWktZmlsZXNcbiAgICAgICAgICAgICpuZ0lmPVwiYWNjZXB0ZWQ/Lmxlbmd0aCB8fCByZWplY3RlZC5sZW5ndGhcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktc3BhY2VfdG9wLTFcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dHVpLWZpbGVcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsZSBvZiBhY2NlcHRlZFwiXG4gICAgICAgICAgICAgICAgW2ZpbGVdPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJvblJlbW92ZShmaWxlKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHR1aS1maWxlXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpbGUgb2YgcmVqZWN0ZWRcIlxuICAgICAgICAgICAgICAgIHN0YXRlPVwiZXJyb3JcIlxuICAgICAgICAgICAgICAgIFtmaWxlXT1cIihmaWxlIHwgdHVpRmlsZVJlamVjdGVkOiB2YWxpZGF0b3IgfCBhc3luYykgfHwgZmlsZVwiXG4gICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJvblJlbW92ZShmaWxlKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3R1aS1maWxlcz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0g0JrQsNC/0YfQsCAtLT5cbiAgICBAaWYgKGZvcm0uZ2V0KCdyZWNhcHRjaGEnKTsgYXMgcmVjYXB0Y2hhKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWItMyBtYXgtaC1bNy41cmVtXSBvdmVyZmxvdy1oaWRkZW4gZHVyYXRpb24tNTAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJyFtYXgtaC0wICEtbS0yJzogcmVjYXB0Y2hhLnZhbGlkIH1cIlxuICAgICAgICAgICAgW2F0dHIuaW5lcnRdPVwicmVjYXB0Y2hhLnZhbGlkID8gJycgOiBudWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNjLXNtYXJ0LWNhcHRjaGEgZm9ybUNvbnRyb2xOYW1lPVwicmVjYXB0Y2hhXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAocmVjYXB0Y2hhLmdldEVycm9yKCdzZXJ2ZXJSZXNwb25zZScpOyBhcyBzZXJ2ZXJFcnJvcnMpIHtcbiAgICAgICAgICAgIDx0dWktZXJyb3IgW2Vycm9yXT1cInNlcnZlckVycm9ycy5qb2luKCcgJylcIiAvPlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgPCEtLSDQrdC70LXQvNC10L3RgtGLINGD0L/RgNCw0LLQu9C10L3QuNGPICAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCIhIShsb2FkaW5nJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkuc2Muc2VuZFwiXG4gICAgICAgICAgICBjbGFzcz1cInNlbGYtY2VudGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0J7RgtC/0YDQsNCy0LjRgtGMXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdyBiYXNpcy02MCB0ZXh0LWJvZHktc1wiPlxuICAgICAgICAgICAg0J3QsNC20LjQvNCw0Y8g0L3QsCDQutC90L7Qv9C60YMsINCy0Ysg0YHQvtCz0LvQsNGI0LDQtdGC0LXRgdGMINGBXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgICAgIFtwc2V1ZG9dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbnRleHQ/LmRhdGE/Lm9uQ2xpY2tPZmZlckhhbmRsZXIoKTsgY2xpY2tPZmZlci5lbWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgINCf0L7Qu9C40YLQuNC60L7QuSDQutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90L7RgdGC0LhcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtZmVlZGJhY2stZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZmVlZGJhY2svZmVlZGJhY2stZm9ybS9zYy1mZWVkYmFjay1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9mZWVkYmFjay9mZWVkYmFjay1mb3JtL3NjLWZlZWRiYWNrLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZFQUE2RTtBQUU3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkgsT0FBTyxFQUNILG1CQUFtQixFQUVuQixpQkFBaUIsRUFHakIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxjQUFjLEVBRWQsYUFBYSxHQUNoQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBaUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRSxPQUFP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O0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBRU8sOEJBQThCLENBQUMsS0FBYTtRQUNsRCxPQUFPLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDOytHQWpWUSx1QkFBdUI7bUdBQXZCLHVCQUF1QiwrWkNyRXBDLHVnTUErSkEsdUNEcEhRLFNBQVMsNkNBQ1QsbUJBQW1CLGl6Q0FDbkIsT0FBTyxvRkFDUCxLQUFLLG1IQUNMLFFBQVEsb0VBQ1IsaUJBQWlCLHFEQUNqQixrQkFBa0IseUtBQ2xCLGNBQWMsa0xBQ2QsbUJBQW1CLCtCQUNuQixTQUFTLG9JQUNULGdCQUFnQix1SEFDaEIsUUFBUSwyREFDUixvQkFBb0Isb0xBQ3BCLGVBQWUscVFBQ2YsT0FBTyw0RkFDUCxJQUFJLDRGQUNKLGlCQUFpQiw0T0FDakIsV0FBVyxvR0FDWCxRQUFRLHFwQkFFUiwwQkFBMEIscVFBRTFCLG9CQUFvQjs7QUFtVmQ7SUFEVCxPQUFPOzZFQUdQOzRGQWpWUSx1QkFBdUI7a0JBL0JuQyxTQUFTO2lDQUNNLElBQUksWUFDTixrQkFBa0IsV0FFbkI7d0JBQ0wsU0FBUzt3QkFDVCxtQkFBbUI7d0JBQ25CLE9BQU87d0JBQ1AsS0FBSzt3QkFDTCxRQUFRO3dCQUNSLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLFFBQVE7d0JBQ1Isb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLE9BQU87d0JBQ1AsSUFBSTt3QkFDSixpQkFBaUI7d0JBQ2pCLFdBQVc7d0JBQ1gsUUFBUTt3QkFDUixRQUFRO3dCQUNSLDBCQUEwQjt3QkFDMUIsR0FBRyxZQUFZO3dCQUNmLG9CQUFvQjtxQkFDdkIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07d0RBaVZyQyw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAqL1xuXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgSW5wdXRTaWduYWwsIG91dHB1dCwgT3V0cHV0RW1pdHRlclJlZiwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBTY0NvbnZlcnRlcnNTZXJ2aWNlLFxuICAgIFNjRmVlZGJhY2tGb3JtcyxcbiAgICBTY0ZlZWRiYWNrU2VydmljZSxcbiAgICBTY0lBcGlFcnJvclJlc3BvbnNlLFxuICAgIFNjSUZlZWRiYWNrTWVzc2FnZSxcbiAgICBTY0lTdWdnZXN0aW9uVHlwZSxcbiAgICBTY1Bob25lU2VydmljZSxcbiAgICBTY1VwbG9hZGVkRmlsZSxcbiAgICBTY1VzZXIsXG4gICAgU2NVc2VyU2VydmljZSxcbn0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBUdWlMb29zZVVuaW9uLCB0dWlQdXJlLCBUdWlWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aUJ1dHRvbiwgVHVpRGlhbG9nQ29udGV4dCwgVHVpRXJyb3IsIFR1aUxhYmVsLCBUdWlMaW5rLCBUdWlUZXh0ZmllbGQsIFR1aVRpdGxlIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVHVpSW5wdXRQaG9uZUludGVybmF0aW9uYWwgfSBmcm9tICdAdGFpZ2EtdWkvZXhwZXJpbWVudGFsJztcbmltcG9ydCB7IFR1aUNvdW50cnlJc29Db2RlIH0gZnJvbSAnQHRhaWdhLXVpL2kxOG4nO1xuaW1wb3J0IHsgVHVpQnV0dG9uTG9hZGluZywgVHVpQ2hlY2tib3gsIFR1aUZpZWxkRXJyb3JQaXBlLCBUdWlGaWxlTGlrZSwgVHVpRmlsZXMsIHR1aUZpbGVzQWNjZXB0ZWQsIFR1aVNvcnRDb3VudHJpZXNQaXBlIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBUdWlJbnB1dE1vZHVsZSwgVHVpSW5wdXRQaG9uZU1vZHVsZSwgVHVpVGV4dGFyZWFNb2R1bGUgfSBmcm9tICdAdGFpZ2EtdWkvbGVnYWN5JztcbmltcG9ydCB7IFBPTFlNT1JQSEVVU19DT05URVhUIH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5pbXBvcnQgeyBnZXRDb3VudHJpZXMgfSBmcm9tICdsaWJwaG9uZW51bWJlci1qcyc7XG5pbXBvcnQgeyBSZWNhcHRjaGFDb21wb25lbnQsIFJlY2FwdGNoYUZvcm1zTW9kdWxlLCBSZWNhcHRjaGFNb2R1bGUgfSBmcm9tICduZy1yZWNhcHRjaGEtMic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBzaGFyZSwgc3RhcnRXaXRoLCBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY0Zvcm1GaWVsZHNNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkcyc7XG5pbXBvcnQgeyBNQVhfRklMRVNfSU5fRk9STV9JTlBVVCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9zYy1tYXgtZmlsZXMtaW4tZm9ybS1pbnB1dCc7XG5pbXBvcnQgeyBwaG9uZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvc2MtcGhvbmUtdmFsaWRhdG9yJztcbmltcG9ydCB7IFNjRmVlZGJhY2tGb3JtQ29uZmlnLCBTY0ZlZWRiYWNrRm9ybUZpZWxkVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDRhNC+0YDQvNGLINC+0LHRgNCw0YLQvdC+0Lkg0YHQstGP0LfQuC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLWZlZWRiYWNrLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1mZWVkYmFjay1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgTmdGb3IsXG4gICAgICAgIFR1aUVycm9yLFxuICAgICAgICBUdWlGaWVsZEVycm9yUGlwZSxcbiAgICAgICAgU2NGb3JtRmllbGRzTW9kdWxlLFxuICAgICAgICBUdWlJbnB1dE1vZHVsZSxcbiAgICAgICAgVHVpSW5wdXRQaG9uZU1vZHVsZSxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlCdXR0b25Mb2FkaW5nLFxuICAgICAgICBUdWlMYWJlbCxcbiAgICAgICAgUmVjYXB0Y2hhRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlY2FwdGNoYU1vZHVsZSxcbiAgICAgICAgVHVpTGluayxcbiAgICAgICAgTmdJZixcbiAgICAgICAgVHVpVGV4dGFyZWFNb2R1bGUsXG4gICAgICAgIFR1aUNoZWNrYm94LFxuICAgICAgICBUdWlUaXRsZSxcbiAgICAgICAgVHVpRmlsZXMsXG4gICAgICAgIFR1aUlucHV0UGhvbmVJbnRlcm5hdGlvbmFsLFxuICAgICAgICAuLi5UdWlUZXh0ZmllbGQsXG4gICAgICAgIFR1aVNvcnRDb3VudHJpZXNQaXBlLFxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjRmVlZGJhY2tGb3JtQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQmtC+0L3RgtC10LrRgdGCINC00LjQsNC70L7Qs9C+0LLQvtCz0L4g0L7QutC90LAsINCyINC60L7RgtC+0YDQvtC8INC+0YLQutGA0YvRgiDQutC+0LzQv9C+0L3QtdC90YIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRleHQ6IFR1aURpYWxvZ0NvbnRleHQ8dm9pZCwgeyBvbkNsaWNrT2ZmZXJIYW5kbGVyOiAoKSA9PiB2b2lkIH0gJiBTY0ZlZWRiYWNrRm9ybUNvbmZpZz4gfCBudWxsID0gaW5qZWN0PFxuICAgICAgICBUdWlEaWFsb2dDb250ZXh0PHZvaWQsIHsgb25DbGlja09mZmVySGFuZGxlcjogKCkgPT4gdm9pZCB9ICYgU2NGZWVkYmFja0Zvcm1Db25maWc+XG4gICAgPihQT0xZTU9SUEhFVVNfQ09OVEVYVCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKlxuICAgICAqINCh0LjQvNCy0L7Qu9GM0L3QvtC1INC+0LHQvtC30L3QsNGH0LXQvdC40LUgKHNsdWcpINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2x1Z0lucHV0OiBJbnB1dFNpZ25hbDxUdWlMb29zZVVuaW9uPFNjRmVlZGJhY2tGb3Jtcz4+ID0gaW5wdXQ8VHVpTG9vc2VVbmlvbjxTY0ZlZWRiYWNrRm9ybXM+PignY29tbW9uJywgeyBhbGlhczogJ3NsdWcnIH0pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INC/0L7Qu9C10LksINC00L7RgdGC0YPQv9C90YvRhSDQsiDQtNCw0L3QvdC+0Lkg0YTQvtGA0LzQtS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZHNJbnB1dDogSW5wdXRTaWduYWw8U2NGZWVkYmFja0Zvcm1GaWVsZFR5cGVbXT4gPSBpbnB1dDxTY0ZlZWRiYWNrRm9ybUZpZWxkVHlwZVtdPihbJ25hbWUnLCAnZW1haWwnLCAncGhvbmUnLCAnbWVzc2FnZScsICdmaWxlcyddLCB7IGFsaWFzOiAnZmllbGRzJyB9KTtcblxuICAgIC8qKlxuICAgICAqINCh0LjQvNCy0L7Qu9GM0L3QvtC1INC+0LHQvtC30L3QsNGH0LXQvdC40LUgKHNsdWcpINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNsdWc6IFNpZ25hbDxUdWlMb29zZVVuaW9uPFNjRmVlZGJhY2tGb3Jtcz4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb250ZXh0Py5kYXRhLnNsdWcgPz8gdGhpcy5zbHVnSW5wdXQoKSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0L/QvtC70LXQuSwg0LTQvtGB0YLRg9C/0L3Ri9GFINCyINC00LDQvdC90L7QuSDRhNC+0YDQvNC1LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmaWVsZHM6IFNpZ25hbDxTY0ZlZWRiYWNrRm9ybUZpZWxkVHlwZVtdPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29udGV4dD8uZGF0YS5maWVsZHMgPz8gdGhpcy5maWVsZHNJbnB1dCgpKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0LrQvdC+0L/QutGDINC00L7Qs9C+0LLQvtGA0LAg0L7RhNC10YDRgtGLLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjbGlja09mZmVyOiBPdXRwdXRFbWl0dGVyUmVmPHZvaWQ+ID0gb3V0cHV0KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDRg9GB0L/QtdGI0L3QvtC5INC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VuZFN1Y2Nlc3M6IE91dHB1dEVtaXR0ZXJSZWY8dm9pZD4gPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQvtCx0YDQsNGC0L3QvtC5INGB0LLRj9C30LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBmZWVkYmFja1NlcnZpY2U6IFNjRmVlZGJhY2tTZXJ2aWNlID0gaW5qZWN0KFNjRmVlZGJhY2tTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQutC+0L3QstC10YDRgtCw0YbQuNC4INC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnZlcnRlcnNTZXJ2aWNlOiBTY0NvbnZlcnRlcnNTZXJ2aWNlID0gaW5qZWN0KFNjQ29udmVydGVyc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGE0LDQudC70L7Qsiwg0L7RgtC/0YDQsNCy0LvRj9C10LzRi9GFINCyINGE0L7RgNC80LUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlc0luRm9ybTogbnVtYmVyID0gaW5qZWN0KE1BWF9GSUxFU19JTl9GT1JNX0lOUFVUKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNCw0L3QvdGL0YUg0L4g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlciQ6IE9ic2VydmFibGU8U2NVc2VyPiA9IGluamVjdChTY1VzZXJTZXJ2aWNlKVxuICAgICAgICAuZ2V0VXNlckNoYW5nZSQoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcCgodXNlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1c2VyLmlzR3Vlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZm9ybSBhcyBGb3JtR3JvdXApLmFkZENvbnRyb2woJ3JlY2FwdGNoYScsIHRoaXMucmVjYXB0Y2hhQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZm9ybSBhcyBGb3JtR3JvdXApLnJlbW92ZUNvbnRyb2woJ3JlY2FwdGNoYScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpZWxkcy5pbmNsdWRlcygnbmFtZScpID8gdXNlci5uYW1lIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lOiBmaWVsZHMuaW5jbHVkZXMoJ3Bob25lJykgPyB1c2VyLmNvbnRhY3RzLnBob25lLnZhbHVlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBmaWVsZHMuaW5jbHVkZXMoJ2VtYWlsJykgPyB1c2VyLmNvbnRhY3RzLmVtYWlsLnZhbHVlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgIC8qKlxuICAgICAqINCf0L7Qu9C1INCy0LLQvtC00LAg0LTQu9GPIHJlY2FwdGNoYS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjYXB0Y2hhQ29udHJvbDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4gPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cbiAgICAvKipcbiAgICAgKiDQk9GA0YPQv9C/0LAg0L/QvtC70LXQuSDQstCy0L7QtNCwINC00LvRjyDRhNC+0YDQvNGLIMKr0J/QvtC20LXQu9Cw0L3QuNGPINC4INC/0YDQtdC00LvQvtC20LXQvdC40Y8g0L/QviDRg9C70YPRh9GI0LXQvdC40Y4g0YHQsNC50YLQsMK7LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKSxcbiAgICAgICAgcGhvbmU6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKSxcbiAgICAgICAgZW1haWw6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKSxcbiAgICAgICAgbWVzc2FnZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpLFxuICAgICAgICBmaWxlczogbmV3IEZvcm1Db250cm9sPFNjVXBsb2FkZWRGaWxlW10gfCBudWxsPihbXSksXG4gICAgICAgIGlzU2hvdWxkVXNlTWVzc2VuZ2VyOiBuZXcgRm9ybUNvbnRyb2w8Ym9vbGVhbiB8IG51bGw+KGZhbHNlKSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqINCf0LXRgNC10YfQuNGB0LvQtdC90LjQtSDRgtC40L/QvtCyINC/0L7QtNGB0LrQsNC30L7Qui5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3VnZ2VzdGlvblR5cGU6IHR5cGVvZiBTY0lTdWdnZXN0aW9uVHlwZSA9IFNjSVN1Z2dlc3Rpb25UeXBlO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIFN1YmplY3R9INGB0L7QsdGL0YLQuNGPINC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25TdWJtaXQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC30LDQv9GA0L7RgdCwINC90LAg0L7RgtC/0YDQsNCy0LrRgyDQtNCw0L3QvdGL0YUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3QkOiBPYnNlcnZhYmxlPHVuZGVmaW5lZCB8IG51bGw+ID0gdGhpcy5vblN1Ym1pdC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5mb3JtLnZhbGlkKSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuZm9ybS52YWx1ZSBhcyBTY0lGZWVkYmFja01lc3NhZ2UpLFxuICAgICAgICB0YXAoKHZhbHVlOiBTY0lGZWVkYmFja01lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5waG9uZSAmJiAhU2NQaG9uZVNlcnZpY2UuaXNWYWxpZFBob25lTnVtYmVyRm9yTWVzc2VuZ2VyKHZhbHVlLnBob25lKSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZS5pc1Nob3VsZFVzZU1lc3NlbmdlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgodmFsdWUpID0+XG4gICAgICAgICAgICB0aGlzLmZlZWRiYWNrU2VydmljZS5zZW5kRmVlZGJhY2sodGhpcy5zbHVnKCkgYXMgU2NGZWVkYmFja0Zvcm1zLCB0aGlzLmNvbnZlcnRlcnNTZXJ2aWNlLnJlbW92ZU51bGxSZWN1cnNpdmUodmFsdWUpKS5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5jb21wbGV0ZVdpdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVtb3ZlQWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRTdWNjZXNzLmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzL25vLWltcGxpY2l0LWFueS1jYXRjaFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCBtZXNzYWdlIH0gPSBlcnJvci5lcnJvciBhcyBTY0lBcGlFcnJvclJlc3BvbnNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEVycm9ycyh7IHNlcnZlclJlc3BvbnNlOiBlcnJvcnNba2V5XSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IFttZXNzYWdlXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11c2VsZXNzLXVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpXG4gICAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC40LfQvNC10L3QtdC90LjRjyDRgdC+0YHRgtC+0Y/QvdC40Y8g0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5yZXF1ZXN0JC5waXBlKG1hcCgodmFsdWUpID0+IHZhbHVlID09PSB1bmRlZmluZWQpKTtcblxuICAgIC8qKlxuICAgICAqINCj0L/RgNCw0LLQu9GP0LXRgiDRgdC+0YHRgtC+0Y/QvdC40LXQvCDQt9Cw0LPRgNGD0LbQtdC90L3Ri9GFINGE0LDQudC70L7Qsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZGVkRmlsZTogRm9ybUNvbnRyb2w8VHVpRmlsZUxpa2VbXSB8IG51bGw+ID0gbmV3IEZvcm1Db250cm9sPFR1aUZpbGVMaWtlW10gfCBudWxsPihbXSwgW3RoaXMubWF4RmlsZXNMZW5ndGgoKV0pO1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2YWJsZSwg0LrQvtGC0L7RgNGL0Lkg0L7RgtGB0LvQtdC20LjQstCw0LXRgiwg0L/RgNC40L3Rj9GC0Ysg0LvQuCDRhNCw0LnQu9GLINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgSDRgtGA0LXQsdC+0LLQsNC90LjRj9C80Lgg0L/QviDRgtC40L/RgyDRgNCw0LfQvNC10YDRgyDQuCDRgi7QtC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0ZWQkOiBPYnNlcnZhYmxlPEZpbGVbXT4gPSB0aGlzLmxvYWRlZEZpbGUudmFsdWVDaGFuZ2VzLnBpcGUobWFwKCgpID0+IHR1aUZpbGVzQWNjZXB0ZWQodGhpcy5sb2FkZWRGaWxlKSkpO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGE0LDQudC70L7Qsiwg0LrQvtGC0L7RgNGL0LUg0LHRi9C70Lgg0L7RgtC60LvQvtC90LXQvdGLINC/0YDQuCDQt9Cw0LPRgNGD0LfQutC1LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWplY3RlZDogcmVhZG9ubHkgRmlsZVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0YHRgtGA0LDQvS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY291bnRyaWVzOiByZWFkb25seSBUdWlDb3VudHJ5SXNvQ29kZVtdID0gZ2V0Q291bnRyaWVzKCk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjRmVlZGJhY2tGb3JtQ29tcG9uZW50fS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQrdGC0L4g0YDQtdGI0LXQvdC40LUg0L7RiNC40LHQutC4ICM0OTQwLCDQsdGL0LvQviBAc2VlIFvQv9GA0LXQtNC70L7QttC10L3Qvl0oaHR0cHM6Ly9naXRodWIuY29tL0RldGhBcmllbC9uZy1yZWNhcHRjaGEvaXNzdWVzLzEyMyNpc3N1ZWNvbW1lbnQtNDI2MTEyMTAxKSDQsNCy0YLQvtGA0L7QvCB7QGxpbmsgUmVjYXB0Y2hhQ29tcG9uZW50fS5cbiAgICAgICAgICovXG4gICAgICAgIFJlY2FwdGNoYUNvbXBvbmVudC5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2RvdC1ub3RhdGlvblxuICAgICAgICAgICAgaWYgKHRoaXNbJ3N1YnNjcmlwdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgdGhpc1snc3Vic2NyaXB0aW9uJ10udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHRoaXMudXNlciQsXG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkJC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoZmlsZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmZpbGVzLnJlc2V0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblVwbG9hZEZpbGUoZmlsZXMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIC8vINCS0LDQu9C40LTQsNGG0LjRjyDQv9C+0LvQtdC5INCy0LLQvtC00LAg0LIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINGE0L7RgNC80YsuXG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQWxsVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgdGhpcy5zZXRBbGxWYWxpZGF0b3JzKHRoaXMuZmllbGRzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9GP0LXRgiDQstCw0LvQuNC00LDRhtC40Y4g0YHQviDQstGB0LXRhSDQv9C+0LvQtdC5INCy0LLQvtC00LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhckFsbFZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuXG4gICAgICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sICE9PSB0aGlzLnJlY2FwdGNoYUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDQstCw0LvQuNC00LDRhtC40Y4g0YHQviDQtNC70Y8g0YPQutCw0LfQsNC90L3Ri9GFINC/0L7Qu9C10Lkg0LLQstC+0LTQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZHMg0J/QvtC70Y8sINC00LvRjyDQutC+0YLQvtGA0YvRhSDQvdGD0LbQvdC+INGD0YHRgtCw0L3QvtCy0LjRgtGMINCy0LDQu9C40LTQsNGG0LjRji5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEFsbFZhbGlkYXRvcnMoZmllbGRzOiBTY0ZlZWRiYWNrRm9ybUZpZWxkVHlwZVtdKTogdm9pZCB7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWxlZDogU2NGZWVkYmFja0Zvcm1GaWVsZFR5cGUpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2VcbiAgICAgICAgICAgIHN3aXRjaCAoZmlsZWQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbmFtZScpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgzKV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwaG9uZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3Bob25lJyk/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHBob25lVmFsaWRhdG9yKCldKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdlbWFpbCcpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdtZXNzYWdlJyk/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZmlsZXMnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlcycpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLm1heEZpbGVzTGVuZ3RoKDUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0L7RgtC60LvQvtC90LXQvdC90YvQtSDRhNCw0LnQu9GLLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVzINCh0L/QuNGB0L7QuiDRhNCw0LnQu9C+0LIsINC60L7RgtC+0YDRi9C1INCx0YvQu9C4INC+0YLQutC70L7QvdC10L3Riy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25SZWplY3QoZmlsZXM6IHJlYWRvbmx5IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlamVjdGVkID0gWy4uLm5ldyBTZXQoWy4uLnRoaXMucmVqZWN0ZWQsIC4uLmZpbGVzXSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINGE0LDQudC7INC40Lcg0YHQv9C40YHQutCwINC30LDQs9GA0YPQttC10L3QvdGL0YUg0Lgg0L7RgtC60LvQvtC90LXQvdC90YvRhSDRhNCw0LnQu9C+0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZSDQpNCw0LnQuywg0LrQvtGC0L7RgNGL0Lkg0L3Rg9C20L3QviDRg9C00LDQu9C40YLRjC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25SZW1vdmUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlamVjdGVkID0gdGhpcy5yZWplY3RlZC5maWx0ZXIoKHJlamVjdGVkKSA9PiByZWplY3RlZCAhPT0gZmlsZSk7XG4gICAgICAgIHRoaXMubG9hZGVkRmlsZS5zZXRWYWx1ZSh0aGlzLmxvYWRlZEZpbGUudmFsdWU/LmZpbHRlcigoY3VycmVudCkgPT4gY3VycmVudCAhPT0gZmlsZSkgPz8gW10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YfQuNGJ0LDQtdGCINGB0L/QuNGB0L7QuiDRhNCw0LnQu9C+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUmVtb3ZlQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlamVjdGVkID0gW107XG4gICAgICAgIHRoaXMubG9hZGVkRmlsZS5zZXRWYWx1ZShbXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JfQsNCz0YDRg9C20LDQtdGCINGE0LDQudC7INCyINGE0L7RgNC80YMg0L7QsdGA0LDRgtC90L7QuSDRgdCy0Y/Qt9C4LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVzINCd0LDQsdC+0YAg0YTQsNC50LvQvtCyLlxuICAgICAqL1xuICAgIHByaXZhdGUgb25VcGxvYWRGaWxlKGZpbGVzOiBUdWlGaWxlTGlrZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBmaWxlcz8uZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZmlsZXMuc2V0VmFsdWUoWy4uLih0aGlzLmZvcm0uY29udHJvbHMuZmlsZXMudmFsdWUgPz8gW10pLCBuZXcgU2NVcGxvYWRlZEZpbGUoZmlsZS5uYW1lLCByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUgYXMgdW5rbm93biBhcyBCbG9iKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INGE0LDQudC70L7QsiDQt9Cw0LPRgNGD0LbQtdC90L3Ri9GFINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC8LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1heExlbmd0aCDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LTQvtC/0YPRgdGC0LjQvNC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0YTQsNC50LvQvtCyINC00LvRjyDQvtGC0L/RgNCw0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgbWF4RmlsZXNMZW5ndGgobWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLm1heEZpbGVzSW5Gb3JtKTogVmFsaWRhdG9yRm4ge1xuICAgICAgICByZXR1cm4gKHsgdmFsdWUgfTogQWJzdHJhY3RDb250cm9sPFR1aUZpbGVMaWtlW10+KSA9PlxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoID8geyBtYXhMZW5ndGg6IG5ldyBUdWlWYWxpZGF0aW9uRXJyb3IoYNCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRhNCw0LnQu9C+0LIgLSAke21heExlbmd0aH1gKSB9IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGL0L/QvtC70L3Rj9C10YIg0L7Rh9C40YHRgtC60YMg0L/QvtC70LXQuSDRhNC+0YDQvNGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0ucmVzZXQoe1xuICAgICAgICAgICAgZW1haWw6IG51bGwsXG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgICAgcGhvbmU6IG51bGwsXG4gICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxuICAgICAgICAgICAgZmlsZXM6IFtdLFxuICAgICAgICAgICAgaXNTaG91bGRVc2VNZXNzZW5nZXI6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIsINGH0YLQviDQvdC+0LzQtdGAINGC0LXQu9C10YTQvtC90LAg0L/QvtC00YXQvtC00LjRgiDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0LIg0LzQtdGB0YHQtdC90LTQttC10YDQsNGFLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlINCd0L7QvNC10YAg0YLQtdC70LXRhNC+0L3QsCwg0LrQvtGC0L7RgNGL0Lkg0L3QtdC+0LHRhdC+0LTQuNC80L4g0L/RgNC+0LLQtdGA0LjRgtGMLlxuICAgICAqIEByZXR1cm5zINCf0YDQuNC30L3QsNC6INGC0L7Qs9C+LCDRh9GC0L4g0L3QvtC80LXRgCDRgtC10LvQtdGE0L7QvdCwINC/0L7QtNGF0L7QtNC40YIg0LTQu9GPINC80LXRgdGB0LXQvdC00LbQtdGA0L7Qsi5cbiAgICAgKi9cbiAgICBAdHVpUHVyZVxuICAgIHByb3RlY3RlZCBpc1ZhbGlkUGhvbmVOdW1iZXJGb3JNZXNzZW5nZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU2NQaG9uZVNlcnZpY2UuaXNWYWxpZFBob25lTnVtYmVyRm9yTWVzc2VuZ2VyKHZhbHVlKTtcbiAgICB9XG59XG4iLCJAbGV0IGZpZWxkc0xpc3QgPSBmaWVsZHMoKTtcbjxmb3JtXG4gICAgKm5nSWY9XCJmaWVsZHNMaXN0Lmxlbmd0aCA+IDBcIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgKG5nU3VibWl0KT1cIm9uU3VibWl0Lm5leHQoKVwiXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiXG4+XG4gICAgPCEtLSDQpNCY0J4gLS0+XG4gICAgPGxhYmVsXG4gICAgICAgICpuZ0lmPVwiZmllbGRzTGlzdC5pbmNsdWRlcygnbmFtZScpXCJcbiAgICAgICAgdHVpTGFiZWxcbiAgICA+XG4gICAgICAgINCk0JjQnlxuICAgICAgICA8dHVpLWlucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj4g0KPQutCw0LbQuNGC0LUg0JLQsNGI0Lgg0KQu0Jgu0J4uIDwvdHVpLWlucHV0PlxuICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgPC9sYWJlbD5cblxuICAgIDwhLS0g0KLQtdC70LXRhNC+0L0gLS0+XG4gICAgQGlmIChmaWVsZHNMaXN0LmluY2x1ZGVzKCdwaG9uZScpKSB7XG4gICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgINCi0LXQu9C10YTQvtC9XG4gICAgICAgICAgICA8dHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGhvbmVcIlxuICAgICAgICAgICAgICAgICAgICB0dWlJbnB1dFBob25lSW50ZXJuYXRpb25hbFxuICAgICAgICAgICAgICAgICAgICBbY291bnRyeVNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvdW50cmllc109XCIoY291bnRyaWVzIHwgdHVpU29ydENvdW50cmllcyB8IGFzeW5jKSB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cInBob25lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBob25lXCJcbiAgICAgICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICpuZ0lmPVwiZmllbGRzTGlzdC5pbmNsdWRlcygnaXNTaG91bGRVc2VNZXNzZW5nZXInKSAmJiBmb3JtLmNvbnRyb2xzLnBob25lLnZhbHVlICYmIGlzVmFsaWRQaG9uZU51bWJlckZvck1lc3Nlbmdlcihmb3JtLmNvbnRyb2xzLnBob25lLnZhbHVlKVwiXG4gICAgICAgICAgICB0dWlMYWJlbFxuICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpc1Nob3VsZFVzZU1lc3NlbmdlclwiXG4gICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIHR1aVRpdGxlPiDQndCw0L/QuNGB0LDRgtGMINCyINC80LXRgdGB0LXQvdC00LbQtdGA0LDRhSwg0LAg0L3QtSDQt9Cy0L7QvdC40YLRjCA8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgfVxuICAgIDwhLS0g0JDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YsgLS0+XG4gICAgPGxhYmVsXG4gICAgICAgICpuZ0lmPVwiZmllbGRzTGlzdC5pbmNsdWRlcygnZW1haWwnKVwiXG4gICAgICAgIHR1aUxhYmVsXG4gICAgPlxuICAgICAgICDQkNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRi1xuICAgICAgICA8dHVpLWlucHV0IGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XG4gICAgICAgICAgICDQkNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRi1xuICAgICAgICAgICAgPHNjLXN1Z2dlc3Rpb24tZmllbGRcbiAgICAgICAgICAgICAgICAqdHVpRGF0YUxpc3RcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJzdWdnZXN0aW9uVHlwZS5lbWFpbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3R1aS1pbnB1dD5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIlxuICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgLz5cbiAgICA8L2xhYmVsPlxuXG4gICAgPCEtLSDQmtC+0LzQvNC10L3RgtCw0YDQuNC5IC0tPlxuICAgIDxsYWJlbFxuICAgICAgICAqbmdJZj1cImZpZWxkc0xpc3QuaW5jbHVkZXMoJ21lc3NhZ2UnKVwiXG4gICAgICAgIHR1aUxhYmVsXG4gICAgPlxuICAgICAgICDQmtC+0LzQvNC10L3RgtCw0YDQuNC5XG4gICAgICAgIDx0dWktdGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwibWVzc2FnZVwiPiDQmtC+0LzQvNC10L3RgtCw0YDQuNC5IDwvdHVpLXRleHRhcmVhPlxuICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgPC9sYWJlbD5cblxuICAgIDwhLS0g0KTQsNC50LvRiyAtLT5cbiAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiZmllbGRzTGlzdC5pbmNsdWRlcygnZmlsZXMnKVwiXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiXG4gICAgPlxuICAgICAgICA8bGFiZWwgdHVpSW5wdXRGaWxlcz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICN2YWxpZGF0b3I9XCJ0dWlJbnB1dEZpbGVzVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICBhY2NlcHQ9XCIuZG9jLC5kb2N4LC5wZGYsaW1hZ2UvKlwiXG4gICAgICAgICAgICAgICAgdHVpSW5wdXRGaWxlc1xuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJsb2FkZWRGaWxlXCJcbiAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHJlamVjdCk9XCJvblJlamVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgKm5nSWY9XCJsb2FkZWRGaWxlLmludmFsaWRcIlxuICAgICAgICAgICAgW2Vycm9yXT1cIlsnbWF4TGVuZ3RoJ10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImxvYWRlZEZpbGVcIlxuICAgICAgICAvPlxuXG4gICAgICAgIEBsZXQgYWNjZXB0ZWQgPSBhY2NlcHRlZCQgfCBhc3luYztcbiAgICAgICAgPHR1aS1maWxlc1xuICAgICAgICAgICAgKm5nSWY9XCJhY2NlcHRlZD8ubGVuZ3RoIHx8IHJlamVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1zcGFjZV90b3AtMVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDx0dWktZmlsZVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWxlIG9mIGFjY2VwdGVkXCJcbiAgICAgICAgICAgICAgICBbZmlsZV09XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlKT1cIm9uUmVtb3ZlKGZpbGUpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8dHVpLWZpbGVcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsZSBvZiByZWplY3RlZFwiXG4gICAgICAgICAgICAgICAgc3RhdGU9XCJlcnJvclwiXG4gICAgICAgICAgICAgICAgW2ZpbGVdPVwiKGZpbGUgfCB0dWlGaWxlUmVqZWN0ZWQ6IHZhbGlkYXRvciB8IGFzeW5jKSB8fCBmaWxlXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlKT1cIm9uUmVtb3ZlKGZpbGUpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvdHVpLWZpbGVzPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSByZWNhcHRjaGEgLS0+XG4gICAgQGlmIChmb3JtLmdldCgncmVjYXB0Y2hhJykpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtYi0zIG1heC1oLTIwIG92ZXJmbG93LWhpZGRlbiBkdXJhdGlvbi01MDBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnIW1heC1oLTAgIS1tLTInOiBmb3JtLmdldCgncmVjYXB0Y2hhJyk/LnZhbGlkIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8cmUtY2FwdGNoYSBmb3JtQ29udHJvbE5hbWU9XCJyZWNhcHRjaGFcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tINCt0LvQtdC80LXQvdGC0Ysg0YPQv9GA0LDQstC70LXQvdC40Y8gIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgICAgICAgIFtsb2FkaW5nXT1cIiEhKGxvYWRpbmckIHwgYXN5bmMpXCJcbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5zYy5zZW5kXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQntGC0L/RgNCw0LLQuNGC0YxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm93IGJhc2lzLTYwIHRleHQtYm9keS1zXCI+XG4gICAgICAgICAgICDQndCw0LbQuNC80LDRjyDQvdCwINC60L3QvtC/0LrRgywg0LLRiyDRgdC+0LPQu9Cw0YjQsNC10YLQtdGB0Ywg0YFcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0dWlMaW5rXG4gICAgICAgICAgICAgICAgW3BzZXVkb109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29udGV4dD8uZGF0YT8ub25DbGlja09mZmVySGFuZGxlcigpOyBjbGlja09mZmVyLmVtaXQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0J/QvtC70LjRgtC40LrQvtC5INC60L7QvdGE0LjQtNC10L3RhtC40LDQu9GM0L3QvtGB0YLQuFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuIl19
@@ -30,11 +30,6 @@ export class ScSuggestionFieldComponent {
30
30
  * Тип подсказок.
31
31
  */
32
32
  this.type = ScISuggestionType.fio;
33
- /**
34
- * Признак, что элементы подсказок показывают пометку о полноте адреса.
35
- * Отключается там, где адреса из подсказки по организации не применяются.
36
- */
37
- this.showAddressQuality = true;
38
33
  /**
39
34
  * Событие выбора результата подсказки.
40
35
  */
@@ -147,31 +142,13 @@ export class ScSuggestionFieldComponent {
147
142
  return false;
148
143
  }
149
144
  /**
150
- * Возвращает текст пометки о качестве адреса для элемента выпадающего списка подсказок либо null, когда пометка не требуется.
145
+ * Возвращает текст пометки о качестве адреса для элемента выпадающего списка подсказок по адресу либо null, когда пометка не требуется.
146
+ * Неполный адрес и адрес с неопределённой полнотой помечаются одинаково.
151
147
  *
152
148
  * @param quality Качество (полнота) адреса.
153
149
  */
154
150
  getAddressQualityWarning(quality) {
155
- if (!this.showAddressQuality) {
156
- return null;
157
- }
158
- switch (quality) {
159
- case ScSuggestionAddressQuality.undetermined:
160
- return 'Полнота адреса не определена';
161
- case ScSuggestionAddressQuality.incomplete:
162
- return 'Неполный адрес';
163
- default:
164
- return null;
165
- }
166
- }
167
- /**
168
- * Возвращает текст пометки о качестве юридического адреса для подсказки по организации либо null,
169
- * когда пометка не требуется, в том числе когда у организации нет юридического адреса.
170
- *
171
- * @param suggestion Объект подсказки по организации.
172
- */
173
- getOrganizationAddressQualityWarning(suggestion) {
174
- return suggestion.legalAddress ? this.getAddressQualityWarning(suggestion.legalAddressQuality) : null;
151
+ return quality === ScSuggestionAddressQuality.incomplete || quality === ScSuggestionAddressQuality.undetermined ? 'Проверьте адрес' : null;
175
152
  }
176
153
  /**
177
154
  * Проверяет прекращена ли деятельность указанной организации.
@@ -215,11 +192,11 @@ export class ScSuggestionFieldComponent {
215
192
  this.addressQualityService.setOrganizationAddressQualities(parentGroup, suggestion);
216
193
  }
217
194
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScSuggestionFieldComponent, deps: [{ token: NgControl, skipSelf: true }, { token: i1.ScSuggestionService }], target: i0.ɵɵFactoryTarget.Component }); }
218
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScSuggestionFieldComponent, selector: "sc-suggestion-field", inputs: { type: "type", showAddressQuality: "showAddressQuality" }, outputs: { selectedClick: "selectedClick" }, ngImport: i0, template: "<tui-loader\n size=\"m\"\n [overlay]=\"true\"\n [showLoader]=\"!!(loading$ | async)\"\n>\n @let options = suggestions$ | async;\n <tui-data-list>\n <button\n *ngFor=\"let option of options\"\n tuiOption\n (click)=\"onSelected(option)\"\n [disabled]=\"isDisabledSuggestion(option)\"\n class=\"flex-col !items-start\"\n >\n @let optionValue = $any(option);\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"suggestionType.fio\">\n <span class=\"text-tui-link\">{{ optionValue.fio }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.organization\">\n <span class=\"text-tui-link\">\n {{ optionValue.name }}\n <span class=\"ml-1 text-tui-text-02\">\u0438\u043D\u043D: {{ optionValue.inn }}</span>\n <span\n *ngIf=\"isOrgTerminated(optionValue)\"\n class=\"text-tui-negative\"\n >\n \u041B\u0438\u043A\u0432\u0438\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u043E\n </span>\n </span>\n <span class=\"text-tui-text-02\">{{ optionValue?.legalAddress }}</span>\n @if (getOrganizationAddressQualityWarning(optionValue); as addressQualityWarning) {\n <span class=\"text-xs text-tui-status-warning\">{{ addressQualityWarning }}</span>\n }\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.bank\">\n <span class=\"text-tui-link\">{{ optionValue.name }}</span>\n <span class=\"text-tui-text-02\">{{ optionValue.bic }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.email\">\n <span class=\"text-tui-link\">{{ optionValue.email }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.address\">\n <span class=\"text-tui-link\">{{ optionValue.addressString }}</span>\n @if (getAddressQualityWarning(optionValue.quality); as addressQualityWarning) {\n <span class=\"text-xs text-tui-status-warning\">{{ addressQualityWarning }}</span>\n }\n </ng-container>\n </ng-container>\n </button>\n </tui-data-list>\n</tui-loader>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i3.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: i3.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScSuggestionFieldComponent, selector: "sc-suggestion-field", inputs: { type: "type" }, outputs: { selectedClick: "selectedClick" }, ngImport: i0, template: "<tui-loader\n size=\"m\"\n [overlay]=\"true\"\n [showLoader]=\"!!(loading$ | async)\"\n>\n @let options = suggestions$ | async;\n <tui-data-list>\n <button\n *ngFor=\"let option of options\"\n tuiOption\n (click)=\"onSelected(option)\"\n [disabled]=\"isDisabledSuggestion(option)\"\n class=\"flex-col !items-start\"\n >\n @let optionValue = $any(option);\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"suggestionType.fio\">\n <span class=\"text-tui-link\">{{ optionValue.fio }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.organization\">\n <span class=\"text-tui-link\">\n {{ optionValue.name }}\n <span class=\"ml-1 text-tui-text-02\">\u0438\u043D\u043D: {{ optionValue.inn }}</span>\n <span\n *ngIf=\"isOrgTerminated(optionValue)\"\n class=\"text-tui-negative\"\n >\n \u041B\u0438\u043A\u0432\u0438\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u043E\n </span>\n </span>\n <span class=\"text-tui-text-02\">{{ optionValue?.legalAddress }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.bank\">\n <span class=\"text-tui-link\">{{ optionValue.name }}</span>\n <span class=\"text-tui-text-02\">{{ optionValue.bic }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.email\">\n <span class=\"text-tui-link\">{{ optionValue.email }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.address\">\n <span class=\"text-tui-link\">{{ optionValue.addressString }}</span>\n @if (getAddressQualityWarning(optionValue.quality); as addressQualityWarning) {\n <span class=\"text-xs text-tui-status-warning\">{{ addressQualityWarning }}</span>\n }\n </ng-container>\n </ng-container>\n </button>\n </tui-data-list>\n</tui-loader>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i3.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: i3.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
219
196
  }
220
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScSuggestionFieldComponent, decorators: [{
221
198
  type: Component,
222
- args: [{ selector: 'sc-suggestion-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<tui-loader\n size=\"m\"\n [overlay]=\"true\"\n [showLoader]=\"!!(loading$ | async)\"\n>\n @let options = suggestions$ | async;\n <tui-data-list>\n <button\n *ngFor=\"let option of options\"\n tuiOption\n (click)=\"onSelected(option)\"\n [disabled]=\"isDisabledSuggestion(option)\"\n class=\"flex-col !items-start\"\n >\n @let optionValue = $any(option);\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"suggestionType.fio\">\n <span class=\"text-tui-link\">{{ optionValue.fio }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.organization\">\n <span class=\"text-tui-link\">\n {{ optionValue.name }}\n <span class=\"ml-1 text-tui-text-02\">\u0438\u043D\u043D: {{ optionValue.inn }}</span>\n <span\n *ngIf=\"isOrgTerminated(optionValue)\"\n class=\"text-tui-negative\"\n >\n \u041B\u0438\u043A\u0432\u0438\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u043E\n </span>\n </span>\n <span class=\"text-tui-text-02\">{{ optionValue?.legalAddress }}</span>\n @if (getOrganizationAddressQualityWarning(optionValue); as addressQualityWarning) {\n <span class=\"text-xs text-tui-status-warning\">{{ addressQualityWarning }}</span>\n }\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.bank\">\n <span class=\"text-tui-link\">{{ optionValue.name }}</span>\n <span class=\"text-tui-text-02\">{{ optionValue.bic }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.email\">\n <span class=\"text-tui-link\">{{ optionValue.email }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.address\">\n <span class=\"text-tui-link\">{{ optionValue.addressString }}</span>\n @if (getAddressQualityWarning(optionValue.quality); as addressQualityWarning) {\n <span class=\"text-xs text-tui-status-warning\">{{ addressQualityWarning }}</span>\n }\n </ng-container>\n </ng-container>\n </button>\n </tui-data-list>\n</tui-loader>\n" }]
199
+ args: [{ selector: 'sc-suggestion-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<tui-loader\n size=\"m\"\n [overlay]=\"true\"\n [showLoader]=\"!!(loading$ | async)\"\n>\n @let options = suggestions$ | async;\n <tui-data-list>\n <button\n *ngFor=\"let option of options\"\n tuiOption\n (click)=\"onSelected(option)\"\n [disabled]=\"isDisabledSuggestion(option)\"\n class=\"flex-col !items-start\"\n >\n @let optionValue = $any(option);\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"suggestionType.fio\">\n <span class=\"text-tui-link\">{{ optionValue.fio }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.organization\">\n <span class=\"text-tui-link\">\n {{ optionValue.name }}\n <span class=\"ml-1 text-tui-text-02\">\u0438\u043D\u043D: {{ optionValue.inn }}</span>\n <span\n *ngIf=\"isOrgTerminated(optionValue)\"\n class=\"text-tui-negative\"\n >\n \u041B\u0438\u043A\u0432\u0438\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u043E\n </span>\n </span>\n <span class=\"text-tui-text-02\">{{ optionValue?.legalAddress }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.bank\">\n <span class=\"text-tui-link\">{{ optionValue.name }}</span>\n <span class=\"text-tui-text-02\">{{ optionValue.bic }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.email\">\n <span class=\"text-tui-link\">{{ optionValue.email }}</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"suggestionType.address\">\n <span class=\"text-tui-link\">{{ optionValue.addressString }}</span>\n @if (getAddressQualityWarning(optionValue.quality); as addressQualityWarning) {\n <span class=\"text-xs text-tui-status-warning\">{{ addressQualityWarning }}</span>\n }\n </ng-container>\n </ng-container>\n </button>\n </tui-data-list>\n</tui-loader>\n" }]
223
200
  }], ctorParameters: () => [{ type: i4.NgControl, decorators: [{
224
201
  type: SkipSelf
225
202
  }, {
@@ -227,9 +204,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
227
204
  args: [NgControl]
228
205
  }] }, { type: i1.ScSuggestionService }], propDecorators: { type: [{
229
206
  type: Input
230
- }], showAddressQuality: [{
231
- type: Input
232
207
  }], selectedClick: [{
233
208
  type: Output
234
209
  }] } });
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc3VnZ2VzdGlvbi1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZm9ybS1maWVsZHMvc3VnZ2VzdGlvbi1maWVsZC9zYy1zdWdnZXN0aW9uLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9mb3JtLWZpZWxkcy9zdWdnZXN0aW9uLWZpZWxkL3NjLXN1Z2dlc3Rpb24tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEksT0FBTyxFQUFhLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFDSCx5QkFBeUIsRUFJekIsaUJBQWlCLEVBRWpCLDBCQUEwQixHQUU3QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSwwQkFBMEIsRUFB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QUFDLElBQUk7WUFDckIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1lBQ25CLEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRztZQUNuQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJO1lBQzdCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7WUFDckMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtZQUM3QyxZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7WUFDckMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxhQUFhO1lBQ3ZDLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtTQUMxQyxFQUNELEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUN2QixDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLCtCQUErQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RixDQUFDOytHQTVQUSwwQkFBMEIsa0JBaUV2QixTQUFTO21HQWpFWiwwQkFBMEIsNEtDOUJ2Qyw4bEZBb0RBOzs0RkR0QmEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNJLHFCQUFxQixtQkFFZCx1QkFBdUIsQ0FBQyxNQUFNOzswQkFrRTFDLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsU0FBUzsyRUE1RGQsSUFBSTtzQkFEVixLQUFLO2dCQVFDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBTQ19NSU5fTEVOR1RIX1NFQVJDSF9URVJNLFxuICAgIFNjSUFwaUVycm9yUmVzcG9uc2UsXG4gICAgU2NJU3VnZ2VzdGlvbkFkZHJlc3MsXG4gICAgU2NJU3VnZ2VzdGlvbk9yZ2FuaXphdGlvbixcbiAgICBTY0lTdWdnZXN0aW9uVHlwZSxcbiAgICBTY1N1Z2dlc3Rpb24sXG4gICAgU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHksXG4gICAgU2NTdWdnZXN0aW9uU2VydmljZSxcbn0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyB0dWlDb250cm9sVmFsdWUsIHR1aUlzRmFsc3ksIHR1aUlzUHJlc2VudCwgdHVpTWFya0NvbnRyb2xBc1RvdWNoZWRBbmRWYWxpZGF0ZSB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVFVJX0RBVEFfTElTVF9IT1NULCBUdWlEYXRhTGlzdEhvc3QgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmUsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNjQWRkcmVzc1F1YWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hZGRyZXNzLXF1YWxpdHkvc2MtYWRkcmVzcy1xdWFsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU0NfQUxMT1dfU0VMRUNUX1RFUk1JTkFURUQgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvc2MtYWxsb3ctc2VsZWN0LXRlcm1pbmF0ZWQnO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQv9C+0LTRgdC60LDQt9C+0Log0LTQu9GPINC/0L7Qu9GPINCy0LLQvtC00LAuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2Mtc3VnZ2VzdGlvbi1maWVsZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLXN1Z2dlc3Rpb24tZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY1N1Z2dlc3Rpb25GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICog0KLQuNC/INC/0L7QtNGB0LrQsNC30L7Qui5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0eXBlOiBTY0lTdWdnZXN0aW9uVHlwZSA9IFNjSVN1Z2dlc3Rpb25UeXBlLmZpbztcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0Y3Qu9C10LzQtdC90YLRiyDQv9C+0LTRgdC60LDQt9C+0Log0L/QvtC60LDQt9GL0LLQsNGO0YIg0L/QvtC80LXRgtC60YMg0L4g0L/QvtC70L3QvtGC0LUg0LDQtNGA0LXRgdCwLlxuICAgICAqINCe0YLQutC70Y7Rh9Cw0LXRgtGB0Y8g0YLQsNC8LCDQs9C00LUg0LDQtNGA0LXRgdCwINC40Lcg0L/QvtC00YHQutCw0LfQutC4INC/0L4g0L7RgNCz0LDQvdC40LfQsNGG0LjQuCDQvdC1INC/0YDQuNC80LXQvdGP0Y7RgtGB0Y8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd0FkZHJlc3NRdWFsaXR5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INCy0YvQsdC+0YDQsCDRgNC10LfRg9C70YzRgtCw0YLQsCDQv9C+0LTRgdC60LDQt9C60LguXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkQ2xpY2s6IEV2ZW50RW1pdHRlcjxTY1N1Z2dlc3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxTY1N1Z2dlc3Rpb24+KCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0L/QvtC00YHQutCw0LfQvtC6LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdWdnZXN0aW9ucyQ/OiBPYnNlcnZhYmxlPFNjU3VnZ2VzdGlvbltdIHwgbnVsbD47XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQvtGB0YLQvtGP0L3QuNC1INC30LDQv9GA0L7RgdCwINC/0L7QtNGB0LrQsNC30L7Qui5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXRh9C40YHQu9C10L3QuNC1INGC0LjQv9C+0LIg0L/QvtC00YHQutCw0LfQvtC6LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzdWdnZXN0aW9uVHlwZTogdHlwZW9mIFNjSVN1Z2dlc3Rpb25UeXBlID0gU2NJU3VnZ2VzdGlvblR5cGU7XG5cbiAgICAvKipcbiAgICAgKiDQmtC+0LzQv9C+0L3QtdC90YIg0L7QsdGR0YDRgtC60LAg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUdWlEYXRhTGlzdEhvc3Q8dW5rbm93bj4gfCBudWxsID0gaW5qZWN0PFR1aURhdGFMaXN0SG9zdDx1bmtub3duPj4oVFVJX0RBVEFfTElTVF9IT1NULCB7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0JzQuNC90LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwINC/0L7QuNGB0LrQvtCy0L7Qs9C+INC30LDQv9GA0L7RgdCwINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWluTGVuZ3RoU2VhcmNoVGVybTogbnVtYmVyID0gaW5qZWN0KFNDX01JTl9MRU5HVEhfU0VBUkNIX1RFUk0pO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDRgNCw0LfRgNC10YjQtdC90L4g0LLRi9Cx0LjRgNCw0YLRjCDQt9Cw0L/QuNGB0Lgg0LvQuNC60LLQuNC00LjRgNC+0LLQsNC90L3Ri9GFINC+0YDQs9Cw0L3QuNC30LDRhtC40LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGxvd1NlbGVjdFRlcm1pbmF0ZWQ6IGJvb2xlYW4gPSBpbmplY3QoU0NfQUxMT1dfU0VMRUNUX1RFUk1JTkFURUQpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBLdGA0LXQtdGB0YLRgCDQutCw0YfQtdGB0YLQstCwINCw0LTRgNC10YHQvtCyLCDQstGL0LHRgNCw0L3QvdGL0YUg0LjQtyDQv9C+0LTRgdC60LDQt9C+0LouXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzUXVhbGl0eVNlcnZpY2UgPSBpbmplY3QoU2NBZGRyZXNzUXVhbGl0eVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY1N1Z2dlc3Rpb25GaWVsZENvbXBvbmVudH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJvbCDQmtC+0L3RgtGA0L7QuyDQv9C+0LvRjyDQstCy0L7QtNCwLlxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9uU2VydmljZSDQodC10YDQstC40YEg0YDQsNCx0L7RgtGLINGBIEFQSSDQv9C+0LTRgdC60LDQt9C+0LouXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBAU2tpcFNlbGYoKVxuICAgICAgICBASW5qZWN0KE5nQ29udHJvbClcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdWdnZXN0aW9uU2VydmljZTogU2NTdWdnZXN0aW9uU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCQgPSB0dWlDb250cm9sVmFsdWU8c3RyaW5nIHwgbnVsbD4odGhpcy5jb250cm9sKS5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICBmaWx0ZXIodHVpSXNQcmVzZW50KSxcbiAgICAgICAgICAgIG1hcCgodGVybSkgPT4gdGVybS50cmltKCkpLFxuICAgICAgICAgICAgZmlsdGVyKCh0ZXJtKSA9PiB0ZXJtLmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aFNlYXJjaFRlcm0pLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCh0ZXJtOiBzdHJpbmcpID0+IHRoaXMuc3VnZ2VzdGlvblNlcnZpY2UuZ2V0RGF0YTxTY1N1Z2dlc3Rpb24+KHRlcm0sIHRoaXMudHlwZSkucGlwZShzdGFydFdpdGgobnVsbCkpKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IGVycm9yLmVycm9yIGFzIFNjSUFwaUVycm9yUmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5jb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlNYXJrQ29udHJvbEFzVG91Y2hlZEFuZFZhbGlkYXRlKHRoaXMuY29udHJvbC5jb250cm9sKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZTogW2Vycm9yUmVzcG9uc2UubWVzc2FnZSB8fCAn0J7RiNC40LHQutCwINGB0LXRgNCy0LXRgNCwOiDQv9C+0LbQsNC70YPQudGB0YLQsCwg0L/QtdGA0LXQt9Cw0LPRgNGD0LfQuNGC0LUg0YHRgtGA0LDQvdC40YbRgyDQuC/QuNC70Lgg0LLRi9C/0L7Qu9C90LjRgtC1INC30LDQv9GA0L7RgSDQv9C+0LfQttC1LiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBvZihbXSkpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdWdnZXN0aW9ucyQgPSByZXF1ZXN0JC5waXBlKGZpbHRlcih0dWlJc1ByZXNlbnQpLCBzdGFydFdpdGgobnVsbCkpO1xuICAgICAgICB0aGlzLmxvYWRpbmckID0gcmVxdWVzdCQucGlwZShtYXAodHVpSXNGYWxzeSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9C+0LvQvdC10L3QuNC1INC/0L7Qu9C10Lkg0L7RgdC90L7QstC1INCy0YvQsdGA0LDQvdC90L7QuSDQv9C+0LTRgdC60LDQt9C60LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiDQntCx0YrQtdC60YIg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBvblNlbGVjdGVkKHN1Z2dlc3Rpb246IFNjU3VnZ2VzdGlvbik6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5maW86XG4gICAgICAgICAgICAgICAgaWYgKCdmaW8nIGluIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoc3VnZ2VzdGlvbi5maW8sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLmFkZHJlc3M6XG4gICAgICAgICAgICAgICAgaWYgKCdhZGRyZXNzU3RyaW5nJyBpbiBzdWdnZXN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBZGRyZXNzU3VnZ2VzdGlvbihzdWdnZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLmJhbms6XG4gICAgICAgICAgICAgICAgaWYgKCdpbm4nIGluIHN1Z2dlc3Rpb24gJiYgJ2JpYycgaW4gc3VnZ2VzdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb250cm9sLmNvbnRyb2w/LnBhcmVudCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFua05hbWU6IHN1Z2dlc3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWM6IHN1Z2dlc3Rpb24uYmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRlbnRBY2NvdW50OiBzdWdnZXN0aW9uLmNvcnJlc3BvbmRlbnRBY2NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5vcmdhbml6YXRpb246XG4gICAgICAgICAgICAgICAgaWYgKCdpbm4nIGluIHN1Z2dlc3Rpb24gJiYgISgnYmljJyBpbiBzdWdnZXN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5T3JnYW5pemF0aW9uU3VnZ2VzdGlvbihzdWdnZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLmVtYWlsOlxuICAgICAgICAgICAgICAgIGlmICgnZW1haWwnIGluIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoc3VnZ2VzdGlvbi5lbWFpbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ob3N0Py5oYW5kbGVPcHRpb24pIHtcbiAgICAgICAgICAgIC8vINCU0ZHRgNCz0LDQtdC8INCy0L3Rg9GC0YDQtdC90L3QuNC5INC+0LHRgNCw0LHQvtGC0YfQuNC6INCy0YvQsdC+0YDQsCDRjdC70LXQvNC10L3RgtCwINCy0YvQv9Cw0LTQsNGO0YnQtdCz0L4g0YHQv9C40YHQutCwINC00LvRjyDRgNC10YjQtdC90LjRjyDQv9GA0L7QsdC70LXQvNGLINC30LDQutGA0YvRgtC40Y8g0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAgICAgICAgdGhpcy5ob3N0LmhhbmRsZU9wdGlvbih0aGlzLmNvbnRyb2wudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDbGljay5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQuNC30L3QsNC6LCDRh9GC0L4g0Y3Qu9C10LzQtdC90YIg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAg0L/QvtC00YHQutCw0LfQvtC6INC+0YLQutC70Y7Rh9GR0L0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiDQntCx0YrQtdC60YIg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBTY1N1Z2dlc3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NJU3VnZ2VzdGlvblR5cGUuZmlvOlxuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5hZGRyZXNzOlxuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5iYW5rOlxuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5lbWFpbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLm9yZ2FuaXphdGlvbjpcbiAgICAgICAgICAgICAgICBpZiAoJ2lubicgaW4gc3VnZ2VzdGlvbiAmJiAhKCdiaWMnIGluIHN1Z2dlc3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5hbGxvd1NlbGVjdFRlcm1pbmF0ZWQgJiYgdGhpcy5pc09yZ1Rlcm1pbmF0ZWQoc3VnZ2VzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0YLQtdC60YHRgiDQv9C+0LzQtdGC0LrQuCDQviDQutCw0YfQtdGB0YLQstC1INCw0LTRgNC10YHQsCDQtNC70Y8g0Y3Qu9C10LzQtdC90YLQsCDQstGL0L/QsNC00LDRjtGJ0LXQs9C+INGB0L/QuNGB0LrQsCDQv9C+0LTRgdC60LDQt9C+0Log0LvQuNCx0L4gbnVsbCwg0LrQvtCz0LTQsCDQv9C+0LzQtdGC0LrQsCDQvdC1INGC0YDQtdCx0YPQtdGC0YHRjy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWFsaXR5INCa0LDRh9C10YHRgtCy0L4gKNC/0L7Qu9C90L7RgtCwKSDQsNC00YDQtdGB0LAuXG4gICAgICovXG4gICAgcHVibGljIGdldEFkZHJlc3NRdWFsaXR5V2FybmluZyhxdWFsaXR5OiBTY1N1Z2dlc3Rpb25BZGRyZXNzUXVhbGl0eSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dBZGRyZXNzUXVhbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHF1YWxpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkudW5kZXRlcm1pbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAn0J/QvtC70L3QvtGC0LAg0LDQtNGA0LXRgdCwINC90LUg0L7Qv9GA0LXQtNC10LvQtdC90LAnO1xuICAgICAgICAgICAgY2FzZSBTY1N1Z2dlc3Rpb25BZGRyZXNzUXVhbGl0eS5pbmNvbXBsZXRlOlxuICAgICAgICAgICAgICAgIHJldHVybiAn0J3QtdC/0L7Qu9C90YvQuSDQsNC00YDQtdGBJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgtC10LrRgdGCINC/0L7QvNC10YLQutC4INC+INC60LDRh9C10YHRgtCy0LUg0Y7RgNC40LTQuNGH0LXRgdC60L7Qs9C+INCw0LTRgNC10YHQsCDQtNC70Y8g0L/QvtC00YHQutCw0LfQutC4INC/0L4g0L7RgNCz0LDQvdC40LfQsNGG0LjQuCDQu9C40LHQviBudWxsLFxuICAgICAqINC60L7Qs9C00LAg0L/QvtC80LXRgtC60LAg0L3QtSDRgtGA0LXQsdGD0LXRgtGB0Y8sINCyINGC0L7QvCDRh9C40YHQu9C1INC60L7Qs9C00LAg0YMg0L7RgNCz0LDQvdC40LfQsNGG0LjQuCDQvdC10YIg0Y7RgNC40LTQuNGH0LXRgdC60L7Qs9C+INCw0LTRgNC10YHQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9uINCe0LHRitC10LrRgiDQv9C+0LTRgdC60LDQt9C60Lgg0L/QviDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcmdhbml6YXRpb25BZGRyZXNzUXVhbGl0eVdhcm5pbmcoc3VnZ2VzdGlvbjogU2NJU3VnZ2VzdGlvbk9yZ2FuaXphdGlvbik6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gc3VnZ2VzdGlvbi5sZWdhbEFkZHJlc3MgPyB0aGlzLmdldEFkZHJlc3NRdWFsaXR5V2FybmluZyhzdWdnZXN0aW9uLmxlZ2FsQWRkcmVzc1F1YWxpdHkpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIg0L/RgNC10LrRgNCw0YnQtdC90LAg0LvQuCDQtNC10Y/RgtC10LvRjNC90L7RgdGC0Ywg0YPQutCw0LfQsNC90L3QvtC5INC+0YDQs9Cw0L3QuNC30LDRhtC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiDQntCx0YrQtdC60YIg0L/QvtC00YHQutCw0LfQutC4INC/0L4g0L7RgNCz0LDQvdC40LfQsNGG0LjQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcmdUZXJtaW5hdGVkKHN1Z2dlc3Rpb246IFNjSVN1Z2dlc3Rpb25Pcmdhbml6YXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXR1cm4gc3VnZ2VzdGlvbi5yYXdEYXRhPy5bJ3N0YXRlJ10/LnN0YXR1cyA9PT0gJ0xJUVVJREFURUQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9C+0LvQvdGP0LXRgiDQutC+0L3RgtGA0L7QuyDRgdGC0YDQvtC60L7QuSDQstGL0LHRgNCw0L3QvdC+0LPQviDQsNC00YDQtdGB0LAg0Lgg0YDQtdCz0LjRgdGC0YDQuNGA0YPQtdGCINC60LDRh9C10YHRgtCy0L4g0LDQtNGA0LXRgdCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24g0J7QsdGK0LXQutGCINC/0L7QtNGB0LrQsNC30LrQuCDQv9C+INCw0LTRgNC10YHRgy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5QWRkcmVzc1N1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU2NJU3VnZ2VzdGlvbkFkZHJlc3MpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoc3VnZ2VzdGlvbi5hZGRyZXNzU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NRdWFsaXR5U2VydmljZS5zZXRRdWFsaXR5KHRoaXMuY29udHJvbC5jb250cm9sLCBzdWdnZXN0aW9uLnF1YWxpdHkgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0L/QvtC70L3Rj9C10YIg0L/QvtC70Y8g0YDQvtC00LjRgtC10LvRjNGB0LrQvtC5INCz0YDRg9C/0L/RiyDQtNCw0L3QvdGL0LzQuCDQstGL0LHRgNCw0L3QvdC+0Lkg0L7RgNCz0LDQvdC40LfQsNGG0LjQuCDQuCDRgNC10LPQuNGB0YLRgNC40YDRg9C10YIg0LrQsNGH0LXRgdGC0LLQviDQtdGRINCw0LTRgNC10YHQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24g0J7QsdGK0LXQutGCINC/0L7QtNGB0LrQsNC30LrQuCDQv9C+INC+0YDQs9Cw0L3QuNC30LDRhtC40LguXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBseU9yZ2FuaXphdGlvblN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU2NJU3VnZ2VzdGlvbk9yZ2FuaXphdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJlbnRHcm91cCA9IHRoaXMuY29udHJvbC5jb250cm9sPy5wYXJlbnQgYXMgRm9ybUdyb3VwO1xuXG4gICAgICAgIHBhcmVudEdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogc3VnZ2VzdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGlubjogc3VnZ2VzdGlvbi5pbm4sXG4gICAgICAgICAgICAgICAga3BwOiBzdWdnZXN0aW9uLmtwcCxcbiAgICAgICAgICAgICAgICBvZ3JuOiBzdWdnZXN0aW9uLm9ncm4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICBva3BvOiBzdWdnZXN0aW9uLm9rcG8sXG4gICAgICAgICAgICAgICAgZGlyZWN0b3JOYW1lOiBzdWdnZXN0aW9uLmRpcmVjdG9yTmFtZSxcbiAgICAgICAgICAgICAgICBkaXJlY3RvclBvc2l0aW9uOiBzdWdnZXN0aW9uLmRpcmVjdG9yUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgbGVnYWxBZGRyZXNzOiBzdWdnZXN0aW9uLmxlZ2FsQWRkcmVzcyxcbiAgICAgICAgICAgICAgICBwb3N0YWxBZGRyZXNzOiBzdWdnZXN0aW9uLnBvc3RhbEFkZHJlc3MsXG4gICAgICAgICAgICAgICAgYWN0dWFsQWRkcmVzczogc3VnZ2VzdGlvbi5hY3R1YWxBZGRyZXNzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hZGRyZXNzUXVhbGl0eVNlcnZpY2Uuc2V0T3JnYW5pemF0aW9uQWRkcmVzc1F1YWxpdGllcyhwYXJlbnRHcm91cCwgc3VnZ2VzdGlvbik7XG4gICAgfVxufVxuIiwiPHR1aS1sb2FkZXJcbiAgICBzaXplPVwibVwiXG4gICAgW292ZXJsYXldPVwidHJ1ZVwiXG4gICAgW3Nob3dMb2FkZXJdPVwiISEobG9hZGluZyQgfCBhc3luYylcIlxuPlxuICAgIEBsZXQgb3B0aW9ucyA9IHN1Z2dlc3Rpb25zJCB8IGFzeW5jO1xuICAgIDx0dWktZGF0YS1saXN0PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkU3VnZ2VzdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleC1jb2wgIWl0ZW1zLXN0YXJ0XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgQGxldCBvcHRpb25WYWx1ZSA9ICRhbnkob3B0aW9uKTtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInR5cGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJzdWdnZXN0aW9uVHlwZS5maW9cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXR1aS1saW5rXCI+e3sgb3B0aW9uVmFsdWUuZmlvIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInN1Z2dlc3Rpb25UeXBlLm9yZ2FuaXphdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvblZhbHVlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMSB0ZXh0LXR1aS10ZXh0LTAyXCI+0LjQvdC9OiB7eyBvcHRpb25WYWx1ZS5pbm4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNPcmdUZXJtaW5hdGVkKG9wdGlvblZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXR1aS1uZWdhdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg0JvQuNC60LLQuNC00LjRgNC+0LLQsNC90L5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLXRleHQtMDJcIj57eyBvcHRpb25WYWx1ZT8ubGVnYWxBZGRyZXNzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGdldE9yZ2FuaXphdGlvbkFkZHJlc3NRdWFsaXR5V2FybmluZyhvcHRpb25WYWx1ZSk7IGFzIGFkZHJlc3NRdWFsaXR5V2FybmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtdHVpLXN0YXR1cy13YXJuaW5nXCI+e3sgYWRkcmVzc1F1YWxpdHlXYXJuaW5nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwic3VnZ2VzdGlvblR5cGUuYmFua1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLWxpbmtcIj57eyBvcHRpb25WYWx1ZS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLXRleHQtMDJcIj57eyBvcHRpb25WYWx1ZS5iaWMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwic3VnZ2VzdGlvblR5cGUuZW1haWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXR1aS1saW5rXCI+e3sgb3B0aW9uVmFsdWUuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwic3VnZ2VzdGlvblR5cGUuYWRkcmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLWxpbmtcIj57eyBvcHRpb25WYWx1ZS5hZGRyZXNzU3RyaW5nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGdldEFkZHJlc3NRdWFsaXR5V2FybmluZyhvcHRpb25WYWx1ZS5xdWFsaXR5KTsgYXMgYWRkcmVzc1F1YWxpdHlXYXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQteHMgdGV4dC10dWktc3RhdHVzLXdhcm5pbmdcIj57eyBhZGRyZXNzUXVhbGl0eVdhcm5pbmcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L3R1aS1kYXRhLWxpc3Q+XG48L3R1aS1sb2FkZXI+XG4iXX0=
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc3VnZ2VzdGlvbi1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZm9ybS1maWVsZHMvc3VnZ2VzdGlvbi1maWVsZC9zYy1zdWdnZXN0aW9uLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9mb3JtLWZpZWxkcy9zdWdnZXN0aW9uLWZpZWxkL3NjLXN1Z2dlc3Rpb24tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEksT0FBTyxFQUFhLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFDSCx5QkFBeUIsRUFJekIsaUJBQWlCLEVBRWpCLDBCQUEwQixHQUU3QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSwwQkFBMEIsRUFB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QVMsRUFBRSxLQUFLLEVBQUUsQ0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQywrQkFBK0IsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEYsQ0FBQzsrR0FqT1EsMEJBQTBCLGtCQTBEdkIsU0FBUzttR0ExRFosMEJBQTBCLGtJQzlCdkMsazNFQWlEQTs7NEZEbkJhLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDSSxxQkFBcUIsbUJBRWQsdUJBQXVCLENBQUMsTUFBTTs7MEJBMkQxQyxRQUFROzswQkFDUixNQUFNOzJCQUFDLFNBQVM7MkVBckRkLElBQUk7c0JBRFYsS0FBSztnQkFPQyxhQUFhO3NCQURuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBTQ19NSU5fTEVOR1RIX1NFQVJDSF9URVJNLFxuICAgIFNjSUFwaUVycm9yUmVzcG9uc2UsXG4gICAgU2NJU3VnZ2VzdGlvbkFkZHJlc3MsXG4gICAgU2NJU3VnZ2VzdGlvbk9yZ2FuaXphdGlvbixcbiAgICBTY0lTdWdnZXN0aW9uVHlwZSxcbiAgICBTY1N1Z2dlc3Rpb24sXG4gICAgU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHksXG4gICAgU2NTdWdnZXN0aW9uU2VydmljZSxcbn0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyB0dWlDb250cm9sVmFsdWUsIHR1aUlzRmFsc3ksIHR1aUlzUHJlc2VudCwgdHVpTWFya0NvbnRyb2xBc1RvdWNoZWRBbmRWYWxpZGF0ZSB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVFVJX0RBVEFfTElTVF9IT1NULCBUdWlEYXRhTGlzdEhvc3QgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmUsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNjQWRkcmVzc1F1YWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hZGRyZXNzLXF1YWxpdHkvc2MtYWRkcmVzcy1xdWFsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU0NfQUxMT1dfU0VMRUNUX1RFUk1JTkFURUQgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvc2MtYWxsb3ctc2VsZWN0LXRlcm1pbmF0ZWQnO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQv9C+0LTRgdC60LDQt9C+0Log0LTQu9GPINC/0L7Qu9GPINCy0LLQvtC00LAuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2Mtc3VnZ2VzdGlvbi1maWVsZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLXN1Z2dlc3Rpb24tZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY1N1Z2dlc3Rpb25GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICog0KLQuNC/INC/0L7QtNGB0LrQsNC30L7Qui5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0eXBlOiBTY0lTdWdnZXN0aW9uVHlwZSA9IFNjSVN1Z2dlc3Rpb25UeXBlLmZpbztcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INCy0YvQsdC+0YDQsCDRgNC10LfRg9C70YzRgtCw0YLQsCDQv9C+0LTRgdC60LDQt9C60LguXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkQ2xpY2s6IEV2ZW50RW1pdHRlcjxTY1N1Z2dlc3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxTY1N1Z2dlc3Rpb24+KCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0L/QvtC00YHQutCw0LfQvtC6LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdWdnZXN0aW9ucyQ/OiBPYnNlcnZhYmxlPFNjU3VnZ2VzdGlvbltdIHwgbnVsbD47XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQvtGB0YLQvtGP0L3QuNC1INC30LDQv9GA0L7RgdCwINC/0L7QtNGB0LrQsNC30L7Qui5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXRh9C40YHQu9C10L3QuNC1INGC0LjQv9C+0LIg0L/QvtC00YHQutCw0LfQvtC6LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzdWdnZXN0aW9uVHlwZTogdHlwZW9mIFNjSVN1Z2dlc3Rpb25UeXBlID0gU2NJU3VnZ2VzdGlvblR5cGU7XG5cbiAgICAvKipcbiAgICAgKiDQmtC+0LzQv9C+0L3QtdC90YIg0L7QsdGR0YDRgtC60LAg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUdWlEYXRhTGlzdEhvc3Q8dW5rbm93bj4gfCBudWxsID0gaW5qZWN0PFR1aURhdGFMaXN0SG9zdDx1bmtub3duPj4oVFVJX0RBVEFfTElTVF9IT1NULCB7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0JzQuNC90LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwINC/0L7QuNGB0LrQvtCy0L7Qs9C+INC30LDQv9GA0L7RgdCwINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWluTGVuZ3RoU2VhcmNoVGVybTogbnVtYmVyID0gaW5qZWN0KFNDX01JTl9MRU5HVEhfU0VBUkNIX1RFUk0pO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDRgNCw0LfRgNC10YjQtdC90L4g0LLRi9Cx0LjRgNCw0YLRjCDQt9Cw0L/QuNGB0Lgg0LvQuNC60LLQuNC00LjRgNC+0LLQsNC90L3Ri9GFINC+0YDQs9Cw0L3QuNC30LDRhtC40LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGxvd1NlbGVjdFRlcm1pbmF0ZWQ6IGJvb2xlYW4gPSBpbmplY3QoU0NfQUxMT1dfU0VMRUNUX1RFUk1JTkFURUQpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBLdGA0LXQtdGB0YLRgCDQutCw0YfQtdGB0YLQstCwINCw0LTRgNC10YHQvtCyLCDQstGL0LHRgNCw0L3QvdGL0YUg0LjQtyDQv9C+0LTRgdC60LDQt9C+0LouXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzUXVhbGl0eVNlcnZpY2UgPSBpbmplY3QoU2NBZGRyZXNzUXVhbGl0eVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY1N1Z2dlc3Rpb25GaWVsZENvbXBvbmVudH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJvbCDQmtC+0L3RgtGA0L7QuyDQv9C+0LvRjyDQstCy0L7QtNCwLlxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9uU2VydmljZSDQodC10YDQstC40YEg0YDQsNCx0L7RgtGLINGBIEFQSSDQv9C+0LTRgdC60LDQt9C+0LouXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBAU2tpcFNlbGYoKVxuICAgICAgICBASW5qZWN0KE5nQ29udHJvbClcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdWdnZXN0aW9uU2VydmljZTogU2NTdWdnZXN0aW9uU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCQgPSB0dWlDb250cm9sVmFsdWU8c3RyaW5nIHwgbnVsbD4odGhpcy5jb250cm9sKS5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICBmaWx0ZXIodHVpSXNQcmVzZW50KSxcbiAgICAgICAgICAgIG1hcCgodGVybSkgPT4gdGVybS50cmltKCkpLFxuICAgICAgICAgICAgZmlsdGVyKCh0ZXJtKSA9PiB0ZXJtLmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aFNlYXJjaFRlcm0pLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCh0ZXJtOiBzdHJpbmcpID0+IHRoaXMuc3VnZ2VzdGlvblNlcnZpY2UuZ2V0RGF0YTxTY1N1Z2dlc3Rpb24+KHRlcm0sIHRoaXMudHlwZSkucGlwZShzdGFydFdpdGgobnVsbCkpKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IGVycm9yLmVycm9yIGFzIFNjSUFwaUVycm9yUmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5jb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlNYXJrQ29udHJvbEFzVG91Y2hlZEFuZFZhbGlkYXRlKHRoaXMuY29udHJvbC5jb250cm9sKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZTogW2Vycm9yUmVzcG9uc2UubWVzc2FnZSB8fCAn0J7RiNC40LHQutCwINGB0LXRgNCy0LXRgNCwOiDQv9C+0LbQsNC70YPQudGB0YLQsCwg0L/QtdGA0LXQt9Cw0LPRgNGD0LfQuNGC0LUg0YHRgtGA0LDQvdC40YbRgyDQuC/QuNC70Lgg0LLRi9C/0L7Qu9C90LjRgtC1INC30LDQv9GA0L7RgSDQv9C+0LfQttC1LiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBvZihbXSkpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdWdnZXN0aW9ucyQgPSByZXF1ZXN0JC5waXBlKGZpbHRlcih0dWlJc1ByZXNlbnQpLCBzdGFydFdpdGgobnVsbCkpO1xuICAgICAgICB0aGlzLmxvYWRpbmckID0gcmVxdWVzdCQucGlwZShtYXAodHVpSXNGYWxzeSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9C+0LvQvdC10L3QuNC1INC/0L7Qu9C10Lkg0L7RgdC90L7QstC1INCy0YvQsdGA0LDQvdC90L7QuSDQv9C+0LTRgdC60LDQt9C60LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiDQntCx0YrQtdC60YIg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBvblNlbGVjdGVkKHN1Z2dlc3Rpb246IFNjU3VnZ2VzdGlvbik6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5maW86XG4gICAgICAgICAgICAgICAgaWYgKCdmaW8nIGluIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoc3VnZ2VzdGlvbi5maW8sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLmFkZHJlc3M6XG4gICAgICAgICAgICAgICAgaWYgKCdhZGRyZXNzU3RyaW5nJyBpbiBzdWdnZXN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBZGRyZXNzU3VnZ2VzdGlvbihzdWdnZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLmJhbms6XG4gICAgICAgICAgICAgICAgaWYgKCdpbm4nIGluIHN1Z2dlc3Rpb24gJiYgJ2JpYycgaW4gc3VnZ2VzdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb250cm9sLmNvbnRyb2w/LnBhcmVudCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFua05hbWU6IHN1Z2dlc3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWM6IHN1Z2dlc3Rpb24uYmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRlbnRBY2NvdW50OiBzdWdnZXN0aW9uLmNvcnJlc3BvbmRlbnRBY2NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5vcmdhbml6YXRpb246XG4gICAgICAgICAgICAgICAgaWYgKCdpbm4nIGluIHN1Z2dlc3Rpb24gJiYgISgnYmljJyBpbiBzdWdnZXN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5T3JnYW5pemF0aW9uU3VnZ2VzdGlvbihzdWdnZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLmVtYWlsOlxuICAgICAgICAgICAgICAgIGlmICgnZW1haWwnIGluIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoc3VnZ2VzdGlvbi5lbWFpbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ob3N0Py5oYW5kbGVPcHRpb24pIHtcbiAgICAgICAgICAgIC8vINCU0ZHRgNCz0LDQtdC8INCy0L3Rg9GC0YDQtdC90L3QuNC5INC+0LHRgNCw0LHQvtGC0YfQuNC6INCy0YvQsdC+0YDQsCDRjdC70LXQvNC10L3RgtCwINCy0YvQv9Cw0LTQsNGO0YnQtdCz0L4g0YHQv9C40YHQutCwINC00LvRjyDRgNC10YjQtdC90LjRjyDQv9GA0L7QsdC70LXQvNGLINC30LDQutGA0YvRgtC40Y8g0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAgICAgICAgdGhpcy5ob3N0LmhhbmRsZU9wdGlvbih0aGlzLmNvbnRyb2wudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDbGljay5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQuNC30L3QsNC6LCDRh9GC0L4g0Y3Qu9C10LzQtdC90YIg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAg0L/QvtC00YHQutCw0LfQvtC6INC+0YLQutC70Y7Rh9GR0L0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiDQntCx0YrQtdC60YIg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBTY1N1Z2dlc3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NJU3VnZ2VzdGlvblR5cGUuZmlvOlxuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5hZGRyZXNzOlxuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5iYW5rOlxuICAgICAgICAgICAgY2FzZSBTY0lTdWdnZXN0aW9uVHlwZS5lbWFpbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIFNjSVN1Z2dlc3Rpb25UeXBlLm9yZ2FuaXphdGlvbjpcbiAgICAgICAgICAgICAgICBpZiAoJ2lubicgaW4gc3VnZ2VzdGlvbiAmJiAhKCdiaWMnIGluIHN1Z2dlc3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5hbGxvd1NlbGVjdFRlcm1pbmF0ZWQgJiYgdGhpcy5pc09yZ1Rlcm1pbmF0ZWQoc3VnZ2VzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0YLQtdC60YHRgiDQv9C+0LzQtdGC0LrQuCDQviDQutCw0YfQtdGB0YLQstC1INCw0LTRgNC10YHQsCDQtNC70Y8g0Y3Qu9C10LzQtdC90YLQsCDQstGL0L/QsNC00LDRjtGJ0LXQs9C+INGB0L/QuNGB0LrQsCDQv9C+0LTRgdC60LDQt9C+0Log0L/QviDQsNC00YDQtdGB0YMg0LvQuNCx0L4gbnVsbCwg0LrQvtCz0LTQsCDQv9C+0LzQtdGC0LrQsCDQvdC1INGC0YDQtdCx0YPQtdGC0YHRjy5cbiAgICAgKiDQndC10L/QvtC70L3Ri9C5INCw0LTRgNC10YEg0Lgg0LDQtNGA0LXRgSDRgSDQvdC10L7Qv9GA0LXQtNC10LvRkdC90L3QvtC5INC/0L7Qu9C90L7RgtC+0Lkg0L/QvtC80LXRh9Cw0Y7RgtGB0Y8g0L7QtNC40L3QsNC60L7QstC+LlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWxpdHkg0JrQsNGH0LXRgdGC0LLQviAo0L/QvtC70L3QvtGC0LApINCw0LTRgNC10YHQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QWRkcmVzc1F1YWxpdHlXYXJuaW5nKHF1YWxpdHk6IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gcXVhbGl0eSA9PT0gU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkuaW5jb21wbGV0ZSB8fCBxdWFsaXR5ID09PSBTY1N1Z2dlc3Rpb25BZGRyZXNzUXVhbGl0eS51bmRldGVybWluZWQgPyAn0J/RgNC+0LLQtdGA0YzRgtC1INCw0LTRgNC10YEnIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIg0L/RgNC10LrRgNCw0YnQtdC90LAg0LvQuCDQtNC10Y/RgtC10LvRjNC90L7RgdGC0Ywg0YPQutCw0LfQsNC90L3QvtC5INC+0YDQs9Cw0L3QuNC30LDRhtC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiDQntCx0YrQtdC60YIg0L/QvtC00YHQutCw0LfQutC4INC/0L4g0L7RgNCz0LDQvdC40LfQsNGG0LjQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcmdUZXJtaW5hdGVkKHN1Z2dlc3Rpb246IFNjSVN1Z2dlc3Rpb25Pcmdhbml6YXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXR1cm4gc3VnZ2VzdGlvbi5yYXdEYXRhPy5bJ3N0YXRlJ10/LnN0YXR1cyA9PT0gJ0xJUVVJREFURUQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9C+0LvQvdGP0LXRgiDQutC+0L3RgtGA0L7QuyDRgdGC0YDQvtC60L7QuSDQstGL0LHRgNCw0L3QvdC+0LPQviDQsNC00YDQtdGB0LAg0Lgg0YDQtdCz0LjRgdGC0YDQuNGA0YPQtdGCINC60LDRh9C10YHRgtCy0L4g0LDQtNGA0LXRgdCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24g0J7QsdGK0LXQutGCINC/0L7QtNGB0LrQsNC30LrQuCDQv9C+INCw0LTRgNC10YHRgy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5QWRkcmVzc1N1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU2NJU3VnZ2VzdGlvbkFkZHJlc3MpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoc3VnZ2VzdGlvbi5hZGRyZXNzU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbC5jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NRdWFsaXR5U2VydmljZS5zZXRRdWFsaXR5KHRoaXMuY29udHJvbC5jb250cm9sLCBzdWdnZXN0aW9uLnF1YWxpdHkgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0L/QvtC70L3Rj9C10YIg0L/QvtC70Y8g0YDQvtC00LjRgtC10LvRjNGB0LrQvtC5INCz0YDRg9C/0L/RiyDQtNCw0L3QvdGL0LzQuCDQstGL0LHRgNCw0L3QvdC+0Lkg0L7RgNCz0LDQvdC40LfQsNGG0LjQuCDQuCDRgNC10LPQuNGB0YLRgNC40YDRg9C10YIg0LrQsNGH0LXRgdGC0LLQviDQtdGRINCw0LTRgNC10YHQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24g0J7QsdGK0LXQutGCINC/0L7QtNGB0LrQsNC30LrQuCDQv9C+INC+0YDQs9Cw0L3QuNC30LDRhtC40LguXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBseU9yZ2FuaXphdGlvblN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU2NJU3VnZ2VzdGlvbk9yZ2FuaXphdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJlbnRHcm91cCA9IHRoaXMuY29udHJvbC5jb250cm9sPy5wYXJlbnQgYXMgRm9ybUdyb3VwO1xuXG4gICAgICAgIHBhcmVudEdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogc3VnZ2VzdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGlubjogc3VnZ2VzdGlvbi5pbm4sXG4gICAgICAgICAgICAgICAga3BwOiBzdWdnZXN0aW9uLmtwcCxcbiAgICAgICAgICAgICAgICBvZ3JuOiBzdWdnZXN0aW9uLm9ncm4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICBva3BvOiBzdWdnZXN0aW9uLm9rcG8sXG4gICAgICAgICAgICAgICAgZGlyZWN0b3JOYW1lOiBzdWdnZXN0aW9uLmRpcmVjdG9yTmFtZSxcbiAgICAgICAgICAgICAgICBkaXJlY3RvclBvc2l0aW9uOiBzdWdnZXN0aW9uLmRpcmVjdG9yUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgbGVnYWxBZGRyZXNzOiBzdWdnZXN0aW9uLmxlZ2FsQWRkcmVzcyxcbiAgICAgICAgICAgICAgICBwb3N0YWxBZGRyZXNzOiBzdWdnZXN0aW9uLnBvc3RhbEFkZHJlc3MsXG4gICAgICAgICAgICAgICAgYWN0dWFsQWRkcmVzczogc3VnZ2VzdGlvbi5hY3R1YWxBZGRyZXNzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hZGRyZXNzUXVhbGl0eVNlcnZpY2Uuc2V0T3JnYW5pemF0aW9uQWRkcmVzc1F1YWxpdGllcyhwYXJlbnRHcm91cCwgc3VnZ2VzdGlvbik7XG4gICAgfVxufVxuIiwiPHR1aS1sb2FkZXJcbiAgICBzaXplPVwibVwiXG4gICAgW292ZXJsYXldPVwidHJ1ZVwiXG4gICAgW3Nob3dMb2FkZXJdPVwiISEobG9hZGluZyQgfCBhc3luYylcIlxuPlxuICAgIEBsZXQgb3B0aW9ucyA9IHN1Z2dlc3Rpb25zJCB8IGFzeW5jO1xuICAgIDx0dWktZGF0YS1saXN0PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkU3VnZ2VzdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleC1jb2wgIWl0ZW1zLXN0YXJ0XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgQGxldCBvcHRpb25WYWx1ZSA9ICRhbnkob3B0aW9uKTtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInR5cGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJzdWdnZXN0aW9uVHlwZS5maW9cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXR1aS1saW5rXCI+e3sgb3B0aW9uVmFsdWUuZmlvIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInN1Z2dlc3Rpb25UeXBlLm9yZ2FuaXphdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvblZhbHVlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMSB0ZXh0LXR1aS10ZXh0LTAyXCI+0LjQvdC9OiB7eyBvcHRpb25WYWx1ZS5pbm4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNPcmdUZXJtaW5hdGVkKG9wdGlvblZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXR1aS1uZWdhdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg0JvQuNC60LLQuNC00LjRgNC+0LLQsNC90L5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHVpLXRleHQtMDJcIj57eyBvcHRpb25WYWx1ZT8ubGVnYWxBZGRyZXNzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInN1Z2dlc3Rpb25UeXBlLmJhbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXR1aS1saW5rXCI+e3sgb3B0aW9uVmFsdWUubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXR1aS10ZXh0LTAyXCI+e3sgb3B0aW9uVmFsdWUuYmljIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInN1Z2dlc3Rpb25UeXBlLmVtYWlsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC10dWktbGlua1wiPnt7IG9wdGlvblZhbHVlLmVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInN1Z2dlc3Rpb25UeXBlLmFkZHJlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXR1aS1saW5rXCI+e3sgb3B0aW9uVmFsdWUuYWRkcmVzc1N0cmluZyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChnZXRBZGRyZXNzUXVhbGl0eVdhcm5pbmcob3B0aW9uVmFsdWUucXVhbGl0eSk7IGFzIGFkZHJlc3NRdWFsaXR5V2FybmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtdHVpLXN0YXR1cy13YXJuaW5nXCI+e3sgYWRkcmVzc1F1YWxpdHlXYXJuaW5nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC90dWktZGF0YS1saXN0PlxuPC90dWktbG9hZGVyPlxuIl19