@libs-ui/components-inputs-multi-language 0.2.356-23 → 0.2.356-25

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.
@@ -1,8 +1,8 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { ChangeDetectionStrategy, Component, computed, effect, input, model, output, signal, untracked } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, computed, effect, input, model, output, signal, untracked, viewChildren } from '@angular/core';
3
3
  import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
4
4
  import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
5
- import { LibsUiComponentsInputsQuillComponent } from '@libs-ui/components-inputs-quill';
5
+ import { LibsUiComponentsInputsQuill2xComponent } from '@libs-ui/components-inputs-quill2x';
6
6
  import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
7
7
  import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
8
8
  import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
@@ -16,7 +16,6 @@ import { currenciesOptions, currenciesSupport, httpRequestDetail, langOptions, l
16
16
  import * as i0 from "@angular/core";
17
17
  import * as i1 from "@ngx-translate/core";
18
18
  export class LibsUiComponentsInputsMultiLanguageComponent {
19
- // #region PROPERTY
20
19
  languageDisplay = signal([]);
21
20
  dataLanguageChange = signal({});
22
21
  langDefault = signal(languageSupport());
@@ -25,10 +24,9 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
25
24
  validRequiredDefault = signal(validRequired());
26
25
  listConfigItem = computed(() => listConfigItem(this.options()));
27
26
  httpRequestDetail = computed(() => httpRequestDetail(this.options()));
28
- inputFunctionControl = signal(new Map());
29
- quillFunctionControl = signal([]);
27
+ inputComponentRefs = viewChildren(LibsUiComponentsInputsValidComponent);
28
+ quillComponentRefs = viewChildren(LibsUiComponentsInputsQuill2xComponent);
30
29
  onDestroy = new Subject();
31
- // #region INPUT
32
30
  optionsLanguage = input(langOptions());
33
31
  zIndex = input();
34
32
  viewType = input('text', { transform: (value) => value ?? 'text' });
@@ -51,17 +49,16 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
51
49
  classIncludeKey = input('libs-ui-font-h4r');
52
50
  classIncludeValue = input('libs-ui-font-h4s');
53
51
  dataLanguage = model({});
54
- multiLine = input();
55
52
  readonly = input();
56
53
  acceptNegativeValue = input();
57
54
  valueUpDownNumber = input();
58
55
  maxValueNumber = input();
59
56
  onlyAcceptNegativeValue = input();
60
57
  validOneDefaultMultiLanguage = input();
61
- // #region OUTPUT
58
+ classIconAddLanguage = input('libs-ui-icon-add', { transform: (value) => value || 'libs-ui-icon-add' });
59
+ validPattern = input();
62
60
  outEventMultiLanguage = output();
63
61
  outChangeTypeLanguage = output();
64
- outFunctionsControl = output();
65
62
  outChangeValueInput = output();
66
63
  constructor() {
67
64
  effect(() => {
@@ -76,16 +73,18 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
76
73
  untracked(() => {
77
74
  if (viewType === 'integer') {
78
75
  this.langDefault.set(currenciesSupport());
79
- this.options.set(currenciesOptions());
80
- this.options().forEach((item) => {
81
- this.currencyUnits().push({
82
- label: item.label,
83
- id: item.key,
84
- type: item.label,
85
- });
86
- });
87
- this.currencyUnits.update((value) => [...value]);
76
+ const opts = currenciesOptions();
77
+ this.options.set(opts);
78
+ this.currencyUnits.set(opts.map((item) => ({
79
+ label: item.label,
80
+ id: item.key,
81
+ type: item.label,
82
+ })));
83
+ return;
88
84
  }
85
+ this.langDefault.set(languageSupport());
86
+ this.options.set(this.optionsLanguage());
87
+ this.currencyUnits.set([]);
89
88
  });
90
89
  });
91
90
  effect(() => {
@@ -93,20 +92,7 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
93
92
  const dataLanguage = this.dataLanguage();
94
93
  this.dataLanguageChange.set(cloneDeep(dataLanguage));
95
94
  this.generateData();
96
- const optionsSelected = new Set();
97
- Object.keys(this.dataLanguageChange()).forEach((key) => {
98
- if (this.options().find((item) => item.key === key)) {
99
- optionsSelected.add(key);
100
- }
101
- });
102
- if (this.langDefault().length) {
103
- this.langDefault().forEach((key) => {
104
- if (!isNil(get(this.dataLanguageChange, key))) {
105
- optionsSelected.add(key);
106
- }
107
- });
108
- }
109
- this.languageDisplay.set(Array.from(optionsSelected));
95
+ this.languageDisplay.set(this.computeLanguageDisplayKeys());
110
96
  });
111
97
  });
112
98
  effect(() => {
@@ -117,24 +103,23 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
117
103
  return;
118
104
  }
119
105
  const key = this.langDefault()[0];
120
- this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange, key) }));
106
+ this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange(), key) }));
121
107
  });
122
108
  });
123
109
  effect(() => {
124
- const validRequired = this.validRequired();
110
+ const validRequiredInput = this.validRequired();
125
111
  untracked(() => {
126
- if (!validRequired) {
112
+ if (!validRequiredInput) {
127
113
  return;
128
114
  }
129
- this.validRequiredDefault.update((value) => ({ ...value, isRequired: validRequired.isRequired }));
130
- if (!validRequired.isRequired) {
131
- this.validate();
115
+ this.validRequiredDefault.update((value) => ({ ...value, isRequired: validRequiredInput.isRequired }));
116
+ if (!validRequiredInput.isRequired) {
117
+ void this.validate();
132
118
  }
133
119
  });
134
120
  });
135
121
  }
136
122
  ngOnInit() {
137
- this.outFunctionsControl.emit(this.FunctionsControl);
138
123
  this.extendClass.update((value) => `${value || ''} ${this.viewPosition() === 'row' ? 'flex-row' : 'flex-col'}`);
139
124
  }
140
125
  get FunctionsControl() {
@@ -143,82 +128,94 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
143
128
  getData: this.getData.bind(this),
144
129
  };
145
130
  }
146
- async handlerInputFunctionControl(event, key) {
147
- this.inputFunctionControl().set(key, event);
148
- }
149
- async handlerQuillFunctionControl(event) {
150
- this.quillFunctionControl.update((items) => [...items, event]);
131
+ /** Các key ngôn ngữ / tiền tệ cần hiển thị theo dữ liệu + cấu hình options. */
132
+ computeLanguageDisplayKeys() {
133
+ const dc = this.dataLanguageChange();
134
+ const opts = this.options();
135
+ const langs = this.langDefault();
136
+ const selected = new Set();
137
+ for (const k of Object.keys(dc)) {
138
+ if (opts.some((o) => o.key === k)) {
139
+ selected.add(k);
140
+ }
141
+ }
142
+ for (const k of langs) {
143
+ if (!isNil(get(dc, k))) {
144
+ selected.add(k);
145
+ }
146
+ }
147
+ return Array.from(selected);
151
148
  }
152
- async handlerSelectChange(event, keyOld) {
149
+ handlerSelectChange(event, keyOld) {
153
150
  if (!event || event.key === keyOld) {
154
151
  return;
155
152
  }
156
153
  this.languageDisplay.update((value) => value.map((item) => (item === keyOld ? event.key : item)));
157
154
  delete this.dataLanguageChange()[keyOld];
158
155
  delete this.dataLanguage()[keyOld];
159
- this.setDefaultData(event.key);
156
+ void this.setDefaultData(event.key);
160
157
  }
161
- async handlerAddLanguage(event) {
158
+ handlerAddLanguage(event) {
162
159
  event.stopPropagation();
163
160
  const lang = this.options().find((item) => !this.languageDisplay().includes(item.key));
164
161
  if (!lang) {
165
162
  return;
166
163
  }
167
164
  this.languageDisplay.update((value) => [...value, lang.key]);
168
- this.setDefaultData(lang.key);
165
+ void this.setDefaultData(lang.key);
169
166
  if (this.options().length === this.languageDisplay().length) {
170
167
  this.ignoreAdd.set(true);
171
168
  }
172
169
  this.outEventMultiLanguage.emit({ action: 'add', data: this.dataLanguageChange() });
173
170
  }
174
- async handlerRemoveLanguage(event, key) {
171
+ handlerRemoveLanguage(event, key) {
175
172
  event.stopPropagation();
176
- this.ignoreAdd.set(true);
173
+ this.ignoreAdd.set(false);
177
174
  this.dataLanguageChange.update((value) => {
178
175
  delete value[key];
179
176
  return { ...value };
180
177
  });
181
- this.validateIsMultiKey();
178
+ void this.validateIsMultiKey();
182
179
  this.languageDisplay.update((value) => value.filter((item) => item !== key));
183
180
  this.outEventMultiLanguage.emit({ action: 'remove', data: this.dataLanguageChange() });
184
- this.inputFunctionControl().delete(key);
185
181
  }
186
- async getData() {
182
+ getData() {
187
183
  if (this.singleLanguage()) {
188
184
  const key = this.langDefault()[0];
189
- this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange, key) }));
185
+ this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange(), key) }));
190
186
  return this.dataLanguage();
191
187
  }
192
188
  if (this.data().length > 1) {
189
+ const defaultLang = this.langDefault()[0];
193
190
  for (const item of this.data()) {
194
- const lang = this.langDefault()[0];
195
- const key = item.keyBindData;
196
- const dataByKey = key ? get(this.dataLanguageChange, key) : undefined;
197
- if (key && dataByKey && lang && !get(dataByKey, lang) && !get(this.dataLanguageChange, lang)) {
191
+ const keyBind = item.keyBindData;
192
+ const dataByKey = keyBind ? get(this.dataLanguageChange(), keyBind) : undefined;
193
+ if (keyBind && dataByKey && defaultLang && !get(dataByKey, defaultLang) && !get(this.dataLanguageChange(), defaultLang)) {
198
194
  return {};
199
195
  }
200
196
  }
201
197
  }
202
198
  return this.dataLanguageChange();
203
199
  }
204
- async generateData() {
200
+ generateData() {
205
201
  const lang = this.langDefault()[0];
206
- if (this.data().length) {
207
- this.data().forEach((item, index) => {
202
+ const dataItems = this.data();
203
+ if (dataItems.length) {
204
+ dataItems.forEach((item, index) => {
208
205
  const key = item.keyBindData;
209
- if (!index && isNil(get(this.dataLanguageChange, lang))) {
210
- this.setDefaultData(lang);
206
+ if (!index && isNil(get(this.dataLanguageChange(), lang))) {
207
+ void this.setDefaultData(lang);
211
208
  return;
212
209
  }
213
- if (!key || !isNil(get(this.dataLanguageChange, key))) {
210
+ if (!key || !isNil(get(this.dataLanguageChange(), key))) {
214
211
  return;
215
212
  }
216
213
  this.dataLanguageChange.update((value) => ({ ...value, [key]: { [lang]: '' } }));
217
214
  });
218
215
  }
219
- if (!this.data().length) {
216
+ if (!dataItems.length) {
220
217
  if (!this.dataLanguage() || !Object.keys(this.dataLanguage()).length) {
221
- this.setDefaultData(lang);
218
+ void this.setDefaultData(lang);
222
219
  }
223
220
  this.data.set([
224
221
  {
@@ -230,19 +227,19 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
230
227
  ]);
231
228
  }
232
229
  }
233
- async setDefaultData(key) {
230
+ setDefaultData(key) {
234
231
  this.dataLanguageChange.update((value) => ({ ...value, [key]: '' }));
235
232
  this.dataLanguage.update((value) => ({ ...value, [key]: '' }));
236
233
  }
237
234
  async validate() {
238
235
  let valid = true;
239
- for (const control of this.inputFunctionControl().values()) {
240
- if (!(await control.checkIsValid())) {
236
+ for (const control of this.inputComponentRefs()) {
237
+ if (!(await control.FunctionsControl.checkIsValid())) {
241
238
  valid = false;
242
239
  }
243
240
  }
244
- for (const control of this.quillFunctionControl()) {
245
- if (!(await control.checkIsValid())) {
241
+ for (const quillCmp of this.quillComponentRefs()) {
242
+ if (!(await quillCmp.FunctionsControl.checkIsValid())) {
246
243
  valid = false;
247
244
  }
248
245
  }
@@ -250,9 +247,12 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
250
247
  return valid;
251
248
  }
252
249
  if (this.data().length === 1) {
253
- await this.validateDefault();
250
+ const defaultOk = await this.validateDefault();
251
+ if (!defaultOk) {
252
+ valid = false;
253
+ }
254
254
  }
255
- this.validateIsMultiKey();
255
+ await this.validateIsMultiKey();
256
256
  return valid;
257
257
  }
258
258
  async validateDefault() {
@@ -272,12 +272,12 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
272
272
  return valid;
273
273
  }
274
274
  for (const key of Object.keys(this.dataLanguageChange())) {
275
- if (key !== 'id' && key !== this.keyHeader() && get(this.dataLanguageChange, key) && key !== this.langDefault()[0]) {
275
+ if (key !== 'id' && key !== this.keyHeader() && get(this.dataLanguageChange(), key) && key !== this.langDefault()[0]) {
276
276
  this.validRequiredDefault.update((value) => ({ ...value, isRequired: true }));
277
277
  if (!(await this.checkValidInput())) {
278
278
  valid = false;
279
279
  }
280
- return;
280
+ return valid;
281
281
  }
282
282
  this.validRequiredDefault.update((value) => ({ ...value, isRequired: false }));
283
283
  if (!(await this.checkValidInput())) {
@@ -288,80 +288,90 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
288
288
  }
289
289
  async checkValidInput() {
290
290
  let valid = true;
291
- for (const control of this.inputFunctionControl().values()) {
292
- if (!(await control.checkIsValid())) {
291
+ for (const control of this.inputComponentRefs()) {
292
+ if (!(await control.FunctionsControl.checkIsValid())) {
293
293
  valid = false;
294
294
  }
295
295
  }
296
296
  return valid;
297
297
  }
298
+ /**
299
+ * Khi có nhiều `IDataItem` (nhiều field bind), cập nhật `validRequiredLangDefault` theo dữ liệu đã nhập.
300
+ * Giữ nguyên thứ tự điều kiện / nhánh như phiên bản trước (forEach async), nhưng await đúng để validate không kết thúc sớm.
301
+ */
298
302
  async validateIsMultiKey() {
299
- if (this.data().length > 1) {
300
- if (this.data()[0].validRequired?.isRequired) {
301
- return;
303
+ if (this.data().length <= 1) {
304
+ return;
305
+ }
306
+ if (this.data()[0].validRequired?.isRequired) {
307
+ return;
308
+ }
309
+ const dataItems = this.data();
310
+ const dc = this.dataLanguageChange();
311
+ for (const item of dataItems) {
312
+ if (!item.keyBindData) {
313
+ continue;
302
314
  }
303
- this.data().forEach((item) => {
304
- if (!item.keyBindData) {
305
- return;
306
- }
307
- Object.keys(get(this.dataLanguageChange, item.keyBindData)).forEach(async (keyBind) => {
308
- for (const key of Object.keys(this.dataLanguageChange())) {
309
- if (key === item.keyBindData || key === keyBind) {
310
- continue;
311
- }
312
- if (get(this.dataLanguageChange, key) && this.options().find((item) => item.key === key)) {
313
- this.data().forEach(async (config) => {
314
- if (config && config.validRequiredLangDefault) {
315
- config.validRequiredLangDefault.isRequired = true;
316
- await this.checkValidInput();
317
- }
318
- });
319
- return;
320
- }
321
- this.data().forEach(async (config) => {
322
- if (config && config.validRequiredLangDefault) {
323
- config.validRequiredLangDefault.isRequired = false;
315
+ const nested = get(dc, item.keyBindData);
316
+ if (!nested || typeof nested !== 'object') {
317
+ continue;
318
+ }
319
+ langKey: for (const langNestedKey of Object.keys(nested)) {
320
+ for (const topKey of Object.keys(dc)) {
321
+ if (topKey === item.keyBindData || topKey === langNestedKey) {
322
+ continue;
323
+ }
324
+ if (get(dc, topKey) && this.options().find((opt) => opt.key === topKey)) {
325
+ for (const config of dataItems) {
326
+ if (config?.validRequiredLangDefault) {
327
+ config.validRequiredLangDefault.isRequired = true;
324
328
  await this.checkValidInput();
325
329
  }
326
- });
327
- }
328
- const dataLanguageChangeByKeyBind = get(this.dataLanguageChange, keyBind);
329
- const dataLanguageChangeByKeyBindData = item.keyBindData ? get(this.dataLanguageChange, item.keyBindData) : undefined;
330
- if ((!dataLanguageChangeByKeyBind && !get(dataLanguageChangeByKeyBindData, keyBind)) || (dataLanguageChangeByKeyBind && get(dataLanguageChangeByKeyBindData, keyBind))) {
331
- return;
332
- }
333
- if (!dataLanguageChangeByKeyBind) {
334
- const dataFirst = this.data()[0];
335
- if (dataFirst && dataFirst.validRequiredLangDefault) {
336
- dataFirst.validRequiredLangDefault.isRequired = true;
337
- await this.checkValidInput();
338
330
  }
339
- return;
331
+ continue langKey;
340
332
  }
341
- if (!get(dataLanguageChangeByKeyBindData, keyBind)) {
342
- const dataSecond = this.data()[1];
343
- if (dataSecond && dataSecond.validRequiredLangDefault) {
344
- dataSecond.validRequiredLangDefault.isRequired = true;
333
+ for (const config of dataItems) {
334
+ if (config?.validRequiredLangDefault) {
335
+ config.validRequiredLangDefault.isRequired = false;
345
336
  await this.checkValidInput();
346
337
  }
347
- return;
348
338
  }
349
- });
350
- });
339
+ }
340
+ const dataLanguageChangeByKeyBind = get(dc, langNestedKey);
341
+ const dataByItemKey = item.keyBindData ? get(dc, item.keyBindData) : undefined;
342
+ if ((!dataLanguageChangeByKeyBind && !get(dataByItemKey, langNestedKey)) || (dataLanguageChangeByKeyBind && get(dataByItemKey, langNestedKey))) {
343
+ continue;
344
+ }
345
+ if (!dataLanguageChangeByKeyBind) {
346
+ const dataFirst = dataItems[0];
347
+ if (dataFirst?.validRequiredLangDefault) {
348
+ dataFirst.validRequiredLangDefault.isRequired = true;
349
+ await this.checkValidInput();
350
+ }
351
+ continue;
352
+ }
353
+ if (!get(dataByItemKey, langNestedKey)) {
354
+ const dataSecond = dataItems[1];
355
+ if (dataSecond?.validRequiredLangDefault) {
356
+ dataSecond.validRequiredLangDefault.isRequired = true;
357
+ await this.checkValidInput();
358
+ }
359
+ }
360
+ }
351
361
  }
352
362
  }
353
- async handlerInputChange() {
363
+ handlerInputChange() {
354
364
  this.outChangeValueInput.emit();
355
365
  timer(500)
356
366
  .pipe(takeUntil(this.onDestroy))
357
- .subscribe(() => this.validate());
367
+ .subscribe(() => void this.validate());
358
368
  }
359
369
  ngOnDestroy() {
360
370
  this.onDestroy.next();
361
371
  this.onDestroy.complete();
362
372
  }
363
373
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
364
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, multiLine: { classPropertyName: "multiLine", publicName: "multiLine", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outFunctionsControl: "outFunctionsControl", outChangeValueInput: "outChangeValueInput" }, ngImport: i0, template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\">{{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div\n [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div\n class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if ((item.type !== 'editor' && !item.isOneValue) || (item.isOneValue && $first)) {\n <div\n class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"(singleLanguage() && !multiLine()) || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true } : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage() ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false} :\n ($index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false })\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"(validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key] ) ? undefined : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerQuillFunctionControl($event)\" />\n }\n </div>\n </div>\n }\n }\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div\n class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div\n class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage() || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuillComponent, selector: "libs_ui-components-inputs-quill", inputs: ["isShowToolBar", "isToolbarPositionFixed", "classIncludeToolbar", "stylesIncludeToolbar", "toolbarConfig", "placeholder", "label", "item", "autoUpdateValueWhenTextChange", "fieldNameBind", "readonly", "showErrorLabel", "showErrorBorder", "onlyShowErrorBorderInContent", "classIncludeTemplate", "classInclude", "handlersExpand", "validRequired", "validMinLength", "validMaxLength", "zIndex", "dataConfigMention", "blotsRegister", "autoFocus", "focusBottom", "blockUndoRedoKeyboard", "templateToolBarPersonalize", "template", "uploadImageConfig", "heightAuto", "elementScrollHeightAuto", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outFunctionsControl", "outSelectionChange", "outTextChange", "outContextMenu"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
374
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, classIconAddLanguage: { classPropertyName: "classIconAddLanguage", publicName: "classIconAddLanguage", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outChangeValueInput: "outChangeValueInput" }, viewQueries: [{ propertyName: "inputComponentRefs", predicate: LibsUiComponentsInputsValidComponent, descendants: true, isSignal: true }, { propertyName: "quillComponentRefs", predicate: LibsUiComponentsInputsQuill2xComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuill2xComponent, selector: "libs_ui-components-inputs-quill2x", inputs: ["uploadImageConfig", "displayToolbar", "placeholder", "blotsRegister", "readonly", "quillCustomConfig", "label", "item", "fieldBind", "dataConfigMention", "templateToolBarPersonalize", "zIndex", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup", "handlersExpand", "resizeImagePlugin", "fontSizeDefault", "heightEditorContentDefault", "minHeightEditorContentDefault", "maxHeightEditorContentDefault", "removeNearWhiteColorsOnPaste", "resize", "autoFocus", "focusTimerOnInit", "focusBottom", "validRequired", "validMinLength", "validMaxLength", "showErrorLabel", "showErrorBorder", "ignoreShowBorderErrorToolbar"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outSelectionChange", "outTextChange", "outContextMenu", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
365
375
  }
366
376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, decorators: [{
367
377
  type: Component,
@@ -375,7 +385,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
375
385
  LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe,
376
386
  LibsUiComponentsInputsMultiLanguageGetItemPipe,
377
387
  LibsUiPipesEscapeHtmlPipe,
378
- LibsUiComponentsInputsQuillComponent,
379
- ], template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\">{{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div\n [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div\n class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if ((item.type !== 'editor' && !item.isOneValue) || (item.isOneValue && $first)) {\n <div\n class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"(singleLanguage() && !multiLine()) || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true } : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage() ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false} :\n ($index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false })\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"(validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key] ) ? undefined : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerQuillFunctionControl($event)\" />\n }\n </div>\n </div>\n }\n }\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div\n class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div\n class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage() || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
388
+ LibsUiComponentsInputsQuill2xComponent,
389
+ ], template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
380
390
  }], ctorParameters: () => [] });
381
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQWtCLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUE4QixvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BILE9BQU8sRUFBaUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2SixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzREFBc0QsRUFBRSxNQUFNLCtC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Q0FBQztRQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0IsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBaFhVLDRDQUE0Qzs0RkFBNUMsNENBQTRDLDAvSUNwQ3pELGt1UkFtS0EsMkNEM0lJLGVBQWUsNEZBQ2YsaUNBQWlDLHUzREFDakMsb0NBQW9DLGczREFDcEMsc0NBQXNDLHNqQkFDdEMsZ0NBQWdDLCtmQUNoQyxvREFBb0Qsd0ZBQ3BELHNEQUFzRCwwRkFDdEQsOENBQThDLGtGQUM5Qyx5QkFBeUIsa0VBQ3pCLG9DQUFvQzs7NEZBRzNCLDRDQUE0QztrQkFuQnhELFNBQVM7K0JBRUUsMENBQTBDLGNBRXhDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxlQUFlO3dCQUNmLGlDQUFpQzt3QkFDakMsb0NBQW9DO3dCQUNwQyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMsb0RBQW9EO3dCQUNwRCxzREFBc0Q7d0JBQ3RELDhDQUE4Qzt3QkFDOUMseUJBQXlCO3dCQUN6QixvQ0FBb0M7cUJBQ3JDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1xdWlsbCc7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJVmFsaWRMZW5ndGgsIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1pdGVtLnBpcGUnO1xuaW1wb3J0IHsgY3VycmVuY2llc09wdGlvbnMsIGN1cnJlbmNpZXNTdXBwb3J0LCBodHRwUmVxdWVzdERldGFpbCwgbGFuZ09wdGlvbnMsIGxhbmd1YWdlU3VwcG9ydCwgbGlzdENvbmZpZ0l0ZW0sIHZhbGlkUmVxdWlyZWQgfSBmcm9tICcuL3V0aWxzL211bHRpLWxhbmd1YWdlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1tdWx0aV9sYW5ndWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXREaXNhYmxlS2V5UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGxhbmd1YWdlRGlzcGxheSA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBkYXRhTGFuZ3VhZ2VDaGFuZ2UgPSBzaWduYWw8SURhdGFNdWx0aUxhbmd1YWdlPih7fSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihsYW5ndWFnZVN1cHBvcnQoKSk7XG4gIHByb3RlY3RlZCBjdXJyZW5jeVVuaXRzID0gc2lnbmFsPEFycmF5PElDdXJyZW5jeVVuaXQ+PihbXSk7XG4gIHByb3RlY3RlZCBvcHRpb25zID0gc2lnbmFsPEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWREZWZhdWx0ID0gc2lnbmFsPElWYWxpZFJlcXVpcmVkPih2YWxpZFJlcXVpcmVkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBsaXN0Q29uZmlnSXRlbSh0aGlzLm9wdGlvbnMoKSkpO1xuICBwcm90ZWN0ZWQgaHR0cFJlcXVlc3REZXRhaWwgPSBjb21wdXRlZCgoKSA9PiBodHRwUmVxdWVzdERldGFpbCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgaW5wdXRGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8TWFwPHN0cmluZywgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudD4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgcXVpbGxGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8QXJyYXk8SVF1aWxsRnVuY3Rpb25Db250cm9sRXZlbnQ+PihbXSk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IG9wdGlvbnNMYW5ndWFnZSA9IGlucHV0PEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB2aWV3VHlwZSA9IGlucHV0PFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIHwgdW5kZWZpbmVkPigndGV4dCcsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICd0ZXh0JyB9KTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkYXRhID0gbW9kZWw8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPih2YWxpZFJlcXVpcmVkKCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHZhbGlkUmVxdWlyZWQoKSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQWRkID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGl0bGVGaWVsZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkga2V5SGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB0ZXh0QXJlYSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBleHRlbmRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3NDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB2aWV3UG9zaXRpb24gPSBpbnB1dDwncm93JyB8ICdjb2x1bW4nPigncm93Jyk7XG4gIHJlYWRvbmx5IGlnbm9yZVJlbW92ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoLCBJVmFsaWRMZW5ndGggfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiAwIH0sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHsgbGVuZ3RoOiAwIH0gfSk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSBjb3VudENoYXJhY3RlcnMgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2aWV3Q29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUtleSA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNHInKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVmFsdWUgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRzJyk7XG4gIHJlYWRvbmx5IGRhdGFMYW5ndWFnZSA9IG1vZGVsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICByZWFkb25seSBtdWx0aUxpbmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWx1ZVVwRG93bk51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWF4VmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRFdmVudE11bHRpTGFuZ3VhZ2UgPSBvdXRwdXQ8SUV2ZW50TXVsdGlMYW5ndWFnZT4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVHlwZUxhbmd1YWdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VWYWx1ZUlucHV0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmKHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUeXBlID0gdGhpcy52aWV3VHlwZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChjdXJyZW5jaWVzU3VwcG9ydCgpKTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KGN1cnJlbmNpZXNPcHRpb25zKCkpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucygpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lVbml0cygpLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgaWQ6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICB0eXBlOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW5jeVVuaXRzLnVwZGF0ZSgodmFsdWUpID0+IFsuLi52YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2UgPSB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS5zZXQoY2xvbmVEZWVwKGRhdGFMYW5ndWFnZSkpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0YSgpO1xuICAgICAgICBjb25zdCBvcHRpb25zU2VsZWN0ZWQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGtleSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnNTZWxlY3RlZC5hZGQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5sYW5nRGVmYXVsdCgpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubGFuZ0RlZmF1bHQoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpKSkge1xuICAgICAgICAgICAgICBvcHRpb25zU2VsZWN0ZWQuYWRkKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYW5ndWFnZURpc3BsYXkuc2V0KEFycmF5LmZyb20ob3B0aW9uc1NlbGVjdGVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVMYW5ndWFnZSA9IHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlVHlwZUxhbmd1YWdlLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghc2luZ2xlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdmFsaWRSZXF1aXJlZC5pc1JlcXVpcmVkIH0pKTtcbiAgICAgICAgaWYgKCF2YWxpZFJlcXVpcmVkLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICB0aGlzLmV4dGVuZENsYXNzLnVwZGF0ZSgodmFsdWUpID0+IGAke3ZhbHVlIHx8ICcnfSAke3RoaXMudmlld1Bvc2l0aW9uKCkgPT09ICdyb3cnID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCd9YCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiB0aGlzLmdldERhdGEuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbChldmVudDogSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkuc2V0KGtleSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJRdWlsbEZ1bmN0aW9uQ29udHJvbChldmVudDogSVF1aWxsRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnF1aWxsRnVuY3Rpb25Db250cm9sLnVwZGF0ZSgoaXRlbXMpID0+IFsuLi5pdGVtcywgZXZlbnRdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0Q2hhbmdlKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwga2V5T2xkOiBzdHJpbmcpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmtleSA9PT0ga2V5T2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFuZ3VhZ2VEaXNwbGF5LnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlLm1hcCgoaXRlbSkgPT4gKGl0ZW0gPT09IGtleU9sZCA/IChldmVudC5rZXkgYXMgc3RyaW5nKSA6IGl0ZW0pKSk7XG4gICAgZGVsZXRlIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5T2xkXTtcbiAgICBkZWxldGUgdGhpcy5kYXRhTGFuZ3VhZ2UoKVtrZXlPbGRdO1xuICAgIHRoaXMuc2V0RGVmYXVsdERhdGEoZXZlbnQua2V5IGFzIHN0cmluZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFkZExhbmd1YWdlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLm9wdGlvbnMoKS5maW5kKChpdGVtKSA9PiAhdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5pbmNsdWRlcyhpdGVtLmtleSkpO1xuICAgIGlmICghbGFuZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUoKHZhbHVlKSA9PiBbLi4udmFsdWUsIGxhbmcua2V5XSk7XG4gICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nLmtleSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpLmxlbmd0aCA9PT0gdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaWdub3JlQWRkLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5vdXRFdmVudE11bHRpTGFuZ3VhZ2UuZW1pdCh7IGFjdGlvbjogJ2FkZCcsIGRhdGE6IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclJlbW92ZUxhbmd1YWdlKGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlnbm9yZUFkZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKCh2YWx1ZSkgPT4ge1xuICAgICAgZGVsZXRlIHZhbHVlW2tleV07XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSB9O1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBrZXkpKTtcbiAgICB0aGlzLm91dEV2ZW50TXVsdGlMYW5ndWFnZS5lbWl0KHsgYWN0aW9uOiAncmVtb3ZlJywgZGF0YTogdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSB9KTtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkuZGVsZXRlKGtleSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERhdGEoKSB7XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgfSkpO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhKCkpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ0RlZmF1bHQoKVswXTtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXlCaW5kRGF0YTtcbiAgICAgICAgY29uc3QgZGF0YUJ5S2V5ID0ga2V5ID8gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoa2V5ICYmIGRhdGFCeUtleSAmJiBsYW5nICYmICFnZXQ8YW55PihkYXRhQnlLZXksIGxhbmcpICYmICFnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGxhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRGF0YSgpIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5QmluZERhdGE7XG4gICAgICAgIGlmICghaW5kZXggJiYgaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBsYW5nKSkpIHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IHsgW2xhbmddOiAnJyB9IH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0YSgpLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YS5zZXQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdGhpcy52aWV3VHlwZSgpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyKCksXG4gICAgICAgICAgaXNPbmVWYWx1ZTogZmFsc2UsXG4gICAgICAgICAga2V5QmluZERhdGE6ICcnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXREZWZhdWx0RGF0YShrZXk6IHN0cmluZykge1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnF1aWxsRnVuY3Rpb25Db250cm9sKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRGVmYXVsdCgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKS5pc1JlcXVpcmVkKSB7XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB0cnVlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWQnICYmIGtleSAhPT0gdGhpcy5rZXlIZWFkZXIoKSAmJiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgJiYga2V5ICE9PSB0aGlzLmxhbmdEZWZhdWx0KClbMF0pIHtcbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdHJ1ZSB9KSk7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiBmYWxzZSB9KSk7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVmFsaWRJbnB1dCgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVJc011bHRpS2V5KCkge1xuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5kYXRhKClbMF0udmFsaWRSZXF1aXJlZD8uaXNSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICghaXRlbS5rZXlCaW5kRGF0YSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGl0ZW0ua2V5QmluZERhdGEpKS5mb3JFYWNoKGFzeW5jIChrZXlCaW5kKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IGl0ZW0ua2V5QmluZERhdGEgfHwga2V5ID09PSBrZXlCaW5kKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSAmJiB0aGlzLm9wdGlvbnMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmtleSA9PT0ga2V5KSkge1xuICAgICAgICAgICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKGFzeW5jIChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kID0gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXlCaW5kKTtcbiAgICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmREYXRhID0gaXRlbS5rZXlCaW5kRGF0YSA/IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgaXRlbS5rZXlCaW5kRGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKCghZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kICYmICFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHx8IChkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgZ2V0KGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZERhdGEsIGtleUJpbmQpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUZpcnN0ID0gdGhpcy5kYXRhKClbMF07XG4gICAgICAgICAgICBpZiAoZGF0YUZpcnN0ICYmIGRhdGFGaXJzdC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGF0YUZpcnN0LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTZWNvbmQgPSB0aGlzLmRhdGEoKVsxXTtcbiAgICAgICAgICAgIGlmIChkYXRhU2Vjb25kICYmIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICAgIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlcklucHV0Q2hhbmdlKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVJbnB1dC5lbWl0KCk7XG4gICAgdGltZXIoNTAwKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy52YWxpZGF0ZSgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gIEBpZiAodGl0bGVGaWVsZCgpOyBhcyB0aXRsZUZpZWxkKSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gbWItWzRweF1cIj57eyB0aXRsZUZpZWxkIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gIH1cbiAgQGZvciAoa2V5IG9mIGxhbmd1YWdlRGlzcGxheSgpOyB0cmFjayBrZXkpIHtcbiAgICBAaWYgKCF2aWV3Q29udGVudCgpKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIFtjbGFzcy5tdC1bNHB4XV09XCIhJGZpcnN0XCJcbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICBbY2xhc3MubXQtWzhweF1dPVwiY291bnRDaGFyYWN0ZXJzKCkgJiYgISRmaXJzdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB7eyBleHRlbmRDbGFzcygpIH19XCI+XG4gICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImh0dHBSZXF1ZXN0RGV0YWlsKClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwibGFuZ3VhZ2VEaXNwbGF5KCkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlOiBrZXlcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIkaW5kZXggPT09IDAgfHwgcmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3ctWzE1MHB4XSdcIlxuICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdENoYW5nZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCByZWxhdGl2ZSBwLTAge3sgZXh0ZW5kQ2xhc3NDb250ZW50KCkgfX1cIlxuICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS0xNTBweCldXT1cIiF0ZXh0QXJlYSgpICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIHZpZXdQb3NpdGlvbigpID09PSAncm93J1wiXG4gICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cInRleHRBcmVhKCkgfHwgc2luZ2xlTGFuZ3VhZ2UoKSB8fCB2aWV3UG9zaXRpb24oKSA9PT0gJ2NvbHVtbidcIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YSgpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIEBpZiAoKGl0ZW0udHlwZSAhPT0gJ2VkaXRvcicgJiYgIWl0ZW0uaXNPbmVWYWx1ZSkgfHwgKGl0ZW0uaXNPbmVWYWx1ZSAmJiAkZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB7eyBpdGVtLmNsYXNzSW5jbHVkZUlucHV0IH19XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiKHNpbmdsZUxhbmd1YWdlKCkgJiYgIW11bHRpTGluZSgpKSB8fCByZWFkb25seSgpIHx8ICRmaXJzdFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTI4cHgpXV09XCJ0ZXh0QXJlYSgpIHx8ICghc2luZ2xlTGFuZ3VhZ2UoKSAmJiBtdWx0aUxpbmUoKSlcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS00MHB4KV1dPVwiIXRleHRBcmVhKCkgJiYgIXNpbmdsZUxhbmd1YWdlKCkgJiYgIW11bHRpTGluZSgpICYmICFyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtNzBweCldXT1cIiF0ZXh0QXJlYSgpICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIG11bHRpTGluZSgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tdC1bOHB4XV09XCJ2aWV3UG9zaXRpb24oKSA9PT0gJ2NvbHVtbidcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVsxMnB4XV09XCIhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhdGV4dEFyZWEoKSAmJiB2aWV3UG9zaXRpb24oKSA9PT0gJ3JvdydcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBsYWNlaG9sZGVyID0gaXRlbS5wbGFjZWhvbGRlciB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgW2RhdGFUeXBlXT1cIml0ZW0udHlwZSA9PT0gJ251bWJlcicgPyAnaW50JyA6IGl0ZW0udHlwZSA9PT0gJ3RleHQnID8gJ3N0cmluZycgOiBpdGVtLnR5cGUgPT09ICdiaWdpbnQnID8gJ2JpZ2ludCcgOiAnZmxvYXQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImNvdW50Q2hhcmFjdGVycygpID8geyBjbGFzc0luY2x1ZGU6ICdhYnNvbHV0ZSAtdG9wLVsyMHB4XScsIHJlcXVpcmVkOiB0cnVlIH0gOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0YWdJbnB1dF09XCJ0ZXh0QXJlYSgpID8gJ3RleHRhcmVhJyA6ICdpbnB1dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25zdEh0bWxQbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkUmVxdWlyZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZE9uZURlZmF1bHRNdWx0aUxhbmd1YWdlKCkgPyB7IGlzUmVxdWlyZWQ6IHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSA9PT0ga2V5ID8gdHJ1ZSA6IGZhbHNlfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAoJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPD0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVxdWlyZWREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA+IDEgJiYgaXRlbS52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLnZhbGlkUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaXRlbS52YWxpZFJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVxdWlyZWQoKSB8fCB7IGlzUmVxdWlyZWQ6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdW5pdHNSaWdodF09XCJjdXJyZW5jeVVuaXRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtrZXlTZWxlY3RlZFVuaXRSaWdodF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NvdW50XT1cImNvdW50Q2hhcmFjdGVycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInZhbGlkTWF4TGVuZ3RoKCkubGVuZ3RoID8gdmFsaWRNYXhMZW5ndGgoKS5sZW5ndGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaXhlZEZsb2F0XT1cIml0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyA0IDogMTRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZE1pbkxlbmd0aF09XCIodmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpICYmIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSAhPT0ga2V5ICYmICFpdGVtTWFwKClba2V5XSApID8gIHVuZGVmaW5lZCA6IHsgbGVuZ3RoOiB2YWxpZE1pbkxlbmd0aCgpPy5sZW5ndGggfHwgLTEsIG1lc3NhZ2U6ICdpMThuX21pbmltdW1fbGVuZ3RoX251bWJlcicsIGludGVycG9sYXRlUGFyYW1zOiB7IG51bWJlcjogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIH0gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS50eXBlID09PSAnZWRpdG9yJykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LVtjYWxjKDEwMCUtMjhweCldXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMjUwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGxhY2Vob2xkZXIgPSBpdGVtLnBsYWNlaG9sZGVyIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhpdGVtKV09XCJpdGVtTWFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCIkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA8PSAxID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKSA6IHZhbGlkUmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uc3RIdG1sUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZvY3VzKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclF1aWxsRnVuY3Rpb25Db250cm9sKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICgkaW5kZXggPiAwICYmIGRhdGEoKS5sZW5ndGggPT09IDEgJiYgIWlnbm9yZVJlbW92ZSgpICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVszMnB4XSBmbGV4IGl0ZW1zLWNlbnRlciBtbC1bMTZweF1cIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICBbYnV0dG9uQ3VzdG9tXT1cIntcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU3RlcENvbG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfaG92ZXI6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2FjdGl2ZTogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJzA3MTYzMScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJvb3RDb2xvcjogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fZGVsZXRlJywgekluZGV4OiAxMjA1IH0gfVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmVMYW5ndWFnZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoJGluZGV4ID09PSAwICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIG9wdGlvbnMoKS5sZW5ndGggIT09IGxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCAmJiB2aWV3VHlwZSgpICE9PSAnaW50ZWdlcicgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9sYW5ndWFnZSdcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFweC0wIG10LVs4cHhdJ1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZExhbmd1YWdlKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmICh2aWV3Q29udGVudCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICBAaWYgKHNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICAgICAgW2NsYXNzLm10LVs0cHhdXT1cIiFzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZUtleSgpXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJrZXkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGU6IG9wdGlvbnMoKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidy1bY2FsYygxMDAlLTEwMHB4KV1cIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwic2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCIhc2luZ2xlTGFuZ3VhZ2UoKSB8fCAkZmlyc3RcIlxuICAgICAgICAgIFtjbGFzcy5tdC1bNHB4XV09XCIhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGVWYWx1ZSgpXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gfHwgZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSA9PT0gMCA/IGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gKyAnJyA6ICcnKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7IHpJbmRleDogekluZGV4KCkgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG4gIEBpZiAodmlld1R5cGUoKSA9PT0gJ2ludGVnZXInICYmICF0aGlzLmlnbm9yZUFkZCgpICYmICFyZWFkb25seSgpKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvbi1saW5rLXByaW1hcnlcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQgbXItWzhweF0gdGV4dC1bMTBweF0nXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcGItMCdcIlxuICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9jdXJyZW5jeSdcIlxuICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG4iXX0=
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0osT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBK0Msb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNySSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzREFBc0QsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxvREFBb0QsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BHLE9BQU8sRUFBRSw4Q0FBOEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBcUI5SixNQUFNLE9BQU8sNENBQTRDO0lBQzdDLGVBQWUsR0FBRyxNQUFNLENBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLGtCQUFrQixHQUFHLE1BQU0sQ0FBcUIsRUFBRSxDQUFDLENBQUM7SUFDcEQsV0FBVyxHQUFHLE1BQU0sQ0FBZ0IsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUN2RCxhQUFhLEdBQUcsTUFBTSxDQUF1QixFQUFFLENBQUMsQ0FBQztJQUNqRCxPQUFPLEdBQUcsTUFBTSxDQUFpQixXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELG9CQUFvQixHQUFHLE1BQU0sQ0FBaUIsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUMvRCxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXhFLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ3hFLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzFFLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRS9CLGVBQWUsR0FBRyxLQUFLLENBQWlCLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkQsTUFBTSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3pCLFFBQVEsR0FBRyxLQUFLLENBQWlFLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEksY0FBYyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ2xDLElBQUksR0FBRyxLQUFLLENBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLGFBQWEsR0FBRyxLQUFLLENBQTZDLGFBQWEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLFNBQVMsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM3QixVQUFVLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDN0IsU0FBUyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzVCLFFBQVEsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM1QixXQUFXLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDOUIsV0FBVyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzlCLGtCQUFrQixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3JDLFlBQVksR0FBRyxLQUFLLENBQW1CLEtBQUssQ0FBQyxDQUFDO0lBQzlDLFlBQVksR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNoQyxjQUFjLEdBQUcsS0FBSyxDQUF5QyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoSSxjQUFjLEdBQUcsS0FBSyxFQUFnQixDQUFDO0lBQ3ZDLGVBQWUsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNuQyxXQUFXLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDL0IsZUFBZSxHQUFHLEtBQUssQ0FBUyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BELGlCQUFpQixHQUFHLEtBQUssQ0FBUyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RELFlBQVksR0FBRyxLQUFLLENBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLFFBQVEsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM1QixtQkFBbUIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUN2QyxpQkFBaUIsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUNwQyxjQUFjLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDakMsdUJBQXVCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDM0MsNEJBQTRCLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDL0Msb0JBQW9CLEdBQUcsS0FBSyxDQUE2QixrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNwSSxZQUFZLEdBQUcsS0FBSyxFQUF3QixDQUFDO0lBRTdDLHFCQUFxQixHQUFHLE1BQU0sRUFBdUIsQ0FBQztJQUN0RCxxQkFBcUIsR0FBRyxNQUFNLEVBQVcsQ0FBQztJQUMxQyxtQkFBbUIsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUU5QztRQUNFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsRUFBRSxDQUFDO29CQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDakIsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHO3dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztxQkFDakIsQ0FBQyxDQUFDLENBQ0osQ0FBQztvQkFDRixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDcEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2hELFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3hCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNuQyxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPO1lBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLDBCQUEwQjtRQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFbkMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVTLG1CQUFtQixDQUFDLEtBQWlDLEVBQUUsTUFBYztRQUM3RSxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBRSxLQUFLLENBQUMsR0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxLQUFZO1FBQ3ZDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVTLHFCQUFxQixDQUFDLEtBQVksRUFBRSxHQUFXO1FBQ3ZELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFTyxPQUFPO1FBQ2IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNqQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNoRixJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksV0FBVyxJQUFJLENBQUMsR0FBRyxDQUFNLFNBQVMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUM3SCxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFUyxZQUFZO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25GLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3JFLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ1o7b0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUMvQixVQUFVLEVBQUUsS0FBSztvQkFDakIsV0FBVyxFQUFFLEVBQUU7aUJBQ2hCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsR0FBVztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVE7UUFDcEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlO1FBQzNCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckgsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZTtRQUMzQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDckQsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRXJDLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEIsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQyxTQUFTO1lBQ1gsQ0FBQztZQUVELE9BQU8sRUFBRSxLQUFLLE1BQU0sYUFBYSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNyQyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sS0FBSyxhQUFhLEVBQUUsQ0FBQzt3QkFDNUQsU0FBUztvQkFDWCxDQUFDO29CQUNELElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7d0JBQ3hFLEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7NEJBQy9CLElBQUksTUFBTSxFQUFFLHdCQUF3QixFQUFFLENBQUM7Z0NBQ3JDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dDQUNsRCxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDL0IsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELFNBQVMsT0FBTyxDQUFDO29CQUNuQixDQUFDO29CQUNELEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQy9CLElBQUksTUFBTSxFQUFFLHdCQUF3QixFQUFFLENBQUM7NEJBQ3JDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDOzRCQUNuRCxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDL0IsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUMvRSxJQUFJLENBQUMsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixJQUFJLEdBQUcsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMvSSxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7b0JBQ2pDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzt3QkFDeEMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7d0JBQ3JELE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUMvQixDQUFDO29CQUNELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO29CQUN2QyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLElBQUksVUFBVSxFQUFFLHdCQUF3QixFQUFFLENBQUM7d0JBQ3pDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUN0RCxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDL0IsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0IsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0FoWVUsNENBQTRDOzRGQUE1Qyw0Q0FBNEMsbXFKQVViLG9DQUFvQyx3RkFDcEMsc0NBQXNDLGdFQy9DbEYsd2lRQTRKQSwyQ0RwSUksZUFBZSw0RkFDZixpQ0FBaUMsdTNEQUNqQyxvQ0FBb0MsZzNEQUNwQyxzQ0FBc0Msc2pCQUN0QyxnQ0FBZ0MsK2ZBQ2hDLG9EQUFvRCx3RkFDcEQsc0RBQXNELDBGQUN0RCw4Q0FBOEMsa0ZBQzlDLHlCQUF5QixrRUFDekIsc0NBQXNDOzs0RkFHN0IsNENBQTRDO2tCQW5CeEQsU0FBUzsrQkFFRSwwQ0FBMEMsY0FFeEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLGVBQWU7d0JBQ2YsaUNBQWlDO3dCQUNqQyxvQ0FBb0M7d0JBQ3BDLHNDQUFzQzt3QkFDdEMsZ0NBQWdDO3dCQUNoQyxvREFBb0Q7d0JBQ3BELHNEQUFzRDt3QkFDdEQsOENBQThDO3dCQUM5Qyx5QkFBeUI7d0JBQ3pCLHNDQUFzQztxQkFDdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGwyeENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXF1aWxsMngnO1xuaW1wb3J0IHsgSVZhbGlkTGVuZ3RoLCBJVmFsaWRQYXR0ZXJuLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWVzY2FwZS1odG1sJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZ2V0LCBpc05pbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUN1cnJlbmN5VW5pdCwgSURhdGFJdGVtLCBJRGF0YU11bHRpTGFuZ3VhZ2UsIElFdmVudE11bHRpTGFuZ3VhZ2UsIElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudCwgSU9wdGlvbiwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIH0gZnJvbSAnLi9pbnRlcmZhY2VzL211bHRpLWxhbmd1YWdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGUgfSBmcm9tICcuL3BpcGVzL2Rpc3BsYXktbGFuZ3VhZ2UucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtZGlzYWJsZS1rZXkucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtaXRlbS5waXBlJztcbmltcG9ydCB7IGN1cnJlbmNpZXNPcHRpb25zLCBjdXJyZW5jaWVzU3VwcG9ydCwgaHR0cFJlcXVlc3REZXRhaWwsIGxhbmdPcHRpb25zLCBsYW5ndWFnZVN1cHBvcnQsIGxpc3RDb25maWdJdGVtLCB2YWxpZFJlcXVpcmVkIH0gZnJvbSAnLi91dGlscy9tdWx0aS1sYW5ndWFnZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbXVsdGlfbGFuZ3VhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VEaXNwbGF5TGFuZ3VhZ2VQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUsXG4gICAgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGwyeENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBsYW5ndWFnZURpc3BsYXkgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQgZGF0YUxhbmd1YWdlQ2hhbmdlID0gc2lnbmFsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICBwcm90ZWN0ZWQgbGFuZ0RlZmF1bHQgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4obGFuZ3VhZ2VTdXBwb3J0KCkpO1xuICBwcm90ZWN0ZWQgY3VycmVuY3lVbml0cyA9IHNpZ25hbDxBcnJheTxJQ3VycmVuY3lVbml0Pj4oW10pO1xuICBwcm90ZWN0ZWQgb3B0aW9ucyA9IHNpZ25hbDxBcnJheTxJT3B0aW9uPj4obGFuZ09wdGlvbnMoKSk7XG4gIHByb3RlY3RlZCB2YWxpZFJlcXVpcmVkRGVmYXVsdCA9IHNpZ25hbDxJVmFsaWRSZXF1aXJlZD4odmFsaWRSZXF1aXJlZCgpKTtcbiAgcHJvdGVjdGVkIGxpc3RDb25maWdJdGVtID0gY29tcHV0ZWQoKCkgPT4gbGlzdENvbmZpZ0l0ZW0odGhpcy5vcHRpb25zKCkpKTtcbiAgcHJvdGVjdGVkIGh0dHBSZXF1ZXN0RGV0YWlsID0gY29tcHV0ZWQoKCkgPT4gaHR0cFJlcXVlc3REZXRhaWwodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcml2YXRlIGlucHV0Q29tcG9uZW50UmVmcyA9IHZpZXdDaGlsZHJlbihMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQpO1xuICBwcml2YXRlIHF1aWxsQ29tcG9uZW50UmVmcyA9IHZpZXdDaGlsZHJlbihMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGwyeENvbXBvbmVudCk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSBvcHRpb25zTGFuZ3VhZ2UgPSBpbnB1dDxBcnJheTxJT3B0aW9uPj4obGFuZ09wdGlvbnMoKSk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdmlld1R5cGUgPSBpbnB1dDxUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UsIFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSB8IHVuZGVmaW5lZD4oJ3RleHQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAndGV4dCcgfSk7XG4gIHJlYWRvbmx5IHNpbmdsZUxhbmd1YWdlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGF0YSA9IG1vZGVsPEFycmF5PElEYXRhSXRlbT4+KFtdKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElWYWxpZFJlcXVpcmVkLCBJVmFsaWRSZXF1aXJlZCB8IHVuZGVmaW5lZD4odmFsaWRSZXF1aXJlZCgpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB2YWxpZFJlcXVpcmVkKCkgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUFkZCA9IG1vZGVsPGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHRpdGxlRmllbGQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGtleUhlYWRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdGV4dEFyZWEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3MgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGV4dGVuZENsYXNzQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdmlld1Bvc2l0aW9uID0gaW5wdXQ8J3JvdycgfCAnY29sdW1uJz4oJ3JvdycpO1xuICByZWFkb25seSBpZ25vcmVSZW1vdmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aCwgSVZhbGlkTGVuZ3RoIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogMCB9LCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB7IGxlbmd0aDogMCB9IH0pO1xuICByZWFkb25seSB2YWxpZE1pbkxlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aD4oKTtcbiAgcmVhZG9ubHkgY291bnRDaGFyYWN0ZXJzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmlld0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVLZXkgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRyJyk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVZhbHVlID0gaW5wdXQ8c3RyaW5nPignbGlicy11aS1mb250LWg0cycpO1xuICByZWFkb25seSBkYXRhTGFuZ3VhZ2UgPSBtb2RlbDxJRGF0YU11bHRpTGFuZ3VhZ2U+KHt9KTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1heFZhbHVlTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSWNvbkFkZExhbmd1YWdlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdsaWJzLXVpLWljb24tYWRkJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ2xpYnMtdWktaWNvbi1hZGQnIH0pO1xuICByZWFkb25seSB2YWxpZFBhdHRlcm4gPSBpbnB1dDxBcnJheTxJVmFsaWRQYXR0ZXJuPj4oKTtcblxuICByZWFkb25seSBvdXRFdmVudE11bHRpTGFuZ3VhZ2UgPSBvdXRwdXQ8SUV2ZW50TXVsdGlMYW5ndWFnZT4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVHlwZUxhbmd1YWdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVZhbHVlSW5wdXQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3VHlwZSA9IHRoaXMudmlld1R5cGUoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3VHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICAgICAgdGhpcy5sYW5nRGVmYXVsdC5zZXQoY3VycmVuY2llc1N1cHBvcnQoKSk7XG4gICAgICAgICAgY29uc3Qgb3B0cyA9IGN1cnJlbmNpZXNPcHRpb25zKCk7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNldChvcHRzKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbmN5VW5pdHMuc2V0KFxuICAgICAgICAgICAgb3B0cy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICBpZDogaXRlbS5rZXksXG4gICAgICAgICAgICAgIHR5cGU6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChsYW5ndWFnZVN1cHBvcnQoKSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXQodGhpcy5vcHRpb25zTGFuZ3VhZ2UoKSk7XG4gICAgICAgIHRoaXMuY3VycmVuY3lVbml0cy5zZXQoW10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlID0gdGhpcy5kYXRhTGFuZ3VhZ2UoKTtcbiAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2Uuc2V0KGNsb25lRGVlcChkYXRhTGFuZ3VhZ2UpKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGEoKTtcbiAgICAgICAgdGhpcy5sYW5ndWFnZURpc3BsYXkuc2V0KHRoaXMuY29tcHV0ZUxhbmd1YWdlRGlzcGxheUtleXMoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVMYW5ndWFnZSA9IHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlVHlwZUxhbmd1YWdlLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghc2luZ2xlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBrZXkpIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkUmVxdWlyZWRJbnB1dCA9IHRoaXMudmFsaWRSZXF1aXJlZCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCF2YWxpZFJlcXVpcmVkSW5wdXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdmFsaWRSZXF1aXJlZElucHV0LmlzUmVxdWlyZWQgfSkpO1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWRJbnB1dC5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5leHRlbmRDbGFzcy51cGRhdGUoKHZhbHVlKSA9PiBgJHt2YWx1ZSB8fCAnJ30gJHt0aGlzLnZpZXdQb3NpdGlvbigpID09PSAncm93JyA/ICdmbGV4LXJvdycgOiAnZmxleC1jb2wnfWApO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgZ2V0RGF0YTogdGhpcy5nZXREYXRhLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDw6FjIGtleSBuZ8O0biBuZ+G7ryAvIHRp4buBbiB04buHIGPhuqduIGhp4buDbiB0aOG7iyB0aGVvIGThu68gbGnhu4d1ICsgY+G6pXUgaMOsbmggb3B0aW9ucy4gKi9cbiAgcHJpdmF0ZSBjb21wdXRlTGFuZ3VhZ2VEaXNwbGF5S2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGMgPSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICBjb25zdCBsYW5ncyA9IHRoaXMubGFuZ0RlZmF1bHQoKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGRjKSkge1xuICAgICAgaWYgKG9wdHMuc29tZSgobykgPT4gby5rZXkgPT09IGspKSB7XG4gICAgICAgIHNlbGVjdGVkLmFkZChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrIG9mIGxhbmdzKSB7XG4gICAgICBpZiAoIWlzTmlsKGdldChkYywgaykpKSB7XG4gICAgICAgIHNlbGVjdGVkLmFkZChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RDaGFuZ2UoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkLCBrZXlPbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQua2V5ID09PSBrZXlPbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUubWFwKChpdGVtKSA9PiAoaXRlbSA9PT0ga2V5T2xkID8gKGV2ZW50LmtleSBhcyBzdHJpbmcpIDogaXRlbSkpKTtcbiAgICBkZWxldGUgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKVtrZXlPbGRdO1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFMYW5ndWFnZSgpW2tleU9sZF07XG4gICAgdm9pZCB0aGlzLnNldERlZmF1bHREYXRhKGV2ZW50LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJBZGRMYW5ndWFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5vcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gIXRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkuaW5jbHVkZXMoaXRlbS5rZXkpKTtcbiAgICBpZiAoIWxhbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gWy4uLnZhbHVlLCBsYW5nLmtleV0pO1xuICAgIHZvaWQgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nLmtleSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpLmxlbmd0aCA9PT0gdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaWdub3JlQWRkLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5vdXRFdmVudE11bHRpTGFuZ3VhZ2UuZW1pdCh7IGFjdGlvbjogJ2FkZCcsIGRhdGE6IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclJlbW92ZUxhbmd1YWdlKGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlnbm9yZUFkZC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+IHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtrZXldO1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUgfTtcbiAgICB9KTtcbiAgICB2b2lkIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBrZXkpKTtcbiAgICB0aGlzLm91dEV2ZW50TXVsdGlMYW5ndWFnZS5lbWl0KHsgYWN0aW9uOiAncmVtb3ZlJywgZGF0YTogdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YSgpOiBJRGF0YU11bHRpTGFuZ3VhZ2UgfCBJRGF0YU11bHRpTGFuZ3VhZ2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwga2V5KSB9KSk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhTGFuZ3VhZ2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRMYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YSgpKSB7XG4gICAgICAgIGNvbnN0IGtleUJpbmQgPSBpdGVtLmtleUJpbmREYXRhO1xuICAgICAgICBjb25zdCBkYXRhQnlLZXkgPSBrZXlCaW5kID8gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleUJpbmQpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoa2V5QmluZCAmJiBkYXRhQnlLZXkgJiYgZGVmYXVsdExhbmcgJiYgIWdldDxhbnk+KGRhdGFCeUtleSwgZGVmYXVsdExhbmcpICYmICFnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwgZGVmYXVsdExhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgIGNvbnN0IGRhdGFJdGVtcyA9IHRoaXMuZGF0YSgpO1xuICAgIGlmIChkYXRhSXRlbXMubGVuZ3RoKSB7XG4gICAgICBkYXRhSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXlCaW5kRGF0YTtcbiAgICAgICAgaWYgKCFpbmRleCAmJiBpc05pbChnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwgbGFuZykpKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogeyBbbGFuZ106ICcnIH0gfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZGF0YUl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLnNldChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnZpZXdUeXBlKCksXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIoKSxcbiAgICAgICAgICBpc09uZVZhbHVlOiBmYWxzZSxcbiAgICAgICAgICBrZXlCaW5kRGF0YTogJycsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHREYXRhKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiAnJyB9KSk7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiAnJyB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRDb21wb25lbnRSZWZzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuRnVuY3Rpb25zQ29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWlsbENtcCBvZiB0aGlzLnF1aWxsQ29tcG9uZW50UmVmcygpKSB7XG4gICAgICBpZiAoIShhd2FpdCBxdWlsbENtcC5GdW5jdGlvbnNDb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRPayA9IGF3YWl0IHRoaXMudmFsaWRhdGVEZWZhdWx0KCk7XG4gICAgICBpZiAoIWRlZmF1bHRPaykge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlSXNNdWx0aUtleSgpO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVEZWZhdWx0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgaWYgKHRoaXMudmFsaWRSZXF1aXJlZCgpLmlzUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogZmFsc2UgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdpZCcgJiYga2V5ICE9PSB0aGlzLmtleUhlYWRlcigpICYmIGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBrZXkpICYmIGtleSAhPT0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdKSB7XG4gICAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogZmFsc2UgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1ZhbGlkSW5wdXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbnB1dENvbXBvbmVudFJlZnMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5GdW5jdGlvbnNDb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogS2hpIGPDsyBuaGnhu4F1IGBJRGF0YUl0ZW1gIChuaGnhu4F1IGZpZWxkIGJpbmQpLCBj4bqtcCBuaOG6rXQgYHZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdGAgdGhlbyBk4buvIGxp4buHdSDEkcOjIG5o4bqtcC5cbiAgICogR2nhu68gbmd1ecOqbiB0aOG7qSB04buxIMSRaeG7gXUga2nhu4duIC8gbmjDoW5oIG5oxrAgcGhpw6puIGLhuqNuIHRyxrDhu5tjIChmb3JFYWNoIGFzeW5jKSwgbmjGsG5nIGF3YWl0IMSRw7puZyDEkeG7gyB2YWxpZGF0ZSBraMO0bmcga+G6v3QgdGjDumMgc+G7m20uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlSXNNdWx0aUtleSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpWzBdLnZhbGlkUmVxdWlyZWQ/LmlzUmVxdWlyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhSXRlbXMgPSB0aGlzLmRhdGEoKTtcbiAgICBjb25zdCBkYyA9IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YUl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0ua2V5QmluZERhdGEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBnZXQoZGMsIGl0ZW0ua2V5QmluZERhdGEpO1xuICAgICAgaWYgKCFuZXN0ZWQgfHwgdHlwZW9mIG5lc3RlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhbmdLZXk6IGZvciAoY29uc3QgbGFuZ05lc3RlZEtleSBvZiBPYmplY3Qua2V5cyhuZXN0ZWQgYXMgb2JqZWN0KSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRvcEtleSBvZiBPYmplY3Qua2V5cyhkYykpIHtcbiAgICAgICAgICBpZiAodG9wS2V5ID09PSBpdGVtLmtleUJpbmREYXRhIHx8IHRvcEtleSA9PT0gbGFuZ05lc3RlZEtleSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnZXQoZGMsIHRvcEtleSkgJiYgdGhpcy5vcHRpb25zKCkuZmluZCgob3B0KSA9PiBvcHQua2V5ID09PSB0b3BLZXkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBkYXRhSXRlbXMpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZz8udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZSBsYW5nS2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBkYXRhSXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChjb25maWc/LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICBjb25maWcudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgPSBnZXQoZGMsIGxhbmdOZXN0ZWRLZXkpO1xuICAgICAgICBjb25zdCBkYXRhQnlJdGVtS2V5ID0gaXRlbS5rZXlCaW5kRGF0YSA/IGdldChkYywgaXRlbS5rZXlCaW5kRGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICgoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCAmJiAhZ2V0KGRhdGFCeUl0ZW1LZXksIGxhbmdOZXN0ZWRLZXkpKSB8fCAoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kICYmIGdldChkYXRhQnlJdGVtS2V5LCBsYW5nTmVzdGVkS2V5KSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCkge1xuICAgICAgICAgIGNvbnN0IGRhdGFGaXJzdCA9IGRhdGFJdGVtc1swXTtcbiAgICAgICAgICBpZiAoZGF0YUZpcnN0Py52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGRhdGFGaXJzdC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdldChkYXRhQnlJdGVtS2V5LCBsYW5nTmVzdGVkS2V5KSkge1xuICAgICAgICAgIGNvbnN0IGRhdGFTZWNvbmQgPSBkYXRhSXRlbXNbMV07XG4gICAgICAgICAgaWYgKGRhdGFTZWNvbmQ/LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgZGF0YVNlY29uZC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW5wdXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRDaGFuZ2VWYWx1ZUlucHV0LmVtaXQoKTtcbiAgICB0aW1lcig1MDApXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB2b2lkIHRoaXMudmFsaWRhdGUoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGZsZXgtY29sIGdhcC1bOHB4XVwiPlxuICBAaWYgKHRpdGxlRmllbGQoKTsgYXMgdGl0bGVGaWVsZCkge1xuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtXCI+e3sgdGl0bGVGaWVsZCB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICB9XG4gIDxkaXZcbiAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLVs4cHhdXCJcbiAgICBbY2xhc3MuZ2FwLVs4cHhdXT1cInZpZXdQb3NpdGlvbigpID09PSAncm93J1wiXG4gICAgW2NsYXNzLmdhcC1bMTZweF1dPVwidmlld1Bvc2l0aW9uKCkgPT09ICdjb2x1bW4nXCI+XG4gICAgQGZvciAoa2V5IG9mIGxhbmd1YWdlRGlzcGxheSgpOyB0cmFjayBrZXkpIHtcbiAgICAgIEBpZiAoIXZpZXdDb250ZW50KCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLVs4cHhdIHctZnVsbCB7eyBleHRlbmRDbGFzcygpIH19XCI+XG4gICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImh0dHBSZXF1ZXN0RGV0YWlsKClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwibGFuZ3VhZ2VEaXNwbGF5KCkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlOiBrZXlcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIkaW5kZXggPT09IDAgfHwgcmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3ctWzE1MHB4XSdcIlxuICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0Q2hhbmdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGdhcC1bMTJweF0ge3sgZXh0ZW5kQ2xhc3NDb250ZW50KCkgfX1cIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YSgpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS50eXBlID09PSAnZWRpdG9yJykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTogZGF0YUxhbmd1YWdlQ2hhbmdlOyBhcyBpdGVtTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGxhY2Vob2xkZXIgPSBpdGVtLnBsYWNlaG9sZGVyIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtcXVpbGwyeFxuICAgICAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbU1hcFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkQmluZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXNpemVdPVwiaXRlbS5yZXNpemUgfHwgJ3ZlcnRpY2FsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW21pbkhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XT1cIml0ZW0ubWluSGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHQgfHwgMTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4SGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHRdPVwiaXRlbS5tYXhIZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XT1cIml0ZW0uaGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIiRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoIDw9IDEgPyB2YWxpZFJlcXVpcmVkRGVmYXVsdCgpIDogdmFsaWRSZXF1aXJlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uc3RIdG1sUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0Rm9jdXMpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1pbi13LTAge3sgaXRlbS5jbGFzc0luY2x1ZGVJbnB1dCB9fVwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTogZGF0YUxhbmd1YWdlQ2hhbmdlOyBhcyBpdGVtTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGxhY2Vob2xkZXIgPSBpdGVtLnBsYWNlaG9sZGVyIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICBbZGF0YVR5cGVdPVwiaXRlbS50eXBlID09PSAnbnVtYmVyJyA/ICdpbnQnIDogaXRlbS50eXBlID09PSAndGV4dCcgPyAnc3RyaW5nJyA6IGl0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyAnYmlnaW50JyA6ICdmbG9hdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbU1hcFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkTmFtZUJpbmRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGFnSW5wdXRdPVwidGV4dEFyZWEoKSA/ICd0ZXh0YXJlYScgOiAnaW5wdXQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uc3RIdG1sUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8geyBpc1JlcXVpcmVkOiB2YWxpZE9uZURlZmF1bHRNdWx0aUxhbmd1YWdlKCkgPT09IGtleSA/IHRydWUgOiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPD0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPiAxICYmIGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0udmFsaWRSZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udmFsaWRSZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVxdWlyZWQoKSB8fCB7IGlzUmVxdWlyZWQ6IGZhbHNlIH1cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFt1bml0c1JpZ2h0XT1cImN1cnJlbmN5VW5pdHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q291bnRdPVwiY291bnRDaGFyYWN0ZXJzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwidmFsaWRNYXhMZW5ndGgoKS5sZW5ndGggPyB2YWxpZE1heExlbmd0aCgpLmxlbmd0aCA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpeGVkRmxvYXRdPVwiaXRlbS50eXBlID09PSAnYmlnaW50JyA/IDQgOiAxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkTWluTGVuZ3RoXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpICYmIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSAhPT0ga2V5ICYmICFpdGVtTWFwKClba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgbGVuZ3RoOiB2YWxpZE1pbkxlbmd0aCgpPy5sZW5ndGggfHwgLTEsIG1lc3NhZ2U6ICdpMThuX21pbmltdW1fbGVuZ3RoX251bWJlcicsIGludGVycG9sYXRlUGFyYW1zOiB7IG51bWJlcjogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIH0gfVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkUGF0dGVybl09XCJ2YWxpZFBhdHRlcm4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctWzE2cHhdIHNocmluay0wXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaC1bMzJweF1dPVwiZGF0YSgpWzBdLnR5cGUgIT09ICdlZGl0b3InXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaC1bNDRweF1dPVwiZGF0YSgpWzBdLnR5cGUgPT09ICdlZGl0b3InXCI+XG4gICAgICAgICAgICAgICAgQGlmICgkaW5kZXggPiAwICYmIGRhdGEoKS5sZW5ndGggPT09IDEgJiYgIWlnbm9yZVJlbW92ZSgpICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1jdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgW2J1dHRvbkN1c3RvbV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnU3RlcENvbG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIzZhNzM4MycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2hvdmVyOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2FjdGl2ZTogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9kaXNhYmxlOiAnIzZhNzM4MycsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICByb290Q29sb3I6ICcjNmE3MzgzJyxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogMTIwNSB9IH1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyUmVtb3ZlTGFuZ3VhZ2UoJGV2ZW50LCBrZXkpXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmICgkaW5kZXggPT09IDAgJiYgb3B0aW9ucygpLmxlbmd0aCAhPT0gbGFuZ3VhZ2VEaXNwbGF5KCkubGVuZ3RoICYmIHZpZXdUeXBlKCkgIT09ICdpbnRlZ2VyJyAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiY2xhc3NJY29uQWRkTGFuZ3VhZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAnXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAodmlld0NvbnRlbnQoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtWzRweF1cIj5cbiAgICAgICAgICBAaWYgKCFzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlS2V5KClcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwia2V5IHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VEaXNwbGF5TGFuZ3VhZ2VQaXBlOiBvcHRpb25zKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCIoZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSB8fCBkYXRhTGFuZ3VhZ2VDaGFuZ2UoKVtrZXldID09PSAwID8gZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSArICcnIDogJycpIHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyB6SW5kZXg6IHpJbmRleCgpIH1cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKHZpZXdUeXBlKCkgPT09ICdpbnRlZ2VyJyAmJiAhdGhpcy5pZ25vcmVBZGQoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWFkZCdcIlxuICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oNm1pJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcHgtMCAhcHktWzJweF0nXCJcbiAgICAgIFtsYWJlbF09XCInaTE4bl9hZGRfbmV3J1wiXG4gICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZExhbmd1YWdlKCRldmVudClcIiAvPlxuICB9XG48L2Rpdj5cbiJdfQ==