turbogui-angular 16.0.0 → 17.0.0

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.
Files changed (55) hide show
  1. package/fesm2022/turbogui-angular.mjs +102 -97
  2. package/fesm2022/turbogui-angular.mjs.map +1 -1
  3. package/main/controller/globalerror.service.d.ts +1 -1
  4. package/main/view/components/busy-state-base/busy-state-base.component.d.ts.map +1 -1
  5. package/main/view/components/button-base/button-base.component.d.ts +1 -1
  6. package/main/view/components/button-container/button-container.component.d.ts.map +1 -1
  7. package/main/view/components/button-image/button-image.component.d.ts.map +1 -1
  8. package/main/view/components/dialog-base/dialog-base.component.d.ts.map +1 -1
  9. package/main/view/components/dialog-date-selection/dialog-date-selection.component.d.ts.map +1 -1
  10. package/main/view/components/dialog-error/dialog-error.component.d.ts.map +1 -1
  11. package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.d.ts.map +1 -1
  12. package/main/view/components/dialog-single-input/dialog-single-input.component.d.ts.map +1 -1
  13. package/main/view/components/dialog-single-option/dialog-single-option.component.d.ts.map +1 -1
  14. package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts.map +1 -1
  15. package/main/view/components/dialog-two-option/dialog-two-option.component.d.ts.map +1 -1
  16. package/main/view/directives/AutoFocusOnDisplayDirective.d.ts.map +1 -1
  17. package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts.map +1 -1
  18. package/main/view/directives/ElementCreatedDirective.d.ts.map +1 -1
  19. package/main/view/directives/ElementDestroyedDirective.d.ts.map +1 -1
  20. package/package.json +1 -3
  21. package/esm2022/main/controller/browser.service.mjs +0 -51
  22. package/esm2022/main/controller/dialog.service.mjs +0 -408
  23. package/esm2022/main/controller/globalerror.service.mjs +0 -73
  24. package/esm2022/main/controller/http.service.mjs +0 -71
  25. package/esm2022/main/controller/httpservice/HTTPServiceGetRequest.mjs +0 -15
  26. package/esm2022/main/controller/httpservice/HTTPServicePostRequest.mjs +0 -15
  27. package/esm2022/main/controller/locales.service.mjs +0 -494
  28. package/esm2022/main/controller/notification.service.mjs +0 -61
  29. package/esm2022/main/controller/turbo-api-caller.service.mjs +0 -440
  30. package/esm2022/main/managers/DelayedMethodCallManager.mjs +0 -70
  31. package/esm2022/main/model/classes/GUINotification.mjs +0 -32
  32. package/esm2022/main/model/classes/SingletoneStrictClass.mjs +0 -24
  33. package/esm2022/main/model/classes/View.mjs +0 -31
  34. package/esm2022/main/model/classes/ViewService.mjs +0 -15
  35. package/esm2022/main/model/modules/turbogui-angular.module.mjs +0 -48
  36. package/esm2022/main/view/animations/fade.animation.mjs +0 -35
  37. package/esm2022/main/view/components/busy-state-base/busy-state-base.component.mjs +0 -38
  38. package/esm2022/main/view/components/button-base/button-base.component.mjs +0 -180
  39. package/esm2022/main/view/components/button-container/button-container.component.mjs +0 -34
  40. package/esm2022/main/view/components/button-image/button-image.component.mjs +0 -47
  41. package/esm2022/main/view/components/dialog-base/dialog-base.component.mjs +0 -56
  42. package/esm2022/main/view/components/dialog-date-selection/dialog-date-selection.component.mjs +0 -39
  43. package/esm2022/main/view/components/dialog-error/dialog-error.component.mjs +0 -48
  44. package/esm2022/main/view/components/dialog-multiple-option/dialog-multiple-option.component.mjs +0 -42
  45. package/esm2022/main/view/components/dialog-single-input/dialog-single-input.component.mjs +0 -84
  46. package/esm2022/main/view/components/dialog-single-option/dialog-single-option.component.mjs +0 -45
  47. package/esm2022/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.mjs +0 -138
  48. package/esm2022/main/view/components/dialog-two-option/dialog-two-option.component.mjs +0 -46
  49. package/esm2022/main/view/directives/AutoFocusOnDisplayDirective.mjs +0 -39
  50. package/esm2022/main/view/directives/AutoSelectTextOnFocusDirective.mjs +0 -39
  51. package/esm2022/main/view/directives/ElementCreatedDirective.mjs +0 -42
  52. package/esm2022/main/view/directives/ElementDestroyedDirective.mjs +0 -42
  53. package/esm2022/main/view/forms/ValidatorsPlus.mjs +0 -39
  54. package/esm2022/public_api.mjs +0 -45
  55. package/esm2022/turbogui-angular.mjs +0 -5
@@ -1,440 +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 { ConversionUtils, HTTPManager, HTTPManagerPostRequest, StringUtils } from 'turbocommons-ts';
11
- import { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';
12
- import { DialogErrorComponent } from '../view/components/dialog-error/dialog-error.component';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "./dialog.service";
15
- import * as i2 from "./browser.service";
16
- /**
17
- * Allows us to easily perform requests to a remote API that is developed with Turbo framework.
18
- */
19
- export class TurboApiCallerService extends SingletoneStrictClass {
20
- constructor(dialogService, browserService) {
21
- super(TurboApiCallerService);
22
- this.dialogService = dialogService;
23
- this.browserService = browserService;
24
- /**
25
- * URI Path to the web service that performs the user login
26
- */
27
- this.loginServiceURI = 'users/login';
28
- /**
29
- * URI Path to the web service that allows us to create extra user tokens
30
- */
31
- this.tokenCreationServiceURI = 'users/user-token-create';
32
- /**
33
- * URI Path to the web service that performs the user log out
34
- */
35
- this.logOutServiceURI = 'users/logout';
36
- /**
37
- * URI Path to the web service that performs the verification for a user email
38
- */
39
- this.mailVerifyServiceURI = 'users/user-mail-verify';
40
- /**
41
- * The username that is currently defined and will be used by the login methods
42
- */
43
- this._userName = '';
44
- /**
45
- * The password for the user that is currently defined and will be used by the login methods
46
- */
47
- this._password = '';
48
- /**
49
- * Contains the last email account that has been verified (or tried to verify) by this service, if any
50
- */
51
- this._lastVerifiedMail = '';
52
- /**
53
- * Check public getter for docs
54
- */
55
- this._isLogged = false;
56
- /**
57
- * @see token() getter for more info
58
- */
59
- this._token = '';
60
- /**
61
- * List of operations that are allowed to the currently loged user. It gets filled just after login is performed
62
- */
63
- this._operations = [];
64
- // Create a fresh instance of the http service so we can use it independently
65
- this.httpManager = new HTTPManager();
66
- this._clearUserAndToken();
67
- }
68
- /**
69
- * The username that is currently defined and will be used by the login methods
70
- */
71
- set userName(v) {
72
- this._isLogged = false;
73
- this._token = '';
74
- this._userName = v;
75
- }
76
- /**
77
- * The username that is currently defined and will be used by the login methods
78
- */
79
- get userName() {
80
- return this._userName;
81
- }
82
- /**
83
- * The password for the user that is currently defined and will be used by the login methods
84
- */
85
- set password(v) {
86
- this._isLogged = false;
87
- this._token = '';
88
- this._password = v;
89
- }
90
- /**
91
- * The password for the user that is currently defined and will be used by the login methods
92
- */
93
- get password() {
94
- return this._password;
95
- }
96
- /**
97
- * Define the root url that will be used for all the API calls
98
- */
99
- set baseUrl(url) {
100
- this.httpManager.baseUrl = url;
101
- }
102
- /**
103
- * Define the root url that will be used for all the API calls
104
- */
105
- get baseUrl() {
106
- return this.httpManager.baseUrl;
107
- }
108
- /**
109
- * If the current browser URL contains a hash fragment (The part after the # character) that contains encoded user or password
110
- * values, this method will parse and automatically set them as the credentials to use.
111
- *
112
- * The URL hash is not altered in any way by this method.
113
- *
114
- * @returns True if any credentials were found and loaded, false if nothing happened
115
- */
116
- loadCredentialsFromURLHashFragment() {
117
- // If the hash fragment is empty, nothing to do
118
- if (!this.browserService.isCurrentUrlWithHashFragment()) {
119
- return false;
120
- }
121
- let valuesFound = false;
122
- // Split the hash fragment to obtain the different values that contains
123
- let hashData = this.browserService.getCurrentUrlHashFragment().split('/');
124
- // User name is the first element of the hash fragment. If we found a value,
125
- // we will fill it automatically
126
- if (hashData.length > 0) {
127
- valuesFound = true;
128
- this.userName = ConversionUtils.base64ToString(hashData[0]);
129
- }
130
- // Auto fill the password if it is received
131
- if (hashData.length > 3) {
132
- valuesFound = true;
133
- this.password = ConversionUtils.base64ToString(hashData[3]);
134
- }
135
- return valuesFound;
136
- }
137
- /**
138
- * If the current browser URL contains a hash fragment (The part after the # character) that contains encoded user, mail and
139
- * has verification code values, this method will perform the request to server to verify that email account for the user.
140
- *
141
- * The URI path to the mail verification service must be correctly defined at this.mailVerifyServiceURI property.
142
- *
143
- * @returns A promise that resolves with the server response if the verification is successful,
144
- * or rejects with an error if the verification fails. Response will have 4 possible values:
145
- * undefined - meaning that the URL hash fragment didn't contain valid verification values
146
- * -1 - meaning verification failed
147
- * 0 - meaning verification succeeded
148
- * 1 - meaning the email was already previouly verified
149
- */
150
- verifyUserMailFromURLHashFragment() {
151
- // If the hash fragment is empty, nothing to do
152
- if (this.browserService.isCurrentUrlWithHashFragment()) {
153
- let hashData = this.browserService.getCurrentUrlHashFragment().split('/');
154
- if (hashData.length >= 3) {
155
- // Call for the user mail verification if user, mail and hash are received
156
- let user = ConversionUtils.base64ToString(hashData[0]);
157
- let mail = ConversionUtils.base64ToString(hashData[1]);
158
- let hash = ConversionUtils.base64ToString(hashData[2]);
159
- if (!StringUtils.isEmpty(user) && !StringUtils.isEmpty(mail) && !StringUtils.isEmpty(hash)) {
160
- this._lastVerifiedMail = mail;
161
- return this.call(this.mailVerifyServiceURI, { userName: user, mail: mail, hash: hash });
162
- }
163
- }
164
- }
165
- return Promise.resolve(undefined);
166
- }
167
- /**
168
- * Obtain the lat user mail account that has been verified (or attempted to verify) by this service.
169
- */
170
- getLastVerifiedMail() {
171
- return this._lastVerifiedMail;
172
- ;
173
- }
174
- /**
175
- * Authenticates the userName and password that are currently defined at the respective properties of this service.
176
- * Returns a promise that resolves with the server's response or rejects with an error if the login fails.
177
- * Path to the login service must be correctly defined at this.loginWebService
178
- *
179
- * The authentication process is performed by sending an encoded credentials request to the login web service using the
180
- * currently defined user name and psw.
181
- *
182
- * Here's an example of a call:
183
- *
184
- * login().then(response => {
185
- * console.log('Login successful:', response);
186
- * }).catch(() => {
187
- * console.error('Login failed:');
188
- * });
189
- *
190
- * @returns A promise that resolves with the server response if the login is successful,
191
- * or rejects with an error if the login fails.
192
- */
193
- login() {
194
- this.dialogService.addModalBusyState();
195
- return new Promise((resolve, reject) => {
196
- const request = new HTTPManagerPostRequest(this.loginServiceURI);
197
- request.ignoreGlobalPostParams = true;
198
- const encodedCredentials = ConversionUtils.stringToBase64(ConversionUtils.stringToBase64(this._userName) + ',' + ConversionUtils.stringToBase64(this._password));
199
- request.parameters = { data: encodedCredentials };
200
- request.successCallback = (response) => {
201
- if (response !== '') {
202
- response = JSON.parse(response);
203
- this._isLogged = true;
204
- this._token = response.token;
205
- this._operations = response.operations;
206
- this.httpManager.setGlobalPostParam('token', response.token);
207
- resolve(response);
208
- }
209
- else {
210
- this._clearUserAndToken();
211
- reject(new Error());
212
- }
213
- };
214
- request.errorCallback = () => {
215
- this._clearUserAndToken();
216
- reject(new Error());
217
- };
218
- request.finallyCallback = () => {
219
- this.dialogService.removeModalBusyState();
220
- };
221
- this.httpManager.execute(request);
222
- });
223
- }
224
- /**
225
- * Perform a request to the API service to create a new token for the user that is currently logged in.
226
- *
227
- * @param options The parameters that will affect the token behaviour. To learn more about each option, please
228
- * refer to the turbodepot UsersManager class createToken method documentation
229
- *
230
- * @returns A promise that resolves with the created token string if the request is successful, or rejects
231
- * with an error (containing all the error response details) if the request fails.
232
- */
233
- createUserToken(options) {
234
- return this.call(this.tokenCreationServiceURI, { options: options }, { resultFormat: 'STRING' });
235
- }
236
- /**
237
- * Checks if the user and password credentials are filled and not empty.
238
- * If any of the two values is empty, false will be returned
239
- */
240
- get isUserAndPswDefined() {
241
- return !StringUtils.isEmpty(this._userName) && !StringUtils.isEmpty(this._password);
242
- }
243
- /**
244
- * Tells if the user name and psw that are specified on this service are currently logged or not. This means
245
- * also a token is active.
246
- */
247
- get isLogged() {
248
- return this._isLogged;
249
- }
250
- /**
251
- * Gives the value for the currently active user authentication token or an empty string if no user logged
252
- */
253
- get token() {
254
- return this._token;
255
- }
256
- /**
257
- * Checks if the currently logged user is allowed to perform the specified operation.
258
- * This will check the user permisions as defined on server side and return true if the operation is allowed
259
- * or false if not. We can then decide what to do (hide an app section, block a button, etc)
260
- *
261
- * @param operation The name of the operation to check
262
- *
263
- * @returns True if the operation is allowed, false otherwise
264
- */
265
- isUserAllowedTo(operation) {
266
- return this._operations.includes(operation);
267
- }
268
- /**
269
- * Performs a standard request to an API service and returns a promise that resolves with the response data.
270
- *
271
- * Following is an example of a call:
272
- *
273
- * this.apiService.call('users/user-create', this.userData, {handleErrors: false}).then(response => {
274
- *
275
- * console.log('Success:', response);
276
- *
277
- * }).catch(error => {
278
- *
279
- * console.error('Error:', error.message);
280
- * });
281
- *
282
- * @param apiPath - A relative URL (based on the defined base root url) that defines the path to the service to call.
283
- * For example: 'users/login'
284
- * @param parameters - An object containing key-value pairs that are sent as the request body.
285
- * token parameter is not necessary, it is automatically appended
286
- * @param options An object defining several options for the request:
287
- * resultFormat: 'JSON' by default. The expected format of the response.
288
- * busyState: Enabled by default. Enables or disables the busy state to lock user interaction while performing the http calls.
289
- * handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.
290
- * If set to false, the promise will generate a reject error that must be handled by our code.
291
- *
292
- * @returns A promise that resolves with the response data correctly parsed if the request is successful, or rejects
293
- * with an error (containing all the error response details) if the request fails.
294
- */
295
- call(apiPath, parameters = {}, options = {}) {
296
- // Set the default values for non specified properties
297
- options.resultFormat = options.resultFormat ?? 'JSON';
298
- options.busyState = options.busyState ?? true;
299
- options.handleErrors = options.handleErrors ?? true;
300
- if (options.busyState) {
301
- this.dialogService.addModalBusyState();
302
- }
303
- return new Promise((resolve, reject) => {
304
- // Create the request object
305
- const request = new HTTPManagerPostRequest(apiPath, options.resultFormat === 'STRING' ? HTTPManagerPostRequest.STRING : HTTPManagerPostRequest.JSON);
306
- request.parameters = parameters;
307
- request.successCallback = (response) => {
308
- resolve(response);
309
- };
310
- request.errorCallback = (errorMsg, errorCode, response) => {
311
- if (options.handleErrors) {
312
- this.showErrorDialog(errorMsg, errorCode, response);
313
- }
314
- else {
315
- reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));
316
- }
317
- };
318
- request.finallyCallback = () => {
319
- if (options.busyState) {
320
- this.dialogService.removeModalBusyState();
321
- }
322
- };
323
- this.httpManager.execute(request);
324
- });
325
- }
326
- /**
327
- * Performs a request to chain several api calls into a single http request, via the chain services mechanism of the turboframework API.
328
- * Returns a promise that resolves with an array of response objects. One for each of the request calls.
329
- *
330
- * @param apiPath - A relative URL (based on the defined base root url) that defines the path to the root of the chain services call.
331
- * For example: 'turbosite/chain/chain-services'
332
- * @param services - An array of objects, were each object contains a valid structure for the chain services call.
333
- * Token parameter is not necessary, it is automatically appended
334
- * @param options An object defining several options for the request:
335
- * busyState: Enables or disables the busy state to lock user interaction while performing the http calls. Enabled by default
336
- * handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.
337
- * If set to false, the promise will generate a reject error that must be handled by our code.
338
- *
339
- * @returns A promise that resolves with the response data correctly parsed if the request is successful, or rejects
340
- * with an error (containing all the error response details) if the request fails.
341
- */
342
- callChain(apiPath, services, options = {}) {
343
- // Set the default values for non specified properties
344
- options.busyState = options.busyState ?? true;
345
- options.handleErrors = options.handleErrors ?? true;
346
- if (options.busyState) {
347
- this.dialogService.addModalBusyState();
348
- }
349
- return new Promise((resolve, reject) => {
350
- const request = new HTTPManagerPostRequest(apiPath, HTTPManagerPostRequest.JSON);
351
- request.ignoreGlobalPostParams = true;
352
- request.parameters = { services: services };
353
- request.successCallback = (response) => {
354
- resolve(response);
355
- };
356
- request.errorCallback = (errorMsg, errorCode, response) => {
357
- if (options.handleErrors) {
358
- this.showErrorDialog(errorMsg, errorCode, response);
359
- }
360
- else {
361
- reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));
362
- }
363
- };
364
- request.finallyCallback = () => {
365
- if (options.busyState) {
366
- this.dialogService.removeModalBusyState();
367
- }
368
- };
369
- this.httpManager.execute(request);
370
- });
371
- }
372
- /**
373
- * Aux method to show an error dialog when a request fails and error handling is enabled
374
- */
375
- showErrorDialog(errorMsg, errorCode, response) {
376
- errorMsg = errorMsg + '\n\n' + response;
377
- if (StringUtils.isEmpty(errorMsg)) {
378
- errorMsg = 'Unknown error. Make sure Internet connection is available';
379
- }
380
- this.dialogService.addDialog(DialogErrorComponent, {
381
- width: '50vw',
382
- texts: ['Error: ' + errorCode, errorMsg],
383
- options: ['Ok']
384
- });
385
- }
386
- /**
387
- * Perform the logout for the currently logged user
388
- *
389
- * @param options An object defining several options for the request:
390
- * handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.
391
- * If set to false, the promise will generate a reject error that must be handled by our code.
392
- *
393
- * @returns A promise that resolves correctly if the logout is correct, or rejects with an error (containing all the error
394
- * response details) if the request fails.
395
- */
396
- logout(options = {}) {
397
- // Set the default values for non specified properties
398
- options.handleErrors = options.handleErrors ?? true;
399
- this.dialogService.addModalBusyState();
400
- return new Promise((resolve, reject) => {
401
- const request = new HTTPManagerPostRequest(this.logOutServiceURI);
402
- request.parameters = { token: this._token };
403
- request.successCallback = () => {
404
- this._clearUserAndToken();
405
- resolve(undefined);
406
- };
407
- request.errorCallback = (errorMsg, errorCode, response) => {
408
- if (options.handleErrors) {
409
- this.showErrorDialog(errorMsg, errorCode, response);
410
- }
411
- else {
412
- reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));
413
- }
414
- };
415
- request.finallyCallback = () => {
416
- this.dialogService.removeModalBusyState();
417
- };
418
- this.httpManager.execute(request);
419
- });
420
- }
421
- /**
422
- * Aux methot to clear all the currently logged user data
423
- */
424
- _clearUserAndToken() {
425
- this._userName = '';
426
- this._password = '';
427
- this._isLogged = false;
428
- this._token = '';
429
- this.httpManager.setGlobalPostParam('token', '-');
430
- }
431
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TurboApiCallerService, deps: [{ token: i1.DialogService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
432
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TurboApiCallerService, providedIn: 'root' }); }
433
- }
434
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TurboApiCallerService, decorators: [{
435
- type: Injectable,
436
- args: [{
437
- providedIn: 'root',
438
- }]
439
- }], ctorParameters: () => [{ type: i1.DialogService }, { type: i2.BrowserService }] });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyYm8tYXBpLWNhbGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9jb250cm9sbGVyL3R1cmJvLWFwaS1jYWxsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7OztBQUk5Rjs7R0FFRztBQUlILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxxQkFBcUI7SUFxRTVELFlBQTZCLGFBQTRCLEVBQzVCLGNBQThCO1FBRXZELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBSEosa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBbkUzRDs7V0FFRztRQUNILG9CQUFlLEdBQUcsYUFBYSxDQUFDO1FBR2hDOztXQUVHO1FBQ0gsNEJBQXVCLEdBQUcseUJBQXlCLENBQUM7UUFHcEQ7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRyxjQUFjLENBQUM7UUFHbEM7O1dBRUc7UUFDSCx5QkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztRQUdoRDs7V0FFRztRQUNLLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFHdkI7O1dBRUc7UUFDSyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBR3ZCOztXQUVHO1FBQ0ssc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBRy9COztXQUVHO1FBQ0ssY0FBUyxHQUFHLEtBQUssQ0FBQztRQUcxQjs7V0FF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LEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUV0RCxJQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUM7b0JBRXBCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFFdkQ7cUJBQUk7b0JBRUQsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNsRTtZQUNMLENBQUMsQ0FBQztZQUVGLE9BQU8sQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO2dCQUU1QixJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR0Q7O09BRUc7SUFDSyxrQkFBa0I7UUFFdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs4R0F6a0JRLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzJGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udmVyc2lvblV0aWxzLCBIVFRQTWFuYWdlciwgSFRUUE1hbmFnZXJQb3N0UmVxdWVzdCwgU3RyaW5nVXRpbHMgfSBmcm9tICd0dXJib2NvbW1vbnMtdHMnO1xyXG5pbXBvcnQgeyBTaW5nbGV0b25lU3RyaWN0Q2xhc3MgfSBmcm9tICcuLi9tb2RlbC9jbGFzc2VzL1NpbmdsZXRvbmVTdHJpY3RDbGFzcyc7XHJcbmltcG9ydCB7IERpYWxvZ0Vycm9yQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2RpYWxvZy1lcnJvci9kaWFsb2ctZXJyb3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UgfSBmcm9tICcuL2Jyb3dzZXIuc2VydmljZSc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEFsbG93cyB1cyB0byBlYXNpbHkgcGVyZm9ybSByZXF1ZXN0cyB0byBhIHJlbW90ZSBBUEkgdGhhdCBpcyBkZXZlbG9wZWQgd2l0aCBUdXJibyBmcmFtZXdvcmsuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHVyYm9BcGlDYWxsZXJTZXJ2aWNlIGV4dGVuZHMgU2luZ2xldG9uZVN0cmljdENsYXNzIHtcclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVVJJIFBhdGggdG8gdGhlIHdlYiBzZXJ2aWNlIHRoYXQgcGVyZm9ybXMgdGhlIHVzZXIgbG9naW5cclxuICAgICAqL1xyXG4gICAgbG9naW5TZXJ2aWNlVVJJID0gJ3VzZXJzL2xvZ2luJztcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFVSSSBQYXRoIHRvIHRoZSB3ZWIgc2VydmljZSB0aGF0IGFsbG93cyB1cyB0byBjcmVhdGUgZXh0cmEgdXNlciB0b2tlbnNcclxuICAgICAqL1xyXG4gICAgdG9rZW5DcmVhdGlvblNlcnZpY2VVUkkgPSAndXNlcnMvdXNlci10b2tlbi1jcmVhdGUnO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVVJJIFBhdGggdG8gdGhlIHdlYiBzZXJ2aWNlIHRoYXQgcGVyZm9ybXMgdGhlIHVzZXIgbG9nIG91dFxyXG4gICAgICovXHJcbiAgICBsb2dPdXRTZXJ2aWNlVVJJID0gJ3VzZXJzL2xvZ291dCc7XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBVUkkgUGF0aCB0byB0aGUgd2ViIHNlcnZpY2UgdGhhdCBwZXJmb3JtcyB0aGUgdmVyaWZpY2F0aW9uIGZvciBhIHVzZXIgZW1haWxcclxuICAgICAqL1xyXG4gICAgbWFpbFZlcmlmeVNlcnZpY2VVUkkgPSAndXNlcnMvdXNlci1tYWlsLXZlcmlmeSc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHVzZXJuYW1lIHRoYXQgaXMgY3VycmVudGx5IGRlZmluZWQgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgbG9naW4gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF91c2VyTmFtZSA9ICcnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIgdGhhdCBpcyBjdXJyZW50bHkgZGVmaW5lZCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dpbiBtZXRob2RzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3Bhc3N3b3JkID0gJyc7XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyB0aGUgbGFzdCBlbWFpbCBhY2NvdW50IHRoYXQgaGFzIGJlZW4gdmVyaWZpZWQgKG9yIHRyaWVkIHRvIHZlcmlmeSkgYnkgdGhpcyBzZXJ2aWNlLCBpZiBhbnlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZlcmlmaWVkTWFpbCA9ICcnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIHB1YmxpYyBnZXR0ZXIgZm9yIGRvY3NcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaXNMb2dnZWQgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc2VlIHRva2VuKCkgZ2V0dGVyIGZvciBtb3JlIGluZm9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfdG9rZW4gPSAnJztcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2Ygb3BlcmF0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIHRoZSBjdXJyZW50bHkgbG9nZWQgdXNlci4gSXQgZ2V0cyBmaWxsZWQganVzdCBhZnRlciBsb2dpbiBpcyBwZXJmb3JtZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb3BlcmF0aW9uczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBodHRwIG1hbmFnZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGV4Y2x1c2l2ZSB0byB0aGlzIHR1cmJvIGFwaSBjYWxsZXIgc2VydmljZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwTWFuYWdlcjogSFRUUE1hbmFnZXI7XHJcbiAgICBcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLCBcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlclNlcnZpY2U6IEJyb3dzZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc3VwZXIoVHVyYm9BcGlDYWxsZXJTZXJ2aWNlKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDcmVhdGUgYSBmcmVzaCBpbnN0YW5jZSBvZiB0aGUgaHR0cCBzZXJ2aWNlIHNvIHdlIGNhbiB1c2UgaXQgaW5kZXBlbmRlbnRseVxyXG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXIgPSBuZXcgSFRUUE1hbmFnZXIoKTtcclxuICAgICAgICB0aGlzLl9jbGVhclVzZXJBbmRUb2tlbigpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKiBcclxuICAgICAqIFRoZSB1c2VybmFtZSB0aGF0IGlzIGN1cnJlbnRseSBkZWZpbmVkIGFuZCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxvZ2luIG1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc2V0IHVzZXJOYW1lKHY6c3RyaW5nKXtcclxuXHJcbiAgICAgICAgdGhpcy5faXNMb2dnZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90b2tlbiA9ICcnO1xyXG4gICAgICAgIHRoaXMuX3VzZXJOYW1lID0gdjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgdXNlcm5hbWUgdGhhdCBpcyBjdXJyZW50bHkgZGVmaW5lZCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dpbiBtZXRob2RzXHJcbiAgICAgKi9cclxuICAgIGdldCB1c2VyTmFtZSgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyTmFtZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGRlZmluZWQgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgbG9naW4gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBzZXQgcGFzc3dvcmQodjpzdHJpbmcpe1xyXG5cclxuICAgICAgICB0aGlzLl9pc0xvZ2dlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rva2VuID0gJyc7XHJcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSB2O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKiBcclxuICAgICAqIFRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIgdGhhdCBpcyBjdXJyZW50bHkgZGVmaW5lZCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dpbiBtZXRob2RzXHJcbiAgICAgKi9cclxuICAgIGdldCBwYXNzd29yZCgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXNzd29yZDtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIERlZmluZSB0aGUgcm9vdCB1cmwgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCB0aGUgQVBJIGNhbGxzXHJcbiAgICAgKi9cclxuICAgIHNldCBiYXNlVXJsKHVybDpzdHJpbmcpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXIuYmFzZVVybCA9IHVybDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKiogXHJcbiAgICAgKiBEZWZpbmUgdGhlIHJvb3QgdXJsIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgdGhlIEFQSSBjYWxsc1xyXG4gICAgICovXHJcbiAgICBnZXQgYmFzZVVybCgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBNYW5hZ2VyLmJhc2VVcmw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBicm93c2VyIFVSTCBjb250YWlucyBhIGhhc2ggZnJhZ21lbnQgKFRoZSBwYXJ0IGFmdGVyIHRoZSAjIGNoYXJhY3RlcikgdGhhdCBjb250YWlucyBlbmNvZGVkIHVzZXIgb3IgcGFzc3dvcmRcclxuICAgICAqIHZhbHVlcywgdGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhbmQgYXV0b21hdGljYWxseSBzZXQgdGhlbSBhcyB0aGUgY3JlZGVudGlhbHMgdG8gdXNlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgVVJMIGhhc2ggaXMgbm90IGFsdGVyZWQgaW4gYW55IHdheSBieSB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIGFueSBjcmVkZW50aWFscyB3ZXJlIGZvdW5kIGFuZCBsb2FkZWQsIGZhbHNlIGlmIG5vdGhpbmcgaGFwcGVuZWRcclxuICAgICAqL1xyXG4gICAgbG9hZENyZWRlbnRpYWxzRnJvbVVSTEhhc2hGcmFnbWVudCgpIHtcclxuICAgIFxyXG4gICAgICAgIC8vIElmIHRoZSBoYXNoIGZyYWdtZW50IGlzIGVtcHR5LCBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgaWYoIXRoaXMuYnJvd3NlclNlcnZpY2UuaXNDdXJyZW50VXJsV2l0aEhhc2hGcmFnbWVudCgpKXtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgbGV0IHZhbHVlc0ZvdW5kID0gZmFsc2U7XHJcbiAgICAgICBcclxuICAgICAgICAvLyBTcGxpdCB0aGUgaGFzaCBmcmFnbWVudCB0byBvYnRhaW4gdGhlIGRpZmZlcmVudCB2YWx1ZXMgdGhhdCBjb250YWluc1xyXG4gICAgICAgIGxldCBoYXNoRGF0YSA9IHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0Q3VycmVudFVybEhhc2hGcmFnbWVudCgpLnNwbGl0KCcvJyk7XHJcbiAgICAgICBcclxuICAgICAgICAvLyBVc2VyIG5hbWUgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGhhc2ggZnJhZ21lbnQuIElmIHdlIGZvdW5kIGEgdmFsdWUsIFxyXG4gICAgICAgIC8vIHdlIHdpbGwgZmlsbCBpdCBhdXRvbWF0aWNhbGx5XHJcbiAgICAgICAgaWYoaGFzaERhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhbHVlc0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IENvbnZlcnNpb25VdGlscy5iYXNlNjRUb1N0cmluZyhoYXNoRGF0YVswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgLy8gQXV0byBmaWxsIHRoZSBwYXNzd29yZCBpZiBpdCBpcyByZWNlaXZlZFxyXG4gICAgICAgIGlmKGhhc2hEYXRhLmxlbmd0aCA+IDMpe1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB2YWx1ZXNGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbM10pO1xyXG4gICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2YWx1ZXNGb3VuZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBjdXJyZW50IGJyb3dzZXIgVVJMIGNvbnRhaW5zIGEgaGFzaCBmcmFnbWVudCAoVGhlIHBhcnQgYWZ0ZXIgdGhlICMgY2hhcmFjdGVyKSB0aGF0IGNvbnRhaW5zIGVuY29kZWQgdXNlciwgbWFpbCBhbmRcclxuICAgICAqIGhhcyB2ZXJpZmljYXRpb24gY29kZSB2YWx1ZXMsIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gdmVyaWZ5IHRoYXQgZW1haWwgYWNjb3VudCBmb3IgdGhlIHVzZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBVUkkgcGF0aCB0byB0aGUgbWFpbCB2ZXJpZmljYXRpb24gc2VydmljZSBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGF0IHRoaXMubWFpbFZlcmlmeVNlcnZpY2VVUkkgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2VydmVyIHJlc3BvbnNlIGlmIHRoZSB2ZXJpZmljYXRpb24gaXMgc3VjY2Vzc2Z1bCxcclxuICAgICAqICAgICAgICAgIG9yIHJlamVjdHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzLiBSZXNwb25zZSB3aWxsIGhhdmUgNCBwb3NzaWJsZSB2YWx1ZXM6XHJcbiAgICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZCAtIG1lYW5pbmcgdGhhdCB0aGUgVVJMIGhhc2ggZnJhZ21lbnQgZGlkbid0IGNvbnRhaW4gdmFsaWQgdmVyaWZpY2F0aW9uIHZhbHVlc1xyXG4gICAgICogICAgICAgICAgICAgIC0xIC0gbWVhbmluZyB2ZXJpZmljYXRpb24gZmFpbGVkXHJcbiAgICAgKiAgICAgICAgICAgICAgIDAgLSBtZWFuaW5nIHZlcmlmaWNhdGlvbiBzdWNjZWVkZWRcclxuICAgICAqICAgICAgICAgICAgICAgMSAtIG1lYW5pbmcgdGhlIGVtYWlsIHdhcyBhbHJlYWR5IHByZXZpb3VseSB2ZXJpZmllZFxyXG4gICAgICovXHJcbiAgICB2ZXJpZnlVc2VyTWFpbEZyb21VUkxIYXNoRnJhZ21lbnQoKSB7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBoYXNoIGZyYWdtZW50IGlzIGVtcHR5LCBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgaWYodGhpcy5icm93c2VyU2VydmljZS5pc0N1cnJlbnRVcmxXaXRoSGFzaEZyYWdtZW50KCkpe1xyXG4gICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBoYXNoRGF0YSA9IHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0Q3VycmVudFVybEhhc2hGcmFnbWVudCgpLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKGhhc2hEYXRhLmxlbmd0aCA+PSAzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDYWxsIGZvciB0aGUgdXNlciBtYWlsIHZlcmlmaWNhdGlvbiBpZiB1c2VyLCBtYWlsIGFuZCBoYXNoIGFyZSByZWNlaXZlZFxyXG4gICAgICAgICAgICAgICAgbGV0IHVzZXIgPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbMF0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1haWwgPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbMV0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IGhhc2ggPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbMl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmKCFTdHJpbmdVdGlscy5pc0VtcHR5KHVzZXIpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KG1haWwpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KGhhc2gpKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmVyaWZpZWRNYWlsID0gbWFpbDtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMubWFpbFZlcmlmeVNlcnZpY2VVUkksIHt1c2VyTmFtZTogdXNlciwgbWFpbDogbWFpbCwgaGFzaDogaGFzaH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIE9idGFpbiB0aGUgbGF0IHVzZXIgbWFpbCBhY2NvdW50IHRoYXQgaGFzIGJlZW4gdmVyaWZpZWQgKG9yIGF0dGVtcHRlZCB0byB2ZXJpZnkpIGJ5IHRoaXMgc2VydmljZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGFzdFZlcmlmaWVkTWFpbCgpe1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFZlcmlmaWVkTWFpbDs7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXRoZW50aWNhdGVzIHRoZSB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgdGhhdCBhcmUgY3VycmVudGx5IGRlZmluZWQgYXQgdGhlIHJlc3BlY3RpdmUgcHJvcGVydGllcyBvZiB0aGlzIHNlcnZpY2UuXHJcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNlcnZlcidzIHJlc3BvbnNlIG9yIHJlamVjdHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgbG9naW4gZmFpbHMuXHJcbiAgICAgKiBQYXRoIHRvIHRoZSBsb2dpbiBzZXJ2aWNlIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgYXQgdGhpcy5sb2dpbldlYlNlcnZpY2VcclxuICAgICAqIFxyXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaXMgcGVyZm9ybWVkIGJ5IHNlbmRpbmcgYW4gZW5jb2RlZCBjcmVkZW50aWFscyByZXF1ZXN0IHRvIHRoZSBsb2dpbiB3ZWIgc2VydmljZSB1c2luZyB0aGUgXHJcbiAgICAgKiBjdXJyZW50bHkgZGVmaW5lZCB1c2VyIG5hbWUgYW5kIHBzdy5cclxuICAgICAqXHJcbiAgICAgKiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIGNhbGw6XHJcbiAgICAgKiBcclxuICAgICAqICBsb2dpbigpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICogICAgIGNvbnNvbGUubG9nKCdMb2dpbiBzdWNjZXNzZnVsOicsIHJlc3BvbnNlKTtcclxuICAgICAqICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgKiAgICAgY29uc29sZS5lcnJvcignTG9naW4gZmFpbGVkOicpO1xyXG4gICAgICogIH0pO1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaWYgdGhlIGxvZ2luIGlzIHN1Y2Nlc3NmdWwsXHJcbiAgICAgKiAgICAgICAgICBvciByZWplY3RzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGxvZ2luIGZhaWxzLlxyXG4gICAgICovXHJcbiAgICBsb2dpbigpIHtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkTW9kYWxCdXN5U3RhdGUoKTsgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOihyOmFueSkgPT4gYW55LCByZWplY3QpID0+IHtcclxuICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBIVFRQTWFuYWdlclBvc3RSZXF1ZXN0KHRoaXMubG9naW5TZXJ2aWNlVVJJKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5pZ25vcmVHbG9iYWxQb3N0UGFyYW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRDcmVkZW50aWFscyA9IENvbnZlcnNpb25VdGlscy5zdHJpbmdUb0Jhc2U2NChcclxuICAgICAgICAgICAgICAgIENvbnZlcnNpb25VdGlscy5zdHJpbmdUb0Jhc2U2NCh0aGlzLl91c2VyTmFtZSkgKyAnLCcgKyBDb252ZXJzaW9uVXRpbHMuc3RyaW5nVG9CYXNlNjQodGhpcy5fcGFzc3dvcmQpKTtcclxuICAgIFxyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnMgPSB7IGRhdGE6IGVuY29kZWRDcmVkZW50aWFscyB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5zdWNjZXNzQ2FsbGJhY2sgPSAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09ICcnKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTsgICAgICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0xvZ2dlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSByZXNwb25zZS50b2tlbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGVyYXRpb25zID0gcmVzcG9uc2Uub3BlcmF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLnNldEdsb2JhbFBvc3RQYXJhbSgndG9rZW4nLCByZXNwb25zZS50b2tlbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyVXNlckFuZFRva2VuKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JDYWxsYmFjayA9ICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclVzZXJBbmRUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCkpOyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5maW5hbGx5Q2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UucmVtb3ZlTW9kYWxCdXN5U3RhdGUoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlci5leGVjdXRlKHJlcXVlc3QpO1xyXG4gICAgICAgIH0pOyBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm0gYSByZXF1ZXN0IHRvIHRoZSBBUEkgc2VydmljZSB0byBjcmVhdGUgYSBuZXcgdG9rZW4gZm9yIHRoZSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGxvZ2dlZCBpbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGFmZmVjdCB0aGUgdG9rZW4gYmVoYXZpb3VyLiBUbyBsZWFybiBtb3JlIGFib3V0IGVhY2ggb3B0aW9uLCBwbGVhc2VcclxuICAgICAqICAgICAgICByZWZlciB0byB0aGUgdHVyYm9kZXBvdCBVc2Vyc01hbmFnZXIgY2xhc3MgY3JlYXRlVG9rZW4gbWV0aG9kIGRvY3VtZW50YXRpb25cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3JlYXRlZCB0b2tlbiBzdHJpbmcgaWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwgb3IgcmVqZWN0cyBcclxuICAgICAqICAgICAgICAgIHdpdGggYW4gZXJyb3IgKGNvbnRhaW5pbmcgYWxsIHRoZSBlcnJvciByZXNwb25zZSBkZXRhaWxzKSBpZiB0aGUgcmVxdWVzdCBmYWlscy5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVXNlclRva2VuKG9wdGlvbnM6IHtsaWZlVGltZT86bnVtYmVyLCB1c2VDb3VudD86bnVtYmVyLCBpc0xpZmVUaW1lUmVjeWNsZWQ/OmJvb2xlYW59KSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnRva2VuQ3JlYXRpb25TZXJ2aWNlVVJJLCB7b3B0aW9uczogb3B0aW9uc30sIHtyZXN1bHRGb3JtYXQ6ICdTVFJJTkcnfSk7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgdXNlciBhbmQgcGFzc3dvcmQgY3JlZGVudGlhbHMgYXJlIGZpbGxlZCBhbmQgbm90IGVtcHR5LlxyXG4gICAgICogSWYgYW55IG9mIHRoZSB0d28gdmFsdWVzIGlzIGVtcHR5LCBmYWxzZSB3aWxsIGJlIHJldHVybmVkXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1VzZXJBbmRQc3dEZWZpbmVkKCk6IGJvb2xlYW4gIHtcclxuXHJcbiAgICAgICAgcmV0dXJuICFTdHJpbmdVdGlscy5pc0VtcHR5KHRoaXMuX3VzZXJOYW1lKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eSh0aGlzLl9wYXNzd29yZCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIHVzZXIgbmFtZSBhbmQgcHN3IHRoYXQgYXJlIHNwZWNpZmllZCBvbiB0aGlzIHNlcnZpY2UgYXJlIGN1cnJlbnRseSBsb2dnZWQgb3Igbm90LiBUaGlzIG1lYW5zXHJcbiAgICAgKiBhbHNvIGEgdG9rZW4gaXMgYWN0aXZlLlxyXG4gICAgICovXHJcbiAgICBnZXQgaXNMb2dnZWQoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvZ2dlZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlcyB0aGUgdmFsdWUgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIHVzZXIgYXV0aGVudGljYXRpb24gdG9rZW4gb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHVzZXIgbG9nZ2VkXHJcbiAgICAgKi9cclxuICAgIGdldCB0b2tlbigpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50bHkgbG9nZ2VkIHVzZXIgaXMgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxyXG4gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSB1c2VyIHBlcm1pc2lvbnMgYXMgZGVmaW5lZCBvbiBzZXJ2ZXIgc2lkZSBhbmQgcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBhbGxvd2VkXHJcbiAgICAgKiBvciBmYWxzZSBpZiBub3QuIFdlIGNhbiB0aGVuIGRlY2lkZSB3aGF0IHRvIGRvIChoaWRlIGFuIGFwcCBzZWN0aW9uLCBibG9jayBhIGJ1dHRvbiwgZXRjKVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdG8gY2hlY2sgXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UgXHJcbiAgICAgKi9cclxuICAgIGlzVXNlckFsbG93ZWRUbyhvcGVyYXRpb246c3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pO1xyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgc3RhbmRhcmQgcmVxdWVzdCB0byBhbiBBUEkgc2VydmljZSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkYXRhLlxyXG4gICAgICogXHJcbiAgICAgKiBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNhbGw6XHJcbiAgICAgKiBcclxuICAgICAqICAgICB0aGlzLmFwaVNlcnZpY2UuY2FsbCgndXNlcnMvdXNlci1jcmVhdGUnLCB0aGlzLnVzZXJEYXRhLCB7aGFuZGxlRXJyb3JzOiBmYWxzZX0pLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICogICAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXNwb25zZSk7XHJcbiAgICAgKiAgICAgICAgICBcclxuICAgICAqICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICogICAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcclxuICAgICAqICAgICAgfSk7XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFwaVBhdGggLSBBIHJlbGF0aXZlIFVSTCAoYmFzZWQgb24gdGhlIGRlZmluZWQgYmFzZSByb290IHVybCkgdGhhdCBkZWZpbmVzIHRoZSBwYXRoIHRvIHRoZSBzZXJ2aWNlIHRvIGNhbGwuXHJcbiAgICAgKiAgICAgICAgRm9yIGV4YW1wbGU6ICd1c2Vycy9sb2dpbidcclxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIHNlbnQgYXMgdGhlIHJlcXVlc3QgYm9keS5cclxuICAgICAqICAgICAgICB0b2tlbiBwYXJhbWV0ZXIgaXMgbm90IG5lY2Vzc2FyeSwgaXQgaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IGRlZmluaW5nIHNldmVyYWwgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3Q6XHJcbiAgICAgKiAgICAgICAgcmVzdWx0Rm9ybWF0OiAnSlNPTicgYnkgZGVmYXVsdC4gVGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgcmVzcG9uc2UuIFxyXG4gICAgICogICAgICAgIGJ1c3lTdGF0ZTogRW5hYmxlZCBieSBkZWZhdWx0LiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBidXN5IHN0YXRlIHRvIGxvY2sgdXNlciBpbnRlcmFjdGlvbiB3aGlsZSBwZXJmb3JtaW5nIHRoZSBodHRwIGNhbGxzLlxyXG4gICAgICogICAgICAgIGhhbmRsZUVycm9yczogRW5hYmxlZCBieSBkZWZhdWx0LiBJZiBzZXQgdG8gdHJ1ZSwgYW4gZXJyb3IgZGlhbG9nIHdpbGwgYmUgYXV0b21hdGljYWxseSBzaG93biB3aGVuIHRoZSBjYWxsIGZhaWxzLlxyXG4gICAgICogICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlIHByb21pc2Ugd2lsbCBnZW5lcmF0ZSBhIHJlamVjdCBlcnJvciB0aGF0IG11c3QgYmUgaGFuZGxlZCBieSBvdXIgY29kZS5cclxuICAgICAqICAgICAgIFxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UgZGF0YSBjb3JyZWN0bHkgcGFyc2VkIGlmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsIG9yIHJlamVjdHMgXHJcbiAgICAgKiAgICAgICAgICB3aXRoIGFuIGVycm9yIChjb250YWluaW5nIGFsbCB0aGUgZXJyb3IgcmVzcG9uc2UgZGV0YWlscykgaWYgdGhlIHJlcXVlc3QgZmFpbHMuXHJcbiAgICAgKi9cclxuICAgIGNhbGwoYXBpUGF0aDpzdHJpbmcsIHBhcmFtZXRlcnMgPSB7fSwgb3B0aW9uczoge3Jlc3VsdEZvcm1hdD86J1NUUklORyd8J0pTT04nLCBidXN5U3RhdGU/OmJvb2xlYW4sIGhhbmRsZUVycm9ycz86Ym9vbGVhbn0gPSB7fSl7XHJcbiAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBvcHRpb25zLnJlc3VsdEZvcm1hdCA9IG9wdGlvbnMucmVzdWx0Rm9ybWF0ID8/ICdKU09OJztcclxuICAgICAgICBvcHRpb25zLmJ1c3lTdGF0ZSA9IG9wdGlvbnMuYnVzeVN0YXRlID8/IHRydWU7XHJcbiAgICAgICAgb3B0aW9ucy5oYW5kbGVFcnJvcnMgPSBvcHRpb25zLmhhbmRsZUVycm9ycyA/PyB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKG9wdGlvbnMuYnVzeVN0YXRlKXtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkTW9kYWxCdXN5U3RhdGUoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZToocjphbnkpID0+IGFueSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgSFRUUE1hbmFnZXJQb3N0UmVxdWVzdChcclxuICAgICAgICAgICAgICAgIGFwaVBhdGgsIFxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZXN1bHRGb3JtYXQgPT09ICdTVFJJTkcnID8gSFRUUE1hbmFnZXJQb3N0UmVxdWVzdC5TVFJJTkcgOiBIVFRQTWFuYWdlclBvc3RSZXF1ZXN0LkpTT05cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcblxyXG4gICAgICAgICAgICByZXF1ZXN0LnN1Y2Nlc3NDYWxsYmFjayA9IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVxdWVzdC5lcnJvckNhbGxiYWNrID0gKGVycm9yTXNnLCBlcnJvckNvZGUsIHJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYob3B0aW9ucy5oYW5kbGVFcnJvcnMpe1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JEaWFsb2coZXJyb3JNc2csIGVycm9yQ29kZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yTXNnICsgJyAnICsgZXJyb3JDb2RlICsgJyAnICsgcmVzcG9uc2UpKTtcclxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbmFsbHlDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYob3B0aW9ucy5idXN5U3RhdGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5yZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlci5leGVjdXRlKHJlcXVlc3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHRvIGNoYWluIHNldmVyYWwgYXBpIGNhbGxzIGludG8gYSBzaW5nbGUgaHR0cCByZXF1ZXN0LCB2aWEgdGhlIGNoYWluIHNlcnZpY2VzIG1lY2hhbmlzbSBvZiB0aGUgdHVyYm9mcmFtZXdvcmsgQVBJLlxyXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMuIE9uZSBmb3IgZWFjaCBvZiB0aGUgcmVxdWVzdCBjYWxscy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYXBpUGF0aCAtIEEgcmVsYXRpdmUgVVJMIChiYXNlZCBvbiB0aGUgZGVmaW5lZCBiYXNlIHJvb3QgdXJsKSB0aGF0IGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGNoYWluIHNlcnZpY2VzIGNhbGwuXHJcbiAgICAgKiAgICAgICAgRm9yIGV4YW1wbGU6ICd0dXJib3NpdGUvY2hhaW4vY2hhaW4tc2VydmljZXMnXHJcbiAgICAgKiBAcGFyYW0gc2VydmljZXMgLSBBbiBhcnJheSBvZiBvYmplY3RzLCB3ZXJlIGVhY2ggb2JqZWN0IGNvbnRhaW5zIGEgdmFsaWQgc3RydWN0dXJlIGZvciB0aGUgY2hhaW4gc2VydmljZXMgY2FsbC4gXHJcbiAgICAgKiAgICAgICAgVG9rZW4gcGFyYW1ldGVyIGlzIG5vdCBuZWNlc3NhcnksIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBkZWZpbmluZyBzZXZlcmFsIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0OlxyXG4gICAgICogICAgICAgIGJ1c3lTdGF0ZTogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYnVzeSBzdGF0ZSB0byBsb2NrIHVzZXIgaW50ZXJhY3Rpb24gd2hpbGUgcGVyZm9ybWluZyB0aGUgaHR0cCBjYWxscy4gRW5hYmxlZCBieSBkZWZhdWx0XHJcbiAgICAgKiAgICAgICAgaGFuZGxlRXJyb3JzOiBFbmFibGVkIGJ5IGRlZmF1bHQuIElmIHNldCB0byB0cnVlLCBhbiBlcnJvciBkaWFsb2cgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNob3duIHdoZW4gdGhlIGNhbGwgZmFpbHMuXHJcbiAgICAgKiAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCB0aGUgcHJvbWlzZSB3aWxsIGdlbmVyYXRlIGEgcmVqZWN0IGVycm9yIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGJ5IG91ciBjb2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkYXRhIGNvcnJlY3RseSBwYXJzZWQgaWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwgb3IgcmVqZWN0cyBcclxuICAgICAqICAgICAgICAgIHdpdGggYW4gZXJyb3IgKGNvbnRhaW5pbmcgYWxsIHRoZSBlcnJvciByZXNwb25zZSBkZXRhaWxzKSBpZiB0aGUgcmVxdWVzdCBmYWlscy5cclxuICAgICAqL1xyXG4gICAgY2FsbENoYWluKGFwaVBhdGg6c3RyaW5nLCBzZXJ2aWNlczp7fVtdLCBvcHRpb25zOiB7YnVzeVN0YXRlPzpib29sZWFuLCBoYW5kbGVFcnJvcnM/OmJvb2xlYW59ID0ge30pe1xyXG4gICAgXHJcbiAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3Igbm9uIHNwZWNpZmllZCBwcm9wZXJ0aWVzXHJcbiAgICAgICAgb3B0aW9ucy5idXN5U3RhdGUgPSBvcHRpb25zLmJ1c3lTdGF0ZSA/PyB0cnVlO1xyXG4gICAgICAgIG9wdGlvbnMuaGFuZGxlRXJyb3JzID0gb3B0aW9ucy5oYW5kbGVFcnJvcnMgPz8gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICBpZihvcHRpb25zLmJ1c3lTdGF0ZSl7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFkZE1vZGFsQnVzeVN0YXRlKCk7IFxyXG4gICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZToocjphbnkpID0+IGFueSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEhUVFBNYW5hZ2VyUG9zdFJlcXVlc3QoYXBpUGF0aCwgSFRUUE1hbmFnZXJQb3N0UmVxdWVzdC5KU09OKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuaWdub3JlR2xvYmFsUG9zdFBhcmFtcyA9IHRydWU7ICAgICAgXHJcblxyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnMgPSB7IHNlcnZpY2VzOiBzZXJ2aWNlcyB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5zdWNjZXNzQ2FsbGJhY2sgPSAocmVzcG9uc2U6YW55W10pID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfTsgICAgICBcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JDYWxsYmFjayA9IChlcnJvck1zZywgZXJyb3JDb2RlLCByZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuaGFuZGxlRXJyb3JzKXtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yRGlhbG9nKGVycm9yTXNnLCBlcnJvckNvZGUsIHJlc3BvbnNlKTsgICAgXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3JNc2cgKyAnICcgKyBlcnJvckNvZGUgKyAnICcgKyByZXNwb25zZSkpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZmluYWxseUNhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmJ1c3lTdGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnJlbW92ZU1vZGFsQnVzeVN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXggbWV0aG9kIHRvIHNob3cgYW4gZXJyb3IgZGlhbG9nIHdoZW4gYSByZXF1ZXN0IGZhaWxzIGFuZCBlcnJvciBoYW5kbGluZyBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2hvd0Vycm9yRGlhbG9nKGVycm9yTXNnOnN0cmluZywgZXJyb3JDb2RlOm51bWJlciwgcmVzcG9uc2U6YW55KXtcclxuICAgICAgICBcclxuICAgICAgICBlcnJvck1zZyA9IGVycm9yTXNnICsgJ1xcblxcbicgKyByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzRW1wdHkoZXJyb3JNc2cpKXtcclxuICAgICAgICBcclxuICAgICAgICAgICAgZXJyb3JNc2cgPSAnVW5rbm93biBlcnJvci4gTWFrZSBzdXJlIEludGVybmV0IGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlJzsgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkRGlhbG9nKERpYWxvZ0Vycm9yQ29tcG9uZW50LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDonNTB2dycsXHJcbiAgICAgICAgICAgICAgICB0ZXh0czogWydFcnJvcjogJyArIGVycm9yQ29kZSwgZXJyb3JNc2ddLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogWydPayddXHJcbiAgICAgICAgICAgIH0pOyBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm0gdGhlIGxvZ291dCBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgdXNlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBkZWZpbmluZyBzZXZlcmFsIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0OlxyXG4gICAgICogICAgICAgIGhhbmRsZUVycm9yczogRW5hYmxlZCBieSBkZWZhdWx0LiBJZiBzZXQgdG8gdHJ1ZSwgYW4gZXJyb3IgZGlhbG9nIHdpbGwgYmUgYXV0b21hdGljYWxseSBzaG93biB3aGVuIHRoZSBjYWxsIGZhaWxzLlxyXG4gICAgICogICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlIHByb21pc2Ugd2lsbCBnZW5lcmF0ZSBhIHJlamVjdCBlcnJvciB0aGF0IG11c3QgYmUgaGFuZGxlZCBieSBvdXIgY29kZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgY29ycmVjdGx5IGlmIHRoZSBsb2dvdXQgaXMgY29ycmVjdCwgb3IgcmVqZWN0cyB3aXRoIGFuIGVycm9yIChjb250YWluaW5nIGFsbCB0aGUgZXJyb3IgXHJcbiAgICAgKiAgICAgICAgICByZXNwb25zZSBkZXRhaWxzKSBpZiB0aGUgcmVxdWVzdCBmYWlscy5cclxuICAgICAqL1xyXG4gICAgbG9nb3V0KG9wdGlvbnM6IHtoYW5kbGVFcnJvcnM/OmJvb2xlYW59ID0ge30pIHtcclxuICAgICAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBvcHRpb25zLmhhbmRsZUVycm9ycyA9IG9wdGlvbnMuaGFuZGxlRXJyb3JzID8/IHRydWU7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkTW9kYWxCdXN5U3RhdGUoKTsgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEhUVFBNYW5hZ2VyUG9zdFJlcXVlc3QodGhpcy5sb2dPdXRTZXJ2aWNlVVJJKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzID0geyB0b2tlbjogdGhpcy5fdG9rZW4gfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3Quc3VjY2Vzc0NhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyVXNlckFuZFRva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JDYWxsYmFjayA9IChlcnJvck1zZywgZXJyb3JDb2RlLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmhhbmRsZUVycm9ycyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JEaWFsb2coZXJyb3JNc2csIGVycm9yQ29kZSwgcmVzcG9uc2UpOyAgICBcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvck1zZyArICcgJyArIGVycm9yQ29kZSArICcgJyArIHJlc3BvbnNlKSk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbmFsbHlDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5yZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCk7XHJcbiAgICAgICAgfSk7IFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQXV4IG1ldGhvdCB0byBjbGVhciBhbGwgdGhlIGN1cnJlbnRseSBsb2dnZWQgdXNlciBkYXRhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2NsZWFyVXNlckFuZFRva2VuKCl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdXNlck5hbWUgPSAnJztcclxuICAgICAgICB0aGlzLl9wYXNzd29yZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuX2lzTG9nZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdG9rZW4gPSAnJztcclxuICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLnNldEdsb2JhbFBvc3RQYXJhbSgndG9rZW4nLCAnLScpOyBcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -1,70 +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
- /**
10
- * Sometimes it is necessary to apply some kind of buffer to the user input for certain operations that may be executed
11
- * several times but we need to capture only the latest of them into a certain period of time. This class does exactly this:
12
- * we can queue as many times as we want a specific method call and only the last one will be executed under a defined window of time.
13
- * So for example if a user types keys on an input, we can buffer it for x seconds and perform a request only with the last of its changes.
14
- * Lots of other UI interaction usages may be interesting with this class.
15
- */
16
- export class DelayedMethodCallManager {
17
- /**
18
- * Sometimes it is necessary to apply some kind of buffer to the user input for certain operations that may be executed
19
- * several times but we need to capture only the latest of them into a certain period of time. This class does exactly this:
20
- * we can queue as many times as we want a specific method call and only the last one will be executed under a defined window of time.
21
- * So for example if a user types keys on an input, we can buffer it for x seconds and perform a request only with the last of its changes.
22
- * Lots of other UI interaction usages may be interesting with this class.
23
- *
24
- * @param delay Amount of time to wait before executing the operations . Defaults to 1000 miliseconds.
25
- */
26
- constructor(delay = 1000) {
27
- this.delay = delay;
28
- this._functionsToExecute = [];
29
- this._timerIsRunning = false;
30
- this._setTimeoutHandler = null;
31
- }
32
- /**
33
- * Add a method to be called once the delay time is finished.
34
- * Every time a new call to queue is performed, the delay timer is restarted. When the delay time finishes, only the
35
- * last of the methods that have been pushed by call() will be executed.
36
- *
37
- * Use it to queue several user input operations that should be called only once in a period of time, while waiting
38
- * for the user to finish his input.
39
- *
40
- * @param method The function that will be queued for execution after the delay time has passed
41
- */
42
- queue(method) {
43
- this._functionsToExecute.push(method);
44
- if (this._timerIsRunning) {
45
- clearTimeout(this._setTimeoutHandler);
46
- }
47
- this._timerIsRunning = true;
48
- this._setTimeoutHandler = setTimeout(() => { this.run(); }, this.delay);
49
- }
50
- /**
51
- * Abort all methods that may have been pushed to this class and are waiting to be executed, so none of them
52
- * is executed when the delay time finishes. Basically everything is cleared and stoped when this method is called.
53
- */
54
- cancel() {
55
- if (this._setTimeoutHandler !== null) {
56
- clearTimeout(this._setTimeoutHandler);
57
- }
58
- this._functionsToExecute = [];
59
- this._timerIsRunning = false;
60
- }
61
- /**
62
- * Auxiliary function that performs the call to the latest queued method
63
- */
64
- run() {
65
- this._functionsToExecute.pop()();
66
- this._functionsToExecute = [];
67
- this._timerIsRunning = false;
68
- }
69
- }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVsYXllZE1ldGhvZENhbGxNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9tYW5hZ2Vycy9EZWxheWVkTWV0aG9kQ2FsbE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyx3QkFBd0I7SUFZakM7Ozs7Ozs7O09BUUc7SUFDSCxZQUFvQixRQUFRLElBQUk7UUFBWixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBbEJ4Qix3QkFBbUIsR0FBZSxFQUFFLENBQUM7UUFHckMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsdUJBQWtCLEdBQVEsSUFBSSxDQUFDO0lBY3ZDLENBQUM7SUFHRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsTUFBa0I7UUFFcEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QyxJQUFHLElBQUksQ0FBQyxlQUFlLEVBQUM7WUFFcEIsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFHRDs7O09BR0c7SUFDSCxNQUFNO1FBRUYsSUFBRyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxFQUFDO1lBRWhDLFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUN6QztRQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUdEOztPQUVHO0lBQ0ssR0FBRztRQUVOLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQWlCLEVBQUUsQ0FBQztRQUVqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHNvbWUga2luZCBvZiBidWZmZXIgdG8gdGhlIHVzZXIgaW5wdXQgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBleGVjdXRlZFxyXG4gKiBzZXZlcmFsIHRpbWVzIGJ1dCB3ZSBuZWVkIHRvIGNhcHR1cmUgb25seSB0aGUgbGF0ZXN0IG9mIHRoZW0gaW50byBhIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUuIFRoaXMgY2xhc3MgZG9lcyBleGFjdGx5IHRoaXM6XHJcbiAqIHdlIGNhbiBxdWV1ZSBhcyBtYW55IHRpbWVzIGFzIHdlIHdhbnQgYSBzcGVjaWZpYyBtZXRob2QgY2FsbCBhbmQgb25seSB0aGUgbGFzdCBvbmUgd2lsbCBiZSBleGVjdXRlZCB1bmRlciBhIGRlZmluZWQgd2luZG93IG9mIHRpbWUuXHJcbiAqIFNvIGZvciBleGFtcGxlIGlmIGEgdXNlciB0eXBlcyBrZXlzIG9uIGFuIGlucHV0LCB3ZSBjYW4gYnVmZmVyIGl0IGZvciB4IHNlY29uZHMgYW5kIHBlcmZvcm0gYSByZXF1ZXN0IG9ubHkgd2l0aCB0aGUgbGFzdCBvZiBpdHMgY2hhbmdlcy5cclxuICogTG90cyBvZiBvdGhlciBVSSBpbnRlcmFjdGlvbiB1c2FnZXMgbWF5IGJlIGludGVyZXN0aW5nIHdpdGggdGhpcyBjbGFzcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBEZWxheWVkTWV0aG9kQ2FsbE1hbmFnZXJ7XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2Z1bmN0aW9uc1RvRXhlY3V0ZTogRnVuY3Rpb25bXSA9IFtdO1xyXG5cclxuXHJcbiAgICBwcml2YXRlIF90aW1lcklzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICBcclxuICAgIHByaXZhdGUgX3NldFRpbWVvdXRIYW5kbGVyOiBhbnkgPSBudWxsO1xyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHNvbWUga2luZCBvZiBidWZmZXIgdG8gdGhlIHVzZXIgaW5wdXQgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBleGVjdXRlZFxyXG4gICAgICogc2V2ZXJhbCB0aW1lcyBidXQgd2UgbmVlZCB0byBjYXB0dXJlIG9ubHkgdGhlIGxhdGVzdCBvZiB0aGVtIGludG8gYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiBUaGlzIGNsYXNzIGRvZXMgZXhhY3RseSB0aGlzOlxyXG4gICAgICogd2UgY2FuIHF1ZXVlIGFzIG1hbnkgdGltZXMgYXMgd2Ugd2FudCBhIHNwZWNpZmljIG1ldGhvZCBjYWxsIGFuZCBvbmx5IHRoZSBsYXN0IG9uZSB3aWxsIGJlIGV4ZWN1dGVkIHVuZGVyIGEgZGVmaW5lZCB3aW5kb3cgb2YgdGltZS5cclxuICAgICAqIFNvIGZvciBleGFtcGxlIGlmIGEgdXNlciB0eXBlcyBrZXlzIG9uIGFuIGlucHV0LCB3ZSBjYW4gYnVmZmVyIGl0IGZvciB4IHNlY29uZHMgYW5kIHBlcmZvcm0gYSByZXF1ZXN0IG9ubHkgd2l0aCB0aGUgbGFzdCBvZiBpdHMgY2hhbmdlcy5cclxuICAgICAqIExvdHMgb2Ygb3RoZXIgVUkgaW50ZXJhY3Rpb24gdXNhZ2VzIG1heSBiZSBpbnRlcmVzdGluZyB3aXRoIHRoaXMgY2xhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRlbGF5IEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyAuIERlZmF1bHRzIHRvIDEwMDAgbWlsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVsYXkgPSAxMDAwKSB7XHJcbiAgICAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIG1ldGhvZCB0byBiZSBjYWxsZWQgb25jZSB0aGUgZGVsYXkgdGltZSBpcyBmaW5pc2hlZC5cclxuICAgICAqIEV2ZXJ5IHRpbWUgYSBuZXcgY2FsbCB0byBxdWV1ZSBpcyBwZXJmb3JtZWQsIHRoZSBkZWxheSB0aW1lciBpcyByZXN0YXJ0ZWQuIFdoZW4gdGhlIGRlbGF5IHRpbWUgZmluaXNoZXMsIG9ubHkgdGhlXHJcbiAgICAgKiBsYXN0IG9mIHRoZSBtZXRob2RzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBieSBjYWxsKCkgd2lsbCBiZSBleGVjdXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgaXQgdG8gcXVldWUgc2V2ZXJhbCB1c2VyIGlucHV0IG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBpbiBhIHBlcmlvZCBvZiB0aW1lLCB3aGlsZSB3YWl0aW5nXHJcbiAgICAgKiBmb3IgdGhlIHVzZXIgdG8gZmluaXNoIGhpcyBpbnB1dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcXVldWVkIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIGRlbGF5IHRpbWUgaGFzIHBhc3NlZFxyXG4gICAgICovXHJcbiAgICBxdWV1ZShtZXRob2Q6ICgpID0+IHZvaWQpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uc1RvRXhlY3V0ZS5wdXNoKG1ldGhvZCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYodGhpcy5fdGltZXJJc1J1bm5pbmcpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NldFRpbWVvdXRIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3RpbWVySXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fc2V0VGltZW91dEhhbmRsZXIgPSBzZXRUaW1lb3V0KCgpID0+IHt0aGlzLnJ1bigpIH0sIHRoaXMuZGVsYXkpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQWJvcnQgYWxsIG1ldGhvZHMgdGhhdCBtYXkgaGF2ZSBiZWVuIHB1c2hlZCB0byB0aGlzIGNsYXNzIGFuZCBhcmUgd2FpdGluZyB0byBiZSBleGVjdXRlZCwgc28gbm9uZSBvZiB0aGVtXHJcbiAgICAgKiBpcyBleGVjdXRlZCB3aGVuIHRoZSBkZWxheSB0aW1lIGZpbmlzaGVzLiBCYXNpY2FsbHkgZXZlcnl0aGluZyBpcyBjbGVhcmVkIGFuZCBzdG9wZWQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXHJcbiAgICAgKi9cclxuICAgIGNhbmNlbCgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKHRoaXMuX3NldFRpbWVvdXRIYW5kbGVyICE9PSBudWxsKXtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZXRUaW1lb3V0SGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uc1RvRXhlY3V0ZSA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3RpbWVySXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXhpbGlhcnkgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0aGUgY2FsbCB0byB0aGUgbGF0ZXN0IHF1ZXVlZCBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBydW4oKXtcclxuICAgICAgICBcclxuICAgICAgICAodGhpcy5fZnVuY3Rpb25zVG9FeGVjdXRlLnBvcCgpIGFzICgpID0+IHZvaWQpKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25zVG9FeGVjdXRlID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdGltZXJJc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -1,32 +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
- /**
10
- * Defines the data that is contained inside a GUI notification
11
- */
12
- export class GUINotification {
13
- constructor(name, type = '', data = null) {
14
- /**
15
- * The name for this notification
16
- */
17
- this.name = '';
18
- /**
19
- * An optional type to categorize this notification in case the name is not enough
20
- * to uniquely identify it
21
- */
22
- this.type = '';
23
- /**
24
- * Additional data to send with the notification
25
- */
26
- this.data = null;
27
- this.name = name;
28
- this.type = type;
29
- this.data = data;
30
- }
31
- }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR1VJTm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9tb2RlbC9jbGFzc2VzL0dVSU5vdGlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUFZLElBQVksRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLE9BQVksSUFBSTtRQVFyRDs7V0FFRztRQUNILFNBQUksR0FBRyxFQUFFLENBQUM7UUFHVjs7O1dBR0c7UUFDSCxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBR1Y7O1dBRUc7UUFDSCxTQUFJLEdBQVEsSUFBSSxDQUFDO1FBdEJiLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7Q0FvQkoiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG4vKipcclxuICogRGVmaW5lcyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbnNpZGUgYSBHVUkgbm90aWZpY2F0aW9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR1VJTm90aWZpY2F0aW9uIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlID0gJycsIGRhdGE6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgZm9yIHRoaXMgbm90aWZpY2F0aW9uXHJcbiAgICAgKi9cclxuICAgIG5hbWUgPSAnJztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBvcHRpb25hbCB0eXBlIHRvIGNhdGVnb3JpemUgdGhpcyBub3RpZmljYXRpb24gaW4gY2FzZSB0aGUgbmFtZSBpcyBub3QgZW5vdWdoXHJcbiAgICAgKiB0byB1bmlxdWVseSBpZGVudGlmeSBpdFxyXG4gICAgICovXHJcbiAgICB0eXBlID0gJyc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgd2l0aCB0aGUgbm90aWZpY2F0aW9uXHJcbiAgICAgKi9cclxuICAgIGRhdGE6IGFueSA9IG51bGw7XHJcbn1cclxuIl19