@gipisistemas/ng-core 1.1.10 → 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 +3497 -146
- 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-crud.component.d.ts +2 -2
- package/core/gipi-components/components/abstract-find.component.d.ts +5 -4
- package/core/gipi-components/components/abstract.component.d.ts +1 -0
- package/esm2015/core/components/abstract-find.component.js +4 -1
- package/esm2015/core/gipi-components/components/abstract-crud.component.js +5 -5
- package/esm2015/core/gipi-components/components/abstract-find.component.js +45 -21
- 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/components/abstract-find.component.js +4 -1
- package/esm5/core/gipi-components/components/abstract-crud.component.js +5 -5
- package/esm5/core/gipi-components/components/abstract-find.component.js +45 -21
- 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 +3264 -191
- package/fesm2015/gipisistemas-ng-core.js.map +1 -1
- package/fesm5/gipisistemas-ng-core.js +3475 -152
- 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,495 @@
|
|
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
|
+
var 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
|
+
var GIPIDatetimepickerContentComponent = /** @class */ (function () {
|
26
|
+
function GIPIDatetimepickerContentComponent() {
|
27
|
+
}
|
28
|
+
GIPIDatetimepickerContentComponent.prototype.ngAfterContentInit = function () {
|
29
|
+
this._calendar._focusActiveCell();
|
30
|
+
};
|
31
|
+
GIPIDatetimepickerContentComponent.prototype.onSelectionChange = function (date) {
|
32
|
+
this.datetimepicker._select(date);
|
33
|
+
this.datetimepicker.close();
|
34
|
+
};
|
35
|
+
/**
|
36
|
+
* Handles keydown event on datepicker content.
|
37
|
+
* @param event The event.
|
38
|
+
*/
|
39
|
+
GIPIDatetimepickerContentComponent.prototype._handleKeydown = function (event) {
|
40
|
+
if (event.keyCode === ESCAPE) {
|
41
|
+
this.datetimepicker.close();
|
42
|
+
event.preventDefault();
|
43
|
+
event.stopPropagation();
|
44
|
+
}
|
45
|
+
};
|
46
|
+
__decorate([
|
47
|
+
ViewChild(GIPIDatetimepickerCalendarComponent, { static: true }),
|
48
|
+
__metadata("design:type", GIPIDatetimepickerCalendarComponent)
|
49
|
+
], GIPIDatetimepickerContentComponent.prototype, "_calendar", void 0);
|
50
|
+
GIPIDatetimepickerContentComponent = __decorate([
|
51
|
+
Component({
|
52
|
+
selector: 'gipi-mat-datetime-picker-content',
|
53
|
+
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>",
|
54
|
+
encapsulation: ViewEncapsulation.None,
|
55
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
56
|
+
host: {
|
57
|
+
class: 'gipi-mat-datetime-picker-content',
|
58
|
+
'[class.gipi-mat-datetime-picker-content-touch]': 'datetimepicker?.touchUi',
|
59
|
+
'(keydown)': '_handleKeydown($event)',
|
60
|
+
},
|
61
|
+
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}"]
|
62
|
+
})
|
63
|
+
], GIPIDatetimepickerContentComponent);
|
64
|
+
return GIPIDatetimepickerContentComponent;
|
65
|
+
}());
|
66
|
+
export { GIPIDatetimepickerContentComponent };
|
67
|
+
var GIPIDatetimepickerComponent = /** @class */ (function () {
|
68
|
+
function GIPIDatetimepickerComponent(_dialog, _overlay, _ngZone, _viewContainerRef, _scrollStrategy, _dateAdapter, _dir, _document) {
|
69
|
+
this._dialog = _dialog;
|
70
|
+
this._overlay = _overlay;
|
71
|
+
this._ngZone = _ngZone;
|
72
|
+
this._viewContainerRef = _viewContainerRef;
|
73
|
+
this._scrollStrategy = _scrollStrategy;
|
74
|
+
this._dateAdapter = _dateAdapter;
|
75
|
+
this._dir = _dir;
|
76
|
+
this._document = _document;
|
77
|
+
/** Whether the calendar is open. */
|
78
|
+
this.opened = false;
|
79
|
+
/** The id for the datepicker calendar. */
|
80
|
+
this.id = "gipi-mat-datetime-picker-" + datetimepickerUid++;
|
81
|
+
/** Emits when the datepicker is disabled. */
|
82
|
+
this._disabledChange = new Subject();
|
83
|
+
this._validSelected = null;
|
84
|
+
/** The element that was focused before the datepicker was opened. */
|
85
|
+
this._focusedElementBeforeOpen = null;
|
86
|
+
this._inputSubscription = Subscription.EMPTY;
|
87
|
+
/** Active multi year view when click on year. */
|
88
|
+
this.multiYearSelector = false;
|
89
|
+
/** if true change the clock to 12 hour format. */
|
90
|
+
this.twelvehour = false;
|
91
|
+
/** The view that the calendar should start in. */
|
92
|
+
this.startView = 'month';
|
93
|
+
this.mode = 'auto';
|
94
|
+
this.timeInterval = 1;
|
95
|
+
this.ariaNextMonthLabel = 'Next month';
|
96
|
+
this.ariaPrevMonthLabel = 'Previous month';
|
97
|
+
this.ariaNextYearLabel = 'Next year';
|
98
|
+
this.ariaPrevYearLabel = 'Previous year';
|
99
|
+
/** Prevent user to select same date time */
|
100
|
+
this.preventSameDateTimeSelection = false;
|
101
|
+
this._type = 'date';
|
102
|
+
/** 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. */
|
103
|
+
this._touchUi = false;
|
104
|
+
/** Emits when the datepicker has been opened. */
|
105
|
+
this.openedStream = new EventEmitter();
|
106
|
+
/** Emits when the datepicker has been closed. */
|
107
|
+
this.closedStream = new EventEmitter();
|
108
|
+
/** Emits when the view has been changed. **/
|
109
|
+
this.viewChanged = new EventEmitter();
|
110
|
+
/**
|
111
|
+
* Emits new selected date when selected date changes.
|
112
|
+
* @deprecated Switch to the `dateChange` and `dateInput` binding on the input element.
|
113
|
+
*/
|
114
|
+
this.selectedChanged = new EventEmitter();
|
115
|
+
if (!this._dateAdapter) {
|
116
|
+
throw createMissingDateImplError('DateAdapter');
|
117
|
+
}
|
118
|
+
}
|
119
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "startAt", {
|
120
|
+
get: function () {
|
121
|
+
// If an explicit startAt is set we start there, otherwise we start at whatever the currently selected value is.
|
122
|
+
return (this._startAt || (this._datepickerInput ? this._datepickerInput.value : null));
|
123
|
+
},
|
124
|
+
set: function (date) {
|
125
|
+
this._startAt = this._dateAdapter.getValidDateOrNull(date);
|
126
|
+
},
|
127
|
+
enumerable: false,
|
128
|
+
configurable: true
|
129
|
+
});
|
130
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "openOnFocus", {
|
131
|
+
get: function () {
|
132
|
+
return this._openOnFocus;
|
133
|
+
},
|
134
|
+
set: function (value) {
|
135
|
+
this._openOnFocus = coerceBooleanProperty(value);
|
136
|
+
},
|
137
|
+
enumerable: false,
|
138
|
+
configurable: true
|
139
|
+
});
|
140
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "type", {
|
141
|
+
get: function () {
|
142
|
+
return this._type;
|
143
|
+
},
|
144
|
+
set: function (value) {
|
145
|
+
this._type = value || 'date';
|
146
|
+
},
|
147
|
+
enumerable: false,
|
148
|
+
configurable: true
|
149
|
+
});
|
150
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "touchUi", {
|
151
|
+
get: function () {
|
152
|
+
return this._touchUi;
|
153
|
+
},
|
154
|
+
set: function (value) {
|
155
|
+
this._touchUi = coerceBooleanProperty(value);
|
156
|
+
},
|
157
|
+
enumerable: false,
|
158
|
+
configurable: true
|
159
|
+
});
|
160
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "disabled", {
|
161
|
+
get: function () {
|
162
|
+
return this._disabled === undefined && this._datepickerInput
|
163
|
+
? this._datepickerInput.disabled
|
164
|
+
: !!this._disabled;
|
165
|
+
},
|
166
|
+
set: function (value) {
|
167
|
+
var newValue = coerceBooleanProperty(value);
|
168
|
+
if (newValue !== this._disabled) {
|
169
|
+
this._disabled = newValue;
|
170
|
+
this._disabledChange.next(newValue);
|
171
|
+
}
|
172
|
+
},
|
173
|
+
enumerable: false,
|
174
|
+
configurable: true
|
175
|
+
});
|
176
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "_selected", {
|
177
|
+
/** The currently selected date. */
|
178
|
+
get: function () {
|
179
|
+
return this._validSelected;
|
180
|
+
},
|
181
|
+
set: function (value) {
|
182
|
+
this._validSelected = value;
|
183
|
+
},
|
184
|
+
enumerable: false,
|
185
|
+
configurable: true
|
186
|
+
});
|
187
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "_minDate", {
|
188
|
+
/** The minimum selectable date. */
|
189
|
+
get: function () {
|
190
|
+
return this._datepickerInput && this._datepickerInput.min;
|
191
|
+
},
|
192
|
+
enumerable: false,
|
193
|
+
configurable: true
|
194
|
+
});
|
195
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "_maxDate", {
|
196
|
+
/** The maximum selectable date. */
|
197
|
+
get: function () {
|
198
|
+
return this._datepickerInput && this._datepickerInput.max;
|
199
|
+
},
|
200
|
+
enumerable: false,
|
201
|
+
configurable: true
|
202
|
+
});
|
203
|
+
Object.defineProperty(GIPIDatetimepickerComponent.prototype, "_dateFilter", {
|
204
|
+
get: function () {
|
205
|
+
return this._datepickerInput && this._datepickerInput._dateFilter;
|
206
|
+
},
|
207
|
+
enumerable: false,
|
208
|
+
configurable: true
|
209
|
+
});
|
210
|
+
GIPIDatetimepickerComponent.prototype._handleFocus = function () {
|
211
|
+
if (!this.opened && this.openOnFocus) {
|
212
|
+
this.open();
|
213
|
+
}
|
214
|
+
};
|
215
|
+
GIPIDatetimepickerComponent.prototype._viewChanged = function (type) {
|
216
|
+
this.viewChanged.emit(type);
|
217
|
+
};
|
218
|
+
GIPIDatetimepickerComponent.prototype.ngOnDestroy = function () {
|
219
|
+
this.close();
|
220
|
+
this._inputSubscription.unsubscribe();
|
221
|
+
this._disabledChange.complete();
|
222
|
+
if (this._popupRef) {
|
223
|
+
this._popupRef.dispose();
|
224
|
+
}
|
225
|
+
};
|
226
|
+
/** Selects the given date */
|
227
|
+
GIPIDatetimepickerComponent.prototype._select = function (date) {
|
228
|
+
var oldValue = this._selected;
|
229
|
+
this._selected = date;
|
230
|
+
if (!this._dateAdapter.sameDatetime(oldValue, this._selected)) {
|
231
|
+
this.selectedChanged.emit(date);
|
232
|
+
}
|
233
|
+
};
|
234
|
+
/**
|
235
|
+
* Register an input with this datepicker.
|
236
|
+
* @param input The datepicker input to register with this datepicker.
|
237
|
+
*/
|
238
|
+
GIPIDatetimepickerComponent.prototype._registerInput = function (input) {
|
239
|
+
var _this = this;
|
240
|
+
if (this._datepickerInput) {
|
241
|
+
throw Error('A MatDatepicker can only be associated with a single input.');
|
242
|
+
}
|
243
|
+
this._datepickerInput = input;
|
244
|
+
this._inputSubscription = this._datepickerInput._valueChange.subscribe(function (value) { return (_this._selected = value); });
|
245
|
+
};
|
246
|
+
/** Open the calendar. */
|
247
|
+
GIPIDatetimepickerComponent.prototype.open = function () {
|
248
|
+
if (this.opened || this.disabled) {
|
249
|
+
return;
|
250
|
+
}
|
251
|
+
if (!this._datepickerInput) {
|
252
|
+
throw Error('Attempted to open an MatDatepicker with no associated input.');
|
253
|
+
}
|
254
|
+
if (this._document) {
|
255
|
+
this._focusedElementBeforeOpen = this._document.activeElement;
|
256
|
+
}
|
257
|
+
this.touchUi ? this._openAsDialog() : this._openAsPopup();
|
258
|
+
this.opened = true;
|
259
|
+
this.openedStream.emit();
|
260
|
+
};
|
261
|
+
/** Close the calendar. */
|
262
|
+
GIPIDatetimepickerComponent.prototype.close = function () {
|
263
|
+
var _this = this;
|
264
|
+
if (!this.opened) {
|
265
|
+
return;
|
266
|
+
}
|
267
|
+
if (this._popupRef && this._popupRef.hasAttached()) {
|
268
|
+
this._popupRef.detach();
|
269
|
+
}
|
270
|
+
if (this._dialogRef) {
|
271
|
+
this._dialogRef.close();
|
272
|
+
this._dialogRef = null;
|
273
|
+
}
|
274
|
+
if (this._calendarPortal && this._calendarPortal.isAttached) {
|
275
|
+
this._calendarPortal.detach();
|
276
|
+
}
|
277
|
+
var completeClose = function () {
|
278
|
+
// The `_opened` could've been reset already if
|
279
|
+
// we got two events in quick succession.
|
280
|
+
if (_this.opened) {
|
281
|
+
_this.opened = false;
|
282
|
+
_this.closedStream.emit();
|
283
|
+
_this._focusedElementBeforeOpen = null;
|
284
|
+
}
|
285
|
+
};
|
286
|
+
if (this._focusedElementBeforeOpen && typeof this._focusedElementBeforeOpen.focus === 'function') {
|
287
|
+
// Because IE moves focus asynchronously, we can't count on it being restored before we've
|
288
|
+
// marked the datepicker as closed. If the event fires out of sequence and the element that
|
289
|
+
// we're refocusing opens the datepicker on focus, the user could be stuck with not being
|
290
|
+
// able to close the calendar at all. We work around it by making the logic, that marks
|
291
|
+
// the datepicker as closed, async as well.
|
292
|
+
this._focusedElementBeforeOpen.focus();
|
293
|
+
setTimeout(completeClose);
|
294
|
+
}
|
295
|
+
else {
|
296
|
+
completeClose();
|
297
|
+
}
|
298
|
+
};
|
299
|
+
/** Open the calendar as a dialog. */
|
300
|
+
GIPIDatetimepickerComponent.prototype._openAsDialog = function () {
|
301
|
+
var _this = this;
|
302
|
+
this._dialogRef = this._dialog.open(GIPIDatetimepickerContentComponent, {
|
303
|
+
direction: this._dir ? this._dir.value : 'ltr',
|
304
|
+
viewContainerRef: this._viewContainerRef,
|
305
|
+
panelClass: 'gipi-mat-datetime-picker-dialog',
|
306
|
+
});
|
307
|
+
this._dialogRef.afterClosed().subscribe(function () { return _this.close(); });
|
308
|
+
this._dialogRef.componentInstance.datetimepicker = this;
|
309
|
+
};
|
310
|
+
/** Open the calendar as a popup. */
|
311
|
+
GIPIDatetimepickerComponent.prototype._openAsPopup = function () {
|
312
|
+
var _this = this;
|
313
|
+
if (!this._calendarPortal) {
|
314
|
+
this._calendarPortal = new ComponentPortal(GIPIDatetimepickerContentComponent, this._viewContainerRef);
|
315
|
+
}
|
316
|
+
if (!this._popupRef) {
|
317
|
+
this._createPopup();
|
318
|
+
}
|
319
|
+
if (!this._popupRef.hasAttached()) {
|
320
|
+
var componentRef = this._popupRef.attach(this._calendarPortal);
|
321
|
+
componentRef.instance.datetimepicker = this;
|
322
|
+
// Update the position once the calendar has rendered.
|
323
|
+
this._ngZone.onStable
|
324
|
+
.asObservable()
|
325
|
+
.pipe(first())
|
326
|
+
.subscribe(function () { return _this._popupRef.updatePosition(); });
|
327
|
+
}
|
328
|
+
this._popupRef.backdropClick().subscribe(function () { return _this.close(); });
|
329
|
+
};
|
330
|
+
/** Create the popup. */
|
331
|
+
GIPIDatetimepickerComponent.prototype._createPopup = function () {
|
332
|
+
var overlayConfig = new OverlayConfig({
|
333
|
+
positionStrategy: this._createPopupPositionStrategy(),
|
334
|
+
hasBackdrop: true,
|
335
|
+
backdropClass: 'mat-overlay-transparent-backdrop',
|
336
|
+
direction: this._dir ? this._dir.value : 'ltr',
|
337
|
+
scrollStrategy: this._scrollStrategy(),
|
338
|
+
panelClass: 'gipi-mat-datetime-picker-popup',
|
339
|
+
});
|
340
|
+
this._popupRef = this._overlay.create(overlayConfig);
|
341
|
+
};
|
342
|
+
/** Create the popup PositionStrategy. */
|
343
|
+
GIPIDatetimepickerComponent.prototype._createPopupPositionStrategy = function () {
|
344
|
+
return this._overlay
|
345
|
+
.position()
|
346
|
+
.flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())
|
347
|
+
.withTransformOriginOn('.gipi-mat-datetime-picker-content')
|
348
|
+
.withFlexibleDimensions(false)
|
349
|
+
.withViewportMargin(8)
|
350
|
+
.withLockedPosition()
|
351
|
+
.withPositions([
|
352
|
+
{
|
353
|
+
originX: 'start',
|
354
|
+
originY: 'bottom',
|
355
|
+
overlayX: 'start',
|
356
|
+
overlayY: 'top',
|
357
|
+
},
|
358
|
+
{
|
359
|
+
originX: 'start',
|
360
|
+
originY: 'top',
|
361
|
+
overlayX: 'start',
|
362
|
+
overlayY: 'bottom',
|
363
|
+
},
|
364
|
+
{
|
365
|
+
originX: 'end',
|
366
|
+
originY: 'bottom',
|
367
|
+
overlayX: 'end',
|
368
|
+
overlayY: 'top',
|
369
|
+
},
|
370
|
+
{
|
371
|
+
originX: 'end',
|
372
|
+
originY: 'top',
|
373
|
+
overlayX: 'end',
|
374
|
+
overlayY: 'bottom',
|
375
|
+
},
|
376
|
+
]);
|
377
|
+
};
|
378
|
+
GIPIDatetimepickerComponent.ctorParameters = function () { return [
|
379
|
+
{ type: MatDialog },
|
380
|
+
{ type: Overlay },
|
381
|
+
{ type: NgZone },
|
382
|
+
{ type: ViewContainerRef },
|
383
|
+
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DATEPICKER_SCROLL_STRATEGY,] }] },
|
384
|
+
{ type: GIPIDatetimeAdapter, decorators: [{ type: Optional }] },
|
385
|
+
{ type: Directionality, decorators: [{ type: Optional }] },
|
386
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }
|
387
|
+
]; };
|
388
|
+
__decorate([
|
389
|
+
Input(),
|
390
|
+
__metadata("design:type", Boolean)
|
391
|
+
], GIPIDatetimepickerComponent.prototype, "multiYearSelector", void 0);
|
392
|
+
__decorate([
|
393
|
+
Input(),
|
394
|
+
__metadata("design:type", Boolean)
|
395
|
+
], GIPIDatetimepickerComponent.prototype, "twelvehour", void 0);
|
396
|
+
__decorate([
|
397
|
+
Input(),
|
398
|
+
__metadata("design:type", String)
|
399
|
+
], GIPIDatetimepickerComponent.prototype, "startView", void 0);
|
400
|
+
__decorate([
|
401
|
+
Input(),
|
402
|
+
__metadata("design:type", String)
|
403
|
+
], GIPIDatetimepickerComponent.prototype, "mode", void 0);
|
404
|
+
__decorate([
|
405
|
+
Input(),
|
406
|
+
__metadata("design:type", Number)
|
407
|
+
], GIPIDatetimepickerComponent.prototype, "timeInterval", void 0);
|
408
|
+
__decorate([
|
409
|
+
Input(),
|
410
|
+
__metadata("design:type", Object)
|
411
|
+
], GIPIDatetimepickerComponent.prototype, "ariaNextMonthLabel", void 0);
|
412
|
+
__decorate([
|
413
|
+
Input(),
|
414
|
+
__metadata("design:type", Object)
|
415
|
+
], GIPIDatetimepickerComponent.prototype, "ariaPrevMonthLabel", void 0);
|
416
|
+
__decorate([
|
417
|
+
Input(),
|
418
|
+
__metadata("design:type", Object)
|
419
|
+
], GIPIDatetimepickerComponent.prototype, "ariaNextYearLabel", void 0);
|
420
|
+
__decorate([
|
421
|
+
Input(),
|
422
|
+
__metadata("design:type", Object)
|
423
|
+
], GIPIDatetimepickerComponent.prototype, "ariaPrevYearLabel", void 0);
|
424
|
+
__decorate([
|
425
|
+
Input(),
|
426
|
+
__metadata("design:type", Object)
|
427
|
+
], GIPIDatetimepickerComponent.prototype, "preventSameDateTimeSelection", void 0);
|
428
|
+
__decorate([
|
429
|
+
Input(),
|
430
|
+
__metadata("design:type", Object)
|
431
|
+
], GIPIDatetimepickerComponent.prototype, "panelClass", void 0);
|
432
|
+
__decorate([
|
433
|
+
Input(),
|
434
|
+
__metadata("design:type", Object),
|
435
|
+
__metadata("design:paramtypes", [Object])
|
436
|
+
], GIPIDatetimepickerComponent.prototype, "startAt", null);
|
437
|
+
__decorate([
|
438
|
+
Input(),
|
439
|
+
__metadata("design:type", Boolean),
|
440
|
+
__metadata("design:paramtypes", [Boolean])
|
441
|
+
], GIPIDatetimepickerComponent.prototype, "openOnFocus", null);
|
442
|
+
__decorate([
|
443
|
+
Input(),
|
444
|
+
__metadata("design:type", String),
|
445
|
+
__metadata("design:paramtypes", [String])
|
446
|
+
], GIPIDatetimepickerComponent.prototype, "type", null);
|
447
|
+
__decorate([
|
448
|
+
Input(),
|
449
|
+
__metadata("design:type", Boolean),
|
450
|
+
__metadata("design:paramtypes", [Boolean])
|
451
|
+
], GIPIDatetimepickerComponent.prototype, "touchUi", null);
|
452
|
+
__decorate([
|
453
|
+
Input(),
|
454
|
+
__metadata("design:type", Boolean),
|
455
|
+
__metadata("design:paramtypes", [Boolean])
|
456
|
+
], GIPIDatetimepickerComponent.prototype, "disabled", null);
|
457
|
+
__decorate([
|
458
|
+
Output('opened'),
|
459
|
+
__metadata("design:type", EventEmitter)
|
460
|
+
], GIPIDatetimepickerComponent.prototype, "openedStream", void 0);
|
461
|
+
__decorate([
|
462
|
+
Output('closed'),
|
463
|
+
__metadata("design:type", EventEmitter)
|
464
|
+
], GIPIDatetimepickerComponent.prototype, "closedStream", void 0);
|
465
|
+
__decorate([
|
466
|
+
Output(),
|
467
|
+
__metadata("design:type", EventEmitter)
|
468
|
+
], GIPIDatetimepickerComponent.prototype, "viewChanged", void 0);
|
469
|
+
__decorate([
|
470
|
+
Output(),
|
471
|
+
__metadata("design:type", Object)
|
472
|
+
], GIPIDatetimepickerComponent.prototype, "selectedChanged", void 0);
|
473
|
+
GIPIDatetimepickerComponent = __decorate([
|
474
|
+
Component({
|
475
|
+
selector: 'gipi-mat-datetime-picker',
|
476
|
+
exportAs: 'gipiDatetimePicker',
|
477
|
+
template: '',
|
478
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
479
|
+
encapsulation: ViewEncapsulation.None,
|
480
|
+
preserveWhitespaces: false
|
481
|
+
}),
|
482
|
+
__param(4, Inject(MAT_DATEPICKER_SCROLL_STRATEGY)),
|
483
|
+
__param(5, Optional()),
|
484
|
+
__param(6, Optional()),
|
485
|
+
__param(7, Optional()), __param(7, Inject(DOCUMENT)),
|
486
|
+
__metadata("design:paramtypes", [MatDialog,
|
487
|
+
Overlay,
|
488
|
+
NgZone,
|
489
|
+
ViewContainerRef, Object, GIPIDatetimeAdapter,
|
490
|
+
Directionality, Object])
|
491
|
+
], GIPIDatetimepickerComponent);
|
492
|
+
return GIPIDatetimepickerComponent;
|
493
|
+
}());
|
494
|
+
export { GIPIDatetimepickerComponent };
|
495
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVwaWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZ2lwaXNpc3RlbWFzL25nLWNvcmUvIiwic291cmNlcyI6WyJzaGFyZWQvZ2lwaS1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlci9tYXQtZGF0ZXRpbWUtcGlja2VyL2RhdGV0aW1lcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsR0FBRyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUN0TixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQW9CLG1DQUFtQyxHQUFHLE1BQU0sWUFBWSxD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QUlQO0lBVWlCO1FBQWpCLE1BQU0sQ0FBQyxRQUFRLENBQUM7a0NBQWUsWUFBWTtxRUFBa0M7SUFHNUQ7UUFBakIsTUFBTSxDQUFDLFFBQVEsQ0FBQztrQ0FBZSxZQUFZO3FFQUFrQztJQUdwRTtRQUFULE1BQU0sRUFBRTtrQ0FBYyxZQUFZO29FQUEwRDtJQU1uRjtRQUFULE1BQU0sRUFBRTs7d0VBQXlDO0lBbEh6QywyQkFBMkI7UUFSdkMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFFBQVEsRUFBRSxFQUFFO1lBQ1osZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07WUFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7WUFDckMsbUJBQW1CLEVBQUUsS0FBSztTQUM3QixDQUFDO1FBaUpPLFdBQUEsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUE7UUFDdEMsV0FBQSxRQUFRLEVBQUUsQ0FBQTtRQUNWLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7eUNBUFosU0FBUztZQUNSLE9BQU87WUFDUixNQUFNO1lBQ0ksZ0JBQWdCLFVBRVQsbUJBQW1CO1lBQzNCLGNBQWM7T0FsSm5DLDJCQUEyQixDQWlWdkM7SUFBRCxrQ0FBQztDQUFBLEFBalZELElBaVZDO1NBalZZLDJCQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEVTQ0FQRSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmLCBQb3NpdGlvblN0cmF0ZWd5LCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPcHRpb25hbCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RBVEVQSUNLRVJfU0NST0xMX1NUUkFURUdZIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBHSVBJQ2FsZW5kYXJWaWV3LCBHSVBJRGF0ZXRpbWVwaWNrZXJDYWxlbmRhckNvbXBvbmVudCwgfSBmcm9tICcuL2NhbGVuZGFyJztcbmltcG9ydCB7IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yIH0gZnJvbSAnLi9kYXRldGltZXBpY2tlci1lcnJvcnMnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lcGlja2VyRmlsdGVyVHlwZSB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItZmlsdGVydHlwZSc7XG5pbXBvcnQgeyBHSVBJRGF0ZXRpbWVwaWNrZXJJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItaW5wdXQnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lcGlja2VyVHlwZSB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItdHlwZSc7XG5pbXBvcnQgeyBHSVBJRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnLi9zaGFyZWQvYWRhcHRlci9kYXRldGltZS1hZGFwdGVyJztcblxuZXhwb3J0IHR5cGUgR0lQSURhdGV0aW1lcGlja2VyTW9kZSA9ICdhdXRvJyB8ICdwb3J0cmFpdCcgfCAnbGFuZHNjYXBlJztcblxuLyoqIFVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIGVhY2ggZGF0ZXBpY2tlciBpbnN0YW5jZS4gKi9cbmxldCBkYXRldGltZXBpY2tlclVpZCA9IDA7XG5cbi8qKlxuICogQ29tcG9uZW50IHVzZWQgYXMgdGhlIGNvbnRlbnQgZm9yIHRoZSBkYXRlcGlja2VyIGRpYWxvZyBhbmQgcG9wdXAuIFdlIHVzZSB0aGlzIGluc3RlYWQgb2YgdXNpbmdcbiAqIE1hdENhbGVuZGFyIGRpcmVjdGx5IGFzIHRoZSBjb250ZW50IHNvIHdlIGNhbiBjb250cm9sIHRoZSBpbml0aWFsIGZvY3VzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYVxuICogcGxhY2UgdG8gcHV0IGFkZGl0aW9uYWwgZmVhdHVyZXMgb2YgdGhlIHBvcHVwIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjYWxlbmRhciBpdHNlbGYgaW4gdGhlXG4gKiBmdXR1cmUuIChlLmcuIGNvbmZpcm1hdGlvbiBidXR0b25zKS5cbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdnaXBpLW1hdC1kYXRldGltZS1waWNrZXItY29udGVudCcsXG4gICAgdGVtcGxhdGVVcmw6ICdkYXRldGltZXBpY2tlci1jb250ZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydkYXRldGltZXBpY2tlci1jb250ZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdnaXBpLW1hdC1kYXRldGltZS1waWNrZXItY29udGVudCcsXG4gICAgICAgICdbY2xhc3MuZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNvbnRlbnQtdG91Y2hdJzogJ2RhdGV0aW1lcGlja2VyPy50b3VjaFVpJyxcbiAgICAgICAgJyhrZXlkb3duKSc6ICdfaGFuZGxlS2V5ZG93bigkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBHSVBJRGF0ZXRpbWVwaWNrZXJDb250ZW50Q29tcG9uZW50PEQ+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgICBAVmlld0NoaWxkKEdJUElEYXRldGltZXBpY2tlckNhbGVuZGFyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBfY2FsZW5kYXI6IEdJUElEYXRldGltZXBpY2tlckNhbGVuZGFyQ29tcG9uZW50PEQ+O1xuXG4gICAgZGF0ZXRpbWVwaWNrZXI6IEdJUElEYXRldGltZXBpY2tlckNvbXBvbmVudDxEPjtcblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIuX2ZvY3VzQWN0aXZlQ2VsbCgpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKGRhdGU6IEQpIHtcbiAgICAgICAgdGhpcy5kYXRldGltZXBpY2tlci5fc2VsZWN0KGRhdGUpO1xuICAgICAgICB0aGlzLmRhdGV0aW1lcGlja2VyLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBrZXlkb3duIGV2ZW50IG9uIGRhdGVwaWNrZXIgY29udGVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LlxuICAgICAqL1xuICAgIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBFU0NBUEUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdnaXBpLW1hdC1kYXRldGltZS1waWNrZXInLFxuICAgIGV4cG9ydEFzOiAnZ2lwaURhdGV0aW1lUGlja2VyJyxcbiAgICB0ZW1wbGF0ZTogJycsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgR0lQSURhdGV0aW1lcGlja2VyQ29tcG9uZW50PEQ+IGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBpcyBvcGVuLiAqL1xuICAgIG9wZW5lZCA9IGZhbHNlO1xuXG4gICAgLyoqIFRoZSBpZCBmb3IgdGhlIGRhdGVwaWNrZXIgY2FsZW5kYXIuICovXG4gICAgaWQgPSBgZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLSR7ZGF0ZXRpbWVwaWNrZXJVaWQrK31gO1xuXG4gICAgLyoqIFRoZSBpbnB1dCBlbGVtZW50IHRoaXMgZGF0ZXBpY2tlciBpcyBhc3NvY2lhdGVkIHdpdGguICovXG4gICAgX2RhdGVwaWNrZXJJbnB1dDogR0lQSURhdGV0aW1lcGlja2VySW5wdXREaXJlY3RpdmU8RD47XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgZGF0ZXBpY2tlciBpcyBkaXNhYmxlZC4gKi9cbiAgICBfZGlzYWJsZWRDaGFuZ2UgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgcHJpdmF0ZSBfdmFsaWRTZWxlY3RlZDogRCB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBvdmVybGF5IHdoZW4gdGhlIGNhbGVuZGFyIGlzIG9wZW5lZCBhcyBhIHBvcHVwLiAqL1xuICAgIHByaXZhdGUgX3BvcHVwUmVmOiBPdmVybGF5UmVmO1xuXG4gICAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBkaWFsb2cgd2hlbiB0aGUgY2FsZW5kYXIgaXMgb3BlbmVkIGFzIGEgZGlhbG9nLiAqL1xuICAgIHByaXZhdGUgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPGFueT4gfCBudWxsO1xuXG4gICAgLyoqIEEgcG9ydGFsIGNvbnRhaW5pbmcgdGhlIGNhbGVuZGFyIGZvciB0aGlzIGRhdGVwaWNrZXIuICovXG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxHSVBJRGF0ZXRpbWVwaWNrZXJDb250ZW50Q29tcG9uZW50PEQ+PjtcblxuICAgIC8qKiBUaGUgZWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgZGF0ZXBpY2tlciB3YXMgb3BlbmVkLiAqL1xuICAgIHByaXZhdGUgX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9pbnB1dFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICAgIC8qKiBBY3RpdmUgbXVsdGkgeWVhciB2aWV3IHdoZW4gY2xpY2sgb24geWVhci4gKi9cbiAgICBASW5wdXQoKSBtdWx0aVllYXJTZWxlY3RvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIGlmIHRydWUgY2hhbmdlIHRoZSBjbG9jayB0byAxMiBob3VyIGZvcm1hdC4gKi9cbiAgICBASW5wdXQoKSB0d2VsdmVob3VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVGhlIHZpZXcgdGhhdCB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IGluLiAqL1xuICAgIEBJbnB1dCgpIHN0YXJ0VmlldzogR0lQSUNhbGVuZGFyVmlldyA9ICdtb250aCc7XG4gICAgQElucHV0KCkgbW9kZTogR0lQSURhdGV0aW1lcGlja2VyTW9kZSA9ICdhdXRvJztcbiAgICBASW5wdXQoKSB0aW1lSW50ZXJ2YWw6IG51bWJlciA9IDE7XG4gICAgQElucHV0KCkgYXJpYU5leHRNb250aExhYmVsID0gJ05leHQgbW9udGgnO1xuICAgIEBJbnB1dCgpIGFyaWFQcmV2TW9udGhMYWJlbCA9ICdQcmV2aW91cyBtb250aCc7XG4gICAgQElucHV0KCkgYXJpYU5leHRZZWFyTGFiZWwgPSAnTmV4dCB5ZWFyJztcbiAgICBASW5wdXQoKSBhcmlhUHJldlllYXJMYWJlbCA9ICdQcmV2aW91cyB5ZWFyJztcblxuICAgIC8qKiBQcmV2ZW50IHVzZXIgdG8gc2VsZWN0IHNhbWUgZGF0ZSB0aW1lICovXG4gICAgQElucHV0KCkgcHJldmVudFNhbWVEYXRlVGltZVNlbGVjdGlvbiA9IGZhbHNlO1xuXG4gICAgLyoqIENsYXNzZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBkYXRlIHBpY2tlciBwYW5lbC4gU3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IGFzIGBuZ0NsYXNzYC4gKi9cbiAgICBASW5wdXQoKSBwYW5lbENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuXG4gICAgLyoqIFRoZSBkYXRlIHRvIG9wZW4gdGhlIGNhbGVuZGFyIHRvIGluaXRpYWxseS4gKi9cbiAgICBwcml2YXRlIF9zdGFydEF0OiBEIHwgbnVsbDtcbiAgICBASW5wdXQoKSBnZXQgc3RhcnRBdCgpOiBEIHwgbnVsbCB7XG4gICAgICAgIC8vIElmIGFuIGV4cGxpY2l0IHN0YXJ0QXQgaXMgc2V0IHdlIHN0YXJ0IHRoZXJlLCBvdGhlcndpc2Ugd2Ugc3RhcnQgYXQgd2hhdGV2ZXIgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZSBpcy5cbiAgICAgICAgcmV0dXJuICh0aGlzLl9zdGFydEF0IHx8ICh0aGlzLl9kYXRlcGlja2VySW5wdXQgPyB0aGlzLl9kYXRlcGlja2VySW5wdXQudmFsdWUgOiBudWxsKSk7XG4gICAgfVxuICAgIHNldCBzdGFydEF0KGRhdGU6IEQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0QXQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwoZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb3Blbk9uRm9jdXM6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZ2V0IG9wZW5PbkZvY3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3Blbk9uRm9jdXM7XG4gICAgfVxuICAgIHNldCBvcGVuT25Gb2N1cyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9vcGVuT25Gb2N1cyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdHlwZTogR0lQSURhdGV0aW1lcGlja2VyVHlwZSA9ICdkYXRlJztcbiAgICBASW5wdXQoKSBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuICAgIHNldCB0eXBlKHZhbHVlOiBHSVBJRGF0ZXRpbWVwaWNrZXJUeXBlKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB2YWx1ZSB8fCAnZGF0ZSc7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIFVJIGlzIGluIHRvdWNoIG1vZGUuIEluIHRvdWNoIG1vZGUgdGhlIGNhbGVuZGFyIG9wZW5zIGluIGEgZGlhbG9nIHJhdGhlciB0aGFuIGEgcG9wdXAgYW5kIGVsZW1lbnRzIGhhdmUgbW9yZSBwYWRkaW5nIHRvIGFsbG93IGZvciBiaWdnZXIgdG91Y2ggdGFyZ2V0cy4gKi9cbiAgICBwcml2YXRlIF90b3VjaFVpID0gZmFsc2U7XG4gICAgQElucHV0KCkgZ2V0IHRvdWNoVWkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3VjaFVpO1xuICAgIH1cbiAgICBzZXQgdG91Y2hVaSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl90b3VjaFVpID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgZGF0ZXBpY2tlciBwb3AtdXAgc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICAgIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkID09PSB1bmRlZmluZWQgJiYgdGhpcy5fZGF0ZXBpY2tlcklucHV0XG4gICAgICAgICAgICA/IHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5kaXNhYmxlZFxuICAgICAgICAgICAgOiAhIXRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsdWUgIT09IHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWRDaGFuZ2UubmV4dChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgZGF0ZXBpY2tlciBoYXMgYmVlbiBvcGVuZWQuICovXG4gICAgQE91dHB1dCgnb3BlbmVkJykgb3BlbmVkU3RyZWFtOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgZGF0ZXBpY2tlciBoYXMgYmVlbiBjbG9zZWQuICovXG4gICAgQE91dHB1dCgnY2xvc2VkJykgY2xvc2VkU3RyZWFtOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgdmlldyBoYXMgYmVlbiBjaGFuZ2VkLiAqKi9cbiAgICBAT3V0cHV0KCkgdmlld0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxHSVBJQ2FsZW5kYXJWaWV3PiA9IG5ldyBFdmVudEVtaXR0ZXI8R0lQSUNhbGVuZGFyVmlldz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIG5ldyBzZWxlY3RlZCBkYXRlIHdoZW4gc2VsZWN0ZWQgZGF0ZSBjaGFuZ2VzLlxuICAgICAqIEBkZXByZWNhdGVkIFN3aXRjaCB0byB0aGUgYGRhdGVDaGFuZ2VgIGFuZCBgZGF0ZUlucHV0YCBiaW5kaW5nIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cbiAgICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlLiAqL1xuICAgIGdldCBfc2VsZWN0ZWQoKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZXQgX3NlbGVjdGVkKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl92YWxpZFNlbGVjdGVkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgICBnZXQgX21pbkRhdGUoKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZXBpY2tlcklucHV0ICYmIHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5taW47XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgICBnZXQgX21heERhdGUoKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZXBpY2tlcklucHV0ICYmIHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5tYXg7XG4gICAgfVxuXG4gICAgZ2V0IF9kYXRlRmlsdGVyKCk6IChkYXRlOiBEIHwgbnVsbCwgdHlwZTogR0lQSURhdGV0aW1lcGlja2VyRmlsdGVyVHlwZSkgPT4gYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlcGlja2VySW5wdXQgJiYgdGhpcy5fZGF0ZXBpY2tlcklucHV0Ll9kYXRlRmlsdGVyO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIEBJbmplY3QoTUFUX0RBVEVQSUNLRVJfU0NST0xMX1NUUkFURUdZKSBwcml2YXRlIF9zY3JvbGxTdHJhdGVneSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IEdJUElEYXRldGltZUFkYXB0ZXI8RD4sXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2RpcjogRGlyZWN0aW9uYWxpdHksXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnlcbiAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRlQWRhcHRlcikge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsRXJyb3IoJ0RhdGVBZGFwdGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaGFuZGxlRm9jdXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuZWQgJiYgdGhpcy5vcGVuT25Gb2N1cykge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmlld0NoYW5nZWQodHlwZTogR0lQSUNhbGVuZGFyVmlldyk6IHZvaWQge1xuICAgICAgICB0aGlzLnZpZXdDaGFuZ2VkLmVtaXQodHlwZSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5faW5wdXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWRDaGFuZ2UuY29tcGxldGUoKTtcblxuICAgICAgICBpZiAodGhpcy5fcG9wdXBSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwUmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTZWxlY3RzIHRoZSBnaXZlbiBkYXRlICovXG4gICAgX3NlbGVjdChkYXRlOiBEKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZGF0ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRlQWRhcHRlci5zYW1lRGF0ZXRpbWUob2xkVmFsdWUsIHRoaXMuX3NlbGVjdGVkKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZWQuZW1pdChkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGFuIGlucHV0IHdpdGggdGhpcyBkYXRlcGlja2VyLlxuICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgZGF0ZXBpY2tlciBpbnB1dCB0byByZWdpc3RlciB3aXRoIHRoaXMgZGF0ZXBpY2tlci5cbiAgICAgKi9cbiAgICBfcmVnaXN0ZXJJbnB1dChpbnB1dDogR0lQSURhdGV0aW1lcGlja2VySW5wdXREaXJlY3RpdmU8RD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGVwaWNrZXJJbnB1dCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0EgTWF0RGF0ZXBpY2tlciBjYW4gb25seSBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0ZXBpY2tlcklucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX2lucHV0U3Vic2NyaXB0aW9uID0gdGhpcy5fZGF0ZXBpY2tlcklucHV0Ll92YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBEIHwgbnVsbCkgPT4gKHRoaXMuX3NlbGVjdGVkID0gdmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKiogT3BlbiB0aGUgY2FsZW5kYXIuICovXG4gICAgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3BlbmVkIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RhdGVwaWNrZXJJbnB1dCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0F0dGVtcHRlZCB0byBvcGVuIGFuIE1hdERhdGVwaWNrZXIgd2l0aCBubyBhc3NvY2lhdGVkIGlucHV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuID0gdGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG91Y2hVaSA/IHRoaXMuX29wZW5Bc0RpYWxvZygpIDogdGhpcy5fb3BlbkFzUG9wdXAoKTtcbiAgICAgICAgdGhpcy5vcGVuZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5lZFN0cmVhbS5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIENsb3NlIHRoZSBjYWxlbmRhci4gKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cFJlZiAmJiB0aGlzLl9wb3B1cFJlZi5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cFJlZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGlhbG9nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NhbGVuZGFyUG9ydGFsICYmIHRoaXMuX2NhbGVuZGFyUG9ydGFsLmlzQXR0YWNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyUG9ydGFsLmRldGFjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcGxldGVDbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoZSBgX29wZW5lZGAgY291bGQndmUgYmVlbiByZXNldCBhbHJlYWR5IGlmXG4gICAgICAgICAgICAvLyB3ZSBnb3QgdHdvIGV2ZW50cyBpbiBxdWljayBzdWNjZXNzaW9uLlxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlZFN0cmVhbS5lbWl0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuICYmIHR5cGVvZiB0aGlzLl9mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgSUUgbW92ZXMgZm9jdXMgYXN5bmNocm9ub3VzbHksIHdlIGNhbid0IGNvdW50IG9uIGl0IGJlaW5nIHJlc3RvcmVkIGJlZm9yZSB3ZSd2ZVxuICAgICAgICAgICAgLy8gbWFya2VkIHRoZSBkYXRlcGlja2VyIGFzIGNsb3NlZC4gSWYgdGhlIGV2ZW50IGZpcmVzIG91dCBvZiBzZXF1ZW5jZSBhbmQgdGhlIGVsZW1lbnQgdGhhdFxuICAgICAgICAgICAgLy8gd2UncmUgcmVmb2N1c2luZyBvcGVucyB0aGUgZGF0ZXBpY2tlciBvbiBmb2N1cywgdGhlIHVzZXIgY291bGQgYmUgc3R1Y2sgd2l0aCBub3QgYmVpbmdcbiAgICAgICAgICAgIC8vIGFibGUgdG8gY2xvc2UgdGhlIGNhbGVuZGFyIGF0IGFsbC4gV2Ugd29yayBhcm91bmQgaXQgYnkgbWFraW5nIHRoZSBsb2dpYywgdGhhdCBtYXJrc1xuICAgICAgICAgICAgLy8gdGhlIGRhdGVwaWNrZXIgYXMgY2xvc2VkLCBhc3luYyBhcyB3ZWxsLlxuICAgICAgICAgICAgdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNvbXBsZXRlQ2xvc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcGxldGVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE9wZW4gdGhlIGNhbGVuZGFyIGFzIGEgZGlhbG9nLiAqL1xuICAgIHByaXZhdGUgX29wZW5Bc0RpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW4oR0lQSURhdGV0aW1lcGlja2VyQ29udGVudENvbXBvbmVudCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl9kaXIgPyB0aGlzLl9kaXIudmFsdWUgOiAnbHRyJyxcbiAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWY6IHRoaXMuX3ZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWRpYWxvZycsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRhdGV0aW1lcGlja2VyID0gdGhpcztcbiAgICB9XG5cbiAgICAvKiogT3BlbiB0aGUgY2FsZW5kYXIgYXMgYSBwb3B1cC4gKi9cbiAgICBwcml2YXRlIF9vcGVuQXNQb3B1cCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxlbmRhclBvcnRhbCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsPEdJUElEYXRldGltZXBpY2tlckNvbnRlbnRDb21wb25lbnQ8RD4+KEdJUElEYXRldGltZXBpY2tlckNvbnRlbnRDb21wb25lbnQsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cFJlZikge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXBSZWYuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8R0lQSURhdGV0aW1lcGlja2VyQ29udGVudENvbXBvbmVudDxEPj4gPSB0aGlzLl9wb3B1cFJlZi5hdHRhY2godGhpcy5fY2FsZW5kYXJQb3J0YWwpO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmRhdGV0aW1lcGlja2VyID0gdGhpcztcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvbmNlIHRoZSBjYWxlbmRhciBoYXMgcmVuZGVyZWQuXG4gICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcG9wdXBSZWYudXBkYXRlUG9zaXRpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3B1cFJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqIENyZWF0ZSB0aGUgcG9wdXAuICovXG4gICAgcHJpdmF0ZSBfY3JlYXRlUG9wdXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9jcmVhdGVQb3B1cFBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogJ21hdC1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy5fZGlyID8gdGhpcy5fZGlyLnZhbHVlIDogJ2x0cicsXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICdnaXBpLW1hdC1kYXRldGltZS1waWNrZXItcG9wdXAnLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9wb3B1cFJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgdGhlIHBvcHVwIFBvc2l0aW9uU3RyYXRlZ3kuICovXG4gICAgcHJpdmF0ZSBfY3JlYXRlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KCk6IFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVxuICAgICAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5nZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCkpXG4gICAgICAgICAgICAud2l0aFRyYW5zZm9ybU9yaWdpbk9uKCcuZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNvbnRlbnQnKVxuICAgICAgICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpXG4gICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDgpXG4gICAgICAgICAgICAud2l0aExvY2tlZFBvc2l0aW9uKClcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgfVxuXG59XG4iXX0=
|