@openmrs/ngx-formentry 19.0.1-pre.492 → 19.0.1-pre.497
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.
- package/components/input/label.component.d.ts +1 -1
- package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
- package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
- package/components/number-input/number-input.component.d.ts +1 -1
- package/components/select/select.component.d.ts +1 -1
- package/fesm2022/openmrs-ngx-formentry.mjs +364 -346
- package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
- package/form-entry/helpers/js-expression-helper.d.ts +1 -1
- package/package.json +10 -12
- package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
- package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
- package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
- package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
- package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
- package/esm2022/abstract-controls-extension/index.mjs +0 -5
- package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
- package/esm2022/change-tracking/control-relation.mjs +0 -42
- package/esm2022/change-tracking/control-relations.mjs +0 -32
- package/esm2022/components/afe-ng-select.component.mjs +0 -101
- package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
- package/esm2022/components/check-box/checkbox.component.mjs +0 -110
- package/esm2022/components/check-box/checkbox.module.mjs +0 -19
- package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
- package/esm2022/components/custom-component-wrapper/custom-component-wrapper.module.mjs +0 -22
- package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
- package/esm2022/components/custom-control-wrapper/custom-control-wrapper.module.mjs +0 -23
- package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
- package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
- package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
- package/esm2022/components/date-time-picker/index.mjs +0 -9
- package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
- package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
- package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
- package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
- package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
- package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
- package/esm2022/components/input/input.directive.mjs +0 -78
- package/esm2022/components/input/input.module.mjs +0 -23
- package/esm2022/components/input/label.component.mjs +0 -263
- package/esm2022/components/input/text-area.directive.mjs +0 -58
- package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
- package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
- package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
- package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
- package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
- package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
- package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
- package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
- package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
- package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
- package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
- package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
- package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
- package/esm2022/components/number-input/number-input.component.mjs +0 -254
- package/esm2022/components/number-input/number-input.module.mjs +0 -21
- package/esm2022/components/number-input/number.directive.mjs +0 -22
- package/esm2022/components/radio-button/radio.component.mjs +0 -98
- package/esm2022/components/radio-button/radio.module.mjs +0 -19
- package/esm2022/components/select/optgroup.directive.mjs +0 -19
- package/esm2022/components/select/option.directive.mjs +0 -19
- package/esm2022/components/select/select.component.mjs +0 -182
- package/esm2022/components/select/select.module.mjs +0 -23
- package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
- package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
- package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
- package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
- package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
- package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
- package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
- package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
- package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
- package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
- package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
- package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
- package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
- package/esm2022/form-entry/form-entry.module.mjs +0 -188
- package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
- package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
- package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
- package/esm2022/form-entry/form-factory/form.factory.mjs +0 -143
- package/esm2022/form-entry/form-factory/form.mjs +0 -190
- package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
- package/esm2022/form-entry/form-factory/index.mjs +0 -7
- package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
- package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
- package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
- package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
- package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
- package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
- package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -322
- package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
- package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
- package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
- package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
- package/esm2022/form-entry/question-models/date-question.mjs +0 -12
- package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
- package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
- package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
- package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
- package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
- package/esm2022/form-entry/question-models/group-question.mjs +0 -12
- package/esm2022/form-entry/question-models/index.mjs +0 -24
- package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
- package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
- package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
- package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/models.mjs +0 -13
- package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
- package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
- package/esm2022/form-entry/question-models/question-base.mjs +0 -26
- package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
- package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
- package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
- package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
- package/esm2022/form-entry/question-models/select-option.mjs +0 -7
- package/esm2022/form-entry/question-models/select-question.mjs +0 -12
- package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
- package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
- package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
- package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
- package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
- package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
- package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
- package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
- package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -262
- package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
- package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
- package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
- package/esm2022/form-entry/validators/date.validator.mjs +0 -18
- package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
- package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
- package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
- package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
- package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
- package/esm2022/form-entry/validators/max.validator.mjs +0 -21
- package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
- package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
- package/esm2022/form-entry/validators/min.validator.mjs +0 -21
- package/esm2022/form-entry/validators/required.validator.mjs +0 -11
- package/esm2022/form-entry/validators/validations.mjs +0 -5
- package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
- package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
- package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
- package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -541
- package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
- package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
- package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
- package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
- package/esm2022/lib/index.mjs +0 -59
- package/esm2022/openmrs-ngx-formentry.mjs +0 -5
- package/esm2022/public_api.mjs +0 -2
- package/esm2022/shared.module.mjs +0 -21
package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs
DELETED
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { CalendarCell, OwlCalendarBodyComponent } from './calendar-body.component';
|
|
3
|
-
import { DateTimeAdapter } from './adapter/date-time-adapter.class';
|
|
4
|
-
import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
|
|
5
|
-
import { Subscription } from 'rxjs';
|
|
6
|
-
import { DOWN_ARROW, END, ENTER, HOME, LEFT_ARROW, PAGE_DOWN, PAGE_UP, RIGHT_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
|
|
7
|
-
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "./adapter/date-time-adapter.class";
|
|
10
|
-
import * as i2 from "@angular/common";
|
|
11
|
-
import * as i3 from "./calendar-body.component";
|
|
12
|
-
const DAYS_PER_WEEK = 7;
|
|
13
|
-
const WEEKS_PER_VIEW = 6;
|
|
14
|
-
export class OwlMonthViewComponent {
|
|
15
|
-
get owlDTCalendarView() {
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
get firstDayOfWeek() {
|
|
19
|
-
return this._firstDayOfWeek;
|
|
20
|
-
}
|
|
21
|
-
set firstDayOfWeek(val) {
|
|
22
|
-
val = coerceNumberProperty(val);
|
|
23
|
-
if (val >= 0 && val <= 6 && val !== this._firstDayOfWeek) {
|
|
24
|
-
this._firstDayOfWeek = val;
|
|
25
|
-
if (this.initiated) {
|
|
26
|
-
this.generateWeekDays();
|
|
27
|
-
this.generateCalendar();
|
|
28
|
-
this.cdRef.markForCheck();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
get selectMode() {
|
|
33
|
-
return this._selectMode;
|
|
34
|
-
}
|
|
35
|
-
set selectMode(val) {
|
|
36
|
-
this._selectMode = val;
|
|
37
|
-
if (this.initiated) {
|
|
38
|
-
this.generateCalendar();
|
|
39
|
-
this.cdRef.markForCheck();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
get selected() {
|
|
43
|
-
return this._selected;
|
|
44
|
-
}
|
|
45
|
-
set selected(value) {
|
|
46
|
-
const oldSelected = this._selected;
|
|
47
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
48
|
-
this._selected = this.getValidDate(value);
|
|
49
|
-
if (!this.dateTimeAdapter.isSameDay(oldSelected, this._selected)) {
|
|
50
|
-
this.setSelectedDates();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
get selecteds() {
|
|
54
|
-
return this._selecteds;
|
|
55
|
-
}
|
|
56
|
-
set selecteds(values) {
|
|
57
|
-
this._selecteds = values.map((v) => {
|
|
58
|
-
v = this.dateTimeAdapter.deserialize(v);
|
|
59
|
-
return this.getValidDate(v);
|
|
60
|
-
});
|
|
61
|
-
this.setSelectedDates();
|
|
62
|
-
}
|
|
63
|
-
get pickerMoment() {
|
|
64
|
-
return this._pickerMoment;
|
|
65
|
-
}
|
|
66
|
-
set pickerMoment(value) {
|
|
67
|
-
const oldMoment = this._pickerMoment;
|
|
68
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
69
|
-
this._pickerMoment = this.getValidDate(value) || this.dateTimeAdapter.now();
|
|
70
|
-
this.firstDateOfMonth = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this._pickerMoment), this.dateTimeAdapter.getMonth(this._pickerMoment), 1);
|
|
71
|
-
if (!this.isSameMonth(oldMoment, this._pickerMoment) && this.initiated) {
|
|
72
|
-
this.generateCalendar();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
get dateFilter() {
|
|
76
|
-
return this._dateFilter;
|
|
77
|
-
}
|
|
78
|
-
set dateFilter(filter) {
|
|
79
|
-
this._dateFilter = filter;
|
|
80
|
-
if (this.initiated) {
|
|
81
|
-
this.generateCalendar();
|
|
82
|
-
this.cdRef.markForCheck();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
get minDate() {
|
|
86
|
-
return this._minDate;
|
|
87
|
-
}
|
|
88
|
-
set minDate(value) {
|
|
89
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
90
|
-
this._minDate = this.getValidDate(value);
|
|
91
|
-
if (this.initiated) {
|
|
92
|
-
this.generateCalendar();
|
|
93
|
-
this.cdRef.markForCheck();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
get maxDate() {
|
|
97
|
-
return this._maxDate;
|
|
98
|
-
}
|
|
99
|
-
set maxDate(value) {
|
|
100
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
101
|
-
this._maxDate = this.getValidDate(value);
|
|
102
|
-
if (this.initiated) {
|
|
103
|
-
this.generateCalendar();
|
|
104
|
-
this.cdRef.markForCheck();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
get weekdays() {
|
|
108
|
-
return this._weekdays;
|
|
109
|
-
}
|
|
110
|
-
get days() {
|
|
111
|
-
return this._days;
|
|
112
|
-
}
|
|
113
|
-
get activeCell() {
|
|
114
|
-
if (this.pickerMoment) {
|
|
115
|
-
return (this.dateTimeAdapter.getDate(this.pickerMoment) +
|
|
116
|
-
this.firstRowOffset -
|
|
117
|
-
1);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
get isInSingleMode() {
|
|
121
|
-
return this.selectMode === 'single';
|
|
122
|
-
}
|
|
123
|
-
get isInRangeMode() {
|
|
124
|
-
return (this.selectMode === 'range' ||
|
|
125
|
-
this.selectMode === 'rangeFrom' ||
|
|
126
|
-
this.selectMode === 'rangeTo');
|
|
127
|
-
}
|
|
128
|
-
constructor(cdRef, dateTimeAdapter, dateTimeFormats) {
|
|
129
|
-
this.cdRef = cdRef;
|
|
130
|
-
this.dateTimeAdapter = dateTimeAdapter;
|
|
131
|
-
this.dateTimeFormats = dateTimeFormats;
|
|
132
|
-
/**
|
|
133
|
-
* Whether to hide dates in other months at the start or end of the current month.
|
|
134
|
-
* */
|
|
135
|
-
this.hideOtherMonths = false;
|
|
136
|
-
/**
|
|
137
|
-
* Define the first day of a week
|
|
138
|
-
* Sunday: 0 ~ Saturday: 6
|
|
139
|
-
* */
|
|
140
|
-
this._firstDayOfWeek = 0;
|
|
141
|
-
/**
|
|
142
|
-
* The select mode of the picker;
|
|
143
|
-
* */
|
|
144
|
-
this._selectMode = 'single';
|
|
145
|
-
this._selecteds = [];
|
|
146
|
-
this.localeSub = Subscription.EMPTY;
|
|
147
|
-
this.initiated = false;
|
|
148
|
-
/**
|
|
149
|
-
* An array to hold all selectedDates' value
|
|
150
|
-
* the value is the day number in current month
|
|
151
|
-
* */
|
|
152
|
-
this.selectedDates = [];
|
|
153
|
-
/**
|
|
154
|
-
* Callback to invoke when a new date is selected
|
|
155
|
-
* */
|
|
156
|
-
this.selectedChange = new EventEmitter();
|
|
157
|
-
/**
|
|
158
|
-
* Callback to invoke when any date is selected.
|
|
159
|
-
* */
|
|
160
|
-
this.userSelection = new EventEmitter();
|
|
161
|
-
/** Emits when any date is activated. */
|
|
162
|
-
this.pickerMomentChange = new EventEmitter();
|
|
163
|
-
}
|
|
164
|
-
ngOnInit() {
|
|
165
|
-
this.generateWeekDays();
|
|
166
|
-
this.localeSub = this.dateTimeAdapter.localeChanges.subscribe(() => {
|
|
167
|
-
this.generateWeekDays();
|
|
168
|
-
this.generateCalendar();
|
|
169
|
-
this.cdRef.markForCheck();
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
ngAfterContentInit() {
|
|
173
|
-
this.generateCalendar();
|
|
174
|
-
this.initiated = true;
|
|
175
|
-
}
|
|
176
|
-
ngOnDestroy() {
|
|
177
|
-
this.localeSub.unsubscribe();
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Handle a calendarCell selected
|
|
181
|
-
*/
|
|
182
|
-
selectCalendarCell(cell) {
|
|
183
|
-
// Cases in which the date would not be selected
|
|
184
|
-
// 1, the calendar cell is NOT enabled (is NOT valid)
|
|
185
|
-
// 2, the selected date is NOT in current picker's month and the hideOtherMonths is enabled
|
|
186
|
-
if (!cell.enabled || (this.hideOtherMonths && cell.out)) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
this.selectDate(cell.value);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Handle a new date selected
|
|
193
|
-
*/
|
|
194
|
-
selectDate(date) {
|
|
195
|
-
const daysDiff = date - 1;
|
|
196
|
-
const selected = this.dateTimeAdapter.addCalendarDays(this.firstDateOfMonth, daysDiff);
|
|
197
|
-
this.selectedChange.emit(selected);
|
|
198
|
-
this.userSelection.emit();
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Handle keydown event on calendar body
|
|
202
|
-
*/
|
|
203
|
-
handleCalendarKeydown(event) {
|
|
204
|
-
let moment;
|
|
205
|
-
switch (event.keyCode) {
|
|
206
|
-
// minus 1 day
|
|
207
|
-
case LEFT_ARROW:
|
|
208
|
-
moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, -1);
|
|
209
|
-
this.pickerMomentChange.emit(moment);
|
|
210
|
-
break;
|
|
211
|
-
// add 1 day
|
|
212
|
-
case RIGHT_ARROW:
|
|
213
|
-
moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, 1);
|
|
214
|
-
this.pickerMomentChange.emit(moment);
|
|
215
|
-
break;
|
|
216
|
-
// minus 1 week
|
|
217
|
-
case UP_ARROW:
|
|
218
|
-
moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, -7);
|
|
219
|
-
this.pickerMomentChange.emit(moment);
|
|
220
|
-
break;
|
|
221
|
-
// add 1 week
|
|
222
|
-
case DOWN_ARROW:
|
|
223
|
-
moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, 7);
|
|
224
|
-
this.pickerMomentChange.emit(moment);
|
|
225
|
-
break;
|
|
226
|
-
// move to first day of current month
|
|
227
|
-
case HOME:
|
|
228
|
-
moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, 1 - this.dateTimeAdapter.getDate(this.pickerMoment));
|
|
229
|
-
this.pickerMomentChange.emit(moment);
|
|
230
|
-
break;
|
|
231
|
-
// move to last day of current month
|
|
232
|
-
case END:
|
|
233
|
-
moment = this.dateTimeAdapter.addCalendarDays(this.pickerMoment, this.dateTimeAdapter.getNumDaysInMonth(this.pickerMoment) -
|
|
234
|
-
this.dateTimeAdapter.getDate(this.pickerMoment));
|
|
235
|
-
this.pickerMomentChange.emit(moment);
|
|
236
|
-
break;
|
|
237
|
-
// minus 1 month (or 1 year)
|
|
238
|
-
case PAGE_UP:
|
|
239
|
-
moment = event.altKey
|
|
240
|
-
? this.dateTimeAdapter.addCalendarYears(this.pickerMoment, -1)
|
|
241
|
-
: this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, -1);
|
|
242
|
-
this.pickerMomentChange.emit(moment);
|
|
243
|
-
break;
|
|
244
|
-
// add 1 month (or 1 year)
|
|
245
|
-
case PAGE_DOWN:
|
|
246
|
-
moment = event.altKey
|
|
247
|
-
? this.dateTimeAdapter.addCalendarYears(this.pickerMoment, 1)
|
|
248
|
-
: this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, 1);
|
|
249
|
-
this.pickerMomentChange.emit(moment);
|
|
250
|
-
break;
|
|
251
|
-
// select the pickerMoment
|
|
252
|
-
case ENTER:
|
|
253
|
-
if (!this.dateFilter || this.dateFilter(this.pickerMoment)) {
|
|
254
|
-
this.selectDate(this.dateTimeAdapter.getDate(this.pickerMoment));
|
|
255
|
-
}
|
|
256
|
-
break;
|
|
257
|
-
default:
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
this.focusActiveCell();
|
|
261
|
-
event.preventDefault();
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Generate the calendar weekdays array
|
|
265
|
-
* */
|
|
266
|
-
generateWeekDays() {
|
|
267
|
-
const longWeekdays = this.dateTimeAdapter.getDayOfWeekNames('long');
|
|
268
|
-
const shortWeekdays = this.dateTimeAdapter.getDayOfWeekNames('short');
|
|
269
|
-
const narrowWeekdays = this.dateTimeAdapter.getDayOfWeekNames('narrow');
|
|
270
|
-
const firstDayOfWeek = this.firstDayOfWeek;
|
|
271
|
-
const weekdays = longWeekdays.map((long, i) => {
|
|
272
|
-
return { long, short: shortWeekdays[i], narrow: narrowWeekdays[i] };
|
|
273
|
-
});
|
|
274
|
-
this._weekdays = weekdays
|
|
275
|
-
.slice(firstDayOfWeek)
|
|
276
|
-
.concat(weekdays.slice(0, firstDayOfWeek));
|
|
277
|
-
this.dateNames = this.dateTimeAdapter.getDateNames();
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Generate the calendar days array
|
|
282
|
-
* */
|
|
283
|
-
generateCalendar() {
|
|
284
|
-
if (!this.pickerMoment) {
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
this.todayDate = null;
|
|
288
|
-
// the first weekday of the month
|
|
289
|
-
const startWeekdayOfMonth = this.dateTimeAdapter.getDay(this.firstDateOfMonth);
|
|
290
|
-
const firstDayOfWeek = this.firstDayOfWeek;
|
|
291
|
-
// the amount of days from the first date of the month
|
|
292
|
-
// if it is < 0, it means the date is in previous month
|
|
293
|
-
let daysDiff = 0 -
|
|
294
|
-
((startWeekdayOfMonth + (DAYS_PER_WEEK - firstDayOfWeek)) %
|
|
295
|
-
DAYS_PER_WEEK);
|
|
296
|
-
// the index of cell that contains the first date of the month
|
|
297
|
-
this.firstRowOffset = Math.abs(daysDiff);
|
|
298
|
-
this._days = [];
|
|
299
|
-
for (let i = 0; i < WEEKS_PER_VIEW; i++) {
|
|
300
|
-
const week = [];
|
|
301
|
-
for (let j = 0; j < DAYS_PER_WEEK; j++) {
|
|
302
|
-
const date = this.dateTimeAdapter.addCalendarDays(this.firstDateOfMonth, daysDiff);
|
|
303
|
-
const dateCell = this.createDateCell(date, daysDiff);
|
|
304
|
-
// check if the date is today
|
|
305
|
-
if (this.dateTimeAdapter.isSameDay(this.dateTimeAdapter.now(), date)) {
|
|
306
|
-
this.todayDate = daysDiff + 1;
|
|
307
|
-
}
|
|
308
|
-
week.push(dateCell);
|
|
309
|
-
daysDiff += 1;
|
|
310
|
-
}
|
|
311
|
-
this._days.push(week);
|
|
312
|
-
}
|
|
313
|
-
this.setSelectedDates();
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Creates CalendarCell for days.
|
|
317
|
-
*/
|
|
318
|
-
createDateCell(date, daysDiff) {
|
|
319
|
-
// total days of the month
|
|
320
|
-
const daysInMonth = this.dateTimeAdapter.getNumDaysInMonth(this.pickerMoment);
|
|
321
|
-
const dateNum = this.dateTimeAdapter.getDate(date);
|
|
322
|
-
// const dateName = this.dateNames[dateNum - 1];
|
|
323
|
-
const dateName = dateNum.toString();
|
|
324
|
-
const ariaLabel = this.dateTimeAdapter.format(date, this.dateTimeFormats.dateA11yLabel);
|
|
325
|
-
// check if the date if selectable
|
|
326
|
-
const enabled = this.isDateEnabled(date);
|
|
327
|
-
// check if date is not in current month
|
|
328
|
-
const dayValue = daysDiff + 1;
|
|
329
|
-
const out = dayValue < 1 || dayValue > daysInMonth;
|
|
330
|
-
const cellClass = 'owl-dt-day-' + this.dateTimeAdapter.getDay(date);
|
|
331
|
-
return new CalendarCell(dayValue, dateName, ariaLabel, enabled, out, cellClass);
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Check if the date is valid
|
|
335
|
-
*/
|
|
336
|
-
isDateEnabled(date) {
|
|
337
|
-
return (!!date &&
|
|
338
|
-
(!this.dateFilter || this.dateFilter(date)) &&
|
|
339
|
-
(!this.minDate ||
|
|
340
|
-
this.dateTimeAdapter.compare(date, this.minDate) >= 0) &&
|
|
341
|
-
(!this.maxDate || this.dateTimeAdapter.compare(date, this.maxDate) <= 0));
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Get a valid date object
|
|
345
|
-
*/
|
|
346
|
-
getValidDate(obj) {
|
|
347
|
-
return this.dateTimeAdapter.isDateInstance(obj) &&
|
|
348
|
-
this.dateTimeAdapter.isValid(obj)
|
|
349
|
-
? obj
|
|
350
|
-
: null;
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Check if the give dates are none-null and in the same month
|
|
354
|
-
*/
|
|
355
|
-
isSameMonth(dateLeft, dateRight) {
|
|
356
|
-
return !!(dateLeft &&
|
|
357
|
-
dateRight &&
|
|
358
|
-
this.dateTimeAdapter.isValid(dateLeft) &&
|
|
359
|
-
this.dateTimeAdapter.isValid(dateRight) &&
|
|
360
|
-
this.dateTimeAdapter.getYear(dateLeft) ===
|
|
361
|
-
this.dateTimeAdapter.getYear(dateRight) &&
|
|
362
|
-
this.dateTimeAdapter.getMonth(dateLeft) ===
|
|
363
|
-
this.dateTimeAdapter.getMonth(dateRight));
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Set the selectedDates value.
|
|
367
|
-
* In single mode, it has only one value which represent the selected date
|
|
368
|
-
* In range mode, it would has two values, one for the fromValue and the other for the toValue
|
|
369
|
-
* */
|
|
370
|
-
setSelectedDates() {
|
|
371
|
-
this.selectedDates = [];
|
|
372
|
-
if (!this.firstDateOfMonth) {
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
if (this.isInSingleMode && this.selected) {
|
|
376
|
-
const dayDiff = this.dateTimeAdapter.differenceInCalendarDays(this.selected, this.firstDateOfMonth);
|
|
377
|
-
this.selectedDates[0] = dayDiff + 1;
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
if (this.isInRangeMode && this.selecteds) {
|
|
381
|
-
this.selectedDates = this.selecteds.map((selected) => {
|
|
382
|
-
if (this.dateTimeAdapter.isValid(selected)) {
|
|
383
|
-
const dayDiff = this.dateTimeAdapter.differenceInCalendarDays(selected, this.firstDateOfMonth);
|
|
384
|
-
return dayDiff + 1;
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
return null;
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
focusActiveCell() {
|
|
393
|
-
this.calendarBodyElm.focusActiveCell();
|
|
394
|
-
}
|
|
395
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OwlMonthViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeAdapter, optional: true }, { token: OWL_DATE_TIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
396
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: OwlMonthViewComponent, selector: "ofe-owl-date-time-month-view", inputs: { hideOtherMonths: "hideOtherMonths", firstDayOfWeek: "firstDayOfWeek", selectMode: "selectMode", selected: "selected", selecteds: "selecteds", pickerMoment: "pickerMoment", dateFilter: "dateFilter", minDate: "minDate", maxDate: "maxDate" }, outputs: { selectedChange: "selectedChange", userSelection: "userSelection", pickerMomentChange: "pickerMomentChange" }, host: { properties: { "class.owl-dt-calendar-view": "this.owlDTCalendarView" } }, viewQueries: [{ propertyName: "calendarBodyElm", first: true, predicate: OwlCalendarBodyComponent, descendants: true, static: true }], exportAs: ["owlYearView"], ngImport: i0, template: "<table\n class=\"owl-dt-calendar-table owl-dt-calendar-month-table\"\n [class.owl-dt-calendar-only-current-month]=\"hideOtherMonths\"\n>\n <thead class=\"owl-dt-calendar-header\">\n <tr class=\"owl-dt-weekdays\">\n <th\n *ngFor=\"let weekday of weekdays\"\n [attr.aria-label]=\"weekday.long\"\n class=\"owl-dt-weekday\"\n scope=\"col\"\n >\n <span>{{ weekday.short }}</span>\n </th>\n </tr>\n <tr>\n <th\n class=\"owl-dt-calendar-table-divider\"\n aria-hidden=\"true\"\n colspan=\"7\"\n ></th>\n </tr>\n </thead>\n <tbody\n ofe-owl-date-time-calendar-body\n role=\"grid\"\n [rows]=\"days\"\n [todayValue]=\"todayDate\"\n [selectedValues]=\"selectedDates\"\n [selectMode]=\"selectMode\"\n [activeCell]=\"activeCell\"\n (keydown)=\"handleCalendarKeydown($event)\"\n (cellSelected)=\"selectCalendarCell($event)\"\n ></tbody>\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.OwlCalendarBodyComponent, selector: "[ofe-owl-date-time-calendar-body]", inputs: ["activeCell", "rows", "numCols", "cellRatio", "todayValue", "selectedValues", "selectMode"], outputs: ["cellSelected"], exportAs: ["owlDateTimeCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
397
|
-
}
|
|
398
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OwlMonthViewComponent, decorators: [{
|
|
399
|
-
type: Component,
|
|
400
|
-
args: [{ selector: 'ofe-owl-date-time-month-view', exportAs: 'owlYearView', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table\n class=\"owl-dt-calendar-table owl-dt-calendar-month-table\"\n [class.owl-dt-calendar-only-current-month]=\"hideOtherMonths\"\n>\n <thead class=\"owl-dt-calendar-header\">\n <tr class=\"owl-dt-weekdays\">\n <th\n *ngFor=\"let weekday of weekdays\"\n [attr.aria-label]=\"weekday.long\"\n class=\"owl-dt-weekday\"\n scope=\"col\"\n >\n <span>{{ weekday.short }}</span>\n </th>\n </tr>\n <tr>\n <th\n class=\"owl-dt-calendar-table-divider\"\n aria-hidden=\"true\"\n colspan=\"7\"\n ></th>\n </tr>\n </thead>\n <tbody\n ofe-owl-date-time-calendar-body\n role=\"grid\"\n [rows]=\"days\"\n [todayValue]=\"todayDate\"\n [selectedValues]=\"selectedDates\"\n [selectMode]=\"selectMode\"\n [activeCell]=\"activeCell\"\n (keydown)=\"handleCalendarKeydown($event)\"\n (cellSelected)=\"selectCalendarCell($event)\"\n ></tbody>\n</table>\n" }]
|
|
401
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter, decorators: [{
|
|
402
|
-
type: Optional
|
|
403
|
-
}] }, { type: undefined, decorators: [{
|
|
404
|
-
type: Optional
|
|
405
|
-
}, {
|
|
406
|
-
type: Inject,
|
|
407
|
-
args: [OWL_DATE_TIME_FORMATS]
|
|
408
|
-
}] }], propDecorators: { owlDTCalendarView: [{
|
|
409
|
-
type: HostBinding,
|
|
410
|
-
args: ['class.owl-dt-calendar-view']
|
|
411
|
-
}], hideOtherMonths: [{
|
|
412
|
-
type: Input
|
|
413
|
-
}], firstDayOfWeek: [{
|
|
414
|
-
type: Input
|
|
415
|
-
}], selectMode: [{
|
|
416
|
-
type: Input
|
|
417
|
-
}], selected: [{
|
|
418
|
-
type: Input
|
|
419
|
-
}], selecteds: [{
|
|
420
|
-
type: Input
|
|
421
|
-
}], pickerMoment: [{
|
|
422
|
-
type: Input
|
|
423
|
-
}], dateFilter: [{
|
|
424
|
-
type: Input
|
|
425
|
-
}], minDate: [{
|
|
426
|
-
type: Input
|
|
427
|
-
}], maxDate: [{
|
|
428
|
-
type: Input
|
|
429
|
-
}], selectedChange: [{
|
|
430
|
-
type: Output
|
|
431
|
-
}], userSelection: [{
|
|
432
|
-
type: Output
|
|
433
|
-
}], pickerMomentChange: [{
|
|
434
|
-
type: Output
|
|
435
|
-
}], calendarBodyElm: [{
|
|
436
|
-
type: ViewChild,
|
|
437
|
-
args: [OwlCalendarBodyComponent, { static: true }]
|
|
438
|
-
}] } });
|
|
439
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9jb21wb25lbnRzL25neC1waWNrLWRhdGV0aW1lL2xpYi9kYXRlLXRpbWUvY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9jb21wb25lbnRzL25neC1waWNrLWRhdGV0aW1lL2xpYi9kYXRlLXRpbWUvY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osd0JBQXdCLEVBQ3pCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxxQkFBcUIsRUFFdEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLEVBQ0osVUFBVSxFQUNWLFNBQVMsRUFDVCxPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsRUFDVCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7OztBQUU3RCxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIsTUFBTSxjQUFj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Q0F2T2dCLGlCQUFpQjtzQkFBL0QsV0FBVzt1QkFBQyw0QkFBNEI7Z0JBUXpDLGVBQWU7c0JBRGQsS0FBSztnQkFTRixjQUFjO3NCQURqQixLQUFLO2dCQXVCRixVQUFVO3NCQURiLEtBQUs7Z0JBZ0JGLFFBQVE7c0JBRFgsS0FBSztnQkFpQkYsU0FBUztzQkFEWixLQUFLO2dCQWVGLFlBQVk7c0JBRGYsS0FBSztnQkEwQkYsVUFBVTtzQkFEYixLQUFLO2dCQWdCRixPQUFPO3NCQURWLEtBQUs7Z0JBaUJGLE9BQU87c0JBRFYsS0FBSztnQkF5RUcsY0FBYztzQkFEdEIsTUFBTTtnQkFPRSxhQUFhO3NCQURyQixNQUFNO2dCQUtFLGtCQUFrQjtzQkFEMUIsTUFBTTtnQkFLUCxlQUFlO3NCQURkLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDYWxlbmRhckNlbGwsXG4gIE93bENhbGVuZGFyQm9keUNvbXBvbmVudFxufSBmcm9tICcuL2NhbGVuZGFyLWJvZHkuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlci9kYXRlLXRpbWUtYWRhcHRlci5jbGFzcyc7XG5pbXBvcnQge1xuICBPV0xfREFURV9USU1FX0ZPUk1BVFMsXG4gIE93bERhdGVUaW1lRm9ybWF0c1xufSBmcm9tICcuL2FkYXB0ZXIvZGF0ZS10aW1lLWZvcm1hdC5jbGFzcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNlbGVjdE1vZGUgfSBmcm9tICcuL2RhdGUtdGltZS5jbGFzcyc7XG5pbXBvcnQge1xuICBET1dOX0FSUk9XLFxuICBFTkQsXG4gIEVOVEVSLFxuICBIT01FLFxuICBMRUZUX0FSUk9XLFxuICBQQUdFX0RPV04sXG4gIFBBR0VfVVAsXG4gIFJJR0hUX0FSUk9XLFxuICBVUF9BUlJPV1xufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuXG5jb25zdCBEQVlTX1BFUl9XRUVLID0gNztcbmNvbnN0IFdFRUtTX1BFUl9WSUVXID0gNjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2ZlLW93bC1kYXRlLXRpbWUtbW9udGgtdmlldycsXG4gIGV4cG9ydEFzOiAnb3dsWWVhclZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgT3dsTW9udGhWaWV3Q29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLm93bC1kdC1jYWxlbmRhci12aWV3JykgZ2V0IG93bERUQ2FsZW5kYXJWaWV3KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGlkZSBkYXRlcyBpbiBvdGhlciBtb250aHMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgY3VycmVudCBtb250aC5cbiAgICogKi9cbiAgQElucHV0KClcbiAgaGlkZU90aGVyTW9udGhzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgZmlyc3QgZGF5IG9mIGEgd2Vla1xuICAgKiBTdW5kYXk6IDAgfiBTYXR1cmRheTogNlxuICAgKiAqL1xuICBwcml2YXRlIF9maXJzdERheU9mV2VlayA9IDA7XG4gIEBJbnB1dCgpXG4gIGdldCBmaXJzdERheU9mV2VlaygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maXJzdERheU9mV2VlaztcbiAgfVxuXG4gIHNldCBmaXJzdERheU9mV2Vlayh2YWw6IG51bWJlcikge1xuICAgIHZhbCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbCk7XG4gICAgaWYgKHZhbCA+PSAwICYmIHZhbCA8PSA2ICYmIHZhbCAhPT0gdGhpcy5fZmlyc3REYXlPZldlZWspIHtcbiAgICAgIHRoaXMuX2ZpcnN0RGF5T2ZXZWVrID0gdmFsO1xuXG4gICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVdlZWtEYXlzKCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0IG1vZGUgb2YgdGhlIHBpY2tlcjtcbiAgICogKi9cbiAgcHJpdmF0ZSBfc2VsZWN0TW9kZTogU2VsZWN0TW9kZSA9ICdzaW5nbGUnO1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0TW9kZSgpOiBTZWxlY3RNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZTtcbiAgfVxuXG4gIHNldCBzZWxlY3RNb2RlKHZhbDogU2VsZWN0TW9kZSkge1xuICAgIHRoaXMuX3NlbGVjdE1vZGUgPSB2YWw7XG4gICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IFQgfCBudWxsO1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWQoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICBjb25zdCBvbGRTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGVkO1xuICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpO1xuXG4gICAgaWYgKCF0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1NhbWVEYXkob2xkU2VsZWN0ZWQsIHRoaXMuX3NlbGVjdGVkKSkge1xuICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRzOiBUW10gPSBbXTtcbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGVkcygpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZHM7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWRzKHZhbHVlczogVFtdKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRzID0gdmFsdWVzLm1hcCgodikgPT4ge1xuICAgICAgdiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHYpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsaWREYXRlKHYpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGlja2VyTW9tZW50OiBUO1xuICBASW5wdXQoKVxuICBnZXQgcGlja2VyTW9tZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9waWNrZXJNb21lbnQ7XG4gIH1cblxuICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUKSB7XG4gICAgY29uc3Qgb2xkTW9tZW50ID0gdGhpcy5fcGlja2VyTW9tZW50O1xuICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgIHRoaXMuX3BpY2tlck1vbWVudCA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKSB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKTtcblxuICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuX3BpY2tlck1vbWVudCksXG4gICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLl9waWNrZXJNb21lbnQpLFxuICAgICAgMVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuaXNTYW1lTW9udGgob2xkTW9tZW50LCB0aGlzLl9waWNrZXJNb21lbnQpICYmIHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZVxuICAgKiAqL1xuICBwcml2YXRlIF9kYXRlRmlsdGVyOiAoZGF0ZTogVCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KClcbiAgZ2V0IGRhdGVGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVGaWx0ZXI7XG4gIH1cblxuICBzZXQgZGF0ZUZpbHRlcihmaWx0ZXI6IChkYXRlOiBUKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGF0ZUZpbHRlciA9IGZpbHRlcjtcbiAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xuICBwcml2YXRlIF9taW5EYXRlOiBUIHwgbnVsbDtcbiAgQElucHV0KClcbiAgZ2V0IG1pbkRhdGUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICB9XG5cbiAgc2V0IG1pbkRhdGUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKTtcbiAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xuICBwcml2YXRlIF9tYXhEYXRlOiBUIHwgbnVsbDtcbiAgQElucHV0KClcbiAgZ2V0IG1heERhdGUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICB9XG5cbiAgc2V0IG1heERhdGUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKTtcblxuICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3dlZWtkYXlzOiBBcnJheTx7IGxvbmc6IHN0cmluZzsgc2hvcnQ6IHN0cmluZzsgbmFycm93OiBzdHJpbmcgfT47XG4gIGdldCB3ZWVrZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5fd2Vla2RheXM7XG4gIH1cblxuICBwcml2YXRlIF9kYXlzOiBDYWxlbmRhckNlbGxbXVtdO1xuICBnZXQgZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF5cztcbiAgfVxuXG4gIGdldCBhY3RpdmVDZWxsKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMucGlja2VyTW9tZW50KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXRlKHRoaXMucGlja2VyTW9tZW50KSArXG4gICAgICAgIHRoaXMuZmlyc3RSb3dPZmZzZXQgLVxuICAgICAgICAxXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJztcbiAgfVxuXG4gIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZScgfHxcbiAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScgfHxcbiAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlyc3REYXRlT2ZNb250aDogVDtcblxuICBwcml2YXRlIGxvY2FsZVN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIHByaXZhdGUgaW5pdGlhdGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkYXRlTmFtZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBvZiB0aGUgbW9udGggdGhhdCB0b2RheSBmYWxscyBvbi5cbiAgICogKi9cbiAgcHVibGljIHRvZGF5RGF0ZTogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYXJyYXkgdG8gaG9sZCBhbGwgc2VsZWN0ZWREYXRlcycgdmFsdWVcbiAgICogdGhlIHZhbHVlIGlzIHRoZSBkYXkgbnVtYmVyIGluIGN1cnJlbnQgbW9udGhcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdGVkRGF0ZXM6IG51bWJlcltdID0gW107XG5cbiAgLy8gdGhlIGluZGV4IG9mIGNlbGwgdGhhdCBjb250YWlucyB0aGUgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGhcbiAgcHVibGljIGZpcnN0Um93T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWRcbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUIHwgbnVsbD4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYW55IGRhdGUgaXMgc2VsZWN0ZWQuXG4gICAqICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSB1c2VyU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFueSBkYXRlIGlzIGFjdGl2YXRlZC4gKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHBpY2tlck1vbWVudENoYW5nZTogRXZlbnRFbWl0dGVyPFQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKiBUaGUgYm9keSBvZiBjYWxlbmRhciB0YWJsZSAqL1xuICBAVmlld0NoaWxkKE93bENhbGVuZGFyQm9keUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgY2FsZW5kYXJCb2R5RWxtOiBPd2xDYWxlbmRhckJvZHlDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoT1dMX0RBVEVfVElNRV9GT1JNQVRTKVxuICAgIHByaXZhdGUgZGF0ZVRpbWVGb3JtYXRzOiBPd2xEYXRlVGltZUZvcm1hdHNcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdlbmVyYXRlV2Vla0RheXMoKTtcblxuICAgIHRoaXMubG9jYWxlU3ViID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5nZW5lcmF0ZVdlZWtEYXlzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsZVN1Yi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGNhbGVuZGFyQ2VsbCBzZWxlY3RlZFxuICAgKi9cbiAgcHVibGljIHNlbGVjdENhbGVuZGFyQ2VsbChjZWxsOiBDYWxlbmRhckNlbGwpOiB2b2lkIHtcbiAgICAvLyBDYXNlcyBpbiB3aGljaCB0aGUgZGF0ZSB3b3VsZCBub3QgYmUgc2VsZWN0ZWRcbiAgICAvLyAxLCB0aGUgY2FsZW5kYXIgY2VsbCBpcyBOT1QgZW5hYmxlZCAoaXMgTk9UIHZhbGlkKVxuICAgIC8vIDIsIHRoZSBzZWxlY3RlZCBkYXRlIGlzIE5PVCBpbiBjdXJyZW50IHBpY2tlcidzIG1vbnRoIGFuZCB0aGUgaGlkZU90aGVyTW9udGhzIGlzIGVuYWJsZWRcbiAgICBpZiAoIWNlbGwuZW5hYmxlZCB8fCAodGhpcy5oaWRlT3RoZXJNb250aHMgJiYgY2VsbC5vdXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3REYXRlKGNlbGwudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIG5ldyBkYXRlIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdERhdGUoZGF0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZGF5c0RpZmYgPSBkYXRlIC0gMTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcbiAgICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aCxcbiAgICAgIGRheXNEaWZmXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZCk7XG4gICAgdGhpcy51c2VyU2VsZWN0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUga2V5ZG93biBldmVudCBvbiBjYWxlbmRhciBib2R5XG4gICAqL1xuICBwdWJsaWMgaGFuZGxlQ2FsZW5kYXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IG1vbWVudDtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIC8vIG1pbnVzIDEgZGF5XG4gICAgICBjYXNlIExFRlRfQVJST1c6XG4gICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLnBpY2tlck1vbWVudCwgLTEpO1xuICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvLyBhZGQgMSBkYXlcbiAgICAgIGNhc2UgUklHSFRfQVJST1c6XG4gICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLnBpY2tlck1vbWVudCwgMSk7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIG1pbnVzIDEgd2Vla1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMucGlja2VyTW9tZW50LCAtNyk7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIGFkZCAxIHdlZWtcbiAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMucGlja2VyTW9tZW50LCA3KTtcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gbW92ZSB0byBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxuICAgICAgY2FzZSBIT01FOlxuICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXG4gICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXG4gICAgICAgICAgMSAtIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUodGhpcy5waWNrZXJNb21lbnQpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIG1vdmUgdG8gbGFzdCBkYXkgb2YgY3VycmVudCBtb250aFxuICAgICAgY2FzZSBFTkQ6XG4gICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcbiAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aCh0aGlzLnBpY2tlck1vbWVudCkgLVxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnBpY2tlck1vbWVudClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gbWludXMgMSBtb250aCAob3IgMSB5ZWFyKVxuICAgICAgY2FzZSBQQUdFX1VQOlxuICAgICAgICBtb21lbnQgPSBldmVudC5hbHRLZXlcbiAgICAgICAgICA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5waWNrZXJNb21lbnQsIC0xKVxuICAgICAgICAgIDogdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5waWNrZXJNb21lbnQsIC0xKTtcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gYWRkIDEgbW9udGggKG9yIDEgeWVhcilcbiAgICAgIGNhc2UgUEFHRV9ET1dOOlxuICAgICAgICBtb21lbnQgPSBldmVudC5hbHRLZXlcbiAgICAgICAgICA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5waWNrZXJNb21lbnQsIDEpXG4gICAgICAgICAgOiB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLnBpY2tlck1vbWVudCwgMSk7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIHNlbGVjdCB0aGUgcGlja2VyTW9tZW50XG4gICAgICBjYXNlIEVOVEVSOlxuICAgICAgICBpZiAoIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIodGhpcy5waWNrZXJNb21lbnQpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUodGhpcy5waWNrZXJNb21lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzQWN0aXZlQ2VsbCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGNhbGVuZGFyIHdlZWtkYXlzIGFycmF5XG4gICAqICovXG4gIHByaXZhdGUgZ2VuZXJhdGVXZWVrRGF5cygpOiB2b2lkIHtcbiAgICBjb25zdCBsb25nV2Vla2RheXMgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpO1xuICAgIGNvbnN0IHNob3J0V2Vla2RheXMgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnc2hvcnQnKTtcbiAgICBjb25zdCBuYXJyb3dXZWVrZGF5cyA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCduYXJyb3cnKTtcbiAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuZmlyc3REYXlPZldlZWs7XG5cbiAgICBjb25zdCB3ZWVrZGF5cyA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmcsIGkpID0+IHtcbiAgICAgIHJldHVybiB7IGxvbmcsIHNob3J0OiBzaG9ydFdlZWtkYXlzW2ldLCBuYXJyb3c6IG5hcnJvd1dlZWtkYXlzW2ldIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLl93ZWVrZGF5cyA9IHdlZWtkYXlzXG4gICAgICAuc2xpY2UoZmlyc3REYXlPZldlZWspXG4gICAgICAuY29uY2F0KHdlZWtkYXlzLnNsaWNlKDAsIGZpcnN0RGF5T2ZXZWVrKSk7XG5cbiAgICB0aGlzLmRhdGVOYW1lcyA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERhdGVOYW1lcygpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRoZSBjYWxlbmRhciBkYXlzIGFycmF5XG4gICAqICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlja2VyTW9tZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50b2RheURhdGUgPSBudWxsO1xuXG4gICAgLy8gdGhlIGZpcnN0IHdlZWtkYXkgb2YgdGhlIG1vbnRoXG4gICAgY29uc3Qgc3RhcnRXZWVrZGF5T2ZNb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERheShcbiAgICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aFxuICAgICk7XG4gICAgY29uc3QgZmlyc3REYXlPZldlZWsgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgLy8gdGhlIGFtb3VudCBvZiBkYXlzIGZyb20gdGhlIGZpcnN0IGRhdGUgb2YgdGhlIG1vbnRoXG4gICAgLy8gaWYgaXQgaXMgPCAwLCBpdCBtZWFucyB0aGUgZGF0ZSBpcyBpbiBwcmV2aW91cyBtb250aFxuICAgIGxldCBkYXlzRGlmZiA9XG4gICAgICAwIC1cbiAgICAgICgoc3RhcnRXZWVrZGF5T2ZNb250aCArIChEQVlTX1BFUl9XRUVLIC0gZmlyc3REYXlPZldlZWspKSAlXG4gICAgICAgIERBWVNfUEVSX1dFRUspO1xuXG4gICAgLy8gdGhlIGluZGV4IG9mIGNlbGwgdGhhdCBjb250YWlucyB0aGUgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGhcbiAgICB0aGlzLmZpcnN0Um93T2Zmc2V0ID0gTWF0aC5hYnMoZGF5c0RpZmYpO1xuXG4gICAgdGhpcy5fZGF5cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgV0VFS1NfUEVSX1ZJRVc7IGkrKykge1xuICAgICAgY29uc3Qgd2VlayA9IFtdO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBEQVlTX1BFUl9XRUVLOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcbiAgICAgICAgICB0aGlzLmZpcnN0RGF0ZU9mTW9udGgsXG4gICAgICAgICAgZGF5c0RpZmZcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGF0ZUNlbGwgPSB0aGlzLmNyZWF0ZURhdGVDZWxsKGRhdGUsIGRheXNEaWZmKTtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgZGF0ZSBpcyB0b2RheVxuICAgICAgICBpZiAodGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNTYW1lRGF5KHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpLCBkYXRlKSkge1xuICAgICAgICAgIHRoaXMudG9kYXlEYXRlID0gZGF5c0RpZmYgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgd2Vlay5wdXNoKGRhdGVDZWxsKTtcbiAgICAgICAgZGF5c0RpZmYgKz0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RheXMucHVzaCh3ZWVrKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIENhbGVuZGFyQ2VsbCBmb3IgZGF5cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRGF0ZUNlbGwoZGF0ZTogVCwgZGF5c0RpZmY6IG51bWJlcik6IENhbGVuZGFyQ2VsbCB7XG4gICAgLy8gdG90YWwgZGF5cyBvZiB0aGUgbW9udGhcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgdGhpcy5waWNrZXJNb21lbnRcbiAgICApO1xuICAgIGNvbnN0IGRhdGVOdW0gPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgIC8vIGNvbnN0IGRhdGVOYW1lID0gdGhpcy5kYXRlTmFtZXNbZGF0ZU51bSAtIDFdO1xuICAgIGNvbnN0IGRhdGVOYW1lID0gZGF0ZU51bS50b1N0cmluZygpO1xuICAgIGNvbnN0IGFyaWFMYWJlbCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChcbiAgICAgIGRhdGUsXG4gICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5kYXRlQTExeUxhYmVsXG4gICAgKTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZSBkYXRlIGlmIHNlbGVjdGFibGVcbiAgICBjb25zdCBlbmFibGVkID0gdGhpcy5pc0RhdGVFbmFibGVkKGRhdGUpO1xuXG4gICAgLy8gY2hlY2sgaWYgZGF0ZSBpcyBub3QgaW4gY3VycmVudCBtb250aFxuICAgIGNvbnN0IGRheVZhbHVlID0gZGF5c0RpZmYgKyAxO1xuICAgIGNvbnN0IG91dCA9IGRheVZhbHVlIDwgMSB8fCBkYXlWYWx1ZSA+IGRheXNJbk1vbnRoO1xuICAgIGNvbnN0IGNlbGxDbGFzcyA9ICdvd2wtZHQtZGF5LScgKyB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXkoZGF0ZSk7XG5cbiAgICByZXR1cm4gbmV3IENhbGVuZGFyQ2VsbChcbiAgICAgIGRheVZhbHVlLFxuICAgICAgZGF0ZU5hbWUsXG4gICAgICBhcmlhTGFiZWwsXG4gICAgICBlbmFibGVkLFxuICAgICAgb3V0LFxuICAgICAgY2VsbENsYXNzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZGF0ZSBpcyB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0RhdGVFbmFibGVkKGRhdGU6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFkYXRlICYmXG4gICAgICAoIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpICYmXG4gICAgICAoIXRoaXMubWluRGF0ZSB8fFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGRhdGUsIHRoaXMubWluRGF0ZSkgPj0gMCkgJiZcbiAgICAgICghdGhpcy5tYXhEYXRlIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZGF0ZSwgdGhpcy5tYXhEYXRlKSA8PSAwKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsaWQgZGF0ZSBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgZ2V0VmFsaWREYXRlKG9iajogYW55KTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmXG4gICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKG9iailcbiAgICAgID8gb2JqXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmUgZGF0ZXMgYXJlIG5vbmUtbnVsbCBhbmQgaW4gdGhlIHNhbWUgbW9udGhcbiAgICovXG4gIHB1YmxpYyBpc1NhbWVNb250aChkYXRlTGVmdDogVCwgZGF0ZVJpZ2h0OiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZGF0ZUxlZnQgJiZcbiAgICAgIGRhdGVSaWdodCAmJlxuICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChkYXRlTGVmdCkgJiZcbiAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoZGF0ZVJpZ2h0KSAmJlxuICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlTGVmdCkgPT09XG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIoZGF0ZVJpZ2h0KSAmJlxuICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZUxlZnQpID09PVxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aChkYXRlUmlnaHQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNlbGVjdGVkRGF0ZXMgdmFsdWUuXG4gICAqIEluIHNpbmdsZSBtb2RlLCBpdCBoYXMgb25seSBvbmUgdmFsdWUgd2hpY2ggcmVwcmVzZW50IHRoZSBzZWxlY3RlZCBkYXRlXG4gICAqIEluIHJhbmdlIG1vZGUsIGl0IHdvdWxkIGhhcyB0d28gdmFsdWVzLCBvbmUgZm9yIHRoZSBmcm9tVmFsdWUgYW5kIHRoZSBvdGhlciBmb3IgdGhlIHRvVmFsdWVcbiAgICogKi9cbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZERhdGVzKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFtdO1xuXG4gICAgaWYgKCF0aGlzLmZpcnN0RGF0ZU9mTW9udGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSAmJiB0aGlzLnNlbGVjdGVkKSB7XG4gICAgICBjb25zdCBkYXlEaWZmID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICAgICAgICB0aGlzLnNlbGVjdGVkLFxuICAgICAgICB0aGlzLmZpcnN0RGF0ZU9mTW9udGhcbiAgICAgICk7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZXNbMF0gPSBkYXlEaWZmICsgMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0luUmFuZ2VNb2RlICYmIHRoaXMuc2VsZWN0ZWRzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMgPSB0aGlzLnNlbGVjdGVkcy5tYXAoKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHNlbGVjdGVkKSkge1xuICAgICAgICAgIGNvbnN0IGRheURpZmYgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoXG4gICAgICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgICAgIHRoaXMuZmlyc3REYXRlT2ZNb250aFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGRheURpZmYgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQWN0aXZlQ2VsbCgpIHtcbiAgICB0aGlzLmNhbGVuZGFyQm9keUVsbS5mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgfVxufVxuIiwiPHRhYmxlXG4gIGNsYXNzPVwib3dsLWR0LWNhbGVuZGFyLXRhYmxlIG93bC1kdC1jYWxlbmRhci1tb250aC10YWJsZVwiXG4gIFtjbGFzcy5vd2wtZHQtY2FsZW5kYXItb25seS1jdXJyZW50LW1vbnRoXT1cImhpZGVPdGhlck1vbnRoc1wiXG4+XG4gIDx0aGVhZCBjbGFzcz1cIm93bC1kdC1jYWxlbmRhci1oZWFkZXJcIj5cbiAgICA8dHIgY2xhc3M9XCJvd2wtZHQtd2Vla2RheXNcIj5cbiAgICAgIDx0aFxuICAgICAgICAqbmdGb3I9XCJsZXQgd2Vla2RheSBvZiB3ZWVrZGF5c1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwid2Vla2RheS5sb25nXCJcbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtd2Vla2RheVwiXG4gICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4+e3sgd2Vla2RheS5zaG9ydCB9fTwvc3Bhbj5cbiAgICAgIDwvdGg+XG4gICAgPC90cj5cbiAgICA8dHI+XG4gICAgICA8dGhcbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtY2FsZW5kYXItdGFibGUtZGl2aWRlclwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIGNvbHNwYW49XCI3XCJcbiAgICAgID48L3RoPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keVxuICAgIG9mZS1vd2wtZGF0ZS10aW1lLWNhbGVuZGFyLWJvZHlcbiAgICByb2xlPVwiZ3JpZFwiXG4gICAgW3Jvd3NdPVwiZGF5c1wiXG4gICAgW3RvZGF5VmFsdWVdPVwidG9kYXlEYXRlXCJcbiAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwic2VsZWN0ZWREYXRlc1wiXG4gICAgW3NlbGVjdE1vZGVdPVwic2VsZWN0TW9kZVwiXG4gICAgW2FjdGl2ZUNlbGxdPVwiYWN0aXZlQ2VsbFwiXG4gICAgKGtleWRvd24pPVwiaGFuZGxlQ2FsZW5kYXJLZXlkb3duKCRldmVudClcIlxuICAgIChjZWxsU2VsZWN0ZWQpPVwic2VsZWN0Q2FsZW5kYXJDZWxsKCRldmVudClcIlxuICA+PC90Ym9keT5cbjwvdGFibGU+XG4iXX0=
|