@esfaenza/extensions 15.2.46 → 16.2.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 (64) hide show
  1. package/{esm2020 → esm2022}/esfaenza-extensions.mjs +4 -4
  2. package/esm2022/lib/models/CallResult.mjs +24 -0
  3. package/esm2022/lib/models/CsvHeaders.mjs +26 -0
  4. package/{esm2020 → esm2022}/lib/models/ExportConsts.mjs +31 -31
  5. package/esm2022/lib/models/ExtensionsModuleConfig.mjs +10 -0
  6. package/esm2022/lib/models/GenericItem.mjs +10 -0
  7. package/{esm2020 → esm2022}/lib/models/InboundMessageTypes.mjs +6 -6
  8. package/esm2022/lib/models/InterComMessage.mjs +16 -0
  9. package/{esm2020 → esm2022}/lib/models/TypeCode.mjs +24 -24
  10. package/{esm2020 → esm2022}/lib/modules/extensions.module.mjs +32 -32
  11. package/esm2022/lib/pipes/loc_date.pipe.mjs +38 -0
  12. package/esm2022/lib/services/extensions.base.mjs +30 -0
  13. package/esm2022/lib/services/extensions.clipboard.service.mjs +221 -0
  14. package/esm2022/lib/services/extensions.dates.service.mjs +244 -0
  15. package/esm2022/lib/services/extensions.embedding.service.mjs +213 -0
  16. package/esm2022/lib/services/extensions.exports.service.mjs +617 -0
  17. package/esm2022/lib/services/extensions.hashing.service.mjs +308 -0
  18. package/esm2022/lib/services/extensions.intercom.service.mjs +52 -0
  19. package/esm2022/lib/services/extensions.messages.service.mjs +450 -0
  20. package/esm2022/lib/services/extensions.utilities.service.mjs +250 -0
  21. package/{esm2020 → esm2022}/lib/tokens.mjs +11 -11
  22. package/{esm2020 → esm2022}/public-api.mjs +21 -21
  23. package/{fesm2020 → fesm2022}/esfaenza-extensions.mjs +2509 -2441
  24. package/{fesm2020 → fesm2022}/esfaenza-extensions.mjs.map +1 -1
  25. package/index.d.ts +5 -5
  26. package/lib/models/CallResult.d.ts +23 -23
  27. package/lib/models/CsvHeaders.d.ts +25 -25
  28. package/lib/models/ExportConsts.d.ts +31 -31
  29. package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
  30. package/lib/models/GenericItem.d.ts +9 -9
  31. package/lib/models/InboundMessageTypes.d.ts +5 -5
  32. package/lib/models/InterComMessage.d.ts +12 -12
  33. package/lib/models/TypeCode.d.ts +23 -23
  34. package/lib/modules/extensions.module.d.ts +11 -11
  35. package/lib/pipes/loc_date.pipe.d.ts +24 -24
  36. package/lib/services/extensions.base.d.ts +22 -22
  37. package/lib/services/extensions.clipboard.service.d.ts +54 -54
  38. package/lib/services/extensions.dates.service.d.ts +99 -99
  39. package/lib/services/extensions.embedding.service.d.ts +28 -28
  40. package/lib/services/extensions.exports.service.d.ts +234 -234
  41. package/lib/services/extensions.hashing.service.d.ts +121 -121
  42. package/lib/services/extensions.intercom.service.d.ts +28 -28
  43. package/lib/services/extensions.messages.service.d.ts +195 -195
  44. package/lib/services/extensions.utilities.service.d.ts +107 -107
  45. package/lib/tokens.d.ts +11 -11
  46. package/package.json +13 -19
  47. package/public-api.d.ts +18 -18
  48. package/esm2020/lib/models/CallResult.mjs +0 -6
  49. package/esm2020/lib/models/CsvHeaders.mjs +0 -6
  50. package/esm2020/lib/models/ExtensionsModuleConfig.mjs +0 -4
  51. package/esm2020/lib/models/GenericItem.mjs +0 -6
  52. package/esm2020/lib/models/InterComMessage.mjs +0 -14
  53. package/esm2020/lib/pipes/loc_date.pipe.mjs +0 -37
  54. package/esm2020/lib/services/extensions.base.mjs +0 -29
  55. package/esm2020/lib/services/extensions.clipboard.service.mjs +0 -219
  56. package/esm2020/lib/services/extensions.dates.service.mjs +0 -242
  57. package/esm2020/lib/services/extensions.embedding.service.mjs +0 -208
  58. package/esm2020/lib/services/extensions.exports.service.mjs +0 -615
  59. package/esm2020/lib/services/extensions.hashing.service.mjs +0 -310
  60. package/esm2020/lib/services/extensions.intercom.service.mjs +0 -54
  61. package/esm2020/lib/services/extensions.messages.service.mjs +0 -433
  62. package/esm2020/lib/services/extensions.utilities.service.mjs +0 -252
  63. package/fesm2015/esfaenza-extensions.mjs +0 -2513
  64. package/fesm2015/esfaenza-extensions.mjs.map +0 -1
package/package.json CHANGED
@@ -1,24 +1,20 @@
1
1
  {
2
2
  "name": "@esfaenza/extensions",
3
- "version": "15.2.46",
3
+ "version": "16.2.0",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },
7
7
  "peerDependencies": {
8
- "@esfaenza/localizations": "^15.2.14",
9
- "@angular/common": "^15.2.9",
10
- "@angular/core": "^15.2.9",
11
- "sweetalert2": "11.7.12",
12
- "ngx-toastr": "16.2.0",
13
- "dayjs": "1.11.8",
14
- "exceljs": "4.3.0",
15
- "stream": "0.0.2"
8
+ "@esfaenza/localizations": "^16.2.0",
9
+ "@angular/common": "^16.2.12",
10
+ "@angular/core": "^16.2.12",
11
+ "sweetalert2": "11.17.2",
12
+ "ngx-toastr": "19.0.0",
13
+ "dayjs": "1.11.13",
14
+ "exceljs": "4.4.0",
15
+ "stream": "0.0.3"
16
16
  },
17
- "module": "fesm2015/esfaenza-extensions.mjs",
18
- "es2020": "fesm2020/esfaenza-extensions.mjs",
19
- "esm2020": "esm2020/esfaenza-extensions.mjs",
20
- "fesm2020": "fesm2020/esfaenza-extensions.mjs",
21
- "fesm2015": "fesm2015/esfaenza-extensions.mjs",
17
+ "module": "fesm2022/esfaenza-extensions.mjs",
22
18
  "typings": "index.d.ts",
23
19
  "exports": {
24
20
  "./package.json": {
@@ -26,11 +22,9 @@
26
22
  },
27
23
  ".": {
28
24
  "types": "./index.d.ts",
29
- "esm2020": "./esm2020/esfaenza-extensions.mjs",
30
- "es2020": "./fesm2020/esfaenza-extensions.mjs",
31
- "es2015": "./fesm2015/esfaenza-extensions.mjs",
32
- "node": "./fesm2015/esfaenza-extensions.mjs",
33
- "default": "./fesm2020/esfaenza-extensions.mjs"
25
+ "esm2022": "./esm2022/esfaenza-extensions.mjs",
26
+ "esm": "./esm2022/esfaenza-extensions.mjs",
27
+ "default": "./fesm2022/esfaenza-extensions.mjs"
34
28
  }
35
29
  },
36
30
  "sideEffects": false
package/public-api.d.ts CHANGED
@@ -1,18 +1,18 @@
1
- export * from './lib/modules/extensions.module';
2
- export * from './lib/services/extensions.base';
3
- export * from './lib/services/extensions.dates.service';
4
- export * from './lib/services/extensions.exports.service';
5
- export * from './lib/services/extensions.clipboard.service';
6
- export * from './lib/services/extensions.hashing.service';
7
- export * from './lib/services/extensions.messages.service';
8
- export * from './lib/services/extensions.utilities.service';
9
- export * from './lib/services/extensions.embedding.service';
10
- export * from './lib/tokens';
11
- export * from './lib/models/CallResult';
12
- export * from './lib/models/CsvHeaders';
13
- export * from './lib/models/GenericItem';
14
- export * from './lib/pipes/loc_date.pipe';
15
- /** Intercom */
16
- export * from './lib/models/InboundMessageTypes';
17
- export * from './lib/models/InterComMessage';
18
- export * from './lib/services/extensions.intercom.service';
1
+ export * from './lib/modules/extensions.module';
2
+ export * from './lib/services/extensions.base';
3
+ export * from './lib/services/extensions.dates.service';
4
+ export * from './lib/services/extensions.exports.service';
5
+ export * from './lib/services/extensions.clipboard.service';
6
+ export * from './lib/services/extensions.hashing.service';
7
+ export * from './lib/services/extensions.messages.service';
8
+ export * from './lib/services/extensions.utilities.service';
9
+ export * from './lib/services/extensions.embedding.service';
10
+ export * from './lib/tokens';
11
+ export * from './lib/models/CallResult';
12
+ export * from './lib/models/CsvHeaders';
13
+ export * from './lib/models/GenericItem';
14
+ export * from './lib/pipes/loc_date.pipe';
15
+ /** Intercom */
16
+ export * from './lib/models/InboundMessageTypes';
17
+ export * from './lib/models/InterComMessage';
18
+ export * from './lib/services/extensions.intercom.service';
@@ -1,6 +0,0 @@
1
- /**
2
- * Classe che rappresenta una risposta ricevuta da un Backend
3
- */
4
- export class CallResult {
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsbFJlc3VsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9tb2RlbHMvQ2FsbFJlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0NBb0J0QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDbGFzc2UgY2hlIHJhcHByZXNlbnRhIHVuYSByaXNwb3N0YSByaWNldnV0YSBkYSB1biBCYWNrZW5kXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ2FsbFJlc3VsdDxUID0gbmV2ZXI+e1xyXG5cclxuICAgIC8qKiBUZW1wbyBpbXBpZWdhdG8gcGVyY2jDqSBsYSBjaGlhbWF0YSB0ZXJtaW5hc3NlICovXHJcbiAgICBlbGFwc2VkdGltZTogc3RyaW5nO1xyXG4gICAgLyoqICoqdHJ1ZSoqIHNlIHR1dHRvIMOoIGFuZGF0byBiZW5lLCAqKmZhbHNlKiogYWx0cmltZW50aSAqL1xyXG4gICAgc3VjY2VzczogYm9vbGVhbjtcclxuICAgIC8qKiBJbmRpY2Egc2UgY2kgc29ubyBlcnJvcmkgKi9cclxuICAgIGhhc2Vycm9yOiBib29sZWFuO1xyXG4gICAgLyoqIENvZGljZSBkZWxsJ2V2ZW50dWFsZSBlcnJvcmUgcmVzdGl0dWl0byAqL1xyXG4gICAgZXJyb3Jjb2RlOiBzdHJpbmc7XHJcbiAgICAvKiogTG9nIGRlbGwnZXZlbnR1YWxlIGVycm9yZSByZXN0aXR1aXRvICovXHJcbiAgICBlcnJvcjogc3RyaW5nO1xyXG4gICAgLyoqIElEIGRlbGwnZXZlbnR1YWxlIGVudGl0w6AgcmVsYXRpdmEgYSBxdWVzdGEgcmlzcG9zdGEgKi9cclxuICAgIGVudGl0eWlkOiBhbnk7XHJcbiAgICAvKiogSW5kaWNhIHNlIGNpIHNvbm8gd2FybmluZyAqL1xyXG4gICAgaGFzd2FybmluZzogYm9vbGVhbjtcclxuICAgIC8qKiBMb2cgZGVsbCdldmVudHVhbGUgd2FybmluZyByZXN0aXR1aXRvICovXHJcbiAgICB3YXJuaW5nOiBzdHJpbmc7XHJcbiAgICAvKiogRW50aXTDoCBjb2xsZWdhdGEgYSBxdWVzdG8gQ2FsbFJlc3VsdCAqL1xyXG4gICAgZW50aXR5OiBUO1xyXG59Il19
@@ -1,6 +0,0 @@
1
- /**
2
- * Header per il file CSV che sta venendo generato
3
- */
4
- export class CsvHeaders {
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3N2SGVhZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9tb2RlbHMvQ3N2SGVhZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0NBMEJ0QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBIZWFkZXIgcGVyIGlsIGZpbGUgQ1NWIGNoZSBzdGEgdmVuZW5kbyBnZW5lcmF0b1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENzdkhlYWRlcnMge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlc3RhemlvbmUgZGVsbGEgY29sb25uYVxyXG4gICAqL1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCB2aXN1YWxpenphdGEgaW4gcXVlc3RhIGNvbG9ubmFcclxuICAgKi9cclxuICBrZXk6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogT3JkaW5lIGRlbGxhIGNvbG9ubmFcclxuICAgKi9cclxuICBvcmRlcjogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBOb21lIGRlbGxhIGNoaWF2ZSBkZWxsYSBwcm9wcmlldMOgIGxhdG8gZXMtdGFibGVcclxuICAgKi9cclxuICBwcm9wS2V5OiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogVGlwbyBkZWxsYSBjb2xvbm5hIChwZXIgZXZlbnR1YWxpIGZvcm1hdHRhemlvbmkgc2Ugc2kgc2NhcmljYSBpbiBFeGNlbClcclxuICAgKi9cclxuICB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnO1xyXG59XHJcbiJdfQ==
@@ -1,4 +0,0 @@
1
- /** Classe di configurazione per il modulo di estensione */
2
- export class ExtensionsModuleConfig {
3
- }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXh0ZW5zaW9uc01vZHVsZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9tb2RlbHMvRXh0ZW5zaW9uc01vZHVsZUNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyREFBMkQ7QUFDM0QsTUFBTSxPQUFPLHNCQUFzQjtDQVVsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDbGFzc2UgZGkgY29uZmlndXJhemlvbmUgcGVyIGlsIG1vZHVsbyBkaSBlc3RlbnNpb25lICovXHJcbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zTW9kdWxlQ29uZmlnIHtcclxuXHJcbiAgLyoqIEluZGljYSBzZSBpIG1ldG9kaSBkaSBlc3RlbnNpb25lIGNoZSB1dGlsaXp6YW5vIGxlIGRhdGUgcGVybWV0dG9ubyBsJ3VzbyBkaSBkYXRlIGluIHV0YyAqL1xyXG4gIGFsbG93X3V0Yz86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBQcmVmaXNzbyBkZWxsZSBzZWFyY2hWaWV3IGNoZSBzZXJ2ZSBwZXIgc3RvcmljaXp6YXJsZSBldml0YW5kbyBkaSB0aXJhcnNpIGluIG1lbW9yaWEgYW5jaGUgdHV0dGkgZ2xpIG9nZ2V0dGkuIFNlIHZ1b3RvIHZpZW5lIHN1cHBvc3RvICdIb3QnICovXHJcbiAgYXBwc2VhcmNoX3ByZWZpeD86IHN0cmluZztcclxuXHJcbiAgLyoqIEF0dGl2YSBsYSBtb2RhbGl0w6AgZGkgZGVidWcgcGVyIGwnZXNwb3NpemlvbmUgZGkgbWVzc2FnZ2kgc2lnbmlmaWNhdGl2aSAqL1xyXG4gIGRlYnVnTW9kZT86IGJvb2xlYW47XHJcbn0iXX0=
@@ -1,6 +0,0 @@
1
- /**
2
- * Rappresentazione di un oggetto generico
3
- */
4
- export class GenericItem {
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuZXJpY0l0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvbW9kZWxzL0dlbmVyaWNJdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7Q0FNdkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUmFwcHJlc2VudGF6aW9uZSBkaSB1biBvZ2dldHRvIGdlbmVyaWNvXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR2VuZXJpY0l0ZW0ge1xyXG5cclxuICAvKipcclxuICAgKiBEaXppb25hcmlvIENoaWF2ZSAtIFZhbG9yZSBkZWxsZSBwcm9wcmlldMOgIGRpIHF1ZXN0byBvZ2dldHRvIGdlbmVyaWNvXHJcbiAgICovXHJcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxufVxyXG4iXX0=
@@ -1,14 +0,0 @@
1
- /** Classe che rappresenta un generico messaggio scambiato fra applicazione e moduli */
2
- export class InterComMessage {
3
- /**
4
- * Costruttore
5
- *
6
- * @param type Tipo di messaggio
7
- * @param message Contenuto del messaggio
8
- */
9
- constructor(type, message) {
10
- this.type = type;
11
- this.message = message;
12
- }
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW50ZXJDb21NZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL21vZGVscy9JbnRlckNvbU1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUZBQXVGO0FBRXZGLE1BQU0sT0FBTyxlQUFlO0lBQ3hCOzs7OztPQUtHO0lBQ0gsWUFBbUIsSUFBUyxFQUFTLE9BQVk7UUFBOUIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUFTLFlBQU8sR0FBUCxPQUFPLENBQUs7SUFBSSxDQUFDO0NBQ3pEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIENsYXNzZSBjaGUgcmFwcHJlc2VudGEgdW4gZ2VuZXJpY28gbWVzc2FnZ2lvIHNjYW1iaWF0byBmcmEgYXBwbGljYXppb25lIGUgbW9kdWxpICovXHJcblxyXG5leHBvcnQgY2xhc3MgSW50ZXJDb21NZXNzYWdlIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdHlwZSBUaXBvIGRpIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHR5cGU6IGFueSwgcHVibGljIG1lc3NhZ2U6IGFueSkgeyB9XHJcbn1cclxuIl19
@@ -1,37 +0,0 @@
1
- // Angular
2
- import { Pipe } from "@angular/core";
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../services/extensions.dates.service";
5
- /**
6
- * Pipe che permette di formattare una data in base al formato specificato. Utilizza il **DateService** di **@esfaenza/extensions** per ricondurre l'input a una data valida
7
- */
8
- export class LocDatePipe {
9
- /**
10
- * @ignore
11
- */
12
- constructor(dts) {
13
- this.dts = dts;
14
- }
15
- /**
16
- * Trasformazione della data in input in base al formato richiesto
17
- *
18
- * @param {any} value Valore da ricondurre ad una data e formattare
19
- * @param {string} format Formato in output della data da visualizzare
20
- *
21
- * @returns {string} Data formattata in base al formato
22
- */
23
- transform(value, format = "DD/MM/YYYY") {
24
- if (value == null || value === "")
25
- return null;
26
- var detatchedValue = JSON.parse(JSON.stringify(value));
27
- var dt = this.dts.getDateConvertion(detatchedValue);
28
- return dt.format(format);
29
- }
30
- }
31
- LocDatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocDatePipe, deps: [{ token: i1.DateService }], target: i0.ɵɵFactoryTarget.Pipe });
32
- LocDatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: LocDatePipe, name: "loc_date" });
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocDatePipe, decorators: [{
34
- type: Pipe,
35
- args: [{ name: "loc_date", pure: true }]
36
- }], ctorParameters: function () { return [{ type: i1.DateService }]; } });
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jX2RhdGUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9waXBlcy9sb2NfZGF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7O0FBR3BEOztHQUVHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFFcEI7O09BRUc7SUFDSCxZQUFvQixHQUFnQjtRQUFoQixRQUFHLEdBQUgsR0FBRyxDQUFhO0lBQUksQ0FBQztJQUV6Qzs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEtBQVUsRUFBRSxTQUFpQixZQUFZO1FBQy9DLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRS9DLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7O3dHQXJCUSxXQUFXO3NHQUFYLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsSUFBSTttQkFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2V4dGVuc2lvbnMuZGF0ZXMuc2VydmljZVwiO1xyXG5cclxuLyoqXHJcbiAqIFBpcGUgY2hlIHBlcm1ldHRlIGRpIGZvcm1hdHRhcmUgdW5hIGRhdGEgaW4gYmFzZSBhbCBmb3JtYXRvIHNwZWNpZmljYXRvLiBVdGlsaXp6YSBpbCAqKkRhdGVTZXJ2aWNlKiogZGkgKipAZXNmYWVuemEvZXh0ZW5zaW9ucyoqIHBlciByaWNvbmR1cnJlIGwnaW5wdXQgYSB1bmEgZGF0YSB2YWxpZGFcclxuICovXHJcbkBQaXBlKHsgbmFtZTogXCJsb2NfZGF0ZVwiLCBwdXJlOiB0cnVlIH0pXHJcbmV4cG9ydCBjbGFzcyBMb2NEYXRlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGR0czogRGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hemlvbmUgZGVsbGEgZGF0YSBpbiBpbnB1dCBpbiBiYXNlIGFsIGZvcm1hdG8gcmljaGllc3RvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWxvcmUgZGEgcmljb25kdXJyZSBhZCB1bmEgZGF0YSBlIGZvcm1hdHRhcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgRm9ybWF0byBpbiBvdXRwdXQgZGVsbGEgZGF0YSBkYSB2aXN1YWxpenphcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gRGF0YSBmb3JtYXR0YXRhIGluIGJhc2UgYWwgZm9ybWF0b1xyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZm9ybWF0OiBzdHJpbmcgPSBcIkREL01NL1lZWVlcIik6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICB2YXIgZGV0YXRjaGVkVmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgICAgdmFyIGR0ID0gdGhpcy5kdHMuZ2V0RGF0ZUNvbnZlcnRpb24oZGV0YXRjaGVkVmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBkdC5mb3JtYXQoZm9ybWF0KTtcclxuICAgIH1cclxufSJdfQ==
@@ -1,29 +0,0 @@
1
- // Angular
2
- import { Injectable } from "@angular/core";
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./extensions.embedding.service";
5
- /**
6
- * Service che fornisce un accesso base in lettura/scrittura sulla clipboard
7
- */
8
- export class BaseExtensionsService {
9
- constructor(emb) {
10
- this.emb = emb;
11
- this.RedirectMap = {};
12
- this.RoutesMap = {};
13
- for (let prop in this.RedirectMap) {
14
- this.RoutesMap[prop] = { route: null };
15
- this.RoutesMap[prop].route = (param) => {
16
- let obj = {};
17
- obj[this.RedirectMap[prop].params[0]] = param;
18
- return [(this.emb.Embedded ? "pages_ext/" : "pages/") + this.RedirectMap[prop].url, obj];
19
- };
20
- }
21
- }
22
- }
23
- BaseExtensionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseExtensionsService, deps: [{ token: i1.AppEmbeddingExtensions }], target: i0.ɵɵFactoryTarget.Injectable });
24
- BaseExtensionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseExtensionsService, providedIn: "root" });
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseExtensionsService, decorators: [{
26
- type: Injectable,
27
- args: [{ providedIn: "root" }]
28
- }], ctorParameters: function () { return [{ type: i1.AppEmbeddingExtensions }]; } });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMuYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRzNDOztHQUVHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQUs5QixZQUFvQixHQUEyQjtRQUEzQixRQUFHLEdBQUgsR0FBRyxDQUF3QjtRQUh4QyxnQkFBVyxHQUEyRCxFQUFFLENBQUM7UUFDekUsY0FBUyxHQUEyRCxFQUFFLENBQUM7UUFHMUUsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDOUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0YsQ0FBQyxDQUFBO1NBQ0o7SUFDTCxDQUFDOztrSEFkUSxxQkFBcUI7c0hBQXJCLHFCQUFxQixjQURSLE1BQU07MkZBQ25CLHFCQUFxQjtrQkFEakMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBcHBFbWJlZGRpbmdFeHRlbnNpb25zIH0gZnJvbSBcIi4vZXh0ZW5zaW9ucy5lbWJlZGRpbmcuc2VydmljZVwiO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIGZvcm5pc2NlIHVuIGFjY2Vzc28gYmFzZSBpbiBsZXR0dXJhL3Njcml0dHVyYSBzdWxsYSBjbGlwYm9hcmRcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcclxuZXhwb3J0IGNsYXNzIEJhc2VFeHRlbnNpb25zU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIFJlZGlyZWN0TWFwOiB7IFtpbmRleDogc3RyaW5nXTogeyB1cmw6IHN0cmluZywgcGFyYW1zOiBzdHJpbmdbXSB9IH0gPSB7fTtcclxuICAgIHB1YmxpYyBSb3V0ZXNNYXA6IHsgW2luZGV4OiBzdHJpbmddOiB7IHJvdXRlOiAocGFyYW06IHN0cmluZykgPT4gYW55IH0gfSA9IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZW1iOiBBcHBFbWJlZGRpbmdFeHRlbnNpb25zKSB7XHJcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLlJlZGlyZWN0TWFwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUm91dGVzTWFwW3Byb3BdID0geyByb3V0ZTogbnVsbCB9O1xyXG4gICAgICAgICAgICB0aGlzLlJvdXRlc01hcFtwcm9wXS5yb3V0ZSA9IChwYXJhbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmpbdGhpcy5SZWRpcmVjdE1hcFtwcm9wXS5wYXJhbXNbMF1dID0gcGFyYW07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWyh0aGlzLmVtYi5FbWJlZGRlZCA/IFwicGFnZXNfZXh0L1wiIDogXCJwYWdlcy9cIikgKyB0aGlzLlJlZGlyZWN0TWFwW3Byb3BdLnVybCwgb2JqXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==
@@ -1,219 +0,0 @@
1
- // Angular
2
- import { Injectable, Optional } from "@angular/core";
3
- // Librerie
4
- import Swal from "sweetalert2";
5
- import { first } from "rxjs/operators";
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./extensions.messages.service";
8
- import * as i2 from "@esfaenza/localizations";
9
- /**
10
- * Service che fornisce un accesso base in lettura/scrittura sulla clipboard
11
- */
12
- export class ClipboardService {
13
- /**
14
- * Costruttore
15
- *
16
- * @ignore
17
- */
18
- constructor(msgService, locProvider) {
19
- this.msgService = msgService;
20
- this.locProvider = locProvider;
21
- /**
22
- * Oggetto statico di localizzazione per i messaggi di questa Service
23
- */
24
- this.loc = {
25
- "Unfortunately Firefox doesn't yet support direct Clipboard access if not via extensions, Please use Chrome to do this operation": {
26
- 'en-US': "Unfortunately Firefox doesn't yet support direct Clipboard access if not via extensions, Please use Chrome to do this operation",
27
- 'it-IT': "Mi dispiace ma Firefox non supporta l'accesso diretto alla Clipboard, se non attraverso le estensioni. Si prega di usare Chrome"
28
- },
29
- "Generic error during 'copy' command execution": {
30
- 'en-US': "Generic error during 'copy' command execution",
31
- 'it-IT': "Errore generico durante l'esecuzione del comando 'copy'"
32
- },
33
- "Error during Clipboard content read operation": {
34
- 'en-US': "Error during Clipboard content read operation",
35
- 'it-IT': "Errore nella lettura del contenuto della Clipboard"
36
- },
37
- "Error during Clipboard content copy operation": {
38
- 'en-US': "Error during Clipboard content copy operation",
39
- 'it-IT': "Errore nella scrittura del contenuto nella Clipboard"
40
- },
41
- "Please insert your clipboard content": {
42
- 'en-US': "Please insert your clipboard content",
43
- 'it-IT': "Si prega di incollare il contenuto della Clipboard"
44
- },
45
- "User input required": {
46
- 'en-US': "User input required",
47
- 'it-IT': "Richiesto Input utente"
48
- },
49
- "Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation": {
50
- 'en-US': "Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation",
51
- 'it-IT': "Il browser corrente non supporta la lettura diretta dei dati della Clipboard, si prega di effettuare un'incolla (CTRL + V) nella casella di testo e confermare l'operazione"
52
- },
53
- "Confirm": {
54
- 'en-US': "Confirm",
55
- 'it-IT': "Conferma"
56
- },
57
- "Cancel": {
58
- 'en-US': "Cancel",
59
- 'it-IT': "Annulla"
60
- },
61
- };
62
- }
63
- /**
64
- * Prende il valore della clipboard.
65
- * Si può specificare se ci si aspetta una lista o una matrice di valori in modo da ricevere già un risultato utilizzabile
66
- *
67
- * @param {'array' | 'matrix'} style Stile dell'output desiderato, se array o matrice
68
- * @param {Function} valueFoundCallback Callback che questa funzione chiamerà una volta ottenuto i valori richiesti dalla clipboard
69
- */
70
- async getClipboard(style, valueFoundCallback) {
71
- let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
72
- if (navigator.userAgent.indexOf("Firefox") != -1) {
73
- Swal.fire({
74
- title: this.loc["User input required"][LOCALE],
75
- text: this.loc["Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation"][LOCALE],
76
- input: 'textarea',
77
- icon: "warning",
78
- confirmButtonText: this.loc["Confirm"][LOCALE],
79
- cancelButtonText: this.loc["Cancel"][LOCALE],
80
- showCancelButton: true,
81
- customClass: {
82
- confirmButton: "btn btn-primary",
83
- cancelButton: "btn btn-secondary app-margin-right-15",
84
- container: "app-wrap",
85
- },
86
- reverseButtons: true,
87
- allowOutsideClick: false,
88
- inputValidator: (value) => {
89
- if (!value)
90
- return this.loc["Please insert your clipboard content"][LOCALE];
91
- }
92
- }).then(t => {
93
- if (t.isConfirmed) {
94
- console.log("[@esfaenza/extensions] Retrieving input data from user input");
95
- this.doClipboardDataGet(t.value, style, valueFoundCallback);
96
- }
97
- });
98
- return;
99
- }
100
- if (window.clipboardData) {
101
- console.log("[@esfaenza/extensions] Found clipboardData");
102
- let data = window.clipboardData.getData("Text");
103
- this.doClipboardDataGet(data, style, valueFoundCallback);
104
- }
105
- else if (window.navigator.clipboard) {
106
- console.log("[@esfaenza/extensions] Found navigator clipboard");
107
- window.navigator.permissions.query({ name: 'clipboard-read' }).then(result => {
108
- if (!(result.state === 'granted' || result.state === 'prompt')) {
109
- console.error("[@esfaenza/extensions] Clipboard permission not granted");
110
- if (valueFoundCallback)
111
- valueFoundCallback([]);
112
- return;
113
- }
114
- console.log("[@esfaenza/extensions] Clipboard permission granted, retrieving values");
115
- window.navigator.clipboard.readText()
116
- .then((t) => this.doClipboardDataGet(t, style, valueFoundCallback))
117
- .catch((err) => this.msgService.simpleError(this.loc["Error during Clipboard content read operation"][LOCALE] + ": " + err));
118
- });
119
- }
120
- }
121
- /** @ignore */
122
- doClipboardDataGet(clipboardText, style, valueFoundCallback) {
123
- console.log("[@esfaenza/extensions] Retrieved clipboard values: " + clipboardText);
124
- let value = style == "array" ? this.getClipboardLines(clipboardText) :
125
- style == "matrix" ? this.getClipboardMatrix(clipboardText) : [];
126
- console.log(`[@esfaenza/extensions] Adapted for ${style}: ${JSON.stringify(value)}`);
127
- if (valueFoundCallback)
128
- valueFoundCallback(value);
129
- }
130
- /**
131
- * Ottiene il contenuto della clipboard diviso per righe (separate da newline)
132
- *
133
- * @param {string} data contenuto letto dalla clipboard
134
- *
135
- * @returns {string[]} Array contenente il testo preso dalla clipboard diviso per riga
136
- */
137
- getClipboardLines(data) {
138
- let trimmedData = data.trim();
139
- if (!trimmedData.includes("\r\n") && trimmedData.includes("\n"))
140
- return trimmedData.split("\n");
141
- return trimmedData.split("\r\n");
142
- }
143
- /**
144
- * Ottiene il contenuto della clipboard diviso per righe (separate da newline) e colonne (separate da tab)
145
- *
146
- * @param {string} data contenuto letto dalla clipboard
147
- *
148
- * @returns {string[][]} Matrice contenente il testo preso dalla clipboard diviso per riga e colonna
149
- */
150
- getClipboardMatrix(data) {
151
- var ret = [];
152
- var rows = !data.includes("\r\n") && data.includes("\n") ? data.split("\n") : data.split("\r\n");
153
- // A quanto pare ogni valore è separato da un \t... spero che sia uno standard di quando si copia da excel altrimenti ciao
154
- for (let i = 0; i < rows.length; i++)
155
- ret.push(rows[i].split('\t').map(t => t.trim()));
156
- return ret;
157
- }
158
- /**
159
- * Metodo che copia un testo all'interno della clipboard
160
- *
161
- * @param {string} text Testo da inserire nella clipboard
162
- */
163
- async copyTextToClipboard(text) {
164
- let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
165
- var textArea = document.createElement("textarea");
166
- //
167
- // *** This styling is an extra step which is likely not required. ***
168
- //
169
- // Why is it here? To ensure:
170
- // 1. the element is able to have focus and selection.
171
- // 2. if element was to flash render it has minimal visual impact.
172
- // 3. less flakyness with selection and copying which **might** occur if
173
- // the textarea element is not visible.
174
- //
175
- // The likelihood is the element won't even render, not even a flash,
176
- // so some of these are just precautions. However in IE the element
177
- // is visible whilst the popup box asking the user for permission for
178
- // the web page to copy to the clipboard.
179
- //
180
- // Place in top-left corner of screen regardless of scroll position.
181
- textArea.style.position = "fixed";
182
- textArea.style.top = "0";
183
- textArea.style.left = "0";
184
- // Ensure it has a small width and height. Setting to 1px / 1em
185
- // doesn't work as this gives a negative w/h on some browsers.
186
- textArea.style.width = "2em";
187
- textArea.style.height = "2em";
188
- // We don't need padding, reducing the size if it does flash render.
189
- textArea.style.padding = "0";
190
- // Clean up any borders.
191
- textArea.style.border = "none";
192
- textArea.style.outline = "none";
193
- textArea.style.boxShadow = "none";
194
- // Avoid flash of white box if rendered for any reason.
195
- textArea.style.background = "transparent";
196
- textArea.value = text;
197
- document.body.appendChild(textArea);
198
- textArea.focus();
199
- textArea.select();
200
- try {
201
- var successful = document.execCommand("copy");
202
- if (!successful)
203
- this.msgService.simpleError(this.loc["Generic error during 'copy' command execution"][LOCALE]);
204
- }
205
- catch (err) {
206
- this.msgService.simpleError(this.loc["Error during Clipboard content copy operation"][LOCALE] + ": " + err);
207
- }
208
- document.body.removeChild(textArea);
209
- }
210
- }
211
- ClipboardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ClipboardService, deps: [{ token: i1.MessageService }, { token: i2.BaseLocalization, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
212
- ClipboardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ClipboardService, providedIn: "root" });
213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ClipboardService, decorators: [{
214
- type: Injectable,
215
- args: [{ providedIn: "root" }]
216
- }], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.BaseLocalization, decorators: [{
217
- type: Optional
218
- }] }]; } });
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5jbGlwYm9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9zZXJ2aWNlcy9leHRlbnNpb25zLmNsaXBib2FyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVFyRCxXQUFXO0FBQ1gsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUV2Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE0Q3pCOzs7O09BSUc7SUFDSCxZQUEyQixVQUEwQixFQUFzQixXQUE2QjtRQUE3RSxlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUFzQixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUEvQ3hHOztXQUVHO1FBQ0ssUUFBRyxHQUFHO1lBQ1YsaUlBQWlJLEVBQUU7Z0JBQy9ILE9BQU8sRUFBRSxpSUFBaUk7Z0JBQzFJLE9BQU8sRUFBRSxpSUFBaUk7YUFDN0k7WUFDRCwrQ0FBK0MsRUFBRTtnQkFDN0MsT0FBTyxFQUFFLCtDQUErQztnQkFDeEQsT0FBTyxFQUFFLHlEQUF5RDthQUNyRTtZQUNELCtDQUErQyxFQUFFO2dCQUM3QyxPQUFPLEVBQUUsK0NBQStDO2dCQUN4RCxPQUFPLEVBQUUsb0RBQW9EO2FBQ2hFO1lBQ0QsK0NBQStDLEVBQUM7Z0JBQzVDLE9BQU8sRUFBRSwrQ0FBK0M7Z0JBQ3hELE9BQU8sRUFBRSxzREFBc0Q7YUFDbEU7WUFDRCxzQ0FBc0MsRUFBRTtnQkFDcEMsT0FBTyxFQUFFLHNDQUFzQztnQkFDL0MsT0FBTyxFQUFFLG9EQUFvRDthQUNoRTtZQUNELHFCQUFxQixFQUFFO2dCQUNuQixPQUFPLEVBQUUscUJBQXFCO2dCQUM5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O1FBQ3ZELFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUUxQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUV0QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWxCLElBQUk7WUFDQSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLElBQUcsQ0FBQyxVQUFVO2dCQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3RHO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzlHO1FBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7NkdBMU5RLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBREosTUFBTTsyRkFDbEIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBa0Q0QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFc1xyXG5pbXBvcnQgeyBCYXNlTG9jYWxpemF0aW9uIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLm1lc3NhZ2VzLnNlcnZpY2UnO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IFN3YWwgZnJvbSBcInN3ZWV0YWxlcnQyXCI7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKipcclxuICogU2VydmljZSBjaGUgZm9ybmlzY2UgdW4gYWNjZXNzbyBiYXNlIGluIGxldHR1cmEvc2NyaXR0dXJhIHN1bGxhIGNsaXBib2FyZFxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIENsaXBib2FyZFNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2dnZXR0byBzdGF0aWNvIGRpIGxvY2FsaXp6YXppb25lIHBlciBpIG1lc3NhZ2dpIGRpIHF1ZXN0YSBTZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9jID0ge1xyXG4gICAgICAgIFwiVW5mb3J0dW5hdGVseSBGaXJlZm94IGRvZXNuJ3QgeWV0IHN1cHBvcnQgZGlyZWN0IENsaXBib2FyZCBhY2Nlc3MgaWYgbm90IHZpYSBleHRlbnNpb25zLCBQbGVhc2UgdXNlIENocm9tZSB0byBkbyB0aGlzIG9wZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiVW5mb3J0dW5hdGVseSBGaXJlZm94IGRvZXNuJ3QgeWV0IHN1cHBvcnQgZGlyZWN0IENsaXBib2FyZCBhY2Nlc3MgaWYgbm90IHZpYSBleHRlbnNpb25zLCBQbGVhc2UgdXNlIENocm9tZSB0byBkbyB0aGlzIG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIk1pIGRpc3BpYWNlIG1hIEZpcmVmb3ggbm9uIHN1cHBvcnRhIGwnYWNjZXNzbyBkaXJldHRvIGFsbGEgQ2xpcGJvYXJkLCBzZSBub24gYXR0cmF2ZXJzbyBsZSBlc3RlbnNpb25pLiBTaSBwcmVnYSBkaSB1c2FyZSBDaHJvbWVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJHZW5lcmljIGVycm9yIGR1cmluZyAnY29weScgY29tbWFuZCBleGVjdXRpb25cIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkdlbmVyaWMgZXJyb3IgZHVyaW5nICdjb3B5JyBjb21tYW5kIGV4ZWN1dGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBnZW5lcmljbyBkdXJhbnRlIGwnZXNlY3V6aW9uZSBkZWwgY29tYW5kbyAnY29weSdcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJFcnJvciBkdXJpbmcgQ2xpcGJvYXJkIGNvbnRlbnQgcmVhZCBvcGVyYXRpb25cIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCByZWFkIG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBuZWxsYSBsZXR0dXJhIGRlbCBjb250ZW51dG8gZGVsbGEgQ2xpcGJvYXJkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiRXJyb3IgZHVyaW5nIENsaXBib2FyZCBjb250ZW50IGNvcHkgb3BlcmF0aW9uXCI6e1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCBjb3B5IG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBuZWxsYSBzY3JpdHR1cmEgZGVsIGNvbnRlbnV0byBuZWxsYSBDbGlwYm9hcmRcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJQbGVhc2UgaW5zZXJ0IHlvdXIgY2xpcGJvYXJkIGNvbnRlbnRcIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIlBsZWFzZSBpbnNlcnQgeW91ciBjbGlwYm9hcmQgY29udGVudFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIlNpIHByZWdhIGRpIGluY29sbGFyZSBpbCBjb250ZW51dG8gZGVsbGEgQ2xpcGJvYXJkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiVXNlciBpbnB1dCByZXF1aXJlZFwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiVXNlciBpbnB1dCByZXF1aXJlZFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIlJpY2hpZXN0byBJbnB1dCB1dGVudGVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJZb3VyIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgZnJvbSB0aGUgY2xpcGJvYXJkIGRpcmVjdGx5LiBQbGVhc2UgcGFzdGUgeW91ciBjbGlwYm9hcmQncyBjb250ZW50IGluIHRoaXMgSW5wdXQgZmllbGQgYW5kIGNvbmZpcm0gdGhlIG9wZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiWW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlIGNsaXBib2FyZCBkaXJlY3RseS4gUGxlYXNlIHBhc3RlIHlvdXIgY2xpcGJvYXJkJ3MgY29udGVudCBpbiB0aGlzIElucHV0IGZpZWxkIGFuZCBjb25maXJtIHRoZSBvcGVyYXRpb25cIixcclxuICAgICAgICAgICAgJ2l0LUlUJzogXCJJbCBicm93c2VyIGNvcnJlbnRlIG5vbiBzdXBwb3J0YSBsYSBsZXR0dXJhIGRpcmV0dGEgZGVpIGRhdGkgZGVsbGEgQ2xpcGJvYXJkLCBzaSBwcmVnYSBkaSBlZmZldHR1YXJlIHVuJ2luY29sbGEgKENUUkwgKyBWKSBuZWxsYSBjYXNlbGxhIGRpIHRlc3RvIGUgY29uZmVybWFyZSBsJ29wZXJhemlvbmVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJDb25maXJtXCI6IHtcclxuICAgICAgICAgICAgJ2VuLVVTJzogXCJDb25maXJtXCIsXHJcbiAgICAgICAgICAgICdpdC1JVCc6IFwiQ29uZmVybWFcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJDYW5jZWxcIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkNhbmNlbFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkFubnVsbGFcIlxyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBtc2dTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsb2NQcm92aWRlcjogQmFzZUxvY2FsaXphdGlvbikgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVuZGUgaWwgdmFsb3JlIGRlbGxhIGNsaXBib2FyZC4gXHJcbiAgICAgKiBTaSBwdcOyIHNwZWNpZmljYXJlIHNlIGNpIHNpIGFzcGV0dGEgdW5hIGxpc3RhIG8gdW5hIG1hdHJpY2UgZGkgdmFsb3JpIGluIG1vZG8gZGEgcmljZXZlcmUgZ2nDoCB1biByaXN1bHRhdG8gdXRpbGl6emFiaWxlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICdtYXRyaXgnfSBzdHlsZSBTdGlsZSBkZWxsJ291dHB1dCBkZXNpZGVyYXRvLCBzZSBhcnJheSBvIG1hdHJpY2VcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbHVlRm91bmRDYWxsYmFjayBDYWxsYmFjayBjaGUgcXVlc3RhIGZ1bnppb25lIGNoaWFtZXLDoCB1bmEgdm9sdGEgb3R0ZW51dG8gaSB2YWxvcmkgcmljaGllc3RpIGRhbGxhIGNsaXBib2FyZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2xpcGJvYXJkKHN0eWxlOiAnYXJyYXknIHwgJ21hdHJpeCcsIHZhbHVlRm91bmRDYWxsYmFjayA6ICh2YWx1ZXM6IHN0cmluZ1tdIHwgc3RyaW5nW11bXSkgPT4gdm9pZCkge1xyXG4gICAgICAgIGxldCBMT0NBTEUgPSB0aGlzLmxvY1Byb3ZpZGVyID8gIGF3YWl0IHRoaXMubG9jUHJvdmlkZXIuTG9jYWxlLnBpcGUoZmlyc3QoKSkudG9Qcm9taXNlKCkgOiAnaXQtSVQnO1xyXG5cclxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgU3dhbC5maXJlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIlVzZXIgaW5wdXQgcmVxdWlyZWRcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubG9jW1wiWW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlIGNsaXBib2FyZCBkaXJlY3RseS4gUGxlYXNlIHBhc3RlIHlvdXIgY2xpcGJvYXJkJ3MgY29udGVudCBpbiB0aGlzIElucHV0IGZpZWxkIGFuZCBjb25maXJtIHRoZSBvcGVyYXRpb25cIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgICAgIGlucHV0OiAndGV4dGFyZWEnLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJ3YXJuaW5nXCIsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDb25maXJtXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNhbmNlbFwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b246IFwiYnRuIGJ0bi1zZWNvbmRhcnkgYXBwLW1hcmdpbi1yaWdodC0xNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaW5wdXRWYWxpZGF0b3I6ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY1tcIlBsZWFzZSBpbnNlcnQgeW91ciBjbGlwYm9hcmQgY29udGVudFwiXVtMT0NBTEVdXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSkudGhlbih0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBSZXRyaWV2aW5nIGlucHV0IGRhdGEgZnJvbSB1c2VyIGlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0NsaXBib2FyZERhdGFHZXQodC52YWx1ZSwgc3R5bGUsIHZhbHVlRm91bmRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKDxhbnk+d2luZG93KS5jbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBGb3VuZCBjbGlwYm9hcmREYXRhXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICg8YW55PndpbmRvdykuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcclxuICAgICAgICAgICAgdGhpcy5kb0NsaXBib2FyZERhdGFHZXQoZGF0YSwgc3R5bGUsIHZhbHVlRm91bmRDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlIGlmICgoPGFueT53aW5kb3cpLm5hdmlnYXRvci5jbGlwYm9hcmQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIEZvdW5kIG5hdmlnYXRvciBjbGlwYm9hcmRcIik7XHJcbiAgICAgICAgICAgICg8YW55PndpbmRvdykubmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHsgbmFtZTogJ2NsaXBib2FyZC1yZWFkJyB9KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQuc3RhdGUgPT09ICdncmFudGVkJyB8fCByZXN1bHQuc3RhdGUgPT09ICdwcm9tcHQnKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBDbGlwYm9hcmQgcGVybWlzc2lvbiBub3QgZ3JhbnRlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVGb3VuZENhbGxiYWNrKSB2YWx1ZUZvdW5kQ2FsbGJhY2soW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gQ2xpcGJvYXJkIHBlcm1pc3Npb24gZ3JhbnRlZCwgcmV0cmlldmluZyB2YWx1ZXNcIik7XHJcbiAgICAgICAgICAgICAgICAoPGFueT53aW5kb3cpLm5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh0OiBzdHJpbmcpID0+IHRoaXMuZG9DbGlwYm9hcmREYXRhR2V0KHQsIHN0eWxlLCB2YWx1ZUZvdW5kQ2FsbGJhY2spKVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMubXNnU2VydmljZS5zaW1wbGVFcnJvcih0aGlzLmxvY1tcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCByZWFkIG9wZXJhdGlvblwiXVtMT0NBTEVdICsgXCI6IFwiICsgZXJyKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBkb0NsaXBib2FyZERhdGFHZXQoY2xpcGJvYXJkVGV4dDogc3RyaW5nLCBzdHlsZTogXCJtYXRyaXhcIiB8IFwiYXJyYXlcIiwgdmFsdWVGb3VuZENhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBSZXRyaWV2ZWQgY2xpcGJvYXJkIHZhbHVlczogXCIgKyBjbGlwYm9hcmRUZXh0KTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZSA9PSBcImFycmF5XCIgPyB0aGlzLmdldENsaXBib2FyZExpbmVzKGNsaXBib2FyZFRleHQpIDpcclxuICAgICAgICAgICAgc3R5bGUgPT0gXCJtYXRyaXhcIiA/IHRoaXMuZ2V0Q2xpcGJvYXJkTWF0cml4KGNsaXBib2FyZFRleHQpIDogW107XHJcbiAgICAgICAgY29uc29sZS5sb2coYFtAZXNmYWVuemEvZXh0ZW5zaW9uc10gQWRhcHRlZCBmb3IgJHtzdHlsZX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xyXG4gICAgICAgIGlmICh2YWx1ZUZvdW5kQ2FsbGJhY2spIHZhbHVlRm91bmRDYWxsYmFjayh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNvbnRlbnV0byBkZWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdoZSAoc2VwYXJhdGUgZGEgbmV3bGluZSlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgY29udGVudXRvIGxldHRvIGRhbGxhIGNsaXBib2FyZFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IGNvbnRlbmVudGUgaWwgdGVzdG8gcHJlc28gZGFsbGEgY2xpcGJvYXJkIGRpdmlzbyBwZXIgcmlnYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldENsaXBib2FyZExpbmVzKGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgdHJpbW1lZERhdGEgPSBkYXRhLnRyaW0oKTtcclxuXHJcbiAgICAgICAgaWYgKCF0cmltbWVkRGF0YS5pbmNsdWRlcyhcIlxcclxcblwiKSAmJiB0cmltbWVkRGF0YS5pbmNsdWRlcyhcIlxcblwiKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWREYXRhLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJpbW1lZERhdGEuc3BsaXQoXCJcXHJcXG5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNvbnRlbnV0byBkZWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdoZSAoc2VwYXJhdGUgZGEgbmV3bGluZSkgZSBjb2xvbm5lIChzZXBhcmF0ZSBkYSB0YWIpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIGNvbnRlbnV0byBsZXR0byBkYWxsYSBjbGlwYm9hcmRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdW119IE1hdHJpY2UgY29udGVuZW50ZSBpbCB0ZXN0byBwcmVzbyBkYWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdhIGUgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldENsaXBib2FyZE1hdHJpeChkYXRhOiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICAgICAgICB2YXIgcmV0OiBzdHJpbmdbXVtdID0gW107XHJcbiAgICAgICAgdmFyIHJvd3MgPSAhZGF0YS5pbmNsdWRlcyhcIlxcclxcblwiKSAmJiBkYXRhLmluY2x1ZGVzKFwiXFxuXCIpID8gZGF0YS5zcGxpdChcIlxcblwiKSA6IGRhdGEuc3BsaXQoXCJcXHJcXG5cIik7XHJcblxyXG4gICAgICAgIC8vIEEgcXVhbnRvIHBhcmUgb2duaSB2YWxvcmUgw6ggc2VwYXJhdG8gZGEgdW4gXFx0Li4uIHNwZXJvIGNoZSBzaWEgdW5vIHN0YW5kYXJkIGRpIHF1YW5kbyBzaSBjb3BpYSBkYSBleGNlbCBhbHRyaW1lbnRpIGNpYW9cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHJldC5wdXNoKHJvd3NbaV0uc3BsaXQoJ1xcdCcpLm1hcCh0ID0+IHQudHJpbSgpKSk7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgY29waWEgdW4gdGVzdG8gYWxsJ2ludGVybm8gZGVsbGEgY2xpcGJvYXJkXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIGluc2VyaXJlIG5lbGxhIGNsaXBib2FyZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgY29weVRleHRUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgTE9DQUxFID0gdGhpcy5sb2NQcm92aWRlciA/ICBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuXHJcbiAgICAgICAgdmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vICoqKiBUaGlzIHN0eWxpbmcgaXMgYW4gZXh0cmEgc3RlcCB3aGljaCBpcyBsaWtlbHkgbm90IHJlcXVpcmVkLiAqKipcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdoeSBpcyBpdCBoZXJlPyBUbyBlbnN1cmU6XHJcbiAgICAgICAgLy8gMS4gdGhlIGVsZW1lbnQgaXMgYWJsZSB0byBoYXZlIGZvY3VzIGFuZCBzZWxlY3Rpb24uXHJcbiAgICAgICAgLy8gMi4gaWYgZWxlbWVudCB3YXMgdG8gZmxhc2ggcmVuZGVyIGl0IGhhcyBtaW5pbWFsIHZpc3VhbCBpbXBhY3QuXHJcbiAgICAgICAgLy8gMy4gbGVzcyBmbGFreW5lc3Mgd2l0aCBzZWxlY3Rpb24gYW5kIGNvcHlpbmcgd2hpY2ggKiptaWdodCoqIG9jY3VyIGlmXHJcbiAgICAgICAgLy8gICAgdGhlIHRleHRhcmVhIGVsZW1lbnQgaXMgbm90IHZpc2libGUuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGUgbGlrZWxpaG9vZCBpcyB0aGUgZWxlbWVudCB3b24ndCBldmVuIHJlbmRlciwgbm90IGV2ZW4gYSBmbGFzaCxcclxuICAgICAgICAvLyBzbyBzb21lIG9mIHRoZXNlIGFyZSBqdXN0IHByZWNhdXRpb25zLiBIb3dldmVyIGluIElFIHRoZSBlbGVtZW50XHJcbiAgICAgICAgLy8gaXMgdmlzaWJsZSB3aGlsc3QgdGhlIHBvcHVwIGJveCBhc2tpbmcgdGhlIHVzZXIgZm9yIHBlcm1pc3Npb24gZm9yXHJcbiAgICAgICAgLy8gdGhlIHdlYiBwYWdlIHRvIGNvcHkgdG8gdGhlIGNsaXBib2FyZC5cclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICAvLyBQbGFjZSBpbiB0b3AtbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIHJlZ2FyZGxlc3Mgb2Ygc2Nyb2xsIHBvc2l0aW9uLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnRvcCA9IFwiMFwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlIGl0IGhhcyBhIHNtYWxsIHdpZHRoIGFuZCBoZWlnaHQuIFNldHRpbmcgdG8gMXB4IC8gMWVtXHJcbiAgICAgICAgLy8gZG9lc24ndCB3b3JrIGFzIHRoaXMgZ2l2ZXMgYSBuZWdhdGl2ZSB3L2ggb24gc29tZSBicm93c2Vycy5cclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS53aWR0aCA9IFwiMmVtXCI7XHJcbiAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gXCIyZW1cIjtcclxuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBwYWRkaW5nLCByZWR1Y2luZyB0aGUgc2l6ZSBpZiBpdCBkb2VzIGZsYXNoIHJlbmRlci5cclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XHJcblxyXG4gICAgICAgIC8vIENsZWFuIHVwIGFueSBib3JkZXJzLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmJvcmRlciA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLm91dGxpbmUgPSBcIm5vbmVcIjtcclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5ib3hTaGFkb3cgPSBcIm5vbmVcIjtcclxuXHJcbiAgICAgICAgLy8gQXZvaWQgZmxhc2ggb2Ygd2hpdGUgYm94IGlmIHJlbmRlcmVkIGZvciBhbnkgcmVhc29uLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmJhY2tncm91bmQgPSBcInRyYW5zcGFyZW50XCI7XHJcblxyXG4gICAgICAgIHRleHRBcmVhLnZhbHVlID0gdGV4dDtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XHJcbiAgICAgICAgdGV4dEFyZWEuZm9jdXMoKTtcclxuICAgICAgICB0ZXh0QXJlYS5zZWxlY3QoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHN1Y2Nlc3NmdWwgPSBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XHJcbiAgICAgICAgICAgIGlmKCFzdWNjZXNzZnVsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5tc2dTZXJ2aWNlLnNpbXBsZUVycm9yKHRoaXMubG9jW1wiR2VuZXJpYyBlcnJvciBkdXJpbmcgJ2NvcHknIGNvbW1hbmQgZXhlY3V0aW9uXCJdW0xPQ0FMRV0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uuc2ltcGxlRXJyb3IodGhpcy5sb2NbXCJFcnJvciBkdXJpbmcgQ2xpcGJvYXJkIGNvbnRlbnQgY29weSBvcGVyYXRpb25cIl1bTE9DQUxFXSArIFwiOiBcIisgZXJyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xyXG4gICAgfVxyXG59Il19