@gipisistemas/ng-core 1.1.11 → 1.1.12
Sign up to get free protection for your applications and to get access to all the features.
- package/assets/styles/colors.scss +228 -211
- package/assets/styles/styles.scss +50 -5
- package/bundles/gipisistemas-ng-core.umd.js +3467 -122
- package/bundles/gipisistemas-ng-core.umd.js.map +1 -1
- package/bundles/gipisistemas-ng-core.umd.min.js +9 -9
- package/bundles/gipisistemas-ng-core.umd.min.js.map +1 -1
- package/core/gipi-components/components/abstract-find.component.d.ts +1 -0
- package/core/gipi-components/components/abstract.component.d.ts +1 -0
- package/esm2015/core/gipi-components/components/abstract-find.component.js +22 -1
- package/esm2015/core/gipi-components/components/abstract.component.js +5 -2
- package/esm2015/gipi-components.js +19 -6
- package/esm2015/gipisistemas-ng-core.js +3 -1
- package/esm2015/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
- package/esm2015/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
- package/esm2015/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
- package/esm2015/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
- package/esm2015/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +158 -0
- package/esm2015/shared/gipi-components/datetime-picker/datetime-picker.module.js +82 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +116 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +676 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +306 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +346 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +83 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +451 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +151 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +230 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +43 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +139 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +138 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
- package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +141 -0
- package/esm2015/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
- package/esm2015/shared/gipi-components/form-field/form-field.component.js +1 -1
- package/esm2015/shared/gipi-components/input-currency/input-currency.component.js +1 -1
- package/esm2015/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
- package/esm2015/shared/gipi-components/input-select/input-select.component.js +1 -1
- package/esm2015/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
- package/esm2015/shared/gipi-components/radio-group/radio-group.component.js +1 -1
- package/esm2015/shared/gipi-components/range-page/range-page.component.js +1 -1
- package/esm2015/shared/gipi-components/range-slider/range-slider.component.js +1 -1
- package/esm2015/shared/gipi-components/select-button/select-button.component.js +1 -1
- package/esm2015/shared/gipi-components/textarea/textarea.component.js +1 -1
- package/esm2015/shared/shared.module.js +51 -3
- package/esm5/core/gipi-components/components/abstract-find.component.js +22 -1
- package/esm5/core/gipi-components/components/abstract.component.js +5 -2
- package/esm5/gipi-components.js +19 -6
- package/esm5/gipisistemas-ng-core.js +3 -1
- package/esm5/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
- package/esm5/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
- package/esm5/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
- package/esm5/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
- package/esm5/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +176 -0
- package/esm5/shared/gipi-components/datetime-picker/datetime-picker.module.js +85 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +119 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +747 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +332 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +377 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +89 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +495 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +160 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +248 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +49 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +145 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +141 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
- package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +151 -0
- package/esm5/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
- package/esm5/shared/gipi-components/form-field/form-field.component.js +1 -1
- package/esm5/shared/gipi-components/input-currency/input-currency.component.js +1 -1
- package/esm5/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
- package/esm5/shared/gipi-components/input-select/input-select.component.js +1 -1
- package/esm5/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
- package/esm5/shared/gipi-components/radio-group/radio-group.component.js +1 -1
- package/esm5/shared/gipi-components/range-page/range-page.component.js +1 -1
- package/esm5/shared/gipi-components/range-slider/range-slider.component.js +1 -1
- package/esm5/shared/gipi-components/select-button/select-button.component.js +1 -1
- package/esm5/shared/gipi-components/textarea/textarea.component.js +1 -1
- package/esm5/shared/shared.module.js +51 -3
- package/fesm2015/gipisistemas-ng-core.js +3234 -167
- package/fesm2015/gipisistemas-ng-core.js.map +1 -1
- package/fesm5/gipisistemas-ng-core.js +3445 -128
- package/fesm5/gipisistemas-ng-core.js.map +1 -1
- package/gipi-components.d.ts +16 -0
- package/gipisistemas-ng-core.d.ts +2 -0
- package/gipisistemas-ng-core.metadata.json +1 -1
- package/package.json +4 -4
- package/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.d.ts +40 -0
- package/shared/gipi-components/datetime-picker/datetime-picker.module.d.ts +2 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.d.ts +50 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.d.ts +140 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.d.ts +66 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.d.ts +8 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.d.ts +2 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.d.ts +5 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.d.ts +98 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.d.ts +20 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.d.ts +1 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.d.ts +133 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.d.ts +53 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.d.ts +80 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.d.ts +4 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.d.ts +46 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.d.ts +20 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.d.ts +36 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.d.ts +2 -0
- package/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.d.ts +52 -0
@@ -0,0 +1,451 @@
|
|
1
|
+
import { __decorate, __metadata, __param } from "tslib";
|
2
|
+
import { Directionality } from '@angular/cdk/bidi';
|
3
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
4
|
+
import { ESCAPE } from '@angular/cdk/keycodes';
|
5
|
+
import { Overlay, OverlayConfig, OverlayRef, PositionStrategy, } from '@angular/cdk/overlay';
|
6
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
7
|
+
import { DOCUMENT } from '@angular/common';
|
8
|
+
import { AfterContentInit, ChangeDetectionStrategy, Component, ComponentRef, EventEmitter, Inject, Input, NgZone, OnDestroy, Optional, Output, ViewChild, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
|
9
|
+
import { MAT_DATEPICKER_SCROLL_STRATEGY } from '@angular/material/datepicker';
|
10
|
+
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
|
11
|
+
import { Subject, Subscription } from 'rxjs';
|
12
|
+
import { first } from 'rxjs/operators';
|
13
|
+
import { GIPIDatetimepickerCalendarComponent, } from './calendar';
|
14
|
+
import { createMissingDateImplError } from './datetimepicker-errors';
|
15
|
+
import { GIPIDatetimeAdapter } from './shared/adapter/datetime-adapter';
|
16
|
+
/** Used to generate a unique ID for each datepicker instance. */
|
17
|
+
let datetimepickerUid = 0;
|
18
|
+
/**
|
19
|
+
* Component used as the content for the datepicker dialog and popup. We use this instead of using
|
20
|
+
* MatCalendar directly as the content so we can control the initial focus. This also gives us a
|
21
|
+
* place to put additional features of the popup that are not part of the calendar itself in the
|
22
|
+
* future. (e.g. confirmation buttons).
|
23
|
+
* @docs-private
|
24
|
+
*/
|
25
|
+
let GIPIDatetimepickerContentComponent = class GIPIDatetimepickerContentComponent {
|
26
|
+
ngAfterContentInit() {
|
27
|
+
this._calendar._focusActiveCell();
|
28
|
+
}
|
29
|
+
onSelectionChange(date) {
|
30
|
+
this.datetimepicker._select(date);
|
31
|
+
this.datetimepicker.close();
|
32
|
+
}
|
33
|
+
/**
|
34
|
+
* Handles keydown event on datepicker content.
|
35
|
+
* @param event The event.
|
36
|
+
*/
|
37
|
+
_handleKeydown(event) {
|
38
|
+
if (event.keyCode === ESCAPE) {
|
39
|
+
this.datetimepicker.close();
|
40
|
+
event.preventDefault();
|
41
|
+
event.stopPropagation();
|
42
|
+
}
|
43
|
+
}
|
44
|
+
};
|
45
|
+
__decorate([
|
46
|
+
ViewChild(GIPIDatetimepickerCalendarComponent, { static: true }),
|
47
|
+
__metadata("design:type", GIPIDatetimepickerCalendarComponent)
|
48
|
+
], GIPIDatetimepickerContentComponent.prototype, "_calendar", void 0);
|
49
|
+
GIPIDatetimepickerContentComponent = __decorate([
|
50
|
+
Component({
|
51
|
+
selector: 'gipi-mat-datetime-picker-content',
|
52
|
+
template: "<gipi-mat-datetime-picker-calendar cdkTrapFocus\n class=\"mat-typography\"\n [id]=\"datetimepicker.id\"\n [attr.mode]=\"datetimepicker.mode\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\">\n</gipi-mat-datetime-picker-calendar>",
|
53
|
+
encapsulation: ViewEncapsulation.None,
|
54
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
55
|
+
host: {
|
56
|
+
class: 'gipi-mat-datetime-picker-content',
|
57
|
+
'[class.gipi-mat-datetime-picker-content-touch]': 'datetimepicker?.touchUi',
|
58
|
+
'(keydown)': '_handleKeydown($event)',
|
59
|
+
},
|
60
|
+
styles: ["@use '@angular/material' as mat;.gipi-mat-datetime-picker-content{display:block;background-color:#fff;border-radius:4px!important;overflow:hidden;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.gipi-mat-datetime-picker-calendar{width:296px;height:405px}.gipi-mat-datetime-picker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width:480px){.gipi-mat-datetime-picker-calendar[mode=auto]{width:446px;height:328px}}.gipi-mat-datetime-picker-content-touch{display:block;box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.gipi-mat-datetime-picker-dialog .mat-dialog-container{padding:0}"]
|
61
|
+
})
|
62
|
+
], GIPIDatetimepickerContentComponent);
|
63
|
+
export { GIPIDatetimepickerContentComponent };
|
64
|
+
let GIPIDatetimepickerComponent = class GIPIDatetimepickerComponent {
|
65
|
+
constructor(_dialog, _overlay, _ngZone, _viewContainerRef, _scrollStrategy, _dateAdapter, _dir, _document) {
|
66
|
+
this._dialog = _dialog;
|
67
|
+
this._overlay = _overlay;
|
68
|
+
this._ngZone = _ngZone;
|
69
|
+
this._viewContainerRef = _viewContainerRef;
|
70
|
+
this._scrollStrategy = _scrollStrategy;
|
71
|
+
this._dateAdapter = _dateAdapter;
|
72
|
+
this._dir = _dir;
|
73
|
+
this._document = _document;
|
74
|
+
/** Whether the calendar is open. */
|
75
|
+
this.opened = false;
|
76
|
+
/** The id for the datepicker calendar. */
|
77
|
+
this.id = `gipi-mat-datetime-picker-${datetimepickerUid++}`;
|
78
|
+
/** Emits when the datepicker is disabled. */
|
79
|
+
this._disabledChange = new Subject();
|
80
|
+
this._validSelected = null;
|
81
|
+
/** The element that was focused before the datepicker was opened. */
|
82
|
+
this._focusedElementBeforeOpen = null;
|
83
|
+
this._inputSubscription = Subscription.EMPTY;
|
84
|
+
/** Active multi year view when click on year. */
|
85
|
+
this.multiYearSelector = false;
|
86
|
+
/** if true change the clock to 12 hour format. */
|
87
|
+
this.twelvehour = false;
|
88
|
+
/** The view that the calendar should start in. */
|
89
|
+
this.startView = 'month';
|
90
|
+
this.mode = 'auto';
|
91
|
+
this.timeInterval = 1;
|
92
|
+
this.ariaNextMonthLabel = 'Next month';
|
93
|
+
this.ariaPrevMonthLabel = 'Previous month';
|
94
|
+
this.ariaNextYearLabel = 'Next year';
|
95
|
+
this.ariaPrevYearLabel = 'Previous year';
|
96
|
+
/** Prevent user to select same date time */
|
97
|
+
this.preventSameDateTimeSelection = false;
|
98
|
+
this._type = 'date';
|
99
|
+
/** Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather than a popup and elements have more padding to allow for bigger touch targets. */
|
100
|
+
this._touchUi = false;
|
101
|
+
/** Emits when the datepicker has been opened. */
|
102
|
+
this.openedStream = new EventEmitter();
|
103
|
+
/** Emits when the datepicker has been closed. */
|
104
|
+
this.closedStream = new EventEmitter();
|
105
|
+
/** Emits when the view has been changed. **/
|
106
|
+
this.viewChanged = new EventEmitter();
|
107
|
+
/**
|
108
|
+
* Emits new selected date when selected date changes.
|
109
|
+
* @deprecated Switch to the `dateChange` and `dateInput` binding on the input element.
|
110
|
+
*/
|
111
|
+
this.selectedChanged = new EventEmitter();
|
112
|
+
if (!this._dateAdapter) {
|
113
|
+
throw createMissingDateImplError('DateAdapter');
|
114
|
+
}
|
115
|
+
}
|
116
|
+
get startAt() {
|
117
|
+
// If an explicit startAt is set we start there, otherwise we start at whatever the currently selected value is.
|
118
|
+
return (this._startAt || (this._datepickerInput ? this._datepickerInput.value : null));
|
119
|
+
}
|
120
|
+
set startAt(date) {
|
121
|
+
this._startAt = this._dateAdapter.getValidDateOrNull(date);
|
122
|
+
}
|
123
|
+
get openOnFocus() {
|
124
|
+
return this._openOnFocus;
|
125
|
+
}
|
126
|
+
set openOnFocus(value) {
|
127
|
+
this._openOnFocus = coerceBooleanProperty(value);
|
128
|
+
}
|
129
|
+
get type() {
|
130
|
+
return this._type;
|
131
|
+
}
|
132
|
+
set type(value) {
|
133
|
+
this._type = value || 'date';
|
134
|
+
}
|
135
|
+
get touchUi() {
|
136
|
+
return this._touchUi;
|
137
|
+
}
|
138
|
+
set touchUi(value) {
|
139
|
+
this._touchUi = coerceBooleanProperty(value);
|
140
|
+
}
|
141
|
+
get disabled() {
|
142
|
+
return this._disabled === undefined && this._datepickerInput
|
143
|
+
? this._datepickerInput.disabled
|
144
|
+
: !!this._disabled;
|
145
|
+
}
|
146
|
+
set disabled(value) {
|
147
|
+
const newValue = coerceBooleanProperty(value);
|
148
|
+
if (newValue !== this._disabled) {
|
149
|
+
this._disabled = newValue;
|
150
|
+
this._disabledChange.next(newValue);
|
151
|
+
}
|
152
|
+
}
|
153
|
+
/** The currently selected date. */
|
154
|
+
get _selected() {
|
155
|
+
return this._validSelected;
|
156
|
+
}
|
157
|
+
set _selected(value) {
|
158
|
+
this._validSelected = value;
|
159
|
+
}
|
160
|
+
/** The minimum selectable date. */
|
161
|
+
get _minDate() {
|
162
|
+
return this._datepickerInput && this._datepickerInput.min;
|
163
|
+
}
|
164
|
+
/** The maximum selectable date. */
|
165
|
+
get _maxDate() {
|
166
|
+
return this._datepickerInput && this._datepickerInput.max;
|
167
|
+
}
|
168
|
+
get _dateFilter() {
|
169
|
+
return this._datepickerInput && this._datepickerInput._dateFilter;
|
170
|
+
}
|
171
|
+
_handleFocus() {
|
172
|
+
if (!this.opened && this.openOnFocus) {
|
173
|
+
this.open();
|
174
|
+
}
|
175
|
+
}
|
176
|
+
_viewChanged(type) {
|
177
|
+
this.viewChanged.emit(type);
|
178
|
+
}
|
179
|
+
ngOnDestroy() {
|
180
|
+
this.close();
|
181
|
+
this._inputSubscription.unsubscribe();
|
182
|
+
this._disabledChange.complete();
|
183
|
+
if (this._popupRef) {
|
184
|
+
this._popupRef.dispose();
|
185
|
+
}
|
186
|
+
}
|
187
|
+
/** Selects the given date */
|
188
|
+
_select(date) {
|
189
|
+
const oldValue = this._selected;
|
190
|
+
this._selected = date;
|
191
|
+
if (!this._dateAdapter.sameDatetime(oldValue, this._selected)) {
|
192
|
+
this.selectedChanged.emit(date);
|
193
|
+
}
|
194
|
+
}
|
195
|
+
/**
|
196
|
+
* Register an input with this datepicker.
|
197
|
+
* @param input The datepicker input to register with this datepicker.
|
198
|
+
*/
|
199
|
+
_registerInput(input) {
|
200
|
+
if (this._datepickerInput) {
|
201
|
+
throw Error('A MatDatepicker can only be associated with a single input.');
|
202
|
+
}
|
203
|
+
this._datepickerInput = input;
|
204
|
+
this._inputSubscription = this._datepickerInput._valueChange.subscribe((value) => (this._selected = value));
|
205
|
+
}
|
206
|
+
/** Open the calendar. */
|
207
|
+
open() {
|
208
|
+
if (this.opened || this.disabled) {
|
209
|
+
return;
|
210
|
+
}
|
211
|
+
if (!this._datepickerInput) {
|
212
|
+
throw Error('Attempted to open an MatDatepicker with no associated input.');
|
213
|
+
}
|
214
|
+
if (this._document) {
|
215
|
+
this._focusedElementBeforeOpen = this._document.activeElement;
|
216
|
+
}
|
217
|
+
this.touchUi ? this._openAsDialog() : this._openAsPopup();
|
218
|
+
this.opened = true;
|
219
|
+
this.openedStream.emit();
|
220
|
+
}
|
221
|
+
/** Close the calendar. */
|
222
|
+
close() {
|
223
|
+
if (!this.opened) {
|
224
|
+
return;
|
225
|
+
}
|
226
|
+
if (this._popupRef && this._popupRef.hasAttached()) {
|
227
|
+
this._popupRef.detach();
|
228
|
+
}
|
229
|
+
if (this._dialogRef) {
|
230
|
+
this._dialogRef.close();
|
231
|
+
this._dialogRef = null;
|
232
|
+
}
|
233
|
+
if (this._calendarPortal && this._calendarPortal.isAttached) {
|
234
|
+
this._calendarPortal.detach();
|
235
|
+
}
|
236
|
+
const completeClose = () => {
|
237
|
+
// The `_opened` could've been reset already if
|
238
|
+
// we got two events in quick succession.
|
239
|
+
if (this.opened) {
|
240
|
+
this.opened = false;
|
241
|
+
this.closedStream.emit();
|
242
|
+
this._focusedElementBeforeOpen = null;
|
243
|
+
}
|
244
|
+
};
|
245
|
+
if (this._focusedElementBeforeOpen && typeof this._focusedElementBeforeOpen.focus === 'function') {
|
246
|
+
// Because IE moves focus asynchronously, we can't count on it being restored before we've
|
247
|
+
// marked the datepicker as closed. If the event fires out of sequence and the element that
|
248
|
+
// we're refocusing opens the datepicker on focus, the user could be stuck with not being
|
249
|
+
// able to close the calendar at all. We work around it by making the logic, that marks
|
250
|
+
// the datepicker as closed, async as well.
|
251
|
+
this._focusedElementBeforeOpen.focus();
|
252
|
+
setTimeout(completeClose);
|
253
|
+
}
|
254
|
+
else {
|
255
|
+
completeClose();
|
256
|
+
}
|
257
|
+
}
|
258
|
+
/** Open the calendar as a dialog. */
|
259
|
+
_openAsDialog() {
|
260
|
+
this._dialogRef = this._dialog.open(GIPIDatetimepickerContentComponent, {
|
261
|
+
direction: this._dir ? this._dir.value : 'ltr',
|
262
|
+
viewContainerRef: this._viewContainerRef,
|
263
|
+
panelClass: 'gipi-mat-datetime-picker-dialog',
|
264
|
+
});
|
265
|
+
this._dialogRef.afterClosed().subscribe(() => this.close());
|
266
|
+
this._dialogRef.componentInstance.datetimepicker = this;
|
267
|
+
}
|
268
|
+
/** Open the calendar as a popup. */
|
269
|
+
_openAsPopup() {
|
270
|
+
if (!this._calendarPortal) {
|
271
|
+
this._calendarPortal = new ComponentPortal(GIPIDatetimepickerContentComponent, this._viewContainerRef);
|
272
|
+
}
|
273
|
+
if (!this._popupRef) {
|
274
|
+
this._createPopup();
|
275
|
+
}
|
276
|
+
if (!this._popupRef.hasAttached()) {
|
277
|
+
const componentRef = this._popupRef.attach(this._calendarPortal);
|
278
|
+
componentRef.instance.datetimepicker = this;
|
279
|
+
// Update the position once the calendar has rendered.
|
280
|
+
this._ngZone.onStable
|
281
|
+
.asObservable()
|
282
|
+
.pipe(first())
|
283
|
+
.subscribe(() => this._popupRef.updatePosition());
|
284
|
+
}
|
285
|
+
this._popupRef.backdropClick().subscribe(() => this.close());
|
286
|
+
}
|
287
|
+
/** Create the popup. */
|
288
|
+
_createPopup() {
|
289
|
+
const overlayConfig = new OverlayConfig({
|
290
|
+
positionStrategy: this._createPopupPositionStrategy(),
|
291
|
+
hasBackdrop: true,
|
292
|
+
backdropClass: 'mat-overlay-transparent-backdrop',
|
293
|
+
direction: this._dir ? this._dir.value : 'ltr',
|
294
|
+
scrollStrategy: this._scrollStrategy(),
|
295
|
+
panelClass: 'gipi-mat-datetime-picker-popup',
|
296
|
+
});
|
297
|
+
this._popupRef = this._overlay.create(overlayConfig);
|
298
|
+
}
|
299
|
+
/** Create the popup PositionStrategy. */
|
300
|
+
_createPopupPositionStrategy() {
|
301
|
+
return this._overlay
|
302
|
+
.position()
|
303
|
+
.flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())
|
304
|
+
.withTransformOriginOn('.gipi-mat-datetime-picker-content')
|
305
|
+
.withFlexibleDimensions(false)
|
306
|
+
.withViewportMargin(8)
|
307
|
+
.withLockedPosition()
|
308
|
+
.withPositions([
|
309
|
+
{
|
310
|
+
originX: 'start',
|
311
|
+
originY: 'bottom',
|
312
|
+
overlayX: 'start',
|
313
|
+
overlayY: 'top',
|
314
|
+
},
|
315
|
+
{
|
316
|
+
originX: 'start',
|
317
|
+
originY: 'top',
|
318
|
+
overlayX: 'start',
|
319
|
+
overlayY: 'bottom',
|
320
|
+
},
|
321
|
+
{
|
322
|
+
originX: 'end',
|
323
|
+
originY: 'bottom',
|
324
|
+
overlayX: 'end',
|
325
|
+
overlayY: 'top',
|
326
|
+
},
|
327
|
+
{
|
328
|
+
originX: 'end',
|
329
|
+
originY: 'top',
|
330
|
+
overlayX: 'end',
|
331
|
+
overlayY: 'bottom',
|
332
|
+
},
|
333
|
+
]);
|
334
|
+
}
|
335
|
+
};
|
336
|
+
GIPIDatetimepickerComponent.ctorParameters = () => [
|
337
|
+
{ type: MatDialog },
|
338
|
+
{ type: Overlay },
|
339
|
+
{ type: NgZone },
|
340
|
+
{ type: ViewContainerRef },
|
341
|
+
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DATEPICKER_SCROLL_STRATEGY,] }] },
|
342
|
+
{ type: GIPIDatetimeAdapter, decorators: [{ type: Optional }] },
|
343
|
+
{ type: Directionality, decorators: [{ type: Optional }] },
|
344
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }
|
345
|
+
];
|
346
|
+
__decorate([
|
347
|
+
Input(),
|
348
|
+
__metadata("design:type", Boolean)
|
349
|
+
], GIPIDatetimepickerComponent.prototype, "multiYearSelector", void 0);
|
350
|
+
__decorate([
|
351
|
+
Input(),
|
352
|
+
__metadata("design:type", Boolean)
|
353
|
+
], GIPIDatetimepickerComponent.prototype, "twelvehour", void 0);
|
354
|
+
__decorate([
|
355
|
+
Input(),
|
356
|
+
__metadata("design:type", String)
|
357
|
+
], GIPIDatetimepickerComponent.prototype, "startView", void 0);
|
358
|
+
__decorate([
|
359
|
+
Input(),
|
360
|
+
__metadata("design:type", String)
|
361
|
+
], GIPIDatetimepickerComponent.prototype, "mode", void 0);
|
362
|
+
__decorate([
|
363
|
+
Input(),
|
364
|
+
__metadata("design:type", Number)
|
365
|
+
], GIPIDatetimepickerComponent.prototype, "timeInterval", void 0);
|
366
|
+
__decorate([
|
367
|
+
Input(),
|
368
|
+
__metadata("design:type", Object)
|
369
|
+
], GIPIDatetimepickerComponent.prototype, "ariaNextMonthLabel", void 0);
|
370
|
+
__decorate([
|
371
|
+
Input(),
|
372
|
+
__metadata("design:type", Object)
|
373
|
+
], GIPIDatetimepickerComponent.prototype, "ariaPrevMonthLabel", void 0);
|
374
|
+
__decorate([
|
375
|
+
Input(),
|
376
|
+
__metadata("design:type", Object)
|
377
|
+
], GIPIDatetimepickerComponent.prototype, "ariaNextYearLabel", void 0);
|
378
|
+
__decorate([
|
379
|
+
Input(),
|
380
|
+
__metadata("design:type", Object)
|
381
|
+
], GIPIDatetimepickerComponent.prototype, "ariaPrevYearLabel", void 0);
|
382
|
+
__decorate([
|
383
|
+
Input(),
|
384
|
+
__metadata("design:type", Object)
|
385
|
+
], GIPIDatetimepickerComponent.prototype, "preventSameDateTimeSelection", void 0);
|
386
|
+
__decorate([
|
387
|
+
Input(),
|
388
|
+
__metadata("design:type", Object)
|
389
|
+
], GIPIDatetimepickerComponent.prototype, "panelClass", void 0);
|
390
|
+
__decorate([
|
391
|
+
Input(),
|
392
|
+
__metadata("design:type", Object),
|
393
|
+
__metadata("design:paramtypes", [Object])
|
394
|
+
], GIPIDatetimepickerComponent.prototype, "startAt", null);
|
395
|
+
__decorate([
|
396
|
+
Input(),
|
397
|
+
__metadata("design:type", Boolean),
|
398
|
+
__metadata("design:paramtypes", [Boolean])
|
399
|
+
], GIPIDatetimepickerComponent.prototype, "openOnFocus", null);
|
400
|
+
__decorate([
|
401
|
+
Input(),
|
402
|
+
__metadata("design:type", String),
|
403
|
+
__metadata("design:paramtypes", [String])
|
404
|
+
], GIPIDatetimepickerComponent.prototype, "type", null);
|
405
|
+
__decorate([
|
406
|
+
Input(),
|
407
|
+
__metadata("design:type", Boolean),
|
408
|
+
__metadata("design:paramtypes", [Boolean])
|
409
|
+
], GIPIDatetimepickerComponent.prototype, "touchUi", null);
|
410
|
+
__decorate([
|
411
|
+
Input(),
|
412
|
+
__metadata("design:type", Boolean),
|
413
|
+
__metadata("design:paramtypes", [Boolean])
|
414
|
+
], GIPIDatetimepickerComponent.prototype, "disabled", null);
|
415
|
+
__decorate([
|
416
|
+
Output('opened'),
|
417
|
+
__metadata("design:type", EventEmitter)
|
418
|
+
], GIPIDatetimepickerComponent.prototype, "openedStream", void 0);
|
419
|
+
__decorate([
|
420
|
+
Output('closed'),
|
421
|
+
__metadata("design:type", EventEmitter)
|
422
|
+
], GIPIDatetimepickerComponent.prototype, "closedStream", void 0);
|
423
|
+
__decorate([
|
424
|
+
Output(),
|
425
|
+
__metadata("design:type", EventEmitter)
|
426
|
+
], GIPIDatetimepickerComponent.prototype, "viewChanged", void 0);
|
427
|
+
__decorate([
|
428
|
+
Output(),
|
429
|
+
__metadata("design:type", Object)
|
430
|
+
], GIPIDatetimepickerComponent.prototype, "selectedChanged", void 0);
|
431
|
+
GIPIDatetimepickerComponent = __decorate([
|
432
|
+
Component({
|
433
|
+
selector: 'gipi-mat-datetime-picker',
|
434
|
+
exportAs: 'gipiDatetimePicker',
|
435
|
+
template: '',
|
436
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
437
|
+
encapsulation: ViewEncapsulation.None,
|
438
|
+
preserveWhitespaces: false
|
439
|
+
}),
|
440
|
+
__param(4, Inject(MAT_DATEPICKER_SCROLL_STRATEGY)),
|
441
|
+
__param(5, Optional()),
|
442
|
+
__param(6, Optional()),
|
443
|
+
__param(7, Optional()), __param(7, Inject(DOCUMENT)),
|
444
|
+
__metadata("design:paramtypes", [MatDialog,
|
445
|
+
Overlay,
|
446
|
+
NgZone,
|
447
|
+
ViewContainerRef, Object, GIPIDatetimeAdapter,
|
448
|
+
Directionality, Object])
|
449
|
+
], GIPIDatetimepickerComponent);
|
450
|
+
export { GIPIDatetimepickerComponent };
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVwaWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZ2lwaXNpc3RlbWFzL25nLWNvcmUvIiwic291cmNlcyI6WyJzaGFyZWQvZ2lwaS1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlci9tYXQtZGF0ZXRpbWUtcGlja2VyL2RhdGV0aW1lcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsR0FBRyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUN0TixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQW9CLG1DQUFtQyxHQUFHLE1BQU0sWUFBWSxD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QUEyQjtJQVJ2QyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsUUFBUSxFQUFFLEVBQUU7UUFDWixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtRQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtRQUNyQyxtQkFBbUIsRUFBRSxLQUFLO0tBQzdCLENBQUM7SUFpSk8sV0FBQSxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUN0QyxXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQ1YsV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUNWLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtxQ0FQWixTQUFTO1FBQ1IsT0FBTztRQUNSLE1BQU07UUFDSSxnQkFBZ0IsVUFFVCxtQkFBbUI7UUFDM0IsY0FBYztHQWxKbkMsMkJBQTJCLENBaVZ2QztTQWpWWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBFU0NBUEUgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgUG9zaXRpb25TdHJhdGVneSwgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9EQVRFUElDS0VSX1NDUk9MTF9TVFJBVEVHWSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgR0lQSUNhbGVuZGFyVmlldywgR0lQSURhdGV0aW1lcGlja2VyQ2FsZW5kYXJDb21wb25lbnQsIH0gZnJvbSAnLi9jYWxlbmRhcic7XG5pbXBvcnQgeyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvciB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItZXJyb3JzJztcbmltcG9ydCB7IEdJUElEYXRldGltZXBpY2tlckZpbHRlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLWZpbHRlcnR5cGUnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lcGlja2VySW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLWlucHV0JztcbmltcG9ydCB7IEdJUElEYXRldGltZXBpY2tlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLXR5cGUnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lQWRhcHRlciB9IGZyb20gJy4vc2hhcmVkL2FkYXB0ZXIvZGF0ZXRpbWUtYWRhcHRlcic7XG5cbmV4cG9ydCB0eXBlIEdJUElEYXRldGltZXBpY2tlck1vZGUgPSAnYXV0bycgfCAncG9ydHJhaXQnIHwgJ2xhbmRzY2FwZSc7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciBlYWNoIGRhdGVwaWNrZXIgaW5zdGFuY2UuICovXG5sZXQgZGF0ZXRpbWVwaWNrZXJVaWQgPSAwO1xuXG4vKipcbiAqIENvbXBvbmVudCB1c2VkIGFzIHRoZSBjb250ZW50IGZvciB0aGUgZGF0ZXBpY2tlciBkaWFsb2cgYW5kIHBvcHVwLiBXZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBNYXRDYWxlbmRhciBkaXJlY3RseSBhcyB0aGUgY29udGVudCBzbyB3ZSBjYW4gY29udHJvbCB0aGUgaW5pdGlhbCBmb2N1cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFcbiAqIHBsYWNlIHRvIHB1dCBhZGRpdGlvbmFsIGZlYXR1cmVzIG9mIHRoZSBwb3B1cCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgY2FsZW5kYXIgaXRzZWxmIGluIHRoZVxuICogZnV0dXJlLiAoZS5nLiBjb25maXJtYXRpb24gYnV0dG9ucykuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnZGF0ZXRpbWVwaWNrZXItY29udGVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0ZXRpbWVwaWNrZXItY29udGVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNvbnRlbnQnLFxuICAgICAgICAnW2NsYXNzLmdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1jb250ZW50LXRvdWNoXSc6ICdkYXRldGltZXBpY2tlcj8udG91Y2hVaScsXG4gICAgICAgICcoa2V5ZG93biknOiAnX2hhbmRsZUtleWRvd24oJGV2ZW50KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgR0lQSURhdGV0aW1lcGlja2VyQ29udGVudENvbXBvbmVudDxEPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuXG4gICAgQFZpZXdDaGlsZChHSVBJRGF0ZXRpbWVwaWNrZXJDYWxlbmRhckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgX2NhbGVuZGFyOiBHSVBJRGF0ZXRpbWVwaWNrZXJDYWxlbmRhckNvbXBvbmVudDxEPjtcblxuICAgIGRhdGV0aW1lcGlja2VyOiBHSVBJRGF0ZXRpbWVwaWNrZXJDb21wb25lbnQ8RD47XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLl9mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbkNoYW5nZShkYXRlOiBEKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXIuX3NlbGVjdChkYXRlKTtcbiAgICAgICAgdGhpcy5kYXRldGltZXBpY2tlci5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5ZG93biBldmVudCBvbiBkYXRlcGlja2VyIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudC5cbiAgICAgKi9cbiAgICBfaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGV0aW1lcGlja2VyLmNsb3NlKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyJyxcbiAgICBleHBvcnRBczogJ2dpcGlEYXRldGltZVBpY2tlcicsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEdJUElEYXRldGltZXBpY2tlckNvbXBvbmVudDxEPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgb3Blbi4gKi9cbiAgICBvcGVuZWQgPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgaWQgZm9yIHRoZSBkYXRlcGlja2VyIGNhbGVuZGFyLiAqL1xuICAgIGlkID0gYGdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci0ke2RhdGV0aW1lcGlja2VyVWlkKyt9YDtcblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCB0aGlzIGRhdGVwaWNrZXIgaXMgYXNzb2NpYXRlZCB3aXRoLiAqL1xuICAgIF9kYXRlcGlja2VySW5wdXQ6IEdJUElEYXRldGltZXBpY2tlcklucHV0RGlyZWN0aXZlPEQ+O1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRhdGVwaWNrZXIgaXMgZGlzYWJsZWQuICovXG4gICAgX2Rpc2FibGVkQ2hhbmdlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgX3ZhbGlkU2VsZWN0ZWQ6IEQgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBBIHJlZmVyZW5jZSB0byB0aGUgb3ZlcmxheSB3aGVuIHRoZSBjYWxlbmRhciBpcyBvcGVuZWQgYXMgYSBwb3B1cC4gKi9cbiAgICBwcml2YXRlIF9wb3B1cFJlZjogT3ZlcmxheVJlZjtcblxuICAgIC8qKiBBIHJlZmVyZW5jZSB0byB0aGUgZGlhbG9nIHdoZW4gdGhlIGNhbGVuZGFyIGlzIG9wZW5lZCBhcyBhIGRpYWxvZy4gKi9cbiAgICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+IHwgbnVsbDtcblxuICAgIC8qKiBBIHBvcnRhbCBjb250YWluaW5nIHRoZSBjYWxlbmRhciBmb3IgdGhpcyBkYXRlcGlja2VyLiAqL1xuICAgIHByaXZhdGUgX2NhbGVuZGFyUG9ydGFsOiBDb21wb25lbnRQb3J0YWw8R0lQSURhdGV0aW1lcGlja2VyQ29udGVudENvbXBvbmVudDxEPj47XG5cbiAgICAvKiogVGhlIGVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGRhdGVwaWNrZXIgd2FzIG9wZW5lZC4gKi9cbiAgICBwcml2YXRlIF9mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaW5wdXRTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgICAvKiogQWN0aXZlIG11bHRpIHllYXIgdmlldyB3aGVuIGNsaWNrIG9uIHllYXIuICovXG4gICAgQElucHV0KCkgbXVsdGlZZWFyU2VsZWN0b3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBpZiB0cnVlIGNoYW5nZSB0aGUgY2xvY2sgdG8gMTIgaG91ciBmb3JtYXQuICovXG4gICAgQElucHV0KCkgdHdlbHZlaG91cjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRoZSB2aWV3IHRoYXQgdGhlIGNhbGVuZGFyIHNob3VsZCBzdGFydCBpbi4gKi9cbiAgICBASW5wdXQoKSBzdGFydFZpZXc6IEdJUElDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIEBJbnB1dCgpIG1vZGU6IEdJUElEYXRldGltZXBpY2tlck1vZGUgPSAnYXV0byc7XG4gICAgQElucHV0KCkgdGltZUludGVydmFsOiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpIGFyaWFOZXh0TW9udGhMYWJlbCA9ICdOZXh0IG1vbnRoJztcbiAgICBASW5wdXQoKSBhcmlhUHJldk1vbnRoTGFiZWwgPSAnUHJldmlvdXMgbW9udGgnO1xuICAgIEBJbnB1dCgpIGFyaWFOZXh0WWVhckxhYmVsID0gJ05leHQgeWVhcic7XG4gICAgQElucHV0KCkgYXJpYVByZXZZZWFyTGFiZWwgPSAnUHJldmlvdXMgeWVhcic7XG5cbiAgICAvKiogUHJldmVudCB1c2VyIHRvIHNlbGVjdCBzYW1lIGRhdGUgdGltZSAqL1xuICAgIEBJbnB1dCgpIHByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgIC8qKiBDbGFzc2VzIHRvIGJlIHBhc3NlZCB0byB0aGUgZGF0ZSBwaWNrZXIgcGFuZWwuIFN1cHBvcnRzIHRoZSBzYW1lIHN5bnRheCBhcyBgbmdDbGFzc2AuICovXG4gICAgQElucHV0KCkgcGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW107XG5cblxuICAgIC8qKiBUaGUgZGF0ZSB0byBvcGVuIHRoZSBjYWxlbmRhciB0byBpbml0aWFsbHkuICovXG4gICAgcHJpdmF0ZSBfc3RhcnRBdDogRCB8IG51bGw7XG4gICAgQElucHV0KCkgZ2V0IHN0YXJ0QXQoKTogRCB8IG51bGwge1xuICAgICAgICAvLyBJZiBhbiBleHBsaWNpdCBzdGFydEF0IGlzIHNldCB3ZSBzdGFydCB0aGVyZSwgb3RoZXJ3aXNlIHdlIHN0YXJ0IGF0IHdoYXRldmVyIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUgaXMuXG4gICAgICAgIHJldHVybiAodGhpcy5fc3RhcnRBdCB8fCAodGhpcy5fZGF0ZXBpY2tlcklucHV0ID8gdGhpcy5fZGF0ZXBpY2tlcklucHV0LnZhbHVlIDogbnVsbCkpO1xuICAgIH1cbiAgICBzZXQgc3RhcnRBdChkYXRlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9zdGFydEF0ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29wZW5PbkZvY3VzOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGdldCBvcGVuT25Gb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZW5PbkZvY3VzO1xuICAgIH1cbiAgICBzZXQgb3Blbk9uRm9jdXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fb3Blbk9uRm9jdXMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3R5cGU6IEdJUElEYXRldGltZXBpY2tlclR5cGUgPSAnZGF0ZSc7XG4gICAgQElucHV0KCkgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cbiAgICBzZXQgdHlwZSh2YWx1ZTogR0lQSURhdGV0aW1lcGlja2VyVHlwZSkge1xuICAgICAgICB0aGlzLl90eXBlID0gdmFsdWUgfHwgJ2RhdGUnO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBVSSBpcyBpbiB0b3VjaCBtb2RlLiBJbiB0b3VjaCBtb2RlIHRoZSBjYWxlbmRhciBvcGVucyBpbiBhIGRpYWxvZyByYXRoZXIgdGhhbiBhIHBvcHVwIGFuZCBlbGVtZW50cyBoYXZlIG1vcmUgcGFkZGluZyB0byBhbGxvdyBmb3IgYmlnZ2VyIHRvdWNoIHRhcmdldHMuICovXG4gICAgcHJpdmF0ZSBfdG91Y2hVaSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGdldCB0b3VjaFVpKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG91Y2hVaTtcbiAgICB9XG4gICAgc2V0IHRvdWNoVWkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fdG91Y2hVaSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGRhdGVwaWNrZXIgcG9wLXVwIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2RhdGVwaWNrZXJJbnB1dFxuICAgICAgICAgICAgPyB0aGlzLl9kYXRlcGlja2VySW5wdXQuZGlzYWJsZWRcbiAgICAgICAgICAgIDogISF0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkQ2hhbmdlLm5leHQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRhdGVwaWNrZXIgaGFzIGJlZW4gb3BlbmVkLiAqL1xuICAgIEBPdXRwdXQoJ29wZW5lZCcpIG9wZW5lZFN0cmVhbTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRhdGVwaWNrZXIgaGFzIGJlZW4gY2xvc2VkLiAqL1xuICAgIEBPdXRwdXQoJ2Nsb3NlZCcpIGNsb3NlZFN0cmVhbTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHZpZXcgaGFzIGJlZW4gY2hhbmdlZC4gKiovXG4gICAgQE91dHB1dCgpIHZpZXdDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8R0lQSUNhbGVuZGFyVmlldz4gPSBuZXcgRXZlbnRFbWl0dGVyPEdJUElDYWxlbmRhclZpZXc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBuZXcgc2VsZWN0ZWQgZGF0ZSB3aGVuIHNlbGVjdGVkIGRhdGUgY2hhbmdlcy5cbiAgICAgKiBAZGVwcmVjYXRlZCBTd2l0Y2ggdG8gdGhlIGBkYXRlQ2hhbmdlYCBhbmQgYGRhdGVJbnB1dGAgYmluZGluZyBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEPigpO1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZS4gKi9cbiAgICBnZXQgX3NlbGVjdGVkKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkU2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgc2V0IF9zZWxlY3RlZCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRTZWxlY3RlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgZ2V0IF9taW5EYXRlKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVwaWNrZXJJbnB1dCAmJiB0aGlzLl9kYXRlcGlja2VySW5wdXQubWluO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWF4aW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgZ2V0IF9tYXhEYXRlKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVwaWNrZXJJbnB1dCAmJiB0aGlzLl9kYXRlcGlja2VySW5wdXQubWF4O1xuICAgIH1cblxuICAgIGdldCBfZGF0ZUZpbHRlcigpOiAoZGF0ZTogRCB8IG51bGwsIHR5cGU6IEdJUElEYXRldGltZXBpY2tlckZpbHRlclR5cGUpID0+IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZXBpY2tlcklucHV0ICYmIHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5fZGF0ZUZpbHRlcjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBASW5qZWN0KE1BVF9EQVRFUElDS0VSX1NDUk9MTF9TVFJBVEVHWSkgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3ksXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBHSVBJRGF0ZXRpbWVBZGFwdGVyPEQ+LFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55XG4gICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGF0ZUFkYXB0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yKCdEYXRlQWRhcHRlcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZUZvY3VzKCkge1xuICAgICAgICBpZiAoIXRoaXMub3BlbmVkICYmIHRoaXMub3Blbk9uRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3ZpZXdDaGFuZ2VkKHR5cGU6IEdJUElDYWxlbmRhclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlZC5lbWl0KHR5cGUpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2lucHV0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cFJlZi5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU2VsZWN0cyB0aGUgZ2l2ZW4gZGF0ZSAqL1xuICAgIF9zZWxlY3QoZGF0ZTogRCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NlbGVjdGVkO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGRhdGU7XG4gICAgICAgIGlmICghdGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGV0aW1lKG9sZFZhbHVlLCB0aGlzLl9zZWxlY3RlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2VkLmVtaXQoZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhbiBpbnB1dCB3aXRoIHRoaXMgZGF0ZXBpY2tlci5cbiAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGRhdGVwaWNrZXIgaW5wdXQgdG8gcmVnaXN0ZXIgd2l0aCB0aGlzIGRhdGVwaWNrZXIuXG4gICAgICovXG4gICAgX3JlZ2lzdGVySW5wdXQoaW5wdXQ6IEdJUElEYXRldGltZXBpY2tlcklucHV0RGlyZWN0aXZlPEQ+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRlcGlja2VySW5wdXQpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdBIE1hdERhdGVwaWNrZXIgY2FuIG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGVwaWNrZXJJbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9pbnB1dFN1YnNjcmlwdGlvbiA9IHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5fdmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogRCB8IG51bGwpID0+ICh0aGlzLl9zZWxlY3RlZCA9IHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqIE9wZW4gdGhlIGNhbGVuZGFyLiAqL1xuICAgIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wZW5lZCB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9kYXRlcGlja2VySW5wdXQpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdBdHRlbXB0ZWQgdG8gb3BlbiBhbiBNYXREYXRlcGlja2VyIHdpdGggbm8gYXNzb2NpYXRlZCBpbnB1dC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiA9IHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdWNoVWkgPyB0aGlzLl9vcGVuQXNEaWFsb2coKSA6IHRoaXMuX29wZW5Bc1BvcHVwKCk7XG4gICAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcGVuZWRTdHJlYW0uZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKiBDbG9zZSB0aGUgY2FsZW5kYXIuICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcG9wdXBSZWYgJiYgdGhpcy5fcG9wdXBSZWYuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fcG9wdXBSZWYuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclBvcnRhbCAmJiB0aGlzLl9jYWxlbmRhclBvcnRhbC5pc0F0dGFjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclBvcnRhbC5kZXRhY2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlQ2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUaGUgYF9vcGVuZWRgIGNvdWxkJ3ZlIGJlZW4gcmVzZXQgYWxyZWFkeSBpZlxuICAgICAgICAgICAgLy8gd2UgZ290IHR3byBldmVudHMgaW4gcXVpY2sgc3VjY2Vzc2lvbi5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZWRTdHJlYW0uZW1pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiAmJiB0eXBlb2YgdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBCZWNhdXNlIElFIG1vdmVzIGZvY3VzIGFzeW5jaHJvbm91c2x5LCB3ZSBjYW4ndCBjb3VudCBvbiBpdCBiZWluZyByZXN0b3JlZCBiZWZvcmUgd2UndmVcbiAgICAgICAgICAgIC8vIG1hcmtlZCB0aGUgZGF0ZXBpY2tlciBhcyBjbG9zZWQuIElmIHRoZSBldmVudCBmaXJlcyBvdXQgb2Ygc2VxdWVuY2UgYW5kIHRoZSBlbGVtZW50IHRoYXRcbiAgICAgICAgICAgIC8vIHdlJ3JlIHJlZm9jdXNpbmcgb3BlbnMgdGhlIGRhdGVwaWNrZXIgb24gZm9jdXMsIHRoZSB1c2VyIGNvdWxkIGJlIHN0dWNrIHdpdGggbm90IGJlaW5nXG4gICAgICAgICAgICAvLyBhYmxlIHRvIGNsb3NlIHRoZSBjYWxlbmRhciBhdCBhbGwuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IG1ha2luZyB0aGUgbG9naWMsIHRoYXQgbWFya3NcbiAgICAgICAgICAgIC8vIHRoZSBkYXRlcGlja2VyIGFzIGNsb3NlZCwgYXN5bmMgYXMgd2VsbC5cbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3Blbi5mb2N1cygpO1xuICAgICAgICAgICAgc2V0VGltZW91dChjb21wbGV0ZUNsb3NlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBsZXRlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBPcGVuIHRoZSBjYWxlbmRhciBhcyBhIGRpYWxvZy4gKi9cbiAgICBwcml2YXRlIF9vcGVuQXNEaWFsb2coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuKEdJUElEYXRldGltZXBpY2tlckNvbnRlbnRDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy5fZGlyID8gdGhpcy5fZGlyLnZhbHVlIDogJ2x0cicsXG4gICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiB0aGlzLl92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2dpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1kaWFsb2cnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRldGltZXBpY2tlciA9IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqIE9wZW4gdGhlIGNhbGVuZGFyIGFzIGEgcG9wdXAuICovXG4gICAgcHJpdmF0ZSBfb3BlbkFzUG9wdXAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsZW5kYXJQb3J0YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbDxHSVBJRGF0ZXRpbWVwaWNrZXJDb250ZW50Q29tcG9uZW50PEQ+PihHSVBJRGF0ZXRpbWVwaWNrZXJDb250ZW50Q29tcG9uZW50LCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXBSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwUmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPEdJUElEYXRldGltZXBpY2tlckNvbnRlbnRDb21wb25lbnQ8RD4+ID0gdGhpcy5fcG9wdXBSZWYuYXR0YWNoKHRoaXMuX2NhbGVuZGFyUG9ydGFsKTtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kYXRldGltZXBpY2tlciA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb25jZSB0aGUgY2FsZW5kYXIgaGFzIHJlbmRlcmVkLlxuICAgICAgICAgICAgdGhpcy5fbmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3BvcHVwUmVmLnVwZGF0ZVBvc2l0aW9uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9wdXBSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgdGhlIHBvcHVwLiAqL1xuICAgIHByaXZhdGUgX2NyZWF0ZVBvcHVwKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fY3JlYXRlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KCksXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdtYXQtb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuX2RpciA/IHRoaXMuX2Rpci52YWx1ZSA6ICdsdHInLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX3Njcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLXBvcHVwJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXBSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRlIHRoZSBwb3B1cCBQb3NpdGlvblN0cmF0ZWd5LiAqL1xuICAgIHByaXZhdGUgX2NyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneSgpOiBQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlcbiAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9kYXRlcGlja2VySW5wdXQuZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpKVxuICAgICAgICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLmdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1jb250ZW50JylcbiAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbigpXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgIH1cblxufVxuIl19
|