turbogui-angular 16.0.0 → 17.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/turbogui-angular.mjs +102 -97
- package/fesm2022/turbogui-angular.mjs.map +1 -1
- package/main/controller/globalerror.service.d.ts +1 -1
- package/main/view/components/busy-state-base/busy-state-base.component.d.ts.map +1 -1
- package/main/view/components/button-base/button-base.component.d.ts +1 -1
- package/main/view/components/button-container/button-container.component.d.ts.map +1 -1
- package/main/view/components/button-image/button-image.component.d.ts.map +1 -1
- package/main/view/components/dialog-base/dialog-base.component.d.ts.map +1 -1
- package/main/view/components/dialog-date-selection/dialog-date-selection.component.d.ts.map +1 -1
- package/main/view/components/dialog-error/dialog-error.component.d.ts.map +1 -1
- package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.d.ts.map +1 -1
- package/main/view/components/dialog-single-input/dialog-single-input.component.d.ts.map +1 -1
- package/main/view/components/dialog-single-option/dialog-single-option.component.d.ts.map +1 -1
- package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts.map +1 -1
- package/main/view/components/dialog-two-option/dialog-two-option.component.d.ts.map +1 -1
- package/main/view/directives/AutoFocusOnDisplayDirective.d.ts.map +1 -1
- package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts.map +1 -1
- package/main/view/directives/ElementCreatedDirective.d.ts.map +1 -1
- package/main/view/directives/ElementDestroyedDirective.d.ts.map +1 -1
- package/package.json +6 -8
- package/esm2022/main/controller/browser.service.mjs +0 -51
- package/esm2022/main/controller/dialog.service.mjs +0 -408
- package/esm2022/main/controller/globalerror.service.mjs +0 -73
- package/esm2022/main/controller/http.service.mjs +0 -71
- package/esm2022/main/controller/httpservice/HTTPServiceGetRequest.mjs +0 -15
- package/esm2022/main/controller/httpservice/HTTPServicePostRequest.mjs +0 -15
- package/esm2022/main/controller/locales.service.mjs +0 -494
- package/esm2022/main/controller/notification.service.mjs +0 -61
- package/esm2022/main/controller/turbo-api-caller.service.mjs +0 -440
- package/esm2022/main/managers/DelayedMethodCallManager.mjs +0 -70
- package/esm2022/main/model/classes/GUINotification.mjs +0 -32
- package/esm2022/main/model/classes/SingletoneStrictClass.mjs +0 -24
- package/esm2022/main/model/classes/View.mjs +0 -31
- package/esm2022/main/model/classes/ViewService.mjs +0 -15
- package/esm2022/main/model/modules/turbogui-angular.module.mjs +0 -48
- package/esm2022/main/view/animations/fade.animation.mjs +0 -35
- package/esm2022/main/view/components/busy-state-base/busy-state-base.component.mjs +0 -38
- package/esm2022/main/view/components/button-base/button-base.component.mjs +0 -180
- package/esm2022/main/view/components/button-container/button-container.component.mjs +0 -34
- package/esm2022/main/view/components/button-image/button-image.component.mjs +0 -47
- package/esm2022/main/view/components/dialog-base/dialog-base.component.mjs +0 -56
- package/esm2022/main/view/components/dialog-date-selection/dialog-date-selection.component.mjs +0 -39
- package/esm2022/main/view/components/dialog-error/dialog-error.component.mjs +0 -48
- package/esm2022/main/view/components/dialog-multiple-option/dialog-multiple-option.component.mjs +0 -42
- package/esm2022/main/view/components/dialog-single-input/dialog-single-input.component.mjs +0 -84
- package/esm2022/main/view/components/dialog-single-option/dialog-single-option.component.mjs +0 -45
- package/esm2022/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.mjs +0 -138
- package/esm2022/main/view/components/dialog-two-option/dialog-two-option.component.mjs +0 -46
- package/esm2022/main/view/directives/AutoFocusOnDisplayDirective.mjs +0 -39
- package/esm2022/main/view/directives/AutoSelectTextOnFocusDirective.mjs +0 -39
- package/esm2022/main/view/directives/ElementCreatedDirective.mjs +0 -42
- package/esm2022/main/view/directives/ElementDestroyedDirective.mjs +0 -42
- package/esm2022/main/view/forms/ValidatorsPlus.mjs +0 -39
- package/esm2022/public_api.mjs +0 -45
- package/esm2022/turbogui-angular.mjs +0 -5
|
@@ -1,408 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TurboGUI is A library that helps with the most common and generic UI elements and functionalities
|
|
3
|
-
*
|
|
4
|
-
* Website : -> http://www.turbogui.org
|
|
5
|
-
* License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
|
|
6
|
-
* License Url : -> http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
* CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
|
|
8
|
-
*/
|
|
9
|
-
import { ArrayUtils, NumericUtils } from 'turbocommons-ts';
|
|
10
|
-
import { Injectable } from '@angular/core';
|
|
11
|
-
import { BusyStateBaseComponent } from '../view/components/busy-state-base/busy-state-base.component';
|
|
12
|
-
import { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';
|
|
13
|
-
import { DialogDateSelectionComponent } from '../view/components/dialog-date-selection/dialog-date-selection.component';
|
|
14
|
-
import { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/material/snack-bar";
|
|
17
|
-
import * as i2 from "@angular/material/dialog";
|
|
18
|
-
/**
|
|
19
|
-
* Manages the application modal and non modal floating elements
|
|
20
|
-
*/
|
|
21
|
-
export class DialogService extends SingletoneStrictClass {
|
|
22
|
-
constructor(rendererFactory, matSnackBar, matDialog, injector, applicationRef, componentFactoryResolver) {
|
|
23
|
-
super(DialogService);
|
|
24
|
-
this.matSnackBar = matSnackBar;
|
|
25
|
-
this.matDialog = matDialog;
|
|
26
|
-
this.injector = injector;
|
|
27
|
-
this.applicationRef = applicationRef;
|
|
28
|
-
this.componentFactoryResolver = componentFactoryResolver;
|
|
29
|
-
/**
|
|
30
|
-
* Used to modify the busy state component that is shown by default by the addModalBusyState() method.
|
|
31
|
-
*
|
|
32
|
-
* @see this.addModalBusyState()
|
|
33
|
-
*/
|
|
34
|
-
this.customBusyStateComponentClass = BusyStateBaseComponent;
|
|
35
|
-
/**
|
|
36
|
-
* Check public getter for docs
|
|
37
|
-
*/
|
|
38
|
-
this._isEnabled = true;
|
|
39
|
-
/**
|
|
40
|
-
* Tells if the main application is currently showing a busy state that blocks all user interaction
|
|
41
|
-
*/
|
|
42
|
-
this._isShowingBusyState = false;
|
|
43
|
-
/**
|
|
44
|
-
* A reference to the modal busy state component that is initialized only the first time it is called.
|
|
45
|
-
*
|
|
46
|
-
* (To append the busy state dynamically, we use the Portal concept from the angular material library)
|
|
47
|
-
*/
|
|
48
|
-
this._componentPortal = null;
|
|
49
|
-
/**
|
|
50
|
-
* A reference to the modal busy state container where the component will be added
|
|
51
|
-
*/
|
|
52
|
-
this._modalBusyStateHost = null;
|
|
53
|
-
/**
|
|
54
|
-
* Tells if the manager is currently showing a snackbar element or not
|
|
55
|
-
*/
|
|
56
|
-
this._isShowingSnackBar = false;
|
|
57
|
-
/**
|
|
58
|
-
* Contains a list of the dialogs that are currently visible to the user.
|
|
59
|
-
* Each item in this list is a hash that is computed when dialog is created to uniquely identify it.
|
|
60
|
-
*
|
|
61
|
-
* Empty list means no dialogs are currently visible
|
|
62
|
-
*/
|
|
63
|
-
this._activeDialogs = [];
|
|
64
|
-
/**
|
|
65
|
-
* Contains a list with all the MatDialog instances that are currently visible to the user.
|
|
66
|
-
* The list uses the same order as the list of _activeDialogs hash values
|
|
67
|
-
*/
|
|
68
|
-
this._activeDialogInstances = [];
|
|
69
|
-
/**
|
|
70
|
-
* Method that is used to delete the window beforeunload event listener once not used anymore
|
|
71
|
-
*/
|
|
72
|
-
this._windowBeforeUnloadUnListen = null;
|
|
73
|
-
/**
|
|
74
|
-
* Method that is used to delete the document keydown event listener once not used anymore
|
|
75
|
-
*/
|
|
76
|
-
this._documentKeydownUnlisten = null;
|
|
77
|
-
/**
|
|
78
|
-
* Method that is used to delete the document mousedown event listener once not used anymore
|
|
79
|
-
*/
|
|
80
|
-
this._documentMousedownUnlisten = null;
|
|
81
|
-
/**
|
|
82
|
-
* Method that is used to delete the document pointerdown event listener once not used anymore
|
|
83
|
-
*/
|
|
84
|
-
this._documentPointerdownUnlisten = null;
|
|
85
|
-
this._renderer = rendererFactory.createRenderer(null, null);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Tells if this dialog service is enabled or not. If dialog service is disabled, none of it's features will work
|
|
89
|
-
* This is used to block all dialog features normally when shutting down the application
|
|
90
|
-
*
|
|
91
|
-
* Use with caution. When this is set to false, dialog service stops working.
|
|
92
|
-
*/
|
|
93
|
-
set isEnabled(v) {
|
|
94
|
-
if (v === this._isEnabled) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
this._isEnabled = v;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Enables a warning that will be shown to the user when he/she tries to close the application.
|
|
101
|
-
* This warning will prompt the user to continue with the exit process or cancel it.
|
|
102
|
-
* The specific texts of this message are a generic ones and cannot be changed.
|
|
103
|
-
*
|
|
104
|
-
* IMPORTANT: This method must be called after the main application has been initialized in order to work,
|
|
105
|
-
* otherwise it will do nothing.
|
|
106
|
-
*/
|
|
107
|
-
addCloseApplicationWarning() {
|
|
108
|
-
if (this._windowBeforeUnloadUnListen === null) {
|
|
109
|
-
this._windowBeforeUnloadUnListen = this._renderer.listen('window', 'beforeunload', (event) => event.returnValue = true);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Remove the close application warning message if previously assigned
|
|
114
|
-
*/
|
|
115
|
-
removeCloseApplicationWarning() {
|
|
116
|
-
if (this._windowBeforeUnloadUnListen !== null) {
|
|
117
|
-
this._windowBeforeUnloadUnListen();
|
|
118
|
-
this._windowBeforeUnloadUnListen = null;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Change the application visual appearance so the user perceives that the application is
|
|
123
|
-
* currently busy. While modal busy state is enabled, no user input is possible neither via
|
|
124
|
-
* keyboard, mouse or touch. Use this state when performing server requests or operations that
|
|
125
|
-
* must block the user interaction with the application. To allow user interaction again, you must
|
|
126
|
-
* call removeModalBusyState()
|
|
127
|
-
*
|
|
128
|
-
* Notice: We can modify the busy state visual component that is shown by this method. To do it, we must
|
|
129
|
-
* set this.customBusyStateComponentClass property with our own custom busy state component class. (We can do it at
|
|
130
|
-
* our main application component constructor for example). Our custom component must extend the
|
|
131
|
-
* BusyStateBaseComponent one to add its own visual appearance.
|
|
132
|
-
*
|
|
133
|
-
* @see this.customBusyStateComponentClass
|
|
134
|
-
*/
|
|
135
|
-
addModalBusyState() {
|
|
136
|
-
if (!this._isEnabled || this._isShowingBusyState) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
this._disableUserInteraction();
|
|
140
|
-
// Dynamically create the busy state component reference if this is the first time
|
|
141
|
-
if (this._componentPortal === null) {
|
|
142
|
-
this._componentPortal = new ComponentPortal(this.customBusyStateComponentClass);
|
|
143
|
-
// Create a PortalHost with document.body as its anchor element
|
|
144
|
-
this._modalBusyStateHost = new DomPortalOutlet(document.body, this.componentFactoryResolver, this.applicationRef, this.injector);
|
|
145
|
-
}
|
|
146
|
-
this._modalBusyStateHost.attach(this._componentPortal);
|
|
147
|
-
this._isShowingBusyState = true;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Tells if the application is currently locked in a modal busy state (caused by an addModalBusyState() call)
|
|
151
|
-
*/
|
|
152
|
-
get isShowingBusyState() {
|
|
153
|
-
return this._isShowingBusyState;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Cancel the application busy state and restore it back to normal so user interaction is allowed again
|
|
157
|
-
*/
|
|
158
|
-
removeModalBusyState() {
|
|
159
|
-
if (!this._isEnabled || !this._isShowingBusyState) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
if (this._componentPortal !== null) {
|
|
163
|
-
this._modalBusyStateHost.detach();
|
|
164
|
-
}
|
|
165
|
-
this._enableUserInteraction();
|
|
166
|
-
this._isShowingBusyState = false;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* TODO - adapt from TS version
|
|
170
|
-
*/
|
|
171
|
-
addToolTip() {
|
|
172
|
-
// TODO - adapt from TS version
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Show a non modal snackbar notification to the user (Only one snack-bar can ever be opened at the same time).
|
|
176
|
-
*
|
|
177
|
-
* Snackbars inform users of a process that an app has performed or will perform. They appear temporarily, towards the bottom or top of the screen.
|
|
178
|
-
* They shouldn’t interrupt the user experience, and they don’t require user input to disappear.
|
|
179
|
-
*
|
|
180
|
-
* @param config A MatSnackBarConfig instance with the customizations we want for this snackbar
|
|
181
|
-
* @param message The message to show on the snackbar
|
|
182
|
-
* @param action If not empty, the text to place on the snackbar confirmation button
|
|
183
|
-
* @param actionCallback A method to execute once the user clicks into the action button.
|
|
184
|
-
*
|
|
185
|
-
* @return void
|
|
186
|
-
*/
|
|
187
|
-
addSnackBar(config, message, action = '', actionCallback = null) {
|
|
188
|
-
if (!this._isEnabled) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
if (this._isShowingSnackBar) {
|
|
192
|
-
throw new Error('Trying to show a snackbar while another one is still visible');
|
|
193
|
-
}
|
|
194
|
-
this._isShowingSnackBar = true;
|
|
195
|
-
const snackBarRef = this.matSnackBar.open(message, action === '' ? undefined : action, config);
|
|
196
|
-
if (actionCallback !== null) {
|
|
197
|
-
snackBarRef.onAction().subscribe(() => {
|
|
198
|
-
actionCallback();
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Tells if the application is currently showing a snackbar or not
|
|
204
|
-
*/
|
|
205
|
-
get isShowingSnackBar() {
|
|
206
|
-
return this._isShowingSnackBar;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Force the removal of the snack bar dialog if it exists.
|
|
210
|
-
*
|
|
211
|
-
* If no snackbar is currently visible, this method will do nothing
|
|
212
|
-
*/
|
|
213
|
-
removeSnackBar() {
|
|
214
|
-
if (!this._isEnabled || !this._isShowingSnackBar) {
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
this.matSnackBar.dismiss();
|
|
218
|
-
this._isShowingSnackBar = false;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Show a dialog with one or more options that can be used to close it. We can use any of the predefined dialog types that are bundled with
|
|
222
|
-
* this library or extend DialogBaseComponent to create our own custom ones.
|
|
223
|
-
*
|
|
224
|
-
* @param dialogComponentClass A class for a component that extends DialogBaseComponent, which will be the dialog that is shown to the user.
|
|
225
|
-
* @param properties An object containing the different visual and textual options that this dialog allows:
|
|
226
|
-
* - id: The html unique identifier that the dialog will have once created. If not specified, no id will be explicitly set
|
|
227
|
-
* - width: 50% by default. Specify the css value for the default dialog width. As the dialog is responsive, the value will be automatically
|
|
228
|
-
* reduced if the available screen is not enough, and will reach the desired value otherwise. We can set any css unit like pixels,
|
|
229
|
-
* %, vh, vw, or any other. For example: '400px', '50%', etc.
|
|
230
|
-
* - maxWidth: Defines the maximum width that the dialog will have regarding the viewport. We can specify it in % or vw, just like is done in
|
|
231
|
-
* css. By default it is defined as 96vw, which will fit 96% of the viewport on small devices
|
|
232
|
-
* - height: TODO docs
|
|
233
|
-
* - maxHeight: TODO docs
|
|
234
|
-
* - modal: True (default) if selecting an option is mandatory to close the dialog, false if the dialog can be closed
|
|
235
|
-
* by the user clicking outside it
|
|
236
|
-
* - texts: A list with strings containing the dialog texts, sorted by importance. When dialog has a title, this should
|
|
237
|
-
* be placed first, subtitle second and so (Each dialog may accept a different custom number of texts).
|
|
238
|
-
* - options: A list of strings that will be used as button captions for each one of the accepted dialog options
|
|
239
|
-
* - data: An object that we can use to pass any extra data that we want to the dialog
|
|
240
|
-
* - viewContainerRef: This is important if we want to propagate providers from a parent component to this dialog. We must specify
|
|
241
|
-
* this reference to make sure the same services injected on the parent are available too at the child dialog
|
|
242
|
-
*
|
|
243
|
-
* @param callback A function that will be called after the dialog is closed. It will receive a selection object with two properties: index and value. Those
|
|
244
|
-
* will contain the index and value from the options array that's selected by the user. if no option selected, index will be -1 and value null
|
|
245
|
-
*/
|
|
246
|
-
addDialog(dialogComponentClass, properties, callback = null) {
|
|
247
|
-
if (!this._isEnabled) {
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
// Set the default values for non specified properties
|
|
251
|
-
properties.modal = properties.modal ?? true;
|
|
252
|
-
properties.texts = properties.texts ?? [];
|
|
253
|
-
properties.options = properties.options ?? [];
|
|
254
|
-
properties.data = properties.data ?? {};
|
|
255
|
-
// Generate a string to uniquely identify this dialog on the list of active dialogs
|
|
256
|
-
// A dialog is considered as unique if the dialog id and texts are exactly the same. We do not take options into consideration
|
|
257
|
-
// as there may be dialogs with a big amount of options available.
|
|
258
|
-
let className = dialogComponentClass.DIALOG_CLASS_NAME;
|
|
259
|
-
if (className === '') {
|
|
260
|
-
throw new Error(`The static property DIALOG_CLASS_NAME is not defined or is empty for this dialog component (${dialogComponentClass})`);
|
|
261
|
-
}
|
|
262
|
-
const dialogHash = className + properties.texts.join('');
|
|
263
|
-
// identical dialogs won't be allowed at the same time
|
|
264
|
-
if (this._activeDialogs.includes(dialogHash)) {
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
const dialogRef = this.matDialog.open(dialogComponentClass, {
|
|
268
|
-
width: properties.width ?? "50%",
|
|
269
|
-
maxWidth: properties.maxWidth ?? "96vw",
|
|
270
|
-
disableClose: properties.modal,
|
|
271
|
-
autoFocus: false,
|
|
272
|
-
closeOnNavigation: !properties.modal,
|
|
273
|
-
viewContainerRef: properties.viewContainerRef,
|
|
274
|
-
data: { texts: properties.texts, options: properties.options, data: properties.data }
|
|
275
|
-
});
|
|
276
|
-
// Assign the dialog ID only if specifically set on properties
|
|
277
|
-
if (properties.id && properties.id !== undefined) {
|
|
278
|
-
dialogRef.id = properties.id;
|
|
279
|
-
}
|
|
280
|
-
this._activeDialogs.push(dialogHash);
|
|
281
|
-
this._activeDialogInstances.push(dialogRef);
|
|
282
|
-
dialogRef.beforeClosed().subscribe((selection) => {
|
|
283
|
-
this._activeDialogs = ArrayUtils.removeElement(this._activeDialogs, dialogHash);
|
|
284
|
-
this._activeDialogInstances = ArrayUtils.removeElement(this._activeDialogInstances, dialogRef);
|
|
285
|
-
if (!properties.modal && selection === undefined) {
|
|
286
|
-
selection = { index: -1 };
|
|
287
|
-
}
|
|
288
|
-
else if (!NumericUtils.isInteger(selection.index)) {
|
|
289
|
-
throw new Error(`closeDialog() expects index to be an integer`);
|
|
290
|
-
}
|
|
291
|
-
if (callback !== null) {
|
|
292
|
-
if (selection.index >= 0 && selection.value === null) {
|
|
293
|
-
selection.value = properties.options[selection.index];
|
|
294
|
-
}
|
|
295
|
-
callback(selection);
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Show a dialog with a calendar to let the user pick a date.
|
|
301
|
-
*
|
|
302
|
-
* @param properties An object containing the different visual and textual options that this dialog allows:
|
|
303
|
-
* - id: The html unique identifier that the dialog will have once created. If not specified, no id will be explicitly set
|
|
304
|
-
* - width: Specify the css value for the default dialog width. As the dialog is responsive, the value will be automatically
|
|
305
|
-
* reduced if the available screen is not enough, and will reach the desired value otherwise. We can set any css unit like pixels,
|
|
306
|
-
* %, vh, vw, or any other. For example: '400px', '50%', etc.
|
|
307
|
-
* - maxWidth: Defines the maximum width that the dialog will have regarding the viewport. We can specify it in % or vw, just like is done in
|
|
308
|
-
* css. By default it is defined as 96vw, which will fit 96% of the viewport on small devices
|
|
309
|
-
* - height: TODO docs
|
|
310
|
-
* - maxHeight: TODO docs
|
|
311
|
-
* - modal: True (default) if selecting an option is mandatory to close the dialog, false if the dialog can be closed
|
|
312
|
-
* by the user clicking outside it
|
|
313
|
-
* - title: An optional dialog title
|
|
314
|
-
* - viewContainerRef: This is important to propagate providers from a parent component to this dialog. We must specify
|
|
315
|
-
* this reference to make sure the same services injected on the parent are available too at the child dialog
|
|
316
|
-
* @param callback A function to be called after the dialog is closed. It will receive a Date() object selected by the user or null if no selection happened
|
|
317
|
-
*/
|
|
318
|
-
addDateSelectionDialog(properties, callback) {
|
|
319
|
-
if (!this._isEnabled) {
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
this.addDialog(DialogDateSelectionComponent, {
|
|
323
|
-
id: properties.id ?? undefined,
|
|
324
|
-
width: properties.width ?? "50%",
|
|
325
|
-
maxWidth: properties.maxWidth ?? "96vw",
|
|
326
|
-
height: properties.height ?? "50%",
|
|
327
|
-
maxHeight: properties.maxHeight ?? "92vw",
|
|
328
|
-
modal: properties.modal ?? false,
|
|
329
|
-
texts: [properties.title ?? ''],
|
|
330
|
-
viewContainerRef: properties.viewContainerRef
|
|
331
|
-
}, (selection) => {
|
|
332
|
-
callback(selection.index === -1 ? null : selection.value);
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Force the removal of all the dialogs that are currently visible.
|
|
337
|
-
*
|
|
338
|
-
* If no dialogs are currently visible, this method will do nothing
|
|
339
|
-
*/
|
|
340
|
-
removeAllDialogs() {
|
|
341
|
-
if (!this._isEnabled) {
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
for (const dialogRef of this._activeDialogInstances) {
|
|
345
|
-
dialogRef.close({ index: -1 });
|
|
346
|
-
}
|
|
347
|
-
this._activeDialogs = [];
|
|
348
|
-
this._activeDialogInstances = [];
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* TODO - translate from TS version
|
|
352
|
-
*/
|
|
353
|
-
// addSideNav(){
|
|
354
|
-
//
|
|
355
|
-
// }
|
|
356
|
-
/**
|
|
357
|
-
* TODO - translate from TS version
|
|
358
|
-
*/
|
|
359
|
-
// get isShowingSideNav(){
|
|
360
|
-
//
|
|
361
|
-
// }
|
|
362
|
-
/**
|
|
363
|
-
* TODO - translate from TS version
|
|
364
|
-
*/
|
|
365
|
-
// removeSideNav(){
|
|
366
|
-
//
|
|
367
|
-
// }
|
|
368
|
-
/**
|
|
369
|
-
* Block all the user interactions with the application (keyboard, touch, mouse, ...)
|
|
370
|
-
*/
|
|
371
|
-
_disableUserInteraction() {
|
|
372
|
-
if (this._documentKeydownUnlisten === null) {
|
|
373
|
-
this._documentKeydownUnlisten = this._renderer.listen('document', 'keydown', (event) => event.preventDefault());
|
|
374
|
-
}
|
|
375
|
-
if (this._documentMousedownUnlisten === null) {
|
|
376
|
-
this._documentMousedownUnlisten = this._renderer.listen('document', 'mousedown', (event) => event.preventDefault());
|
|
377
|
-
}
|
|
378
|
-
if (this._documentPointerdownUnlisten === null) {
|
|
379
|
-
this._documentPointerdownUnlisten = this._renderer.listen('document', 'pointerdown', (event) => event.preventDefault());
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* Restore the user interactions that were previously disabled with _disableUserInteraction method
|
|
384
|
-
*/
|
|
385
|
-
_enableUserInteraction() {
|
|
386
|
-
if (this._documentKeydownUnlisten !== null) {
|
|
387
|
-
this._documentKeydownUnlisten();
|
|
388
|
-
this._documentKeydownUnlisten = null;
|
|
389
|
-
}
|
|
390
|
-
if (this._documentMousedownUnlisten !== null) {
|
|
391
|
-
this._documentMousedownUnlisten();
|
|
392
|
-
this._documentMousedownUnlisten = null;
|
|
393
|
-
}
|
|
394
|
-
if (this._documentPointerdownUnlisten !== null) {
|
|
395
|
-
this._documentPointerdownUnlisten();
|
|
396
|
-
this._documentMousedownUnlisten = null;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogService, deps: [{ token: i0.RendererFactory2 }, { token: i1.MatSnackBar }, { token: i2.MatDialog }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
400
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogService, providedIn: 'root' }); }
|
|
401
|
-
}
|
|
402
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogService, decorators: [{
|
|
403
|
-
type: Injectable,
|
|
404
|
-
args: [{
|
|
405
|
-
providedIn: 'root',
|
|
406
|
-
}]
|
|
407
|
-
}], ctorParameters: () => [{ type: i0.RendererFactory2 }, { type: i1.MatSnackBar }, { type: i2.MatDialog }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: i0.ComponentFactoryResolver }] });
|
|
408
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL2NvbnRyb2xsZXIvZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFRLFVBQVUsRUFBcUcsTUFBTSxlQUFlLENBQUM7QUFHcEosT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwRUFBMEUsQ0FBQztBQUN4SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7OztBQUcvRTs7R0FFRztBQUlILE1BQU0sT0FBTyxhQUFjLFNBQVEscUJBQXFCO0lBeUZwRCxZQUFZLGVBQWlDLEVBQ2hCLFdBQXdCLEVBQ3hCLFNBQW9CLEVBQ3BCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLHdCQUFrRDtRQUVqRixLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFOVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUEzRi9FOzs7O1dBSUc7UUFDSCxrQ0FBNkIsR0FBaUMsc0JBQXNCLENBQUM7UUFHckY7O1dBRUc7UUFDSyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRzFCOztXQUVHO1FBQ0ssd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBR3BDOzs7O1dBSUc7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QUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzNIO0lBQ0wsQ0FBQztJQUdEOztPQUVHO0lBQ0ssc0JBQXNCO1FBRTFCLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLElBQUksRUFBRTtZQUV4QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEtBQUssSUFBSSxFQUFFO1lBRTFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7U0FDMUM7UUFFRCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsS0FBSyxJQUFJLEVBQUU7WUFFNUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUMxQztJQUNMLENBQUM7OEdBdmlCUSxhQUFhO2tIQUFiLGFBQWEsY0FGWixNQUFNOzsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEFycmF5VXRpbHMsIE51bWVyaWNVdGlscyB9IGZyb20gJ3R1cmJvY29tbW9ucy10cyc7XHJcbmltcG9ydCB7IFR5cGUsIEluamVjdGFibGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0b3IsIEFwcGxpY2F0aW9uUmVmLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2J1c3ktc3RhdGUtYmFzZS9idXN5LXN0YXRlLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBEb21Qb3J0YWxPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgRGlhbG9nQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctYmFzZS9kaWFsb2ctYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEaWFsb2dEYXRlU2VsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2RpYWxvZy1kYXRlLXNlbGVjdGlvbi9kaWFsb2ctZGF0ZS1zZWxlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2luZ2xldG9uZVN0cmljdENsYXNzIH0gZnJvbSAnLi4vbW9kZWwvY2xhc3Nlcy9TaW5nbGV0b25lU3RyaWN0Q2xhc3MnO1xuXHJcblxyXG4vKipcclxuICogTWFuYWdlcyB0aGUgYXBwbGljYXRpb24gbW9kYWwgYW5kIG5vbiBtb2RhbCBmbG9hdGluZyBlbGVtZW50c1xyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ1NlcnZpY2UgZXh0ZW5kcyBTaW5nbGV0b25lU3RyaWN0Q2xhc3Mge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gbW9kaWZ5IHRoZSBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IGRlZmF1bHQgYnkgdGhlIGFkZE1vZGFsQnVzeVN0YXRlKCkgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgdGhpcy5hZGRNb2RhbEJ1c3lTdGF0ZSgpXHJcbiAgICAgKi9cclxuICAgIGN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzOiBUeXBlPEJ1c3lTdGF0ZUJhc2VDb21wb25lbnQ+ID0gQnVzeVN0YXRlQmFzZUNvbXBvbmVudDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBwdWJsaWMgZ2V0dGVyIGZvciBkb2NzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzRW5hYmxlZCA9IHRydWU7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIG1haW4gYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHNob3dpbmcgYSBidXN5IHN0YXRlIHRoYXQgYmxvY2tzIGFsbCB1c2VyIGludGVyYWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd2luZ0J1c3lTdGF0ZSA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RhbCBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIGluaXRpYWxpemVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIChUbyBhcHBlbmQgdGhlIGJ1c3kgc3RhdGUgZHluYW1pY2FsbHksIHdlIHVzZSB0aGUgUG9ydGFsIGNvbmNlcHQgZnJvbSB0aGUgYW5ndWxhciBtYXRlcmlhbCBsaWJyYXJ5KVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxCdXN5U3RhdGVCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RhbCBidXN5IHN0YXRlIGNvbnRhaW5lciB3aGVyZSB0aGUgY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbW9kYWxCdXN5U3RhdGVIb3N0OiBEb21Qb3J0YWxPdXRsZXQgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgbWFuYWdlciBpcyBjdXJyZW50bHkgc2hvd2luZyBhIHNuYWNrYmFyIGVsZW1lbnQgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd2luZ1NuYWNrQmFyID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGFpbnMgYSBsaXN0IG9mIHRoZSBkaWFsb2dzIHRoYXQgYXJlIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLlxyXG4gICAgICogRWFjaCBpdGVtIGluIHRoaXMgbGlzdCBpcyBhIGhhc2ggdGhhdCBpcyBjb21wdXRlZCB3aGVuIGRpYWxvZyBpcyBjcmVhdGVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGl0LlxyXG4gICAgICpcclxuICAgICAqIEVtcHR5IGxpc3QgbWVhbnMgbm8gZGlhbG9ncyBhcmUgY3VycmVudGx5IHZpc2libGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGlhbG9nczogc3RyaW5nW10gPSBbXTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyBhIGxpc3Qgd2l0aCBhbGwgdGhlIE1hdERpYWxvZyBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuXHJcbiAgICAgKiBUaGUgbGlzdCB1c2VzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IG9mIF9hY3RpdmVEaWFsb2dzIGhhc2ggdmFsdWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2FjdGl2ZURpYWxvZ0luc3RhbmNlczogTWF0RGlhbG9nUmVmPERpYWxvZ0Jhc2VDb21wb25lbnQ+W10gPSBbXTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBpbml0aWFsaXplZCBSZW5kZXJlciAyIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBieSB0aGlzIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyOiBSZW5kZXJlcjI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdXNlZCB0byBkZWxldGUgdGhlIHdpbmRvdyBiZWZvcmV1bmxvYWQgZXZlbnQgbGlzdGVuZXIgb25jZSBub3QgdXNlZCBhbnltb3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdGhhdCBpcyB1c2VkIHRvIGRlbGV0ZSB0aGUgZG9jdW1lbnQga2V5ZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRLZXlkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgb25jZSBub3QgdXNlZCBhbnltb3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBwb2ludGVyZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IocmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcclxuXHJcblx0XHRzdXBlcihEaWFsb2dTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhpcyBkaWFsb2cgc2VydmljZSBpcyBlbmFibGVkIG9yIG5vdC4gSWYgZGlhbG9nIHNlcnZpY2UgaXMgZGlzYWJsZWQsIG5vbmUgb2YgaXQncyBmZWF0dXJlcyB3aWxsIHdvcmtcclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBibG9jayBhbGwgZGlhbG9nIGZlYXR1cmVzIG5vcm1hbGx5IHdoZW4gc2h1dHRpbmcgZG93biB0aGUgYXBwbGljYXRpb25cclxuICAgICAqXHJcbiAgICAgKiBVc2Ugd2l0aCBjYXV0aW9uLiBXaGVuIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCBkaWFsb2cgc2VydmljZSBzdG9wcyB3b3JraW5nLlxyXG4gICAgICovXHJcbiAgICBzZXQgaXNFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNFbmFibGVkID0gdjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIGEgd2FybmluZyB0aGF0IHdpbGwgYmUgc2hvd24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUgdHJpZXMgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICogVGhpcyB3YXJuaW5nIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGNvbnRpbnVlIHdpdGggdGhlIGV4aXQgcHJvY2VzcyBvciBjYW5jZWwgaXQuXHJcbiAgICAgKiBUaGUgc3BlY2lmaWMgdGV4dHMgb2YgdGhpcyBtZXNzYWdlIGFyZSBhIGdlbmVyaWMgb25lcyBhbmQgY2Fubm90IGJlIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogSU1QT1JUQU5UOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbWFpbiBhcHBsaWNhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZCBpbiBvcmRlciB0byB3b3JrLFxyXG4gICAgICogb3RoZXJ3aXNlIGl0IHdpbGwgZG8gbm90aGluZy5cclxuICAgICAqL1xyXG4gICAgYWRkQ2xvc2VBcHBsaWNhdGlvbldhcm5pbmcoKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRVbkxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdiZWZvcmV1bmxvYWQnLFxyXG4gICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5yZXR1cm5WYWx1ZSA9IHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgdGhlIGNsb3NlIGFwcGxpY2F0aW9uIHdhcm5pbmcgbWVzc2FnZSBpZiBwcmV2aW91c2x5IGFzc2lnbmVkXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNsb3NlQXBwbGljYXRpb25XYXJuaW5nKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlIHRoZSBhcHBsaWNhdGlvbiB2aXN1YWwgYXBwZWFyYW5jZSBzbyB0aGUgdXNlciBwZXJjZWl2ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gaXNcclxuICAgICAqIGN1cnJlbnRseSBidXN5LiBXaGlsZSBtb2RhbCBidXN5IHN0YXRlIGlzIGVuYWJsZWQsIG5vIHVzZXIgaW5wdXQgaXMgcG9zc2libGUgbmVpdGhlciB2aWFcclxuICAgICAqIGtleWJvYXJkLCBtb3VzZSBvciB0b3VjaC4gVXNlIHRoaXMgc3RhdGUgd2hlbiBwZXJmb3JtaW5nIHNlcnZlciByZXF1ZXN0cyBvciBvcGVyYXRpb25zIHRoYXRcclxuICAgICAqIG11c3QgYmxvY2sgdGhlIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgYXBwbGljYXRpb24uIFRvIGFsbG93IHVzZXIgaW50ZXJhY3Rpb24gYWdhaW4sIHlvdSBtdXN0XHJcbiAgICAgKiBjYWxsIHJlbW92ZU1vZGFsQnVzeVN0YXRlKClcclxuICAgICAqXHJcbiAgICAgKiBOb3RpY2U6IFdlIGNhbiBtb2RpZnkgdGhlIGJ1c3kgc3RhdGUgdmlzdWFsIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IHRoaXMgbWV0aG9kLiBUbyBkbyBpdCwgd2UgbXVzdFxyXG4gICAgICogc2V0IHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3MgcHJvcGVydHkgd2l0aCBvdXIgb3duIGN1c3RvbSBidXN5IHN0YXRlIGNvbXBvbmVudCBjbGFzcy4gKFdlIGNhbiBkbyBpdCBhdFxyXG4gICAgICogb3VyIG1haW4gYXBwbGljYXRpb24gY29tcG9uZW50IGNvbnN0cnVjdG9yIGZvciBleGFtcGxlKS4gT3VyIGN1c3RvbSBjb21wb25lbnQgbXVzdCBleHRlbmQgdGhlXHJcbiAgICAgKiBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IG9uZSB0byBhZGQgaXRzIG93biB2aXN1YWwgYXBwZWFyYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3NcclxuICAgICAqL1xyXG4gICAgYWRkTW9kYWxCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkIHx8IHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZVVzZXJJbnRlcmFjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBEeW5hbWljYWxseSBjcmVhdGUgdGhlIGJ1c3kgc3RhdGUgY29tcG9uZW50IHJlZmVyZW5jZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbCh0aGlzLmN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIFBvcnRhbEhvc3Qgd2l0aCBkb2N1bWVudC5ib2R5IGFzIGl0cyBhbmNob3IgZWxlbWVudFxyXG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgPSBuZXcgRG9tUG9ydGFsT3V0bGV0KFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICh0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgYXMgRG9tUG9ydGFsT3V0bGV0KS5hdHRhY2godGhpcy5fY29tcG9uZW50UG9ydGFsKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nQnVzeVN0YXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IGxvY2tlZCBpbiBhIG1vZGFsIGJ1c3kgc3RhdGUgKGNhdXNlZCBieSBhbiBhZGRNb2RhbEJ1c3lTdGF0ZSgpIGNhbGwpXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3dpbmdCdXN5U3RhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FuY2VsIHRoZSBhcHBsaWNhdGlvbiBidXN5IHN0YXRlIGFuZCByZXN0b3JlIGl0IGJhY2sgdG8gbm9ybWFsIHNvIHVzZXIgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhZ2FpblxyXG4gICAgICovXHJcbiAgICByZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQgfHwgIXRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgKHRoaXMuX21vZGFsQnVzeVN0YXRlSG9zdCBhcyBEb21Qb3J0YWxPdXRsZXQpLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZW5hYmxlVXNlckludGVyYWN0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVE9ETyAtIGFkYXB0IGZyb20gVFMgdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBhZGRUb29sVGlwKCkge1xyXG5cclxuICAgICAgICAvLyBUT0RPIC0gYWRhcHQgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhIG5vbiBtb2RhbCBzbmFja2JhciBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIgKE9ubHkgb25lIHNuYWNrLWJhciBjYW4gZXZlciBiZSBvcGVuZWQgYXQgdGhlIHNhbWUgdGltZSkuXHJcbiAgICAgKlxyXG4gICAgICogU25hY2tiYXJzIGluZm9ybSB1c2VycyBvZiBhIHByb2Nlc3MgdGhhdCBhbiBhcHAgaGFzIHBlcmZvcm1lZCBvciB3aWxsIHBlcmZvcm0uIFRoZXkgYXBwZWFyIHRlbXBvcmFyaWx5LCB0b3dhcmRzIHRoZSBib3R0b20gb3IgdG9wIG9mIHRoZSBzY3JlZW4uXHJcbiAgICAgKiBUaGV5IHNob3VsZG7igJl0IGludGVycnVwdCB0aGUgdXNlciBleHBlcmllbmNlLCBhbmQgdGhleSBkb27igJl0IHJlcXVpcmUgdXNlciBpbnB1dCB0byBkaXNhcHBlYXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZyBBIE1hdFNuYWNrQmFyQ29uZmlnIGluc3RhbmNlIHdpdGggdGhlIGN1c3RvbWl6YXRpb25zIHdlIHdhbnQgZm9yIHRoaXMgc25hY2tiYXJcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNob3cgb24gdGhlIHNuYWNrYmFyXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uIElmIG5vdCBlbXB0eSwgdGhlIHRleHQgdG8gcGxhY2Ugb24gdGhlIHNuYWNrYmFyIGNvbmZpcm1hdGlvbiBidXR0b25cclxuICAgICAqIEBwYXJhbSBhY3Rpb25DYWxsYmFjayBBIG1ldGhvZCB0byBleGVjdXRlIG9uY2UgdGhlIHVzZXIgY2xpY2tzIGludG8gdGhlIGFjdGlvbiBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKi9cclxuICAgIGFkZFNuYWNrQmFyKGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcsIG1lc3NhZ2U6IHN0cmluZywgYWN0aW9uID0gJycsIGFjdGlvbkNhbGxiYWNrOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBzaG93IGEgc25hY2tiYXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgc3RpbGwgdmlzaWJsZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nU25hY2tCYXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBzbmFja0JhclJlZiA9IHRoaXMubWF0U25hY2tCYXIub3BlbihtZXNzYWdlLCBhY3Rpb24gPT09ICcnID8gdW5kZWZpbmVkIDogYWN0aW9uLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAoYWN0aW9uQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHNuYWNrQmFyUmVmLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBhY3Rpb25DYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBzaG93aW5nIGEgc25hY2tiYXIgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdTbmFja0JhcigpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcmNlIHRoZSByZW1vdmFsIG9mIHRoZSBzbmFjayBiYXIgZGlhbG9nIGlmIGl0IGV4aXN0cy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBzbmFja2JhciBpcyBjdXJyZW50bHkgdmlzaWJsZSwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVNuYWNrQmFyKCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCB8fCAhdGhpcy5faXNTaG93aW5nU25hY2tCYXIpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIuZGlzbWlzcygpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc1Nob3dpbmdTbmFja0JhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYSBkaWFsb2cgd2l0aCBvbmUgb3IgbW9yZSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2xvc2UgaXQuIFdlIGNhbiB1c2UgYW55IG9mIHRoZSBwcmVkZWZpbmVkIGRpYWxvZyB0eXBlcyB0aGF0IGFyZSBidW5kbGVkIHdpdGhcclxuICAgICAqIHRoaXMgbGlicmFyeSBvciBleHRlbmQgRGlhbG9nQmFzZUNvbXBvbmVudCB0byBjcmVhdGUgb3VyIG93biBjdXN0b20gb25lcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGlhbG9nQ29tcG9uZW50Q2xhc3MgQSBjbGFzcyBmb3IgYSBjb21wb25lbnQgdGhhdCBleHRlbmRzIERpYWxvZ0Jhc2VDb21wb25lbnQsIHdoaWNoIHdpbGwgYmUgdGhlIGRpYWxvZyB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVudCB2aXN1YWwgYW5kIHRleHR1YWwgb3B0aW9ucyB0aGF0IHRoaXMgZGlhbG9nIGFsbG93czpcclxuICAgICAqICAgICAgICAgICAgLSBpZDogVGhlIGh0bWwgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBvbmNlIGNyZWF0ZWQuIElmIG5vdCBzcGVjaWZpZWQsIG5vIGlkIHdpbGwgYmUgZXhwbGljaXRseSBzZXRcclxuICAgICAqICAgICAgICAgICAgLSB3aWR0aDogNTAlIGJ5IGRlZmF1bHQuIFNwZWNpZnkgdGhlIGNzcyB2YWx1ZSBmb3IgdGhlIGRlZmF1bHQgZGlhbG9nIHdpZHRoLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAqICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gV2UgY2FuIHNldCBhbnkgY3NzIHVuaXQgbGlrZSBwaXhlbHMsIFxyXG4gICAgICogICAgICAgICAgICAgICUsIHZoLCB2dywgb3IgYW55IG90aGVyLiBGb3IgZXhhbXBsZTogJzQwMHB4JywgJzUwJScsIGV0Yy5cclxuICAgICAqICAgICAgICAgICAgLSBtYXhXaWR0aDogRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIHJlZ2FyZGluZyB0aGUgdmlld3BvcnQuIFdlIGNhbiBzcGVjaWZ5IGl0IGluICUgb3IgdncsIGp1c3QgbGlrZSBpcyBkb25lIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgY3NzLiBCeSBkZWZhdWx0IGl0IGlzIGRlZmluZWQgYXMgOTZ2dywgd2hpY2ggd2lsbCBmaXQgOTYlIG9mIHRoZSB2aWV3cG9ydCBvbiBzbWFsbCBkZXZpY2VzXHJcbiAgICAgKiAgICAgICAgICAgIC0gaGVpZ2h0OiBUT0RPIGRvY3NcclxuICAgICAqICAgICAgICAgICAgLSBtYXhIZWlnaHQ6IFRPRE8gZG9jc1xyXG4gICAgICogICAgICAgICAgICAtIG1vZGFsOiBUcnVlIChkZWZhdWx0KSBpZiBzZWxlY3RpbmcgYW4gb3B0aW9uIGlzIG1hbmRhdG9yeSB0byBjbG9zZSB0aGUgZGlhbG9nLCBmYWxzZSBpZiB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWRcclxuICAgICAqICAgICAgICAgICAgICBieSB0aGUgdXNlciBjbGlja2luZyBvdXRzaWRlIGl0IFxyXG4gICAgICogICAgICAgICAgICAtIHRleHRzOiBBIGxpc3Qgd2l0aCBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGRpYWxvZyB0ZXh0cywgc29ydGVkIGJ5IGltcG9ydGFuY2UuIFdoZW4gZGlhbG9nIGhhcyBhIHRpdGxlLCB0aGlzIHNob3VsZFxyXG4gICAgICogICAgICAgICAgICAgIGJlIHBsYWNlZCBmaXJzdCwgc3VidGl0bGUgc2Vjb25kIGFuZCBzbyAoRWFjaCBkaWFsb2cgbWF5IGFjY2VwdCBhIGRpZmZlcmVudCBjdXN0b20gbnVtYmVyIG9mIHRleHRzKS5cclxuICAgICAqICAgICAgICAgICAgLSBvcHRpb25zOiBBIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBidXR0b24gY2FwdGlvbnMgZm9yIGVhY2ggb25lIG9mIHRoZSBhY2NlcHRlZCBkaWFsb2cgb3B0aW9uc1xyXG4gICAgICogICAgICAgICAgICAtIGRhdGE6IEFuIG9iamVjdCB0aGF0IHdlIGNhbiB1c2UgdG8gcGFzcyBhbnkgZXh0cmEgZGF0YSB0aGF0IHdlIHdhbnQgdG8gdGhlIGRpYWxvZ1xyXG4gICAgICogICAgICAgICAgICAtIHZpZXdDb250YWluZXJSZWY6IFRoaXMgaXMgaW1wb3J0YW50IGlmIHdlIHdhbnQgdG8gcHJvcGFnYXRlIHByb3ZpZGVycyBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCB0byB0aGlzIGRpYWxvZy4gV2UgbXVzdCBzcGVjaWZ5IFxyXG5cdCAqICAgICAgICAgICAgICB0aGlzIHJlZmVyZW5jZSB0byBtYWtlIHN1cmUgdGhlIHNhbWUgc2VydmljZXMgaW5qZWN0ZWQgb24gdGhlIHBhcmVudCBhcmUgYXZhaWxhYmxlIHRvbyBhdCB0aGUgY2hpbGQgZGlhbG9nIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBJdCB3aWxsIHJlY2VpdmUgYSBzZWxlY3Rpb24gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXM6IGluZGV4IGFuZCB2YWx1ZS4gVGhvc2UgXHJcbiAgICAgKiAgICAgICAgd2lsbCBjb250YWluIHRoZSBpbmRleCBhbmQgdmFsdWUgZnJvbSB0aGUgb3B0aW9ucyBhcnJheSB0aGF0J3Mgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIGlmIG5vIG9wdGlvbiBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSAtMSBhbmQgdmFsdWUgbnVsbFxyXG4gICAgICovXHJcbiAgICBhZGREaWFsb2coZGlhbG9nQ29tcG9uZW50Q2xhc3M6IFR5cGU8RGlhbG9nQmFzZUNvbXBvbmVudD4sXHJcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge2lkPzogc3RyaW5nLFxyXG5cdFx0XHRcdFx0XHQgICB3aWR0aD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD86IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRzPzogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM/OiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT86IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWZ9LCBcclxuICAgICAgICAgICAgICBjYWxsYmFjazogbnVsbCB8ICgoc2VsZWN0aW9uOiB7aW5kZXg6bnVtYmVyLCB2YWx1ZT86IGFueX0pID0+IHZvaWQpID0gbnVsbCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBwcm9wZXJ0aWVzLm1vZGFsID0gcHJvcGVydGllcy5tb2RhbCA/PyB0cnVlO1xyXG4gICAgICAgIHByb3BlcnRpZXMudGV4dHMgPSBwcm9wZXJ0aWVzLnRleHRzID8/IFtdO1xyXG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHByb3BlcnRpZXMub3B0aW9ucyA/PyBbXTtcclxuICAgICAgICBwcm9wZXJ0aWVzLmRhdGEgPSBwcm9wZXJ0aWVzLmRhdGEgPz8ge307XHJcblxyXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgc3RyaW5nIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgZGlhbG9nIG9uIHRoZSBsaXN0IG9mIGFjdGl2ZSBkaWFsb2dzXHJcbiAgICAgICAgLy8gQSBkaWFsb2cgaXMgY29uc2lkZXJlZCBhcyB1bmlxdWUgaWYgdGhlIGRpYWxvZyBpZCBhbmQgdGV4dHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFdlIGRvIG5vdCB0YWtlIG9wdGlvbnMgaW50byBjb25zaWRlcmF0aW9uXHJcbiAgICAgICAgLy8gYXMgdGhlcmUgbWF5IGJlIGRpYWxvZ3Mgd2l0aCBhIGJpZyBhbW91bnQgb2Ygb3B0aW9ucyBhdmFpbGFibGUuXHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IChkaWFsb2dDb21wb25lbnRDbGFzcyBhcyBhbnkpLkRJQUxPR19DTEFTU19OQU1FO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKGNsYXNzTmFtZSA9PT0gJycpe1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzdGF0aWMgcHJvcGVydHkgRElBTE9HX0NMQVNTX05BTUUgaXMgbm90IGRlZmluZWQgb3IgaXMgZW1wdHkgZm9yIHRoaXMgZGlhbG9nIGNvbXBvbmVudCAoJHtkaWFsb2dDb21wb25lbnRDbGFzc30pYCk7ICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZGlhbG9nSGFzaCA9IGNsYXNzTmFtZSArIHByb3BlcnRpZXMudGV4dHMuam9pbignJyk7XHJcblxyXG4gICAgICAgIC8vIGlkZW50aWNhbCBkaWFsb2dzIHdvbid0IGJlIGFsbG93ZWQgYXQgdGhlIHNhbWUgdGltZVxyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVEaWFsb2dzLmluY2x1ZGVzKGRpYWxvZ0hhc2gpKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm1hdERpYWxvZy5vcGVuKGRpYWxvZ0NvbXBvbmVudENsYXNzLCB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBwcm9wZXJ0aWVzLndpZHRoID8/IFwiNTAlXCIsXHJcbiAgICAgICAgICAgIG1heFdpZHRoOiBwcm9wZXJ0aWVzLm1heFdpZHRoID8/IFwiOTZ2d1wiLFxyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHByb3BlcnRpZXMubW9kYWwsXHJcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiAhcHJvcGVydGllcy5tb2RhbCxcclxuICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZjogcHJvcGVydGllcy52aWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICBkYXRhOiB7IHRleHRzOiBwcm9wZXJ0aWVzLnRleHRzLCBvcHRpb25zOiBwcm9wZXJ0aWVzLm9wdGlvbnMsIGRhdGE6IHByb3BlcnRpZXMuZGF0YSB9XHJcbiAgICAgICAgICB9KTsgICAgICBcclxuXHRcdFxyXG5cdFx0Ly8gQXNzaWduIHRoZSBkaWFsb2cgSUQgb25seSBpZiBzcGVjaWZpY2FsbHkgc2V0IG9uIHByb3BlcnRpZXNcclxuXHRcdGlmKHByb3BlcnRpZXMuaWQgJiYgcHJvcGVydGllcy5pZCAhPT0gdW5kZWZpbmVkKXtcclxuXHRcdFx0XHJcblx0XHRcdGRpYWxvZ1JlZi5pZCA9IHByb3BlcnRpZXMuaWQ7XHJcblx0XHR9XHJcblx0XHRcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dzLnB1c2goZGlhbG9nSGFzaCk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzLnB1c2goZGlhbG9nUmVmKTtcclxuXHJcbiAgICAgICAgZGlhbG9nUmVmLmJlZm9yZUNsb3NlZCgpLnN1YnNjcmliZSgoc2VsZWN0aW9uOntpbmRleDpudW1iZXIsIHZhbHVlPzphbnl9KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dzID0gQXJyYXlVdGlscy5yZW1vdmVFbGVtZW50KHRoaXMuX2FjdGl2ZURpYWxvZ3MsIGRpYWxvZ0hhc2gpO1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBBcnJheVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzLCBkaWFsb2dSZWYpO1xyXG5cclxuICAgICAgICAgICAgaWYoIXByb3BlcnRpZXMubW9kYWwgJiYgc2VsZWN0aW9uID09PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHsgaW5kZXg6IC0xIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ZWxzZSBpZiAoIU51bWVyaWNVdGlscy5pc0ludGVnZXIoc2VsZWN0aW9uLmluZGV4KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xvc2VEaWFsb2coKSBleHBlY3RzIGluZGV4IHRvIGJlIGFuIGludGVnZXJgKTsgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0aW9uLmluZGV4ID49IDAgJiYgc2VsZWN0aW9uLnZhbHVlID09PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24udmFsdWUgPSBwcm9wZXJ0aWVzLm9wdGlvbnMhW3NlbGVjdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgKGNhbGxiYWNrIGFzICgoc2VsZWN0aW9uOntpbmRleDpudW1iZXIsIHZhbHVlPzphbnl9KSA9PiB2b2lkKSkoc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhIGRpYWxvZyB3aXRoIGEgY2FsZW5kYXIgdG8gbGV0IHRoZSB1c2VyIHBpY2sgYSBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkaWZmZXJlbnQgdmlzdWFsIGFuZCB0ZXh0dWFsIG9wdGlvbnMgdGhhdCB0aGlzIGRpYWxvZyBhbGxvd3M6XHJcbiAgICAgKiAgICAgICAgICAgIC0gaWQ6IFRoZSBodG1sIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgb25jZSBjcmVhdGVkLiBJZiBub3Qgc3BlY2lmaWVkLCBubyBpZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0XHJcbiAgICAgKiAgICAgICAgICAgIC0gd2lkdGg6IFNwZWNpZnkgdGhlIGNzcyB2YWx1ZSBmb3IgdGhlIGRlZmF1bHQgZGlhbG9nIHdpZHRoLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAqICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gV2UgY2FuIHNldCBhbnkgY3NzIHVuaXQgbGlrZSBwaXhlbHMsIFxyXG4gICAgICogICAgICAgICAgICAgICUsIHZoLCB2dywgb3IgYW55IG90aGVyLiBGb3IgZXhhbXBsZTogJzQwMHB4JywgJzUwJScsIGV0Yy5cclxuICAgICAqICAgICAgICAgICAgLSBtYXhXaWR0aDogRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIHJlZ2FyZGluZyB0aGUgdmlld3BvcnQuIFdlIGNhbiBzcGVjaWZ5IGl0IGluICUgb3IgdncsIGp1c3QgbGlrZSBpcyBkb25lIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgY3NzLiBCeSBkZWZhdWx0IGl0IGlzIGRlZmluZWQgYXMgOTZ2dywgd2hpY2ggd2lsbCBmaXQgOTYlIG9mIHRoZSB2aWV3cG9ydCBvbiBzbWFsbCBkZXZpY2VzXHJcbiAgICAgKiAgICAgICAgICAgIC0gaGVpZ2h0OiBUT0RPIGRvY3NcclxuICAgICAqICAgICAgICAgICAgLSBtYXhIZWlnaHQ6IFRPRE8gZG9jc1xyXG4gICAgICogICAgICAgICAgICAtIG1vZGFsOiBUcnVlIChkZWZhdWx0KSBpZiBzZWxlY3RpbmcgYW4gb3B0aW9uIGlzIG1hbmRhdG9yeSB0byBjbG9zZSB0aGUgZGlhbG9nLCBmYWxzZSBpZiB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWRcclxuICAgICAqICAgICAgICAgICAgICBieSB0aGUgdXNlciBjbGlja2luZyBvdXRzaWRlIGl0IFxyXG4gICAgICogICAgICAgICAgICAtIHRpdGxlOiBBbiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcclxuICAgICAqICAgICAgICAgICAgLSB2aWV3Q29udGFpbmVyUmVmOiBUaGlzIGlzIGltcG9ydGFudCB0byBwcm9wYWdhdGUgcHJvdmlkZXJzIGZyb20gYSBwYXJlbnQgY29tcG9uZW50IHRvIHRoaXMgZGlhbG9nLiBXZSBtdXN0IHNwZWNpZnkgXHJcblx0ICogICAgICAgICAgICAgIHRoaXMgcmVmZXJlbmNlIHRvIG1ha2Ugc3VyZSB0aGUgc2FtZSBzZXJ2aWNlcyBpbmplY3RlZCBvbiB0aGUgcGFyZW50IGFyZSBhdmFpbGFibGUgdG9vIGF0IHRoZSBjaGlsZCBkaWFsb2cgXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuIEl0IHdpbGwgcmVjZWl2ZSBhIERhdGUoKSBvYmplY3Qgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgb3IgbnVsbCBpZiBubyBzZWxlY3Rpb24gaGFwcGVuZWRcclxuICAgICAqL1xyXG4gICAgYWRkRGF0ZVNlbGVjdGlvbkRpYWxvZyhwcm9wZXJ0aWVzOiB7aWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD86IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoPzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0Pzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw/OiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdFx0dmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAoKHNlbGVjdGVkRGF0ZTogbnVsbCB8IERhdGUpID0+IHZvaWQpKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkRGlhbG9nKERpYWxvZ0RhdGVTZWxlY3Rpb25Db21wb25lbnQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiBwcm9wZXJ0aWVzLmlkID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wZXJ0aWVzLndpZHRoID8/IFwiNTAlXCIsXHJcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcHJvcGVydGllcy5tYXhXaWR0aCA/PyBcIjk2dndcIixcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcHJvcGVydGllcy5oZWlnaHQgPz8gXCI1MCVcIixcclxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcHJvcGVydGllcy5tYXhIZWlnaHQgPz8gXCI5MnZ3XCIsXHJcbiAgICAgICAgICAgICAgICBtb2RhbDogcHJvcGVydGllcy5tb2RhbCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRleHRzOiBbcHJvcGVydGllcy50aXRsZSA/PyAnJ10sXHJcbiAgICAgICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiBwcm9wZXJ0aWVzLnZpZXdDb250YWluZXJSZWZcclxuICAgICAgICAgICAgfSwoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGVjdGlvbi5pbmRleCA9PT0gLTEgPyBudWxsIDogKHNlbGVjdGlvbi52YWx1ZSBhcyBEYXRlKSk7ICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSB0aGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRpYWxvZ3MgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gZGlhbG9ncyBhcmUgY3VycmVudGx5IHZpc2libGUsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZ1xyXG4gICAgICovXHJcbiAgICByZW1vdmVBbGxEaWFsb2dzKCkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBkaWFsb2dSZWYgb2YgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzKSB7XHJcblxyXG4gICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2Uoe2luZGV4Oi0xfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZURpYWxvZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBbXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUT0RPIC0gdHJhbnNsYXRlIGZyb20gVFMgdmVyc2lvblxyXG4gICAgICovXHJcbi8vICAgIGFkZFNpZGVOYXYoKXtcclxuLy9cclxuLy8gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSB0cmFuc2xhdGUgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICAgKi9cclxuLy8gICAgZ2V0IGlzU2hvd2luZ1NpZGVOYXYoKXtcclxuLy9cclxuLy8gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSB0cmFuc2xhdGUgZnJvbSBUUyB2ZXJzaW9uXHJcbiAgICAgKi9cclxuLy8gICAgcmVtb3ZlU2lkZU5hdigpe1xyXG4vL1xyXG4vLyAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCbG9jayBhbGwgdGhlIHVzZXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFwcGxpY2F0aW9uIChrZXlib2FyZCwgdG91Y2gsIG1vdXNlLCAuLi4pXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2Rpc2FibGVVc2VySW50ZXJhY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudEtleWRvd25Vbmxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlZG93bicsIChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuID09PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudFBvaW50ZXJkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdG9yZSB0aGUgdXNlciBpbnRlcmFjdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgZGlzYWJsZWQgd2l0aCBfZGlzYWJsZVVzZXJJbnRlcmFjdGlvbiBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZW5hYmxlVXNlckludGVyYWN0aW9uKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50UG9pbnRlcmRvd25Vbmxpc3RlbiAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TurboGUI is A library that helps with the most common and generic UI elements and functionalities
|
|
3
|
-
*
|
|
4
|
-
* Website : -> http://www.turbogui.org
|
|
5
|
-
* License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
|
|
6
|
-
* License Url : -> http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
* CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
|
|
8
|
-
*/
|
|
9
|
-
import { Injectable } from '@angular/core';
|
|
10
|
-
import { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
/**
|
|
13
|
-
* Captures all the application exceptions and performs any required action.
|
|
14
|
-
* It also contains multiple general error management features.
|
|
15
|
-
*
|
|
16
|
-
* To define this class as your application error handler, you must add the following to your
|
|
17
|
-
* main app module providers:
|
|
18
|
-
* {
|
|
19
|
-
* provide: ErrorHandler,
|
|
20
|
-
* useClass: GlobalErrorService
|
|
21
|
-
* },
|
|
22
|
-
* GlobalErrorService
|
|
23
|
-
*
|
|
24
|
-
* You cannot access the error handler at runtime. If you need to modify any of the behaviours
|
|
25
|
-
* or implement your custom ones, you must extend this class and set your new one as the error
|
|
26
|
-
* handler provider.
|
|
27
|
-
*/
|
|
28
|
-
export class GlobalErrorService extends SingletoneStrictClass {
|
|
29
|
-
constructor() {
|
|
30
|
-
super(GlobalErrorService);
|
|
31
|
-
/**
|
|
32
|
-
* Enables or disables the error notification to user via an alert box
|
|
33
|
-
* Extend this class and override this value on your custom error handle to change it
|
|
34
|
-
*/
|
|
35
|
-
this.showExceptionsToUser = true;
|
|
36
|
-
/**
|
|
37
|
-
* Enables or disables the error notification to user via an alert box
|
|
38
|
-
* Extend this class and override this value on your custom error handle to change it
|
|
39
|
-
*/
|
|
40
|
-
this.showExceptionsOnConsole = true;
|
|
41
|
-
/**
|
|
42
|
-
* Defines the text that will be used for the alert that is shown to the user when an exception happens
|
|
43
|
-
* and showExceptionsToUser is true
|
|
44
|
-
* Extend this class and override this value on your custom error handle to change it
|
|
45
|
-
*/
|
|
46
|
-
this.errorAlertMessage = 'Application exception:\n\n';
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Show an alert with the received error detail and also log it to the js console.
|
|
50
|
-
*
|
|
51
|
-
* Angular expects at least this method to be implemented on any class that is used as a global exception handler.
|
|
52
|
-
*
|
|
53
|
-
* @param error An error instance
|
|
54
|
-
*/
|
|
55
|
-
handleError(error) {
|
|
56
|
-
if (this.showExceptionsToUser) {
|
|
57
|
-
alert(this.errorAlertMessage + error);
|
|
58
|
-
}
|
|
59
|
-
if (this.showExceptionsOnConsole) {
|
|
60
|
-
console.log(error);
|
|
61
|
-
}
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: GlobalErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
65
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: GlobalErrorService, providedIn: 'root' }); }
|
|
66
|
-
}
|
|
67
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: GlobalErrorService, decorators: [{
|
|
68
|
-
type: Injectable,
|
|
69
|
-
args: [{
|
|
70
|
-
providedIn: 'root',
|
|
71
|
-
}]
|
|
72
|
-
}], ctorParameters: () => [] });
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1cmJvZ3VpLWFuZ3VsYXIvc3JjL21haW4vY29udHJvbGxlci9nbG9iYWxlcnJvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFHL0U7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGtCQUFtQixTQUFRLHFCQUFxQjtJQXlCNUQ7UUFFQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQXhCeEI7OztXQUdHO1FBQ2MseUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRzdDOzs7V0FHRztRQUNjLDRCQUF1QixHQUFHLElBQUksQ0FBQztRQUdoRDs7OztXQUlHO1FBQ2Msc0JBQWlCLEdBQUcsNEJBQTRCLENBQUM7SUFNckUsQ0FBQztJQUVFOzs7Ozs7T0FNRztJQUNILFdBQVcsQ0FBQyxLQUFVO1FBRWxCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBRTNCLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUksS0FBZ0IsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFFOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjtRQUVELE1BQU0sS0FBSyxDQUFDO0lBQ2hCLENBQUM7OEdBbERRLGtCQUFrQjtrSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBFcnJvckhhbmRsZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU2luZ2xldG9uZVN0cmljdENsYXNzIH0gZnJvbSAnLi4vbW9kZWwvY2xhc3Nlcy9TaW5nbGV0b25lU3RyaWN0Q2xhc3MnO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBDYXB0dXJlcyBhbGwgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgYW5kIHBlcmZvcm1zIGFueSByZXF1aXJlZCBhY3Rpb24uXHJcbiAqIEl0IGFsc28gY29udGFpbnMgbXVsdGlwbGUgZ2VuZXJhbCBlcnJvciBtYW5hZ2VtZW50IGZlYXR1cmVzLlxyXG4gKlxyXG4gKiBUbyBkZWZpbmUgdGhpcyBjbGFzcyBhcyB5b3VyIGFwcGxpY2F0aW9uIGVycm9yIGhhbmRsZXIsIHlvdSBtdXN0IGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXJcclxuICogbWFpbiBhcHAgbW9kdWxlIHByb3ZpZGVyczpcclxuICogICAgICB7XHJcbiAqICAgICAgICAgIHByb3ZpZGU6IEVycm9ySGFuZGxlcixcclxuICogICAgICAgICAgdXNlQ2xhc3M6IEdsb2JhbEVycm9yU2VydmljZVxyXG4gKiAgICAgIH0sXHJcbiAqICAgICAgR2xvYmFsRXJyb3JTZXJ2aWNlXHJcbiAqXHJcbiAqIFlvdSBjYW5ub3QgYWNjZXNzIHRoZSBlcnJvciBoYW5kbGVyIGF0IHJ1bnRpbWUuIElmIHlvdSBuZWVkIHRvIG1vZGlmeSBhbnkgb2YgdGhlIGJlaGF2aW91cnNcclxuICogb3IgaW1wbGVtZW50IHlvdXIgY3VzdG9tIG9uZXMsIHlvdSBtdXN0IGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBzZXQgeW91ciBuZXcgb25lIGFzIHRoZSBlcnJvclxyXG4gKiBoYW5kbGVyIHByb3ZpZGVyLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdsb2JhbEVycm9yU2VydmljZSBleHRlbmRzIFNpbmdsZXRvbmVTdHJpY3RDbGFzcyBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHRvIHVzZXIgdmlhIGFuIGFsZXJ0IGJveFxyXG4gICAgICogRXh0ZW5kIHRoaXMgY2xhc3MgYW5kIG92ZXJyaWRlIHRoaXMgdmFsdWUgb24geW91ciBjdXN0b20gZXJyb3IgaGFuZGxlIHRvIGNoYW5nZSBpdFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNob3dFeGNlcHRpb25zVG9Vc2VyID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBlcnJvciBub3RpZmljYXRpb24gdG8gdXNlciB2aWEgYW4gYWxlcnQgYm94XHJcbiAgICAgKiBFeHRlbmQgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyB2YWx1ZSBvbiB5b3VyIGN1c3RvbSBlcnJvciBoYW5kbGUgdG8gY2hhbmdlIGl0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd0V4Y2VwdGlvbnNPbkNvbnNvbGUgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgdGhlIHRleHQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBhbGVydCB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyIHdoZW4gYW4gZXhjZXB0aW9uIGhhcHBlbnNcclxuICAgICAqIGFuZCBzaG93RXhjZXB0aW9uc1RvVXNlciBpcyB0cnVlXHJcbiAgICAgKiBFeHRlbmQgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyB2YWx1ZSBvbiB5b3VyIGN1c3RvbSBlcnJvciBoYW5kbGUgdG8gY2hhbmdlIGl0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JBbGVydE1lc3NhZ2UgPSAnQXBwbGljYXRpb24gZXhjZXB0aW9uOlxcblxcbic7XHJcblxyXG5cclxuXHRjb25zdHJ1Y3Rvcigpe1xyXG5cdFx0XHJcblx0XHRzdXBlcihHbG9iYWxFcnJvclNlcnZpY2UpO1xyXG5cdH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYW4gYWxlcnQgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IgZGV0YWlsIGFuZCBhbHNvIGxvZyBpdCB0byB0aGUganMgY29uc29sZS5cclxuICAgICAqXHJcbiAgICAgKiBBbmd1bGFyIGV4cGVjdHMgYXQgbGVhc3QgdGhpcyBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgb24gYW55IGNsYXNzIHRoYXQgaXMgdXNlZCBhcyBhIGdsb2JhbCBleGNlcHRpb24gaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXJyb3IgQW4gZXJyb3IgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93RXhjZXB0aW9uc1RvVXNlcikge1xyXG5cclxuICAgICAgICAgICAgYWxlcnQodGhpcy5lcnJvckFsZXJ0TWVzc2FnZSArIChlcnJvciBhcyBzdHJpbmcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dFeGNlcHRpb25zT25Db25zb2xlKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxufVxyXG4iXX0=
|