@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.
Files changed (121) hide show
  1. package/assets/styles/colors.scss +228 -211
  2. package/assets/styles/styles.scss +50 -5
  3. package/bundles/gipisistemas-ng-core.umd.js +3497 -146
  4. package/bundles/gipisistemas-ng-core.umd.js.map +1 -1
  5. package/bundles/gipisistemas-ng-core.umd.min.js +9 -9
  6. package/bundles/gipisistemas-ng-core.umd.min.js.map +1 -1
  7. package/core/gipi-components/components/abstract-crud.component.d.ts +2 -2
  8. package/core/gipi-components/components/abstract-find.component.d.ts +5 -4
  9. package/core/gipi-components/components/abstract.component.d.ts +1 -0
  10. package/esm2015/core/components/abstract-find.component.js +4 -1
  11. package/esm2015/core/gipi-components/components/abstract-crud.component.js +5 -5
  12. package/esm2015/core/gipi-components/components/abstract-find.component.js +45 -21
  13. package/esm2015/core/gipi-components/components/abstract.component.js +5 -2
  14. package/esm2015/gipi-components.js +19 -6
  15. package/esm2015/gipisistemas-ng-core.js +3 -1
  16. package/esm2015/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
  17. package/esm2015/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
  18. package/esm2015/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
  19. package/esm2015/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
  20. package/esm2015/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +158 -0
  21. package/esm2015/shared/gipi-components/datetime-picker/datetime-picker.module.js +82 -0
  22. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +116 -0
  23. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +676 -0
  24. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +306 -0
  25. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
  26. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
  27. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
  28. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +346 -0
  29. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +83 -0
  30. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
  31. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +451 -0
  32. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +151 -0
  33. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +230 -0
  34. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +43 -0
  35. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +139 -0
  36. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
  37. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +138 -0
  38. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
  39. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +141 -0
  40. package/esm2015/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
  41. package/esm2015/shared/gipi-components/form-field/form-field.component.js +1 -1
  42. package/esm2015/shared/gipi-components/input-currency/input-currency.component.js +1 -1
  43. package/esm2015/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
  44. package/esm2015/shared/gipi-components/input-select/input-select.component.js +1 -1
  45. package/esm2015/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
  46. package/esm2015/shared/gipi-components/radio-group/radio-group.component.js +1 -1
  47. package/esm2015/shared/gipi-components/range-page/range-page.component.js +1 -1
  48. package/esm2015/shared/gipi-components/range-slider/range-slider.component.js +1 -1
  49. package/esm2015/shared/gipi-components/select-button/select-button.component.js +1 -1
  50. package/esm2015/shared/gipi-components/textarea/textarea.component.js +1 -1
  51. package/esm2015/shared/shared.module.js +51 -3
  52. package/esm5/core/components/abstract-find.component.js +4 -1
  53. package/esm5/core/gipi-components/components/abstract-crud.component.js +5 -5
  54. package/esm5/core/gipi-components/components/abstract-find.component.js +45 -21
  55. package/esm5/core/gipi-components/components/abstract.component.js +5 -2
  56. package/esm5/gipi-components.js +19 -6
  57. package/esm5/gipisistemas-ng-core.js +3 -1
  58. package/esm5/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
  59. package/esm5/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
  60. package/esm5/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
  61. package/esm5/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
  62. package/esm5/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +176 -0
  63. package/esm5/shared/gipi-components/datetime-picker/datetime-picker.module.js +85 -0
  64. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +119 -0
  65. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +747 -0
  66. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +332 -0
  67. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
  68. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
  69. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
  70. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +377 -0
  71. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +89 -0
  72. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
  73. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +495 -0
  74. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +160 -0
  75. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +248 -0
  76. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +49 -0
  77. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +145 -0
  78. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
  79. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +141 -0
  80. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
  81. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +151 -0
  82. package/esm5/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
  83. package/esm5/shared/gipi-components/form-field/form-field.component.js +1 -1
  84. package/esm5/shared/gipi-components/input-currency/input-currency.component.js +1 -1
  85. package/esm5/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
  86. package/esm5/shared/gipi-components/input-select/input-select.component.js +1 -1
  87. package/esm5/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
  88. package/esm5/shared/gipi-components/radio-group/radio-group.component.js +1 -1
  89. package/esm5/shared/gipi-components/range-page/range-page.component.js +1 -1
  90. package/esm5/shared/gipi-components/range-slider/range-slider.component.js +1 -1
  91. package/esm5/shared/gipi-components/select-button/select-button.component.js +1 -1
  92. package/esm5/shared/gipi-components/textarea/textarea.component.js +1 -1
  93. package/esm5/shared/shared.module.js +51 -3
  94. package/fesm2015/gipisistemas-ng-core.js +3264 -191
  95. package/fesm2015/gipisistemas-ng-core.js.map +1 -1
  96. package/fesm5/gipisistemas-ng-core.js +3475 -152
  97. package/fesm5/gipisistemas-ng-core.js.map +1 -1
  98. package/gipi-components.d.ts +16 -0
  99. package/gipisistemas-ng-core.d.ts +2 -0
  100. package/gipisistemas-ng-core.metadata.json +1 -1
  101. package/package.json +4 -4
  102. package/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.d.ts +40 -0
  103. package/shared/gipi-components/datetime-picker/datetime-picker.module.d.ts +2 -0
  104. package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.d.ts +50 -0
  105. package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.d.ts +140 -0
  106. package/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.d.ts +66 -0
  107. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.d.ts +8 -0
  108. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.d.ts +2 -0
  109. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.d.ts +5 -0
  110. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.d.ts +98 -0
  111. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.d.ts +20 -0
  112. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.d.ts +1 -0
  113. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.d.ts +133 -0
  114. package/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.d.ts +53 -0
  115. package/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.d.ts +80 -0
  116. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.d.ts +4 -0
  117. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.d.ts +46 -0
  118. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.d.ts +20 -0
  119. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.d.ts +36 -0
  120. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.d.ts +2 -0
  121. 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=