@esfaenza/es-charts 12.2.14 → 13.1.2

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 (96) hide show
  1. package/esfaenza-es-charts.d.ts +1 -6
  2. package/esm2020/esfaenza-es-charts.mjs +5 -0
  3. package/esm2020/lib/adapters/classes/BaseAdapter.mjs +50 -0
  4. package/{esm2015/lib/adapters/classes/IBaseAdapter.js → esm2020/lib/adapters/classes/IBaseAdapter.mjs} +0 -0
  5. package/{esm2015/lib/adapters/index.js → esm2020/lib/adapters/index.mjs} +0 -0
  6. package/esm2020/lib/components/base/base-chart.component.mjs +325 -0
  7. package/esm2020/lib/components/chart-pager/chart-pager.component.mjs +89 -0
  8. package/{esm2015/lib/components/index.js → esm2020/lib/components/index.mjs} +0 -0
  9. package/esm2020/lib/components/specializations/es-area-chart.component.mjs +78 -0
  10. package/esm2020/lib/components/specializations/es-chart.component.mjs +111 -0
  11. package/esm2020/lib/components/specializations/es-line-chart.component.mjs +110 -0
  12. package/esm2020/lib/components/specializations/es-pie-chart.component.mjs +99 -0
  13. package/esm2020/lib/components/specializations/es-vertical-2d-chart.component.mjs +96 -0
  14. package/esm2020/lib/components/specializations/es-vertical-chart.component.mjs +93 -0
  15. package/esm2020/lib/components/specializations/es-vertical-stacked-chart.component.mjs +93 -0
  16. package/esm2020/lib/es-charts.module.mjs +61 -0
  17. package/{esm2015/lib/models/EsChaartsModuleConfig.js → esm2020/lib/models/EsChaartsModuleConfig.mjs} +0 -0
  18. package/esm2020/lib/models/core/classes/ChartDispatcher.mjs +91 -0
  19. package/{esm2015/lib/models/core/classes/ChartLoader.js → esm2020/lib/models/core/classes/ChartLoader.mjs} +0 -0
  20. package/{esm2015/lib/models/core/classes/ChartThemes.js → esm2020/lib/models/core/classes/ChartThemes.mjs} +0 -0
  21. package/{esm2015/lib/models/core/index.js → esm2020/lib/models/core/index.mjs} +0 -0
  22. package/{esm2015/lib/models/data/classes/AreaChartData.js → esm2020/lib/models/data/classes/AreaChartData.mjs} +0 -0
  23. package/{esm2015/lib/models/data/classes/LineChartData.js → esm2020/lib/models/data/classes/LineChartData.mjs} +0 -0
  24. package/{esm2015/lib/models/data/classes/PagedChartData.js → esm2020/lib/models/data/classes/PagedChartData.mjs} +0 -0
  25. package/{esm2015/lib/models/data/classes/PieChartData.js → esm2020/lib/models/data/classes/PieChartData.mjs} +0 -0
  26. package/{esm2015/lib/models/data/classes/Vertical2DChartData.js → esm2020/lib/models/data/classes/Vertical2DChartData.mjs} +0 -0
  27. package/{esm2015/lib/models/data/classes/VerticalChartData.js → esm2020/lib/models/data/classes/VerticalChartData.mjs} +0 -0
  28. package/{esm2015/lib/models/data/classes/VerticalStackedChartData.js → esm2020/lib/models/data/classes/VerticalStackedChartData.mjs} +0 -0
  29. package/{esm2015/lib/models/data/classes/base/DateValue.js → esm2020/lib/models/data/classes/base/DateValue.mjs} +0 -0
  30. package/{esm2015/lib/models/data/classes/base/KeyValue.js → esm2020/lib/models/data/classes/base/KeyValue.mjs} +0 -0
  31. package/{esm2015/lib/models/data/classes/base/KeyValueColor.js → esm2020/lib/models/data/classes/base/KeyValueColor.mjs} +0 -0
  32. package/{esm2015/lib/models/data/classes/base/Limit.js → esm2020/lib/models/data/classes/base/Limit.mjs} +0 -0
  33. package/{esm2015/lib/models/data/classes/base/LineSerie.js → esm2020/lib/models/data/classes/base/LineSerie.mjs} +0 -0
  34. package/{esm2015/lib/models/data/index.js → esm2020/lib/models/data/index.mjs} +0 -0
  35. package/{esm2015/lib/models/settings/classes/AreaChartSettings.js → esm2020/lib/models/settings/classes/AreaChartSettings.mjs} +0 -0
  36. package/{esm2015/lib/models/settings/classes/LineChartSettings.js → esm2020/lib/models/settings/classes/LineChartSettings.mjs} +0 -0
  37. package/{esm2015/lib/models/settings/classes/PieChartSettings.js → esm2020/lib/models/settings/classes/PieChartSettings.mjs} +0 -0
  38. package/{esm2015/lib/models/settings/classes/Vertical2DChartSettings.js → esm2020/lib/models/settings/classes/Vertical2DChartSettings.mjs} +0 -0
  39. package/{esm2015/lib/models/settings/classes/VerticalChartSettings.js → esm2020/lib/models/settings/classes/VerticalChartSettings.mjs} +0 -0
  40. package/{esm2015/lib/models/settings/classes/VerticalStackedChartSettings.js → esm2020/lib/models/settings/classes/VerticalStackedChartSettings.mjs} +0 -0
  41. package/{esm2015/lib/models/settings/classes/base/BaseInterval.js → esm2020/lib/models/settings/classes/base/BaseInterval.mjs} +0 -0
  42. package/{esm2015/lib/models/settings/classes/base/BaseSettings.js → esm2020/lib/models/settings/classes/base/BaseSettings.mjs} +0 -0
  43. package/{esm2015/lib/models/settings/classes/base/LegendPad.js → esm2020/lib/models/settings/classes/base/LegendPad.mjs} +0 -0
  44. package/{esm2015/lib/models/settings/index.js → esm2020/lib/models/settings/index.mjs} +0 -0
  45. package/esm2020/lib/services/classes/AreaChartService.mjs +134 -0
  46. package/esm2020/lib/services/classes/LineChartService.mjs +324 -0
  47. package/esm2020/lib/services/classes/PieChartService.mjs +111 -0
  48. package/esm2020/lib/services/classes/Vertical2DChartService.mjs +160 -0
  49. package/esm2020/lib/services/classes/VerticalChartService.mjs +103 -0
  50. package/esm2020/lib/services/classes/VerticalStackedChartService.mjs +124 -0
  51. package/{esm2015/lib/services/classes/base/IBaseService.js → esm2020/lib/services/classes/base/IBaseService.mjs} +0 -0
  52. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  53. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  54. package/esm2020/public-api.mjs +37 -0
  55. package/fesm2015/{esfaenza-es-charts.js → esfaenza-es-charts.mjs} +452 -352
  56. package/fesm2015/esfaenza-es-charts.mjs.map +1 -0
  57. package/fesm2020/esfaenza-es-charts.mjs +2701 -0
  58. package/fesm2020/esfaenza-es-charts.mjs.map +1 -0
  59. package/lib/adapters/classes/BaseAdapter.d.ts +3 -0
  60. package/lib/components/base/base-chart.component.d.ts +3 -0
  61. package/lib/components/chart-pager/chart-pager.component.d.ts +3 -0
  62. package/lib/components/specializations/es-area-chart.component.d.ts +3 -0
  63. package/lib/components/specializations/es-chart.component.d.ts +3 -0
  64. package/lib/components/specializations/es-line-chart.component.d.ts +3 -0
  65. package/lib/components/specializations/es-pie-chart.component.d.ts +3 -0
  66. package/lib/components/specializations/es-vertical-2d-chart.component.d.ts +3 -0
  67. package/lib/components/specializations/es-vertical-chart.component.d.ts +3 -0
  68. package/lib/components/specializations/es-vertical-stacked-chart.component.d.ts +3 -0
  69. package/lib/es-charts.module.d.ts +13 -0
  70. package/lib/models/core/classes/ChartDispatcher.d.ts +3 -0
  71. package/package.json +22 -10
  72. package/public-api.d.ts +1 -0
  73. package/bundles/esfaenza-es-charts.umd.js +0 -3212
  74. package/bundles/esfaenza-es-charts.umd.js.map +0 -1
  75. package/esfaenza-es-charts.metadata.json +0 -1
  76. package/esm2015/esfaenza-es-charts.js +0 -11
  77. package/esm2015/lib/adapters/classes/BaseAdapter.js +0 -47
  78. package/esm2015/lib/components/base/base-chart.component.js +0 -311
  79. package/esm2015/lib/components/chart-pager/chart-pager.component.js +0 -84
  80. package/esm2015/lib/components/specializations/es-area-chart.component.js +0 -75
  81. package/esm2015/lib/components/specializations/es-chart.component.js +0 -108
  82. package/esm2015/lib/components/specializations/es-line-chart.component.js +0 -98
  83. package/esm2015/lib/components/specializations/es-pie-chart.component.js +0 -89
  84. package/esm2015/lib/components/specializations/es-vertical-2d-chart.component.js +0 -87
  85. package/esm2015/lib/components/specializations/es-vertical-chart.component.js +0 -85
  86. package/esm2015/lib/components/specializations/es-vertical-stacked-chart.component.js +0 -85
  87. package/esm2015/lib/es-charts.module.js +0 -42
  88. package/esm2015/lib/models/core/classes/ChartDispatcher.js +0 -88
  89. package/esm2015/lib/services/classes/AreaChartService.js +0 -135
  90. package/esm2015/lib/services/classes/LineChartService.js +0 -326
  91. package/esm2015/lib/services/classes/PieChartService.js +0 -112
  92. package/esm2015/lib/services/classes/Vertical2DChartService.js +0 -163
  93. package/esm2015/lib/services/classes/VerticalChartService.js +0 -105
  94. package/esm2015/lib/services/classes/VerticalStackedChartService.js +0 -127
  95. package/esm2015/public-api.js +0 -36
  96. package/fesm2015/esfaenza-es-charts.js.map +0 -1
@@ -1,10 +1,5 @@
1
1
  /**
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
+ /// <amd-module name="@esfaenza/es-charts" />
4
5
  export * from './public-api';
5
- export { BaseAdapter as ɵi } from './lib/adapters';
6
- export { EsAreaChartComponent as ɵq, EsChartComponent as ɵj, EsLineChartComponent as ɵk, EsPieChartComponent as ɵl, EsVertical2DChartComponent as ɵm, EsVerticalChartComponent as ɵn, EsVerticalStackedChartComponent as ɵo, PageChartSelector as ɵp } from './lib/components';
7
- export { BaseChartComponent as ɵb } from './lib/components/base/base-chart.component';
8
- export { ChartDispatcher as ɵd, ChartLoader as ɵc } from './lib/models/core';
9
- export { BaseInterval as ɵa } from './lib/models/settings';
10
- export { ESC_ANIMATIONS as ɵf, ESC_LOCALE as ɵe, ESC_LOGS as ɵh, ESC_THEME as ɵg } from './lib/tokens';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNmYWVuemEtZXMtY2hhcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9lc2ZhZW56YS1lcy1jaGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,50 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Adapter Base da reimplementare per trasformare i dati da una libreria di grafici a questa per evitare di riscrivere tutto il codice di
5
+ * generazione delle serie in caso si fossero usati grafici di altre librerie
6
+ */
7
+ export class BaseAdapter {
8
+ /**
9
+ * Trasformatore dai dati della libreria vecchia ai dati della libreria nuova per gli Area Chart
10
+ */
11
+ adaptDataForAreaChart(anyData) {
12
+ return anyData;
13
+ }
14
+ /**
15
+ * Trasformatore dai dati della libreria vecchia ai dati della libreria nuova per i Line Chart
16
+ */
17
+ adaptDataForLineChart(anyData) {
18
+ return anyData;
19
+ }
20
+ /**
21
+ * Trasformatore dai dati della libreria vecchia ai dati della libreria nuova per i Line Chart
22
+ */
23
+ adaptDataForPieChart(anyData) {
24
+ return anyData;
25
+ }
26
+ /**
27
+ * Trasformatore dai dati della libreria vecchia ai dati della libreria nuova per i Vertical Chart
28
+ */
29
+ adaptDataForVerticalChart(anyData) {
30
+ return anyData;
31
+ }
32
+ /**
33
+ * Trasformatore dai dati della libreria vecchia ai dati della libreria nuova per i Vertical Chart a due dimensioni
34
+ */
35
+ adaptDataForVertical2DChart(anyData) {
36
+ return anyData;
37
+ }
38
+ /**
39
+ * Trasformatore dai dati della libreria vecchia ai dati della libreria nuova per i Vertical Chart sovrapposti
40
+ */
41
+ adaptDataForVerticalStackedChart(anyData) {
42
+ return anyData;
43
+ }
44
+ }
45
+ BaseAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
46
+ BaseAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseAdapter });
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseAdapter, decorators: [{
48
+ type: Injectable
49
+ }] });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy1jaGFydHMvc3JjL2xpYi9hZGFwdGVycy9jbGFzc2VzL0Jhc2VBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDOzs7R0FHRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBRXBCOztPQUVHO0lBQ0gscUJBQXFCLENBQUMsT0FBWTtRQUM5QixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUIsQ0FBQyxPQUFZO1FBQzlCLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLE9BQVk7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gseUJBQXlCLENBQUMsT0FBWTtRQUNsQyxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCwyQkFBMkIsQ0FBQyxPQUFZO1FBQ3BDLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILGdDQUFnQyxDQUFDLE9BQVk7UUFDekMsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7d0dBMUNRLFdBQVc7NEdBQVgsV0FBVzsyRkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgTGluZUNoYXJ0RGF0YSwgUGllQ2hhcnREYXRhLCBWZXJ0aWNhbENoYXJ0RGF0YSwgVmVydGljYWwyRENoYXJ0RGF0YSwgVmVydGljYWxTdGFja2VkQ2hhcnREYXRhLCBBcmVhQ2hhcnREYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGEnO1xyXG5pbXBvcnQgeyBJQmFzZUFkYXB0ZXIgfSBmcm9tICcuL0lCYXNlQWRhcHRlcic7XHJcblxyXG4vKipcclxuICogQWRhcHRlciBCYXNlIGRhIHJlaW1wbGVtZW50YXJlIHBlciB0cmFzZm9ybWFyZSBpIGRhdGkgZGEgdW5hIGxpYnJlcmlhIGRpIGdyYWZpY2kgYSBxdWVzdGEgcGVyIGV2aXRhcmUgZGkgcmlzY3JpdmVyZSB0dXR0byBpbCBjb2RpY2UgZGlcclxuICogZ2VuZXJhemlvbmUgZGVsbGUgc2VyaWUgaW4gY2FzbyBzaSBmb3NzZXJvIHVzYXRpIGdyYWZpY2kgZGkgYWx0cmUgbGlicmVyaWVcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUJhc2VBZGFwdGVyIHtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWF0b3JlIGRhaSBkYXRpIGRlbGxhIGxpYnJlcmlhIHZlY2NoaWEgYWkgZGF0aSBkZWxsYSBsaWJyZXJpYSBudW92YSBwZXIgZ2xpIEFyZWEgQ2hhcnRcclxuICAgICAqL1xyXG4gICAgYWRhcHREYXRhRm9yQXJlYUNoYXJ0KGFueURhdGE6IGFueSk6IEFyZWFDaGFydERhdGEge1xyXG4gICAgICAgIHJldHVybiBhbnlEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hdG9yZSBkYWkgZGF0aSBkZWxsYSBsaWJyZXJpYSB2ZWNjaGlhIGFpIGRhdGkgZGVsbGEgbGlicmVyaWEgbnVvdmEgcGVyIGkgTGluZSBDaGFydFxyXG4gICAgICovXHJcbiAgICBhZGFwdERhdGFGb3JMaW5lQ2hhcnQoYW55RGF0YTogYW55KTogTGluZUNoYXJ0RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIGFueURhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWF0b3JlIGRhaSBkYXRpIGRlbGxhIGxpYnJlcmlhIHZlY2NoaWEgYWkgZGF0aSBkZWxsYSBsaWJyZXJpYSBudW92YSBwZXIgaSBMaW5lIENoYXJ0XHJcbiAgICAgKi9cclxuICAgIGFkYXB0RGF0YUZvclBpZUNoYXJ0KGFueURhdGE6IGFueSk6IFBpZUNoYXJ0RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIGFueURhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWF0b3JlIGRhaSBkYXRpIGRlbGxhIGxpYnJlcmlhIHZlY2NoaWEgYWkgZGF0aSBkZWxsYSBsaWJyZXJpYSBudW92YSBwZXIgaSBWZXJ0aWNhbCBDaGFydFxyXG4gICAgICovXHJcbiAgICBhZGFwdERhdGFGb3JWZXJ0aWNhbENoYXJ0KGFueURhdGE6IGFueSk6IFZlcnRpY2FsQ2hhcnREYXRhIHtcclxuICAgICAgICByZXR1cm4gYW55RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYXNmb3JtYXRvcmUgZGFpIGRhdGkgZGVsbGEgbGlicmVyaWEgdmVjY2hpYSBhaSBkYXRpIGRlbGxhIGxpYnJlcmlhIG51b3ZhIHBlciBpIFZlcnRpY2FsIENoYXJ0IGEgZHVlIGRpbWVuc2lvbmlcclxuICAgICAqL1xyXG4gICAgYWRhcHREYXRhRm9yVmVydGljYWwyRENoYXJ0KGFueURhdGE6IGFueSk6IFZlcnRpY2FsMkRDaGFydERhdGEge1xyXG4gICAgICAgIHJldHVybiBhbnlEYXRhO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYXNmb3JtYXRvcmUgZGFpIGRhdGkgZGVsbGEgbGlicmVyaWEgdmVjY2hpYSBhaSBkYXRpIGRlbGxhIGxpYnJlcmlhIG51b3ZhIHBlciBpIFZlcnRpY2FsIENoYXJ0IHNvdnJhcHBvc3RpXHJcbiAgICAgKi9cclxuICAgIGFkYXB0RGF0YUZvclZlcnRpY2FsU3RhY2tlZENoYXJ0KGFueURhdGE6IGFueSk6IFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIGFueURhdGE7XHJcbiAgICB9XHJcbn0iXX0=
@@ -0,0 +1,325 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { Input, Output, EventEmitter, ContentChild, Directive } from '@angular/core';
3
+ import * as am4core from "@amcharts/amcharts4/core";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../models/core";
6
+ /**
7
+ * Componente Grafico Base che gestisce tutte le cose comuni dei vari grafici istanziabili, come la presenza o menu di una legenda,
8
+ * il tema utilizzato, il locale del singolo grafico, ecc ecc...
9
+ */
10
+ export class BaseChartComponent {
11
+ /**
12
+ * Costruttore
13
+ *
14
+ * @param {ElementRef} el Contenitore all'interno del cui viene creato il grafico. Utilizzato per estrapolarne la **ContainerHeight**
15
+ * @param {Object} platformId piattaforma Angular (browser, ecc...) per essere sicuri che amcharts venga attivato solo lato browser. Non utilizzando SSR nelle applicazioni che consumano questa libreria non è particolarmente significativo, ma non si sa mai
16
+ * @param {NgZone} zone NgZone di default per permettere di inizializzare il grafico all'infuori di Angular per avere qualche prestazione in più
17
+ * @param {ChartLoader} Charter Istanza del Loader che si occuperà di caricare in memoria tutto ciò che serve per il grafico attuale (temi, locale, animazioni, ecc...)
18
+ * @param {ChartDispatcher} Dispatcher Istanza del Dispatcher che si occupa di differire il caricamento dei grafici 1 dopo l'altro in modo che caricamenti pseudo paralleli incasinino tutto
19
+ * @param {boolean} logs Indica se effettuare log a console o meno, iniettato dalle classi specializzate dal token ESC_LOGS
20
+ * @param {boolean} animations Indica se per questo grafico devono essere attive o meno le animazioni. Impostazione generica presa dal token ESC_ANIMATIONS
21
+ * @param {string} locale Indica il locale specifico per questo grafico. Impostazione generica presa dal token ESC_LOCALE
22
+ * @param {string} theme Indica il tema specifico per questo grafico. Impostazione generica presa dal token ESC_THEME
23
+ */
24
+ constructor(el, platformId, zone, Charter, Dispatcher, logs, animations, locale, theme) {
25
+ this.el = el;
26
+ this.platformId = platformId;
27
+ this.zone = zone;
28
+ this.Charter = Charter;
29
+ this.Dispatcher = Dispatcher;
30
+ this.logs = logs;
31
+ this.animations = animations;
32
+ this.locale = locale;
33
+ this.theme = theme;
34
+ /**
35
+ * Nome del grafico, fondamentale assegnarlo per permettere alla libreria di schedularne la creazione
36
+ */
37
+ this.name = "";
38
+ /**
39
+ * Dopo aver navigato a un nuovo grafico verranno attesi questi millisecondi prima di richiedere i dati attraverso la **DataRetrieve**.
40
+ *
41
+ * Questo per evitare che l'utente cliccando velocemente "avanti" generi tonnellate di richieste inutili
42
+ */
43
+ this.BrowseDelayMs = 500;
44
+ /**
45
+ * Evento lanciato sulla selezione di un range di dati o dalla timeline o dal grafico. Valido per tutti i grafici che supportano serie basate sulle date
46
+ */
47
+ this.onSelectionChanged = new EventEmitter();
48
+ /**
49
+ * Evento lanciato dal click di una serie dalla Legenda, a patto che l'Input **HideSeriesOnLabelClick** sia impostato a false
50
+ */
51
+ this.onSeriesClicked = new EventEmitter();
52
+ /**
53
+ * Evento lanciato all'inizio del caricamento di una nuova pagina del grafico
54
+ */
55
+ this.onLoadStart = new EventEmitter();
56
+ /**
57
+ * Evento lanciato al termine del caricamento di una nuova pagina del grafico
58
+ */
59
+ this.onLoadEnd = new EventEmitter();
60
+ /**
61
+ * Serve a decidere se sarà presente l'interfaccia di paginazione
62
+ */
63
+ this.isPaged = false;
64
+ /**
65
+ * @ignore
66
+ */
67
+ this.initDone = false;
68
+ }
69
+ /**
70
+ * Metodo di inizializzazione post valorizzazione degli input, utilizzato per valorizzare correttamente le proprietà essenziali del grafico (Animazioni, Tema e Locale)
71
+ *
72
+ * Viene data priorità ai Settings (HTML), priorità secondaria agli Input diretti (Lato HTML), priorità ultima alle impostazioni globali,
73
+ * impostate in fase di import del modulo assegnando valori ai token ESC_LOCALE, ESC_ANIMATIONS, ESC_THEME
74
+ */
75
+ ngOnInit() {
76
+ // Qui servono solo le variabili da conoscere PRE-graficazione per il caricamento dei moduli lazy del grafico
77
+ this.Animations = this.Settings?.Animations != null ? this.Settings?.Animations : (this.Animations != null ? this.Animations : this.animations);
78
+ this.Theme = this.Settings?.Theme != null ? this.Settings?.Theme : (this.Theme != null ? this.Theme : this.theme);
79
+ this.Locale = this.Settings?.Locale != null ? this.Settings?.Locale : (this.Locale != null ? this.Locale : this.locale);
80
+ this.isPaged = (this.DataArray && this.DataArray.length > 0 && !this.Data) || (this.DataDtos && this.DataDtos.length > 0 && !!this.DataRetrieve);
81
+ this.log("Chart " + this.name + ": ngOnInit");
82
+ }
83
+ /**
84
+ * Implementazione utilizzata per controllare eventuali proprietà chiave del grafico e rigraficare tutto qualora si rivelasse necessario
85
+ *
86
+ * @param {SimpleChanges} changes Indicazione dei cambiamenti sulle proprietà del grafico. Vedere documentazione Angular in merito
87
+ */
88
+ ngOnChanges(changes) {
89
+ if (!this.initDone)
90
+ return;
91
+ this.log("Chart " + this.name + ": ngOnChanges");
92
+ let propsToCheck = ["Timeline", "Legend", "Settings", "Animations", "Theme", "Locale", ...this.getSpecificPropertiesToCheck()];
93
+ this.checkPropertiesAndRegraphicateAsNeeded(changes, propsToCheck);
94
+ }
95
+ /**
96
+ * Nel post inizializzazione, a patto che mi trovi in ambiente "browser", proseguo al caricamento del grafico sull'HTML
97
+ */
98
+ ngAfterViewInit() {
99
+ if (!this.name)
100
+ throw "a Unique name is mandatory to create a chart";
101
+ this.log("Chart " + this.name + ": ngAfterViewInit, graphicating chart outside Angular");
102
+ if (!this.isPaged)
103
+ this.dispatchLoadChart();
104
+ }
105
+ /**
106
+ * All'onDestroy scarico il grafico per liberare memoria
107
+ */
108
+ ngOnDestroy() {
109
+ if (this.Chart) {
110
+ this.log("Chart " + this.name + ": Unloading destroyed chart");
111
+ this.browserOnly(() => { this.Chart.dispose(); this.Dispatcher.deregisterGraph(this.name); });
112
+ }
113
+ else
114
+ this.log("Chart " + this.name + ": Unloading uncreated chart component. It probably was a duplicated");
115
+ }
116
+ /**
117
+ * Registra il grafico attuale nel Dispatcher in modo che venga caricato appena possibile
118
+ */
119
+ dispatchLoadChart() {
120
+ this.browserOnly(() => {
121
+ this.Dispatcher.register(this.name, () => { return this.loadChart(); });
122
+ });
123
+ }
124
+ /**
125
+ * Il caricamento del grafico funziona nel seguente modo:
126
+ *
127
+ * 1) Caricamento del tema e delle animazioni, qualora necessari
128
+ *
129
+ * 2) Caricamento delle impostazioni specifiche e integrazione con le impostazioni generiche
130
+ *
131
+ * 3) Graficazione
132
+ *
133
+ * 4) Caricamento del locale
134
+ */
135
+ loadChart() {
136
+ this.log("Chart " + this.name + ": Start loading Modules if needed");
137
+ return Promise.all([
138
+ this.setupAmChartsThemes().then(() => {
139
+ this.log("Chart " + this.name + ": Graphicating after modules load");
140
+ var castedSettings = this.getCastedSettings();
141
+ this.fillSettings(castedSettings);
142
+ this.fillSpecificSettings(castedSettings);
143
+ this.ChartService = this.graphicate(castedSettings);
144
+ this.Chart = this.ChartService.ChartInstance;
145
+ if (!this.Chart)
146
+ this.log("Chart " + this.name + ": Could not create graph");
147
+ return this.Charter.applyLocale(this.Chart, this.Locale).then(() => this.initDone = true);
148
+ })
149
+ ]);
150
+ }
151
+ /**
152
+ * Riempimento delle impostazioni nella classe Settings. Si danno priorità ai valori già impostati nei Settings,
153
+ * integrando eventualmente con le proprietà del grafico
154
+ *
155
+ * @param {BaseSettings} settings Impostazioni base ricevute dalla specializzazione del grafico
156
+ */
157
+ fillSettings(settings) {
158
+ // Merge degli Input con i Settings, dando priorità ai Settings
159
+ settings.Theme = settings.Theme ? settings.Theme : this.Theme;
160
+ settings.Locale = settings.Locale ? settings.Locale : this.Locale;
161
+ settings.Animations = settings.Animations != null ? settings.Animations : this.Animations;
162
+ settings.Legend = settings.Legend != null ? settings.Legend : this.Legend;
163
+ settings.Name = settings.Name ? settings.Name : this.name;
164
+ settings.Timeline = settings.Timeline != null ? settings.Timeline : this.Timeline;
165
+ settings.AdaptLabelSizeAndOrientation = settings.AdaptLabelSizeAndOrientation != null ? settings.AdaptLabelSizeAndOrientation : this.AdaptLabelSizeAndOrientation;
166
+ settings.XAxisTitle = settings.XAxisTitle ? settings.XAxisTitle : this.XTitle;
167
+ settings.YAxisTitle = settings.YAxisTitle ? settings.YAxisTitle : this.YTitle;
168
+ settings.LegendPosition = settings.LegendPosition ? settings.LegendPosition : this.LegendPosition;
169
+ settings.HideSeriesOnLabelClick = settings.HideSeriesOnLabelClick != null ? settings.HideSeriesOnLabelClick : this.HideSeriesOnLabelClick;
170
+ settings.MinGridDistance = settings.MinGridDistance != null ? settings.MinGridDistance : this.MinGridDistance;
171
+ settings.LegendPadding = settings.LegendPadding ? settings.LegendPadding : this.LegendPadding ?? null;
172
+ settings.ContainerHeight = this.el.nativeElement.parentElement.offsetHeight;
173
+ settings.OnSeriesClickCallback = (series) => { this.onSeriesClicked.emit(series); };
174
+ settings.OnSelectionChangedCallback = (event) => { this.onSelectionChanged.emit({ from: event.from, to: event.to, initial: event.initial }); };
175
+ }
176
+ /**
177
+ * Controlla i cambiamenti avvenuti alle proprietà chiave e rieffettua la graficazione qualora necessario
178
+ *
179
+ * @param {SimpleChanges} changes Indicazione della modifiche avvenute nei vari Input
180
+ * @param {string[]} propsToCheck Lista degli Input da controllare per cui una modifica causa una rigraficazione
181
+ */
182
+ checkPropertiesAndRegraphicateAsNeeded(changes, propsToCheck) {
183
+ let toReGraphicate = false;
184
+ for (let i = 0; i < propsToCheck.length; i++)
185
+ toReGraphicate = toReGraphicate || (changes[propsToCheck[i]] && changes[propsToCheck[i]].currentValue);
186
+ if (toReGraphicate)
187
+ this.reloadChart();
188
+ }
189
+ /**
190
+ * Funzione che effettua un cambio di pagina per i grafici paginati. Qualora **data** fosse nullo significa che è iniziato un caricamento
191
+ * e anche lato applicativo il DataRetrieve dovrà considerare che l'assenza di valori non è altro che un'indicazione di inizio caricamento
192
+ *
193
+ * Il caricamento di qualsiasi pagina genererà comunque una primo evento con **data** nullo in modo da indicare l'inizio caricamento e
194
+ * in seconda istanza un altro evento in cui **data** sarà sempre valorizzato, o con il Dto da usare per recuperare i dati, o con i dati
195
+ * veri e propri già presenti nel **DataArray**
196
+ *
197
+ * I callback **onLoadStart** e **onLoadEnd** vengono sempre chiamati
198
+ *
199
+ * @param {{ data: LineChartData | PieChartData | Vertical2DChartData | VerticalChartData | any, index: number }} nd Indice del caricamento dati, con eventualmente già i dati se disponibili
200
+ */
201
+ changePage(nd) {
202
+ if (!nd.data) {
203
+ this.loadingChart = true;
204
+ // Serve per informare l'applicativo in listening sull'indice attualmente in visualizzazione.
205
+ // La mancanza di dati indica che non devono essere effettuate ricerche per ora
206
+ if (this.DataRetrieve)
207
+ this.DataRetrieve(null, nd.index);
208
+ this.onLoadStart.emit();
209
+ return;
210
+ }
211
+ if (this.DataRetrieve)
212
+ this.DataRetrieve(nd.data, nd.index).then(t => { this.changePageDataReceived(t); });
213
+ else
214
+ this.changePageDataReceived(nd.data);
215
+ }
216
+ /**
217
+ * Al termine del caricamento dei dati di una pagina questo metodo viene chiamato per rigraficare la situazione con i nuovi dati
218
+ *
219
+ * @param {LineChartData | PieChartData | Vertical2DChartData | VerticalChartData | any} data Dati del grafico
220
+ */
221
+ changePageDataReceived(data) {
222
+ this.loadingChart = false;
223
+ this.onLoadEnd.emit();
224
+ let firstBind = !this.Data;
225
+ this.Data = data;
226
+ if (!firstBind)
227
+ this.reloadChart();
228
+ else
229
+ this.dispatchLoadChart();
230
+ }
231
+ /**
232
+ * Ricarica il grafico distruggendo il vecchio e ricreando il nuovo
233
+ *
234
+ * Le chiamate a questo metodo possono essere trasformate in chiamate al metodo **graphicate** della Service, se solo quel metodo fosse abbastanza intelligente per capire
235
+ * le differenze fra il grafico com'era prima e come deve diventare, in modo da non ricrearlo ma semplicemente modificare quello che già è disegnato
236
+ */
237
+ reloadChart() {
238
+ this.browserOnly(() => { if (!this.Chart.isDisposed())
239
+ this.Chart.dispose(); this.Dispatcher.deregisterGraph(this.name); });
240
+ this.Dispatcher.register(this.name, () => { return this.loadChart(); });
241
+ }
242
+ /**
243
+ * Funzione che si occupa di caricare i temi necessari per il grafico in oggetto. Prima applica il tema, poi, se serve, applica le animazioni
244
+ */
245
+ setupAmChartsThemes() {
246
+ return Promise.all([
247
+ this.Charter.applyTheme(am4core, this.Theme).then(() => {
248
+ return this.Animations ? this.Charter.applyAnimations(am4core) : this.Charter.unapplyAnimations(am4core);
249
+ })
250
+ ]);
251
+ }
252
+ /**
253
+ * @ignore
254
+ */
255
+ log(log) {
256
+ if (this.logs)
257
+ console.log("@esfaenza/es-charts: " + log);
258
+ }
259
+ /**
260
+ * @ignore
261
+ */
262
+ browserOnly(f) {
263
+ if (isPlatformBrowser(this.platformId)) {
264
+ this.zone.runOutsideAngular(() => {
265
+ f();
266
+ });
267
+ }
268
+ }
269
+ }
270
+ BaseChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseChartComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
271
+ BaseChartComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseChartComponent, inputs: { XTitle: "XTitle", YTitle: "YTitle", Settings: "Settings", Legend: "Legend", LegendPosition: "LegendPosition", Timeline: "Timeline", name: "name", Animations: "Animations", Theme: "Theme", Locale: "Locale", HideSeriesOnLabelClick: "HideSeriesOnLabelClick", MinGridDistance: "MinGridDistance", AdaptLabelSizeAndOrientation: "AdaptLabelSizeAndOrientation", LegendPadding: "LegendPadding", DataDtos: "DataDtos", DataDtoStartIndex: "DataDtoStartIndex", DataRetrieve: "DataRetrieve", BrowseDelayMs: "BrowseDelayMs" }, outputs: { onSelectionChanged: "onSelectionChanged", onSeriesClicked: "onSeriesClicked", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd" }, queries: [{ propertyName: "header_tr", first: true, predicate: ["header"], descendants: true }, { propertyName: "loading_template", first: true, predicate: ["loading"], descendants: true }], usesOnChanges: true, ngImport: i0 });
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseChartComponent, decorators: [{
273
+ type: Directive
274
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Object }, { type: i0.NgZone }, { type: i1.ChartLoader }, { type: i1.ChartDispatcher }, { type: undefined }, { type: undefined }, { type: undefined }, { type: undefined }]; }, propDecorators: { XTitle: [{
275
+ type: Input
276
+ }], YTitle: [{
277
+ type: Input
278
+ }], Settings: [{
279
+ type: Input
280
+ }], Legend: [{
281
+ type: Input
282
+ }], LegendPosition: [{
283
+ type: Input
284
+ }], Timeline: [{
285
+ type: Input
286
+ }], name: [{
287
+ type: Input
288
+ }], Animations: [{
289
+ type: Input
290
+ }], Theme: [{
291
+ type: Input
292
+ }], Locale: [{
293
+ type: Input
294
+ }], HideSeriesOnLabelClick: [{
295
+ type: Input
296
+ }], MinGridDistance: [{
297
+ type: Input
298
+ }], AdaptLabelSizeAndOrientation: [{
299
+ type: Input
300
+ }], LegendPadding: [{
301
+ type: Input
302
+ }], DataDtos: [{
303
+ type: Input
304
+ }], DataDtoStartIndex: [{
305
+ type: Input
306
+ }], DataRetrieve: [{
307
+ type: Input
308
+ }], BrowseDelayMs: [{
309
+ type: Input
310
+ }], header_tr: [{
311
+ type: ContentChild,
312
+ args: ['header', { static: false }]
313
+ }], loading_template: [{
314
+ type: ContentChild,
315
+ args: ['loading', { static: false }]
316
+ }], onSelectionChanged: [{
317
+ type: Output
318
+ }], onSeriesClicked: [{
319
+ type: Output
320
+ }], onLoadStart: [{
321
+ type: Output
322
+ }], onLoadEnd: [{
323
+ type: Output
324
+ }] } });
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBc0UsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQVksU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBTy9LLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7OztBQUdwRDs7O0dBR0c7QUFFSCxNQUFNLE9BQWdCLGtCQUFrQjtJQXlMdEM7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsWUFBb0IsRUFBYyxFQUFVLFVBQWtCLEVBQVUsSUFBWSxFQUFVLE9BQW9CLEVBQVUsVUFBMkIsRUFBVSxJQUFhLEVBQ3BLLFVBQW1CLEVBQVUsTUFBYyxFQUFVLEtBQWE7UUFEeEQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVE7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUztRQUNwSyxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVE7UUF2SzVFOztXQUVHO1FBQ00sU0FBSSxHQUFXLEVBQUUsQ0FBQztRQTBEM0I7Ozs7V0FJRztRQUNNLGtCQUFhLEdBQVcsR0FBRyxDQUFDO1FBWXJDOztXQUVHO1FBQ08sdUJBQWtCLEdBQTZELElBQUksWUFBWSxFQUE4QyxDQUFDO1FBRXhKOztXQUVHO1FBQ08sb0JBQWUsR0FBeUIsSUFB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QUFJLENBQUMsTUFBTSxDQUFDO1FBQzFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMxRCxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xGLFFBQVEsQ0FBQyw0QkFBNEIsR0FBRyxRQUFRLENBQUMsNEJBQTRCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztRQUNsSyxRQUFRLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUUsUUFBUSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlFLFFBQVEsQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNsRyxRQUFRLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDMUksUUFBUSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENB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QTNhbUIsa0JBQWtCO21HQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFEdkMsU0FBUzttRkF1TWdELE1BQU0sMkxBak1yRCxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQU1HLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFPRyxlQUFlO3NCQUF2QixLQUFLO2dCQUtHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFLcUMsU0FBUztzQkFBbkQsWUFBWTt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUtHLGdCQUFnQjtzQkFBM0QsWUFBWTt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUtoQyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBS0csZUFBZTtzQkFBeEIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IElucHV0LCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPbkNoYW5nZXMsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb250ZW50Q2hpbGQsIE9wdGlvbmFsLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IElCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgQmFzZVNldHRpbmdzLCBMZWdlbmRQYWQgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBDaGFydExvYWRlciwgQ2hhcnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb3JlXCI7XHJcbmltcG9ydCB7IFBhZ2VkQ2hhcnREYXRhLCBMaW5lQ2hhcnREYXRhLCBQaWVDaGFydERhdGEsIFZlcnRpY2FsMkRDaGFydERhdGEsIFZlcnRpY2FsQ2hhcnREYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGEnO1xyXG5cclxuaW1wb3J0ICogYXMgYW00Y29yZSBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC9jb3JlXCI7XHJcbmltcG9ydCAqIGFzIGFtNGNoYXJ0cyBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC9jaGFydHNcIjtcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIEdyYWZpY28gQmFzZSBjaGUgZ2VzdGlzY2UgdHV0dGUgbGUgY29zZSBjb211bmkgZGVpIHZhcmkgZ3JhZmljaSBpc3RhbnppYWJpbGksIGNvbWUgbGEgcHJlc2VuemEgbyBtZW51IGRpIHVuYSBsZWdlbmRhLFxyXG4gKiBpbCB0ZW1hIHV0aWxpenphdG8sIGlsIGxvY2FsZSBkZWwgc2luZ29sbyBncmFmaWNvLCBlY2MgZWNjLi4uXHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICAvKipcclxuICAgKiBUaXRvbG8gcGVyIGwnYXNzZSBYXHJcbiAgICovXHJcbiAgQElucHV0KCkgWFRpdGxlOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRpdG9sbyBwZXIgbCdhc3NlIFlcclxuICAgKi9cclxuICBASW5wdXQoKSBZVGl0bGU6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3N0YXppb25pIGRpIGJhc2VcclxuICAgKi9cclxuICBASW5wdXQoKSBTZXR0aW5nczogQmFzZVNldHRpbmdzO1xyXG5cclxuICAvKipcclxuICAgKiBQcmVzZW56YSBvIG1lbm8gZGVsbGEgbGVnZW5kYVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIExlZ2VuZDogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogUG9zaXppb25lIGRlbGxhIGxlZ2VuZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBMZWdlbmRQb3NpdGlvbjogXCJ0b3BcIiB8IFwiYm90dG9tXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIjtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJlc2VuemEgbyBtZW5vIGRlbGxhIHRpbWVsaW5lXHJcbiAgICovXHJcbiAgQElucHV0KCkgVGltZWxpbmU6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vbWUgZGVsIGdyYWZpY28sIGZvbmRhbWVudGFsZSBhc3NlZ25hcmxvIHBlciBwZXJtZXR0ZXJlIGFsbGEgbGlicmVyaWEgZGkgc2NoZWR1bGFybmUgbGEgY3JlYXppb25lXHJcbiAgICovXHJcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgLyoqXHJcbiAgICogVXRpbGl6em8gbyBtZW5vIGRlbGxlIGFuaW1hemlvbmkuIFNlbnphIGFuaW1hemlvbmkgaWwgZ3JhZmljbyDDqCBsZWdnZXJtZW50ZSBwacO5IHBlcmZvcm1hbnRlLCBzcGVjaWFsbWVudGUgYWxsJ2F1bWVudGFyZSBkZWkgcHVudGkgbmVsbGEgc2VyaWVcclxuICAgKi9cclxuICBASW5wdXQoKSBBbmltYXRpb25zOiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUZW1hIGRhIHV0aWxpenphcmUsIHZhbGlkbyBzb2xvIHBlciBpbCBncmFmaWNvIGluIHF1ZXN0aW9uZS4gR2xpIGFsdHJpIGdyYWZpY2kgZGVsbGEgcGFnaW5hIHBvc3Nvbm8gYXZlcmUgc3RpbGkgZGl2ZXJzaS5cclxuICAgKiBcclxuICAgKiBFc3NlbmRvIGkgdGVtaSBjYXJpY2F0aSBpbiBtYW5pZXJhIGFzaW5jcm9uYSBpbiBiYXNlIGFsbCd1dGlsaXp6byB1dGlsaXp6YXJuZSB0YW50aSBkaXZlcnNpIGluIHVuJ3VuaWNhIHBhZ2luYSBwb3RyZWJiZSByYWxsZW50YXJlIGlsIHByaW1vIGNhcmljYW1lbnRvXHJcbiAgICovXHJcbiAgQElucHV0KCkgVGhlbWU6ICdzcGlyaXRlZGF3YXknIHwgJ21vb25yaXNla2luZ2RvbScgfCAnZnJvemVuJyB8ICdkYXJrJyB8ICdrZWxseScgfCAnbWF0ZXJpYWwnIHwgJ2RhdGF2aXonIHwgJ25vbmUnO1xyXG5cclxuICAvKipcclxuICAgKiBMb2NhbGUgZGVsIHNpbmdvbG8gZ3JhZmljb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIExvY2FsZTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2UgdXRpbGl6emFyZSBpbCBjb21wb3J0YW1lbnRvIGRpIGRlZmF1bHQgcGVyIGkgY2xpY2sgZGVsbGUgc2VyaWUgc3VsbGEgTGVnZW5kYS4gTWV0dGVuZG8gcXVlc3RhIHZhcmlhYmlsZSBhICoqZmFsc2UqKlxyXG4gICAqIGUgY29sbGVnYW5kbyBsJ291dHB1dCAqKm9uU2VyaWVzQ2xpY2tlZCoqIMOoIHBvc3NpYmlsZSBnZW5lcmFyZSB1biBldmVudG8gb2duaSB2b2x0YSBjaGUgbCd1dGVudGUgZmEgY2xpY2sgc3UgdW5hIHNlcmllIGRlbGxhIExlZ2VuZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBIaWRlU2VyaWVzT25MYWJlbENsaWNrOiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBNaW5pbWEgZGlzdGFuemEgbmVsbGEgZ3JpZ2xpYSBmcmEgaSB2YWxvcmksIG1vZGlmaWNhIGxhIHF1YW50aXTDoCBkaSBzdGVwIGZyYSBpIHZhbG9yaSBkZWxsJ2Fzc2UgWCBlIHF1aW5kaSBsYSBncmFudWxhcml0w6AgZGVpIGRhdGkuXHJcbiAgICogXHJcbiAgICogUGnDuSBwaWNjb2xhIMOoLCBwacO5IHZhbG9yaSB2ZXJyYW5ubyBpbnNlcml0aSBuZWxsJ2Fzc2UgWFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIE1pbkdyaWREaXN0YW5jZTogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBDZXJjYSBkaSBhZ2dpdXN0YXJlIGkgdmFyaSBzdGVwIGRlbGwnYXNzZSBYIHJ1b3RhbmRvbGkgZSBkaW1pbnVlbmRvbmUgbGUgZGltZW5zaW9uaSBhYmJhc3RhbnphIHBlciBtb3N0cmFybmUgaWwgcGnDuSBwb3NzaWJpbGVcclxuICAgKi9cclxuICBASW5wdXQoKSBBZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uOiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBQYWRkaW5nIGRhIGFwcGxpY2FyZSBhbGxhIExlZ2VuZGEgaW4gY2FzbyBzaSB2b2dsaWEgc3Bvc3RhcmUgdW4gcG8nXHJcbiAgICovXHJcbiAgQElucHV0KCkgTGVnZW5kUGFkZGluZzogTGVnZW5kUGFkO1xyXG5cclxuICAvKipcclxuICAgKiBMaXN0YSBkaSBkdG8gZ2VuZXJpY2kgY2hlIHZlcnJhbm5vIGVtZXNzaSBkYWwgc2lzdGVtYSBkaSBncmFmaWNpIHVubyBwZXIgdW5vIGF0dHJhdmVyc28gbGEgZnVuemlvbmUgKipEYXRhUmV0cmlldmUqKiwgY2hlIGRvdnJhbm5vIGVzc2VyZVxyXG4gICAqIHVzYXRpIHBlciB1YW4gc29ydGEgZGkgY2FyaWNhbWVudG8gXCJwYWdpbmF0b1wiIGRlaSBncmFmaWNpXHJcbiAgICovXHJcbiAgQElucHV0KCkgRGF0YUR0b3M6IGFueVtdO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2UgZGVsbCdhcnJheSAqKkRhdGFEdG9zKiogbyBkZWxsJ2FycmF5ICoqRGF0YUFycmF5KiogZGEgY3VpIGluaXppYXJlIGFkIGVtZXR0ZXJlIGkgdmFsb3JpLCB1dGlsZSBwZXIgc3VwcG9ydGFyZSBpbCBcImJhY2tcIiBkYSB1biBldmVudHVhbGUgcGFnaW5hIGRpIGRldHRhZ2xpb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIERhdGFEdG9TdGFydEluZGV4OiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bnppb25lIGRlZmluaXRhIGxhdG8gYXBwbGljYXRpdm8gY2hlIGluIGJhc2UgYWwgKipEYXRhRHRvKiogY29ycmVudGUgcmVzdGl0dWlzY2UgdW5hIFByb21pc2UgZGVsIHRpcG8gZGkgZGF0aSByaWNoaWVzdG8gcGVyIGlsIGdyYWZpY28gY29ycmVudGVcclxuICAgKi9cclxuICBASW5wdXQoKSBEYXRhUmV0cmlldmU6IChkdG86IGFueSwgaW5kZXg6IG51bWJlcikgPT4gUHJvbWlzZTxhbnk+O1xyXG5cclxuICAvKipcclxuICAgKiBEb3BvIGF2ZXIgbmF2aWdhdG8gYSB1biBudW92byBncmFmaWNvIHZlcnJhbm5vIGF0dGVzaSBxdWVzdGkgbWlsbGlzZWNvbmRpIHByaW1hIGRpIHJpY2hpZWRlcmUgaSBkYXRpIGF0dHJhdmVyc28gbGEgKipEYXRhUmV0cmlldmUqKi5cclxuICAgKiBcclxuICAgKiBRdWVzdG8gcGVyIGV2aXRhcmUgY2hlIGwndXRlbnRlIGNsaWNjYW5kbyB2ZWxvY2VtZW50ZSBcImF2YW50aVwiIGdlbmVyaSB0b25uZWxsYXRlIGRpIHJpY2hpZXN0ZSBpbnV0aWxpXHJcbiAgICovXHJcbiAgQElucHV0KCkgQnJvd3NlRGVsYXlNczogbnVtYmVyID0gNTAwO1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlc3RhemlvbmUgZGVpIGdyYWZpY2kgbmVsIGNhc28gc2kgdXRpbGl6emkgbGEgbW9kYWxpdMOgIHBhZ2luYXRhXHJcbiAgICovXHJcbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGhlYWRlcl90cjtcclxuXHJcbiAgLyoqXHJcbiAgICogTWVzc2FnZ2lvIGRpIGNhcmljYW1lbnRvIGZyYSB1biBncmFmaWNvIGUgbCdhbHRybyBcclxuICAgKi9cclxuICBAQ29udGVudENoaWxkKCdsb2FkaW5nJywgeyBzdGF0aWM6IGZhbHNlIH0pIGxvYWRpbmdfdGVtcGxhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBsYW5jaWF0byBzdWxsYSBzZWxlemlvbmUgZGkgdW4gcmFuZ2UgZGkgZGF0aSBvIGRhbGxhIHRpbWVsaW5lIG8gZGFsIGdyYWZpY28uIFZhbGlkbyBwZXIgdHV0dGkgaSBncmFmaWNpIGNoZSBzdXBwb3J0YW5vIHNlcmllIGJhc2F0ZSBzdWxsZSBkYXRlXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHsgZnJvbTogRGF0ZSwgdG86IERhdGUsIGluaXRpYWw6IGJvb2xlYW4gfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZnJvbTogRGF0ZSwgdG86IERhdGUsIGluaXRpYWw6IGJvb2xlYW4gfT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIGxhbmNpYXRvIGRhbCBjbGljayBkaSB1bmEgc2VyaWUgZGFsbGEgTGVnZW5kYSwgYSBwYXR0byBjaGUgbCdJbnB1dCAqKkhpZGVTZXJpZXNPbkxhYmVsQ2xpY2sqKiBzaWEgaW1wb3N0YXRvIGEgZmFsc2VcclxuICAgKi9cclxuICBAT3V0cHV0KCkgb25TZXJpZXNDbGlja2VkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gbGFuY2lhdG8gYWxsJ2luaXppbyBkZWwgY2FyaWNhbWVudG8gZGkgdW5hIG51b3ZhIHBhZ2luYSBkZWwgZ3JhZmljb1xyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbkxvYWRTdGFydDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gbGFuY2lhdG8gYWwgdGVybWluZSBkZWwgY2FyaWNhbWVudG8gZGkgdW5hIG51b3ZhIHBhZ2luYSBkZWwgZ3JhZmljb1xyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbkxvYWRFbmQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2VydmUgYSBkZWNpZGVyZSBzZSBzYXLDoCBwcmVzZW50ZSBsJ2ludGVyZmFjY2lhIGRpIHBhZ2luYXppb25lXHJcbiAgICovXHJcbiAgcHVibGljIGlzUGFnZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdERvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSXN0YW56YSBuYXRpdmEgZGVsIGdyYWZpY28gYW1jaGFydHMuIFF1YWxzaWFzaSBjb3NhIG5vbiBmYSBxdWVzdGEgbGlicmVyaWEgc2kgcHXDsiBwcmVuZGVyZSBxdWVzdGEgaXN0YW56YSBlIG1vZGlmaWNhcmUgYSBwaWFjaW1lbnRvXHJcbiAgICovXHJcbiAgcHVibGljIENoYXJ0OiBhbTRjaGFydHMuQ2hhcnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlcnZpemlvIGRpIGdyYWZpY2F6aW9uZSBkZWwgZ3JhZmljb1xyXG4gICAqL1xyXG4gIHB1YmxpYyBDaGFydFNlcnZpY2U6IElCYXNlU2VydmljZTxhbnk+O1xyXG5cclxuICAvKipcclxuICAgKiBWYXJpYWJpbGUgY2hlIGluZGljYSBzZSB1bmEgbnVvdmEgcGFnaW5hIGRlbCBncmFmaWNvIMOoIGluIGZhc2UgZGkgY2FyaWNhbWVudG9cclxuICAgKi9cclxuICBwdWJsaWMgbG9hZGluZ0NoYXJ0OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBEYXRpIGRlbCBncmFmaWNvLiBPZ25pIGltcGxlbWVudGF6aW9uZSBnZXN0aXLDoCBxdWVzdGEgdmFyaWFiaWxlIGluIGJhc2UgYWwgcHJvcHJpbyB0aXBvIGRpIERhdGlcclxuICAgKi9cclxuICBhYnN0cmFjdCBEYXRhOiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGkgZGVsIGdyYWZpY28gaW4gbW9kYWxpdMOgIHBhZ2luYXRhLCBwZXIgcXVhbmRvIHR1dHRlIGxlIHBhZ2luZSBzb25vIHByZWNhcmljYXRlIGluIG1lbW9yaWEgKGluIGNhc28gY29udHJhcmlvIHZlcnJlYmJlcsOyIHV0aWxpenphdGkgaSAqKkRhdGFEdG9zKiopXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgRGF0YUFycmF5OiBQYWdlZENoYXJ0RGF0YTxhbnk+W107XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBsZSBwcm9wcmlldMOgIHNwZWNpZmljYSBwZXIgdW5hIGRhdGEgaW1wbGVtZW50YXppb25lIGNoZSBkZXZvbm8gY2F1c2FyZSB1biByZXBhaW50IGRlbCBncmFmaWNvXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0U3BlY2lmaWNQcm9wZXJ0aWVzVG9DaGVjaygpOiBzdHJpbmdbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGdlbmVyaWNvIGRpIGdyYWZpY2F6aW9uZSwgcmVpbXBsZW1lbnRhdG8gZGFsbGUgdmFyaWUgaW1wbGVtZW50YXppb25pXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ3JhcGhpY2F0ZShjYXN0ZWRTZXR0aW5ncyk6IElCYXNlU2VydmljZTxhbnk+O1xyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gZ2VuZXJpY28gY2hlIHByZW5kZSBsZSBpbXBvc3RhemlvbmkgZ2VuZXJpY2hlIGRlbCBncmFmaWNvIGUgbGUgY2FzdGEgYWxsYSB0aXBvbG9naWEgZ2l1c3RhIHBlciBpbCBncmFmaWNvIHNwZWNpZmljb1xyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldENhc3RlZFNldHRpbmdzKCk6IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBcIlJpZW1waWVcIiBsYSBjbGFzc2UgZGVsbGUgaW1wb3N0YXppb25pIGNvbiB0dXR0ZSBsZSBpbXBvc3Rhemlvbmkgc3BlY2lmaWNoZSBwYXNzYXRlIGEgdW4gZGF0byBncmFmaWNvIGNvbWUgSW5wdXRcclxuICAgKi9cclxuICBhYnN0cmFjdCBmaWxsU3BlY2lmaWNTZXR0aW5ncyhzZXR0aW5nc0Nhc3RlZCk6IHZvaWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvc3RydXR0b3JlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtFbGVtZW50UmVmfSBlbCBDb250ZW5pdG9yZSBhbGwnaW50ZXJubyBkZWwgY3VpIHZpZW5lIGNyZWF0byBpbCBncmFmaWNvLiBVdGlsaXp6YXRvIHBlciBlc3RyYXBvbGFybmUgbGEgKipDb250YWluZXJIZWlnaHQqKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbGF0Zm9ybUlkIHBpYXR0YWZvcm1hIEFuZ3VsYXIgKGJyb3dzZXIsIGVjYy4uLikgcGVyIGVzc2VyZSBzaWN1cmkgY2hlIGFtY2hhcnRzIHZlbmdhIGF0dGl2YXRvIHNvbG8gbGF0byBicm93c2VyLiBOb24gdXRpbGl6emFuZG8gU1NSIG5lbGxlIGFwcGxpY2F6aW9uaSBjaGUgY29uc3VtYW5vIHF1ZXN0YSBsaWJyZXJpYSBub24gw6ggcGFydGljb2xhcm1lbnRlIHNpZ25pZmljYXRpdm8sIG1hIG5vbiBzaSBzYSBtYWlcclxuICAgKiBAcGFyYW0ge05nWm9uZX0gem9uZSBOZ1pvbmUgZGkgZGVmYXVsdCBwZXIgcGVybWV0dGVyZSBkaSBpbml6aWFsaXp6YXJlIGlsIGdyYWZpY28gYWxsJ2luZnVvcmkgZGkgQW5ndWxhciBwZXIgYXZlcmUgcXVhbGNoZSBwcmVzdGF6aW9uZSBpbiBwacO5XHJcbiAgICogQHBhcmFtIHtDaGFydExvYWRlcn0gQ2hhcnRlciBJc3RhbnphIGRlbCBMb2FkZXIgY2hlIHNpIG9jY3VwZXLDoCBkaSBjYXJpY2FyZSBpbiBtZW1vcmlhIHR1dHRvIGNpw7IgY2hlIHNlcnZlIHBlciBpbCBncmFmaWNvIGF0dHVhbGUgKHRlbWksIGxvY2FsZSwgYW5pbWF6aW9uaSwgZWNjLi4uKVxyXG4gICAqIEBwYXJhbSB7Q2hhcnREaXNwYXRjaGVyfSBEaXNwYXRjaGVyIElzdGFuemEgZGVsIERpc3BhdGNoZXIgY2hlIHNpIG9jY3VwYSBkaSBkaWZmZXJpcmUgaWwgY2FyaWNhbWVudG8gZGVpIGdyYWZpY2kgMSBkb3BvIGwnYWx0cm8gaW4gbW9kbyBjaGUgY2FyaWNhbWVudGkgcHNldWRvIHBhcmFsbGVsaSBpbmNhc2luaW5vIHR1dHRvXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBsb2dzIEluZGljYSBzZSBlZmZldHR1YXJlIGxvZyBhIGNvbnNvbGUgbyBtZW5vLCBpbmlldHRhdG8gZGFsbGUgY2xhc3NpIHNwZWNpYWxpenphdGUgZGFsIHRva2VuIEVTQ19MT0dTXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBhbmltYXRpb25zIEluZGljYSBzZSBwZXIgcXVlc3RvIGdyYWZpY28gZGV2b25vIGVzc2VyZSBhdHRpdmUgbyBtZW5vIGxlIGFuaW1hemlvbmkuIEltcG9zdGF6aW9uZSBnZW5lcmljYSBwcmVzYSBkYWwgdG9rZW4gRVNDX0FOSU1BVElPTlNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIEluZGljYSBpbCBsb2NhbGUgc3BlY2lmaWNvIHBlciBxdWVzdG8gZ3JhZmljby4gSW1wb3N0YXppb25lIGdlbmVyaWNhIHByZXNhIGRhbCB0b2tlbiBFU0NfTE9DQUxFXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRoZW1lIEluZGljYSBpbCB0ZW1hIHNwZWNpZmljbyBwZXIgcXVlc3RvIGdyYWZpY28uIEltcG9zdGF6aW9uZSBnZW5lcmljYSBwcmVzYSBkYWwgdG9rZW4gRVNDX1RIRU1FXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsIHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIENoYXJ0ZXI6IENoYXJ0TG9hZGVyLCBwcml2YXRlIERpc3BhdGNoZXI6IENoYXJ0RGlzcGF0Y2hlciwgcHJpdmF0ZSBsb2dzOiBib29sZWFuLCBcclxuICAgIHByaXZhdGUgYW5pbWF0aW9uczogYm9vbGVhbiwgcHJpdmF0ZSBsb2NhbGU6IHN0cmluZywgcHJpdmF0ZSB0aGVtZTogc3RyaW5nKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGRpIGluaXppYWxpenphemlvbmUgcG9zdCB2YWxvcml6emF6aW9uZSBkZWdsaSBpbnB1dCwgdXRpbGl6emF0byBwZXIgdmFsb3JpenphcmUgY29ycmV0dGFtZW50ZSBsZSBwcm9wcmlldMOgIGVzc2VuemlhbGkgZGVsIGdyYWZpY28gKEFuaW1hemlvbmksIFRlbWEgZSBMb2NhbGUpXHJcbiAgICogXHJcbiAgICogVmllbmUgZGF0YSBwcmlvcml0w6AgYWkgU2V0dGluZ3MgKEhUTUwpLCBwcmlvcml0w6Agc2Vjb25kYXJpYSBhZ2xpIElucHV0IGRpcmV0dGkgKExhdG8gSFRNTCksIHByaW9yaXTDoCB1bHRpbWEgYWxsZSBpbXBvc3RhemlvbmkgZ2xvYmFsaSxcclxuICAgKiBpbXBvc3RhdGUgaW4gZmFzZSBkaSBpbXBvcnQgZGVsIG1vZHVsbyBhc3NlZ25hbmRvIHZhbG9yaSBhaSB0b2tlbiBFU0NfTE9DQUxFLCBFU0NfQU5JTUFUSU9OUywgRVNDX1RIRU1FXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBRdWkgc2Vydm9ubyBzb2xvIGxlIHZhcmlhYmlsaSBkYSBjb25vc2NlcmUgUFJFLWdyYWZpY2F6aW9uZSBwZXIgaWwgY2FyaWNhbWVudG8gZGVpIG1vZHVsaSBsYXp5IGRlbCBncmFmaWNvXHJcblxyXG4gICAgdGhpcy5BbmltYXRpb25zID0gdGhpcy5TZXR0aW5ncz8uQW5pbWF0aW9ucyAhPSBudWxsID8gdGhpcy5TZXR0aW5ncz8uQW5pbWF0aW9ucyA6ICh0aGlzLkFuaW1hdGlvbnMgIT0gbnVsbCA/IHRoaXMuQW5pbWF0aW9ucyA6IHRoaXMuYW5pbWF0aW9ucylcclxuICAgIHRoaXMuVGhlbWUgPSB0aGlzLlNldHRpbmdzPy5UaGVtZSAhPSBudWxsID8gdGhpcy5TZXR0aW5ncz8uVGhlbWUgOiAodGhpcy5UaGVtZSAhPSBudWxsID8gdGhpcy5UaGVtZSA6IDxhbnk+dGhpcy50aGVtZSlcclxuICAgIHRoaXMuTG9jYWxlID0gdGhpcy5TZXR0aW5ncz8uTG9jYWxlICE9IG51bGwgPyB0aGlzLlNldHRpbmdzPy5Mb2NhbGUgOiAodGhpcy5Mb2NhbGUgIT0gbnVsbCA/IHRoaXMuTG9jYWxlIDogdGhpcy5sb2NhbGUpXHJcblxyXG4gICAgdGhpcy5pc1BhZ2VkID0gKHRoaXMuRGF0YUFycmF5ICYmIHRoaXMuRGF0YUFycmF5Lmxlbmd0aCA+IDAgJiYgIXRoaXMuRGF0YSkgfHwgKHRoaXMuRGF0YUR0b3MgJiYgdGhpcy5EYXRhRHRvcy5sZW5ndGggPiAwICYmICEhdGhpcy5EYXRhUmV0cmlldmUpO1xyXG4gICAgdGhpcy5sb2coXCJDaGFydCBcIiArIHRoaXMubmFtZSArIFwiOiBuZ09uSW5pdFwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudGF6aW9uZSB1dGlsaXp6YXRhIHBlciBjb250cm9sbGFyZSBldmVudHVhbGkgcHJvcHJpZXTDoCBjaGlhdmUgZGVsIGdyYWZpY28gZSByaWdyYWZpY2FyZSB0dXR0byBxdWFsb3JhIHNpIHJpdmVsYXNzZSBuZWNlc3NhcmlvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtTaW1wbGVDaGFuZ2VzfSBjaGFuZ2VzIEluZGljYXppb25lIGRlaSBjYW1iaWFtZW50aSBzdWxsZSBwcm9wcmlldMOgIGRlbCBncmFmaWNvLiBWZWRlcmUgZG9jdW1lbnRhemlvbmUgQW5ndWxhciBpbiBtZXJpdG9cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdERvbmUpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmxvZyhcIkNoYXJ0IFwiICsgdGhpcy5uYW1lICsgXCI6IG5nT25DaGFuZ2VzXCIpO1xyXG5cclxuICAgIGxldCBwcm9wc1RvQ2hlY2sgPSBbXCJUaW1lbGluZVwiLCBcIkxlZ2VuZFwiLCBcIlNldHRpbmdzXCIsIFwiQW5pbWF0aW9uc1wiLCBcIlRoZW1lXCIsIFwiTG9jYWxlXCIsIC4uLnRoaXMuZ2V0U3BlY2lmaWNQcm9wZXJ0aWVzVG9DaGVjaygpXTtcclxuICAgIHRoaXMuY2hlY2tQcm9wZXJ0aWVzQW5kUmVncmFwaGljYXRlQXNOZWVkZWQoY2hhbmdlcywgcHJvcHNUb0NoZWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5lbCBwb3N0IGluaXppYWxpenphemlvbmUsIGEgcGF0dG8gY2hlIG1pIHRyb3ZpIGluIGFtYmllbnRlIFwiYnJvd3NlclwiLCBwcm9zZWd1byBhbCBjYXJpY2FtZW50byBkZWwgZ3JhZmljbyBzdWxsJ0hUTUxcclxuICAgKi9cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMubmFtZSlcclxuICAgICAgdGhyb3cgXCJhIFVuaXF1ZSBuYW1lIGlzIG1hbmRhdG9yeSB0byBjcmVhdGUgYSBjaGFydFwiO1xyXG5cclxuICAgIHRoaXMubG9nKFwiQ2hhcnQgXCIgKyB0aGlzLm5hbWUgKyBcIjogbmdBZnRlclZpZXdJbml0LCBncmFwaGljYXRpbmcgY2hhcnQgb3V0c2lkZSBBbmd1bGFyXCIpO1xyXG5cclxuICAgIGlmKCF0aGlzLmlzUGFnZWQpXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hMb2FkQ2hhcnQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFsbCdvbkRlc3Ryb3kgc2NhcmljbyBpbCBncmFmaWNvIHBlciBsaWJlcmFyZSBtZW1vcmlhXHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5DaGFydCkge1xyXG4gICAgICB0aGlzLmxvZyhcIkNoYXJ0IFwiICsgdGhpcy5uYW1lICsgXCI6IFVubG9hZGluZyBkZXN0cm95ZWQgY2hhcnRcIik7XHJcbiAgICAgIHRoaXMuYnJvd3Nlck9ubHkoKCkgPT4geyB0aGlzLkNoYXJ0LmRpc3Bvc2UoKTsgdGhpcy5EaXNwYXRjaGVyLmRlcmVnaXN0ZXJHcmFwaCh0aGlzLm5hbWUpIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxvZyhcIkNoYXJ0IFwiICsgdGhpcy5uYW1lICsgXCI6IFVubG9hZGluZyB1bmNyZWF0ZWQgY2hhcnQgY29tcG9uZW50LiBJdCBwcm9iYWJseSB3YXMgYSBkdXBsaWNhdGVkXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0cmEgaWwgZ3JhZmljbyBhdHR1YWxlIG5lbCBEaXNwYXRjaGVyIGluIG1vZG8gY2hlIHZlbmdhIGNhcmljYXRvIGFwcGVuYSBwb3NzaWJpbGVcclxuICAgKi9cclxuICBwcml2YXRlIGRpc3BhdGNoTG9hZENoYXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5icm93c2VyT25seSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuRGlzcGF0Y2hlci5yZWdpc3Rlcih0aGlzLm5hbWUsICgpID0+IHsgcmV0dXJuIHRoaXMubG9hZENoYXJ0KCk7IH0pO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElsIGNhcmljYW1lbnRvIGRlbCBncmFmaWNvIGZ1bnppb25hIG5lbCBzZWd1ZW50ZSBtb2RvOlxyXG4gICAqIFxyXG4gICAqIDEpIENhcmljYW1lbnRvIGRlbCB0ZW1hIGUgZGVsbGUgYW5pbWF6aW9uaSwgcXVhbG9yYSBuZWNlc3NhcmlcclxuICAgKiBcclxuICAgKiAyKSBDYXJpY2FtZW50byBkZWxsZSBpbXBvc3Rhemlvbmkgc3BlY2lmaWNoZSBlIGludGVncmF6aW9uZSBjb24gbGUgaW1wb3N0YXppb25pIGdlbmVyaWNoZVxyXG4gICAqIFxyXG4gICAqIDMpIEdyYWZpY2F6aW9uZVxyXG4gICAqIFxyXG4gICAqIDQpIENhcmljYW1lbnRvIGRlbCBsb2NhbGVcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRDaGFydCgpIHtcclxuICAgIHRoaXMubG9nKFwiQ2hhcnQgXCIgKyB0aGlzLm5hbWUgKyBcIjogU3RhcnQgbG9hZGluZyBNb2R1bGVzIGlmIG5lZWRlZFwiKTtcclxuICAgIHJldHVybiBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMuc2V0dXBBbUNoYXJ0c1RoZW1lcygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9nKFwiQ2hhcnQgXCIgKyB0aGlzLm5hbWUgKyBcIjogR3JhcGhpY2F0aW5nIGFmdGVyIG1vZHVsZXMgbG9hZFwiKTtcclxuXHJcbiAgICAgICAgdmFyIGNhc3RlZFNldHRpbmdzID0gdGhpcy5nZXRDYXN0ZWRTZXR0aW5ncygpO1xyXG4gICAgICAgIHRoaXMuZmlsbFNldHRpbmdzKGNhc3RlZFNldHRpbmdzKTtcclxuICAgICAgICB0aGlzLmZpbGxTcGVjaWZpY1NldHRpbmdzKGNhc3RlZFNldHRpbmdzKTtcclxuICAgICAgICB0aGlzLkNoYXJ0U2VydmljZSA9IHRoaXMuZ3JhcGhpY2F0ZShjYXN0ZWRTZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5DaGFydCA9IHRoaXMuQ2hhcnRTZXJ2aWNlLkNoYXJ0SW5zdGFuY2U7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5DaGFydCkgdGhpcy5sb2coXCJDaGFydCBcIiArIHRoaXMubmFtZSArIFwiOiBDb3VsZCBub3QgY3JlYXRlIGdyYXBoXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5DaGFydGVyLmFwcGx5TG9jYWxlKHRoaXMuQ2hhcnQsIHRoaXMuTG9jYWxlKS50aGVuKCgpID0+IHRoaXMuaW5pdERvbmUgPSB0cnVlKTtcclxuICAgICAgfSlcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmllbXBpbWVudG8gZGVsbGUgaW1wb3N0YXppb25pIG5lbGxhIGNsYXNzZSBTZXR0aW5ncy4gU2kgZGFubm8gcHJpb3JpdMOgIGFpIHZhbG9yaSBnacOgIGltcG9zdGF0aSBuZWkgU2V0dGluZ3MsIFxyXG4gICAqIGludGVncmFuZG8gZXZlbnR1YWxtZW50ZSBjb24gbGUgIHByb3ByaWV0w6AgZGVsIGdyYWZpY29cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0Jhc2VTZXR0aW5nc30gc2V0dGluZ3MgSW1wb3N0YXppb25pIGJhc2UgcmljZXZ1dGUgZGFsbGEgc3BlY2lhbGl6emF6aW9uZSBkZWwgZ3JhZmljb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsbFNldHRpbmdzKHNldHRpbmdzOiBCYXNlU2V0dGluZ3MpIHtcclxuXHJcbiAgICAvLyBNZXJnZSBkZWdsaSBJbnB1dCBjb24gaSBTZXR0aW5ncywgZGFuZG8gcHJpb3JpdMOgIGFpIFNldHRpbmdzXHJcblxyXG4gICAgc2V0dGluZ3MuVGhlbWUgPSBzZXR0aW5ncy5UaGVtZSA/IHNldHRpbmdzLlRoZW1lIDogdGhpcy5UaGVtZTtcclxuICAgIHNldHRpbmdzLkxvY2FsZSA9IHNldHRpbmdzLkxvY2FsZSA/IHNldHRpbmdzLkxvY2FsZSA6IHRoaXMuTG9jYWxlO1xyXG4gICAgc2V0dGluZ3MuQW5pbWF0aW9ucyA9IHNldHRpbmdzLkFuaW1hdGlvbnMgIT0gbnVsbCA/IHNldHRpbmdzLkFuaW1hdGlvbnMgOiB0aGlzLkFuaW1hdGlvbnM7XHJcblxyXG4gICAgc2V0dGluZ3MuTGVnZW5kID0gc2V0dGluZ3MuTGVnZW5kICE9IG51bGwgPyBzZXR0aW5ncy5MZWdlbmQgOiB0aGlzLkxlZ2VuZDtcclxuICAgIHNldHRpbmdzLk5hbWUgPSBzZXR0aW5ncy5OYW1lID8gc2V0dGluZ3MuTmFtZSA6IHRoaXMubmFtZTtcclxuICAgIHNldHRpbmdzLlRpbWVsaW5lID0gc2V0dGluZ3MuVGltZWxpbmUgIT0gbnVsbCA/IHNldHRpbmdzLlRpbWVsaW5lIDogdGhpcy5UaW1lbGluZTtcclxuICAgIHNldHRpbmdzLkFkYXB0TGFiZWxTaXplQW5kT3JpZW50YXRpb24gPSBzZXR0aW5ncy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uICE9IG51bGwgPyBzZXR0aW5ncy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uIDogdGhpcy5BZGFwdExhYmVsU2l6ZUFuZE9yaWVudGF0aW9uO1xyXG4gICAgc2V0dGluZ3MuWEF4aXNUaXRsZSA9IHNldHRpbmdzLlhBeGlzVGl0bGUgPyBzZXR0aW5ncy5YQXhpc1RpdGxlIDogdGhpcy5YVGl0bGU7XHJcbiAgICBzZXR0aW5ncy5ZQXhpc1RpdGxlID0gc2V0dGluZ3MuWUF4aXNUaXRsZSA/IHNldHRpbmdzLllBeGlzVGl0bGUgOiB0aGlzLllUaXRsZTtcclxuICAgIHNldHRpbmdzLkxlZ2VuZFBvc2l0aW9uID0gc2V0dGluZ3MuTGVnZW5kUG9zaXRpb24gPyBzZXR0aW5ncy5MZWdlbmRQb3NpdGlvbiA6IHRoaXMuTGVnZW5kUG9zaXRpb247XHJcbiAgICBzZXR0aW5ncy5IaWRlU2VyaWVzT25MYWJlbENsaWNrID0gc2V0dGluZ3MuSGlkZVNlcmllc09uTGFiZWxDbGljayAhPSBudWxsID8gc2V0dGluZ3MuSGlkZVNlcmllc09uTGFiZWxDbGljayA6IHRoaXMuSGlkZVNlcmllc09uTGFiZWxDbGljaztcclxuICAgIHNldHRpbmdzLk1pbkdyaWREaXN0YW5jZSA9IHNldHRpbmdzLk1pbkdyaWREaXN0YW5jZSAhPSBudWxsID8gc2V0dGluZ3MuTWluR3JpZERpc3RhbmNlIDogdGhpcy5NaW5HcmlkRGlzdGFuY2U7XHJcbiAgICBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZyA/IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcgOiB0aGlzLkxlZ2VuZFBhZGRpbmcgPz8gbnVsbDtcclxuXHJcbiAgICAoPGFueT5zZXR0aW5ncykuQ29udGFpbmVySGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgKDxhbnk+c2V0dGluZ3MpLk9uU2VyaWVzQ2xpY2tDYWxsYmFjayA9IChzZXJpZXMpID0+IHsgdGhpcy5vblNlcmllc0NsaWNrZWQuZW1pdChzZXJpZXMpOyB9O1xyXG4gICAgKDxhbnk+c2V0dGluZ3MpLk9uU2VsZWN0aW9uQ2hhbmdlZENhbGxiYWNrID0gKGV2ZW50OiB7IGZyb206IERhdGUsIHRvOiBEYXRlLCBpbml0aWFsOiBib29sZWFuIH0pID0+IHsgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh7IGZyb206IGV2ZW50LmZyb20sIHRvOiBldmVudC50bywgaW5pdGlhbDogZXZlbnQuaW5pdGlhbCB9KTsgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xsYSBpIGNhbWJpYW1lbnRpIGF2dmVudXRpIGFsbGUgcHJvcHJpZXTDoCBjaGlhdmUgZSByaWVmZmV0dHVhIGxhIGdyYWZpY2F6aW9uZSBxdWFsb3JhIG5lY2Vzc2FyaW9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1NpbXBsZUNoYW5nZXN9IGNoYW5nZXMgSW5kaWNhemlvbmUgZGVsbGEgbW9kaWZpY2hlIGF2dmVudXRlIG5laSB2YXJpIElucHV0XHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0NoZWNrIExpc3RhIGRlZ2xpIElucHV0IGRhIGNvbnRyb2xsYXJlIHBlciBjdWkgdW5hIG1vZGlmaWNhIGNhdXNhIHVuYSByaWdyYWZpY2F6aW9uZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tQcm9wZXJ0aWVzQW5kUmVncmFwaGljYXRlQXNOZWVkZWQoY2hhbmdlczogU2ltcGxlQ2hhbmdlcywgcHJvcHNUb0NoZWNrOiBzdHJpbmdbXSkge1xyXG4gICAgbGV0IHRvUmVHcmFwaGljYXRlID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9DaGVjay5sZW5ndGg7IGkrKylcclxuICAgICAgdG9SZUdyYXBoaWNhdGUgPSB0b1JlR3JhcGhpY2F0ZSB8fCAoY2hhbmdlc1twcm9wc1RvQ2hlY2tbaV1dICYmIGNoYW5nZXNbcHJvcHNUb0NoZWNrW2ldXS5jdXJyZW50VmFsdWUpXHJcblxyXG4gICAgaWYgKHRvUmVHcmFwaGljYXRlKVxyXG4gICAgICB0aGlzLnJlbG9hZENoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW56aW9uZSBjaGUgZWZmZXR0dWEgdW4gY2FtYmlvIGRpIHBhZ2luYSBwZXIgaSBncmFmaWNpIHBhZ2luYXRpLiBRdWFsb3JhICoqZGF0YSoqIGZvc3NlIG51bGxvIHNpZ25pZmljYSBjaGUgw6ggaW5pemlhdG8gdW4gY2FyaWNhbWVudG8gXHJcbiAgICogZSBhbmNoZSBsYXRvIGFwcGxpY2F0aXZvIGlsIERhdGFSZXRyaWV2ZSBkb3Zyw6AgY29uc2lkZXJhcmUgY2hlIGwnYXNzZW56YSBkaSB2YWxvcmkgbm9uIMOoIGFsdHJvIGNoZSB1bidpbmRpY2F6aW9uZSBkaSBpbml6aW8gY2FyaWNhbWVudG9cclxuICAgKiBcclxuICAgKiBJbCBjYXJpY2FtZW50byBkaSBxdWFsc2lhc2kgcGFnaW5hIGdlbmVyZXLDoCBjb211bnF1ZSB1bmEgcHJpbW8gZXZlbnRvIGNvbiAqKmRhdGEqKiBudWxsbyBpbiBtb2RvIGRhIGluZGljYXJlIGwnaW5pemlvIGNhcmljYW1lbnRvIGVcclxuICAgKiBpbiBzZWNvbmRhIGlzdGFuemEgdW4gYWx0cm8gZXZlbnRvIGluIGN1aSAqKmRhdGEqKiBzYXLDoCBzZW1wcmUgdmFsb3JpenphdG8sIG8gY29uIGlsIER0byBkYSB1c2FyZSBwZXIgcmVjdXBlcmFyZSBpIGRhdGksIG8gY29uIGkgZGF0aVxyXG4gICAqIHZlcmkgZSBwcm9wcmkgZ2nDoCBwcmVzZW50aSBuZWwgKipEYXRhQXJyYXkqKlxyXG4gICAqIFxyXG4gICAqIEkgY2FsbGJhY2sgKipvbkxvYWRTdGFydCoqIGUgKipvbkxvYWRFbmQqKiB2ZW5nb25vIHNlbXByZSBjaGlhbWF0aVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7eyBkYXRhOiBMaW5lQ2hhcnREYXRhIHwgUGllQ2hhcnREYXRhIHwgVmVydGljYWwyRENoYXJ0RGF0YSB8IFZlcnRpY2FsQ2hhcnREYXRhIHwgYW55LCBpbmRleDogbnVtYmVyIH19IG5kIEluZGljZSBkZWwgY2FyaWNhbWVudG8gZGF0aSwgY29uIGV2ZW50dWFsbWVudGUgZ2nDoCBpIGRhdGkgc2UgZGlzcG9uaWJpbGlcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShuZDogeyBkYXRhOiBMaW5lQ2hhcnREYXRhIHwgUGllQ2hhcnREYXRhIHwgVmVydGljYWwyRENoYXJ0RGF0YSB8IFZlcnRpY2FsQ2hhcnREYXRhIHwgYW55LCBpbmRleDogbnVtYmVyIH0pIHtcclxuICAgIGlmICghbmQuZGF0YSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmdDaGFydCA9IHRydWU7XHJcbiAgICAgIC8vIFNlcnZlIHBlciBpbmZvcm1hcmUgbCdhcHBsaWNhdGl2byBpbiBsaXN0ZW5pbmcgc3VsbCdpbmRpY2UgYXR0dWFsbWVudGUgaW4gdmlzdWFsaXp6YXppb25lLiBcclxuICAgICAgLy8gTGEgbWFuY2FuemEgZGkgZGF0aSBpbmRpY2EgY2hlIG5vbiBkZXZvbm8gZXNzZXJlIGVmZmV0dHVhdGUgcmljZXJjaGUgcGVyIG9yYVxyXG4gICAgICBpZiAodGhpcy5EYXRhUmV0cmlldmUpXHJcbiAgICAgICAgdGhpcy5EYXRhUmV0cmlldmUobnVsbCwgbmQuaW5kZXgpXHJcbiAgICAgIHRoaXMub25Mb2FkU3RhcnQuZW1pdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuRGF0YVJldHJpZXZlKVxyXG4gICAgICB0aGlzLkRhdGFSZXRyaWV2ZShuZC5kYXRhLCBuZC5pbmRleCkudGhlbih0ID0+IHsgdGhpcy5jaGFuZ2VQYWdlRGF0YVJlY2VpdmVkKHQpOyB9KTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jaGFuZ2VQYWdlRGF0YVJlY2VpdmVkKG5kLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWwgdGVybWluZSBkZWwgY2FyaWNhbWVudG8gZGVpIGRhdGkgZGkgdW5hIHBhZ2luYSBxdWVzdG8gbWV0b2RvIHZpZW5lIGNoaWFtYXRvIHBlciByaWdyYWZpY2FyZSBsYSBzaXR1YXppb25lIGNvbiBpIG51b3ZpIGRhdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0xpbmVDaGFydERhdGEgfCBQaWVDaGFydERhdGEgfCBWZXJ0aWNhbDJEQ2hhcnREYXRhIHwgVmVydGljYWxDaGFydERhdGEgfCBhbnl9IGRhdGEgRGF0aSBkZWwgZ3JhZmljb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hhbmdlUGFnZURhdGFSZWNlaXZlZChkYXRhOiBMaW5lQ2hhcnREYXRhIHwgUGllQ2hhcnREYXRhIHwgVmVydGljYWwyRENoYXJ0RGF0YSB8IFZlcnRpY2FsQ2hhcnREYXRhIHwgYW55KSB7XHJcbiAgICB0aGlzLmxvYWRpbmdDaGFydCA9IGZhbHNlO1xyXG4gICAgdGhpcy5vbkxvYWRFbmQuZW1pdCgpO1xyXG4gICAgbGV0IGZpcnN0QmluZCA9ICF0aGlzLkRhdGE7XHJcbiAgICB0aGlzLkRhdGEgPSBkYXRhO1xyXG5cclxuICAgIGlmICghZmlyc3RCaW5kKVxyXG4gICAgICB0aGlzLnJlbG9hZENoYXJ0KCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hMb2FkQ2hhcnQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY2FyaWNhIGlsIGdyYWZpY28gZGlzdHJ1Z2dlbmRvIGlsIHZlY2NoaW8gZSByaWNyZWFuZG8gaWwgbnVvdm9cclxuICAgKiBcclxuICAgKiBMZSBjaGlhbWF0ZSBhIHF1ZXN0byBtZXRvZG8gcG9zc29ubyBlc3NlcmUgdHJhc2Zvcm1hdGUgaW4gY2hpYW1hdGUgYWwgbWV0b2RvICoqZ3JhcGhpY2F0ZSoqIGRlbGxhIFNlcnZpY2UsIHNlIHNvbG8gcXVlbCBtZXRvZG8gZm9zc2UgYWJiYXN0YW56YSBpbnRlbGxpZ2VudGUgcGVyIGNhcGlyZVxyXG4gICAqIGxlIGRpZmZlcmVuemUgZnJhIGlsIGdyYWZpY28gY29tJ2VyYSBwcmltYSBlIGNvbWUgZGV2ZSBkaXZlbnRhcmUsIGluIG1vZG8gZGEgbm9uIHJpY3JlYXJsbyBtYSBzZW1wbGljZW1lbnRlIG1vZGlmaWNhcmUgcXVlbGxvIGNoZSBnacOgIMOoIGRpc2VnbmF0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVsb2FkQ2hhcnQoKSB7XHJcbiAgICB0aGlzLmJyb3dzZXJPbmx5KCgpID0+IHsgaWYgKCF0aGlzLkNoYXJ0LmlzRGlzcG9zZWQoKSkgdGhpcy5DaGFydC5kaXNwb3NlKCk7IHRoaXMuRGlzcGF0Y2hlci5kZXJlZ2lzdGVyR3JhcGgodGhpcy5uYW1lKSB9KTtcclxuICAgIHRoaXMuRGlzcGF0Y2hlci5yZWdpc3Rlcih0aGlzLm5hbWUsICgpID0+IHsgcmV0dXJuIHRoaXMubG9hZENoYXJ0KCk7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuemlvbmUgY2hlIHNpIG9jY3VwYSBkaSBjYXJpY2FyZSBpIHRlbWkgbmVjZXNzYXJpIHBlciBpbCBncmFmaWNvIGluIG9nZ2V0dG8uIFByaW1hIGFwcGxpY2EgaWwgdGVtYSwgcG9pLCBzZSBzZXJ2ZSwgYXBwbGljYSBsZSBhbmltYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cEFtQ2hhcnRzVGhlbWVzKCkge1xyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5DaGFydGVyLmFwcGx5VGhlbWUoYW00Y29yZSwgdGhpcy5UaGVtZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQW5pbWF0aW9ucyA/IHRoaXMuQ2hhcnRlci5hcHBseUFuaW1hdGlvbnMoYW00Y29yZSkgOiB0aGlzLkNoYXJ0ZXIudW5hcHBseUFuaW1hdGlvbnMoYW00Y29yZSk7XHJcbiAgICAgIH0pXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGxvZyhsb2c6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMubG9ncylcclxuICAgICAgY29uc29sZS5sb2coXCJAZXNmYWVuemEvZXMtY2hhcnRzOiBcIiArIGxvZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgYnJvd3Nlck9ubHkoZjogKCkgPT4gdm9pZCkge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICBmKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==
@@ -0,0 +1,89 @@
1
+ import { EventEmitter, Component, Input, ChangeDetectionStrategy, Output, ContentChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ /**
5
+ * Componente che si occupa della paginazione dei grafici qualora servisse
6
+ */
7
+ export class PageChartSelector {
8
+ constructor() {
9
+ /**
10
+ * Indica un cambio di pagina ed emette un oggetto con i dati attuali e l'indice attuale.
11
+ *
12
+ * Qualora la proprietà **data** fosse null indica un evento di "loading"
13
+ */
14
+ this.onPageChange = new EventEmitter();
15
+ }
16
+ /**
17
+ * @ignore
18
+ */
19
+ ngOnChanges() {
20
+ if (!(this.Items || this.Dtos) || (this.Items || this.Dtos).length == 0)
21
+ throw new Error("Chart array cannot be empty!");
22
+ var idx = (this.StartIndex || 0);
23
+ this.currentindex = idx;
24
+ this.currentpage = idx + 1;
25
+ this.handlePageChange();
26
+ }
27
+ /**
28
+ * Gestisce un cambio pagina inviando al callback **onPageChange** i dati attuali (siano essi il Dto per il caricamento dati i
29
+ * o i dati già presenti) e l'indice di visualizzazione
30
+ */
31
+ handlePageChange() {
32
+ this.finalIndex = this.currentpage - 1;
33
+ this.currentindex = this.currentpage - 1;
34
+ let data = this.Items && this.Items.length > 0 ? this.Items[this.finalIndex].data : this.Dtos[this.finalIndex];
35
+ this.onPageChange.emit({ data: data, index: this.finalIndex });
36
+ }
37
+ /**
38
+ * Visualizza il grafico successivo
39
+ */
40
+ Next() {
41
+ // Per passare da page a index è sempre un -1
42
+ this.currentpage++;
43
+ this.onPageChange.emit({ data: null, index: this.currentpage - 1 });
44
+ // Delay pseudo-intelligente per click compulsivi.
45
+ // Se dopo questo delay sono andato avanti solo di 1 effettuo il callback altrimenti incremento l'indice
46
+ setTimeout(() => {
47
+ if (this.currentindex == this.currentpage - 2)
48
+ this.handlePageChange();
49
+ else
50
+ this.currentindex++;
51
+ }, this.BrowseDelayMs);
52
+ }
53
+ /**
54
+ * Visualizza il grafico precedente
55
+ */
56
+ Previous() {
57
+ // Per passare da page a index è sempre un -1
58
+ this.currentpage--;
59
+ this.onPageChange.emit({ data: null, index: this.currentpage - 1 });
60
+ // Delay pseudo-intelligente per click compulsivi.
61
+ // Se dopo questo delay sono andato indietro solo di 1 effettuo il callback altrimenti decremento l'indice
62
+ setTimeout(() => {
63
+ if (this.currentindex == this.currentpage)
64
+ this.handlePageChange();
65
+ else
66
+ this.currentindex--;
67
+ }, this.BrowseDelayMs);
68
+ }
69
+ }
70
+ PageChartSelector.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: PageChartSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
+ PageChartSelector.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: PageChartSelector, selector: "chart-pager", inputs: { Items: "Items", Dtos: "Dtos", BrowseDelayMs: "BrowseDelayMs", StartIndex: "StartIndex" }, outputs: { onPageChange: "onPageChange" }, queries: [{ propertyName: "headerInner_tr", first: true, predicate: ["header_inner"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"(Items || Dtos) && (Items || Dtos).length > 0\" class=\"pcs-no-selection\">\r\n <div class=\"pcs-button pcs-backward\">\r\n <svg class=\"pcs-svg-header\">\r\n <g class=\"pcs-svg-button-container\" role=\"button\" (click)=\"currentpage != 1 && Previous(); $event.stopPropagation(); $event.preventDefault();\">\r\n <!--Pulsante e freccettina all'interno-->\r\n <g class=\"pcs-svg-button\" [style.cursor]=\"currentpage == 1 ? 'not-allowed' : 'pointer'\"><path d=\"M3,0 L53.027,0 a3,3 0 0 1 3,3 L56.027,36.817 a3,3 0 0 1 -3,3 L3,39.817 a3,3 0 0 1 -3,-3 L0,3 a3,3 0 0 1 3,-3 Z\"></path></g>\r\n <g class=\"pcs-svg-arrow pcs-svg-arrow-left\"><path d=\"M26,14H10l5.17-6.79A2,2,0,0,0,12,4.79l-7.62,10a2,2,0,0,0,0,2.42l7.62,10a2,2,0,0,0,3.18-2.42L10,18H26a2,2,0,0,0,0-4Z\"></path></g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"pcs-infos\">\r\n <ng-container *ngIf=\"headerInner_tr\">\r\n <ng-container *ngTemplateOutlet=\"headerInner_tr; context : {$implicit: (Items || Dtos)[currentpage - 1]}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"pcs-button pcs-forward\">\r\n <svg class=\"pcs-svg-header\">\r\n <g class=\"pcs-svg-button-container\" role=\"button\" (click)=\"(Items || Dtos).length != currentpage && Next(); $event.stopPropagation(); $event.preventDefault();\">\r\n <!--Pulsante e freccettina all'interno-->\r\n <g class=\"pcs-svg-button\" [style.cursor]=\"(Items || Dtos).length == currentpage ? 'not-allowed' : 'pointer'\"><path d=\"M3,0 L53.027,0 a3,3 0 0 1 3,3 L56.027,36.817 a3,3 0 0 1 -3,3 L3,39.817 a3,3 0 0 1 -3,-3 L0,3 a3,3 0 0 1 3,-3 Z\"></path></g>\r\n <g class=\"pcs-svg-arrow pcs-svg-arrow-right\"><path d=\"M26,14H10l5.17-6.79A2,2,0,0,0,12,4.79l-7.62,10a2,2,0,0,0,0,2.42l7.62,10a2,2,0,0,0,3.18-2.42L10,18H26a2,2,0,0,0,0-4Z\"></path></g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div style=\"clear: both;\"></div>\r\n</div>", styles: [".pcs-button{width:60px}.pcs-forward{float:right;text-align:end}.pcs-backward{float:left}.pcs-svg-header{width:57px;height:40px}.pcs-svg-button-container{outline:currentcolor none medium}.pcs-svg-arrow{pointer-events:none;fill:#555}.pcs-svg-arrow-right{transform:translate(44px,36px) rotate(180deg)}.pcs-svg-arrow-left{transform:translate(13px,4px)}.pcs-svg-button{fill:#d9d9d9;stroke:#fff;fill-opacity:1;stroke-opacity:1}.pcs-svg-button:hover{fill:#a3a3a3;cursor:pointer}.pcs-infos{width:calc(100% - 120px);height:44px;float:left}.pcs-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: PageChartSelector, decorators: [{
73
+ type: Component,
74
+ args: [{ selector: "chart-pager", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"(Items || Dtos) && (Items || Dtos).length > 0\" class=\"pcs-no-selection\">\r\n <div class=\"pcs-button pcs-backward\">\r\n <svg class=\"pcs-svg-header\">\r\n <g class=\"pcs-svg-button-container\" role=\"button\" (click)=\"currentpage != 1 && Previous(); $event.stopPropagation(); $event.preventDefault();\">\r\n <!--Pulsante e freccettina all'interno-->\r\n <g class=\"pcs-svg-button\" [style.cursor]=\"currentpage == 1 ? 'not-allowed' : 'pointer'\"><path d=\"M3,0 L53.027,0 a3,3 0 0 1 3,3 L56.027,36.817 a3,3 0 0 1 -3,3 L3,39.817 a3,3 0 0 1 -3,-3 L0,3 a3,3 0 0 1 3,-3 Z\"></path></g>\r\n <g class=\"pcs-svg-arrow pcs-svg-arrow-left\"><path d=\"M26,14H10l5.17-6.79A2,2,0,0,0,12,4.79l-7.62,10a2,2,0,0,0,0,2.42l7.62,10a2,2,0,0,0,3.18-2.42L10,18H26a2,2,0,0,0,0-4Z\"></path></g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"pcs-infos\">\r\n <ng-container *ngIf=\"headerInner_tr\">\r\n <ng-container *ngTemplateOutlet=\"headerInner_tr; context : {$implicit: (Items || Dtos)[currentpage - 1]}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"pcs-button pcs-forward\">\r\n <svg class=\"pcs-svg-header\">\r\n <g class=\"pcs-svg-button-container\" role=\"button\" (click)=\"(Items || Dtos).length != currentpage && Next(); $event.stopPropagation(); $event.preventDefault();\">\r\n <!--Pulsante e freccettina all'interno-->\r\n <g class=\"pcs-svg-button\" [style.cursor]=\"(Items || Dtos).length == currentpage ? 'not-allowed' : 'pointer'\"><path d=\"M3,0 L53.027,0 a3,3 0 0 1 3,3 L56.027,36.817 a3,3 0 0 1 -3,3 L3,39.817 a3,3 0 0 1 -3,-3 L0,3 a3,3 0 0 1 3,-3 Z\"></path></g>\r\n <g class=\"pcs-svg-arrow pcs-svg-arrow-right\"><path d=\"M26,14H10l5.17-6.79A2,2,0,0,0,12,4.79l-7.62,10a2,2,0,0,0,0,2.42l7.62,10a2,2,0,0,0,3.18-2.42L10,18H26a2,2,0,0,0,0-4Z\"></path></g>\r\n </g>\r\n </svg>\r\n </div>\r\n <div style=\"clear: both;\"></div>\r\n</div>", styles: [".pcs-button{width:60px}.pcs-forward{float:right;text-align:end}.pcs-backward{float:left}.pcs-svg-header{width:57px;height:40px}.pcs-svg-button-container{outline:currentcolor none medium}.pcs-svg-arrow{pointer-events:none;fill:#555}.pcs-svg-arrow-right{transform:translate(44px,36px) rotate(180deg)}.pcs-svg-arrow-left{transform:translate(13px,4px)}.pcs-svg-button{fill:#d9d9d9;stroke:#fff;fill-opacity:1;stroke-opacity:1}.pcs-svg-button:hover{fill:#a3a3a3;cursor:pointer}.pcs-infos{width:calc(100% - 120px);height:44px;float:left}.pcs-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}\n"] }]
75
+ }], propDecorators: { Items: [{
76
+ type: Input
77
+ }], Dtos: [{
78
+ type: Input
79
+ }], BrowseDelayMs: [{
80
+ type: Input
81
+ }], StartIndex: [{
82
+ type: Input
83
+ }], onPageChange: [{
84
+ type: Output
85
+ }], headerInner_tr: [{
86
+ type: ContentChild,
87
+ args: ['header_inner', { static: false }]
88
+ }] } });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtcGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9jaGFydC1wYWdlci9jaGFydC1wYWdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0LXBhZ2VyL2NoYXJ0LXBhZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFHOUc7O0dBRUc7QUFPSCxNQUFNLE9BQU8saUJBQWlCO0lBTjlCO1FBOEJJOzs7O1dBSUc7UUFDTyxpQkFBWSxHQUErQyxJQUFJLFlBQVksRUFBZ0MsQ0FBQztLQStFekg7SUEzREc7O09BRUc7SUFDSCxXQUFXO1FBQ1AsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNuRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFcEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0JBQWdCO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM5RyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUk7UUFDUCw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXBFLG1EQUFtRDtRQUNuRCx3R0FBd0c7UUFDeEcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztnQkFFeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNKLDZDQUE2QztRQUM3QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEUsbURBQW1EO1FBQ25ELDBHQUEwRztRQUMxRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXO2dCQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Z0JBRXhCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNCLENBQUM7OzhHQTNHUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixtVUNaOUIsaWlFQXlCTTsyRkRiTyxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0ksYUFBYSxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNOzhCQU90QyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQU9HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFPSSxZQUFZO3NCQUFyQixNQUFNO2dCQUswQyxjQUFjO3NCQUE5RCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBPdXRwdXQsIENvbnRlbnRDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdlZENoYXJ0RGF0YSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhJztcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGNoZSBzaSBvY2N1cGEgZGVsbGEgcGFnaW5hemlvbmUgZGVpIGdyYWZpY2kgcXVhbG9yYSBzZXJ2aXNzZVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJjaGFydC1wYWdlclwiLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiY2hhcnQtcGFnZXIuY29tcG9uZW50Lmh0bWxcIixcclxuICAgIHN0eWxlVXJsczogWydjaGFydC1wYWdlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VDaGFydFNlbGVjdG9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3RhIGRlaSBkYXRpIHByZWNhcmljYXRhIGluIG1lbW9yaWFcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgSXRlbXM6IFBhZ2VkQ2hhcnREYXRhPGFueT5bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3RhIGRlaSBEdG8gZGEgdXRpbGl6emFyZSBwZXIgY2FyaWNhcmUgaSB2YWxvcmkgZGVpIHZhcmkgZ3JhZmljaVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBEdG9zOiBhbnlbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERvcG8gYXZlciBuYXZpZ2F0byBhIHVuIG51b3ZvIGdyYWZpY28gdmVycmFubm8gYXR0ZXNpIHF1ZXN0aSBtaWxsaXNlY29uZGkgcHJpbWEgZGkgcmljaGllZGVyZSBpIGRhdGkgYXR0cmF2ZXJzbyBsYSAqKkRhdGFSZXRyaWV2ZSoqLlxyXG4gICAgICogXHJcbiAgICAgKiBRdWVzdG8gcGVyIGV2aXRhcmUgY2hlIGwndXRlbnRlIGNsaWNjYW5kbyB2ZWxvY2VtZW50ZSBcImF2YW50aVwiIGdlbmVyaSB0b25uZWxsYXRlIGRpIHJpY2hpZXN0ZSBpbnV0aWxpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEJyb3dzZURlbGF5TXM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2UgZGVsbCdhcnJheSAqKkR0b3MqKiBvIGRlbGwnYXJyYXkgKipJdGVtcyoqIGRhIGN1aSBpbml6aWFyZSBhZCBlbWV0dGVyZSBpIHZhbG9yaSwgdXRpbGUgcGVyIHN1cHBvcnRhcmUgaWwgXCJiYWNrXCIgZGEgdW4gZXZlbnR1YWxlIHBhZ2luYSBkaSBkZXR0YWdsaW9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU3RhcnRJbmRleDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHVuIGNhbWJpbyBkaSBwYWdpbmEgZWQgZW1ldHRlIHVuIG9nZ2V0dG8gY29uIGkgZGF0aSBhdHR1YWxpIGUgbCdpbmRpY2UgYXR0dWFsZS5cclxuICAgICAqIFxyXG4gICAgICogUXVhbG9yYSBsYSBwcm9wcmlldMOgICoqZGF0YSoqIGZvc3NlIG51bGwgaW5kaWNhIHVuIGV2ZW50byBkaSBcImxvYWRpbmdcIlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25QYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55LCBpbmRleDogbnVtYmVyIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVycmlkZSBkZWwgdGl0b2xvIGRpIGRlZmF1bHRcclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyX2lubmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGhlYWRlcklubmVyX3RyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3VycmVudHBhZ2U6IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGN1cnJlbnRpbmRleDogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxJbmRleDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBuZ09uQ2hhbmdlcygpIHtcclxuICAgICAgICBpZiAoISh0aGlzLkl0ZW1zIHx8IHRoaXMuRHRvcykgfHwgKHRoaXMuSXRlbXMgfHwgdGhpcy5EdG9zKS5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2hhcnQgYXJyYXkgY2Fubm90IGJlIGVtcHR5IVwiKTtcclxuXHJcbiAgICAgICAgdmFyIGlkeCA9ICh0aGlzLlN0YXJ0SW5kZXggfHwgMCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50aW5kZXggPSBpZHg7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50cGFnZSA9IGlkeCArIDE7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aXNjZSB1biBjYW1iaW8gcGFnaW5hIGludmlhbmRvIGFsIGNhbGxiYWNrICoqb25QYWdlQ2hhbmdlKiogaSBkYXRpIGF0dHVhbGkgKHNpYW5vIGVzc2kgaWwgRHRvIHBlciBpbCBjYXJpY2FtZW50byBkYXRpIGkgXHJcbiAgICAgKiBvIGkgZGF0aSBnacOgIHByZXNlbnRpKSBlIGwnaW5kaWNlIGRpIHZpc3VhbGl6emF6aW9uZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVBhZ2VDaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5maW5hbEluZGV4ID0gdGhpcy5jdXJyZW50cGFnZSAtIDE7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50aW5kZXggPSB0aGlzLmN1cnJlbnRwYWdlIC0gMTtcclxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuSXRlbXMgJiYgdGhpcy5JdGVtcy5sZW5ndGggPiAwID8gdGhpcy5JdGVtc1t0aGlzLmZpbmFsSW5kZXhdLmRhdGEgOiB0aGlzLkR0b3NbdGhpcy5maW5hbEluZGV4XVxyXG4gICAgICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoeyBkYXRhOiBkYXRhLCBpbmRleDogdGhpcy5maW5hbEluZGV4IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmlzdWFsaXp6YSBpbCBncmFmaWNvIHN1Y2Nlc3Npdm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIE5leHQoKSB7XHJcbiAgICAgICAgLy8gUGVyIHBhc3NhcmUgZGEgcGFnZSBhIGluZGV4IMOoIHNlbXByZSB1biAtMVxyXG4gICAgICAgIHRoaXMuY3VycmVudHBhZ2UrKztcclxuICAgICAgICB0aGlzLm9uUGFnZUNoYW5nZS5lbWl0KHsgZGF0YTogbnVsbCwgaW5kZXg6IHRoaXMuY3VycmVudHBhZ2UgLSAxIH0pO1xyXG5cclxuICAgICAgICAvLyBEZWxheSBwc2V1ZG8taW50ZWxsaWdlbnRlIHBlciBjbGljayBjb21wdWxzaXZpLiBcclxuICAgICAgICAvLyBTZSBkb3BvIHF1ZXN0byBkZWxheSBzb25vIGFuZGF0byBhdmFudGkgc29sbyBkaSAxIGVmZmV0dHVvIGlsIGNhbGxiYWNrIGFsdHJpbWVudGkgaW5jcmVtZW50byBsJ2luZGljZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50aW5kZXggPT0gdGhpcy5jdXJyZW50cGFnZSAtIDIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2UoKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50aW5kZXgrKztcclxuICAgICAgICB9LCB0aGlzLkJyb3dzZURlbGF5TXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmlzdWFsaXp6YSBpbCBncmFmaWNvIHByZWNlZGVudGVcclxuICAgICAqL1xyXG4gICAgUHJldmlvdXMoKSB7XHJcbiAgICAgICAgLy8gUGVyIHBhc3NhcmUgZGEgcGFnZSBhIGluZGV4IMOoIHNlbXByZSB1biAtMVxyXG4gICAgICAgIHRoaXMuY3VycmVudHBhZ2UtLTtcclxuICAgICAgICB0aGlzLm9uUGFnZUNoYW5nZS5lbWl0KHsgZGF0YTogbnVsbCwgaW5kZXg6IHRoaXMuY3VycmVudHBhZ2UgLSAxIH0pO1xyXG5cclxuICAgICAgICAvLyBEZWxheSBwc2V1ZG8taW50ZWxsaWdlbnRlIHBlciBjbGljayBjb21wdWxzaXZpLiBcclxuICAgICAgICAvLyBTZSBkb3BvIHF1ZXN0byBkZWxheSBzb25vIGFuZGF0byBpbmRpZXRybyBzb2xvIGRpIDEgZWZmZXR0dW8gaWwgY2FsbGJhY2sgYWx0cmltZW50aSBkZWNyZW1lbnRvIGwnaW5kaWNlXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRpbmRleCA9PSB0aGlzLmN1cnJlbnRwYWdlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudGluZGV4LS07XHJcbiAgICAgICAgfSwgdGhpcy5Ccm93c2VEZWxheU1zKTtcclxuICAgIH1cclxufSIsIjxkaXYgKm5nSWY9XCIoSXRlbXMgfHwgRHRvcykgJiYgKEl0ZW1zIHx8IER0b3MpLmxlbmd0aCA+IDBcIiBjbGFzcz1cInBjcy1uby1zZWxlY3Rpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwY3MtYnV0dG9uIHBjcy1iYWNrd2FyZFwiPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJwY3Mtc3ZnLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8ZyBjbGFzcz1cInBjcy1zdmctYnV0dG9uLWNvbnRhaW5lclwiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwiY3VycmVudHBhZ2UgIT0gMSAmJiBQcmV2aW91cygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLVB1bHNhbnRlIGUgZnJlY2NldHRpbmEgYWxsJ2ludGVybm8tLT5cclxuICAgICAgICAgICAgICAgIDxnIGNsYXNzPVwicGNzLXN2Zy1idXR0b25cIiAgW3N0eWxlLmN1cnNvcl09XCJjdXJyZW50cGFnZSA9PSAxID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJ1wiPjxwYXRoIGQ9XCJNMywwIEw1My4wMjcsMCBhMywzIDAgMCAxIDMsMyBMNTYuMDI3LDM2LjgxNyBhMywzIDAgMCAxIC0zLDMgTDMsMzkuODE3IGEzLDMgMCAwIDEgLTMsLTMgTDAsMyBhMywzIDAgMCAxIDMsLTMgWlwiPjwvcGF0aD48L2c+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBjcy1zdmctYXJyb3cgcGNzLXN2Zy1hcnJvdy1sZWZ0XCI+PHBhdGggZD1cIk0yNiwxNEgxMGw1LjE3LTYuNzlBMiwyLDAsMCwwLDEyLDQuNzlsLTcuNjIsMTBhMiwyLDAsMCwwLDAsMi40Mmw3LjYyLDEwYTIsMiwwLDAsMCwzLjE4LTIuNDJMMTAsMThIMjZhMiwyLDAsMCwwLDAtNFpcIj48L3BhdGg+PC9nPlxyXG4gICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwY3MtaW5mb3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVySW5uZXJfdHJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlcklubmVyX3RyOyBjb250ZXh0IDogeyRpbXBsaWNpdDogKEl0ZW1zIHx8IER0b3MpW2N1cnJlbnRwYWdlIC0gMV19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwY3MtYnV0dG9uIHBjcy1mb3J3YXJkXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cInBjcy1zdmctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxnIGNsYXNzPVwicGNzLXN2Zy1idXR0b24tY29udGFpbmVyXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCIoSXRlbXMgfHwgRHRvcykubGVuZ3RoICE9IGN1cnJlbnRwYWdlICYmIE5leHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcIj5cclxuICAgICAgICAgICAgICAgIDwhLS1QdWxzYW50ZSBlIGZyZWNjZXR0aW5hIGFsbCdpbnRlcm5vLS0+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBjcy1zdmctYnV0dG9uXCIgW3N0eWxlLmN1cnNvcl09XCIoSXRlbXMgfHwgRHRvcykubGVuZ3RoID09IGN1cnJlbnRwYWdlID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJ1wiPjxwYXRoIGQ9XCJNMywwIEw1My4wMjcsMCBhMywzIDAgMCAxIDMsMyBMNTYuMDI3LDM2LjgxNyBhMywzIDAgMCAxIC0zLDMgTDMsMzkuODE3IGEzLDMgMCAwIDEgLTMsLTMgTDAsMyBhMywzIDAgMCAxIDMsLTMgWlwiPjwvcGF0aD48L2c+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBjcy1zdmctYXJyb3cgcGNzLXN2Zy1hcnJvdy1yaWdodFwiPjxwYXRoIGQ9XCJNMjYsMTRIMTBsNS4xNy02Ljc5QTIsMiwwLDAsMCwxMiw0Ljc5bC03LjYyLDEwYTIsMiwwLDAsMCwwLDIuNDJsNy42MiwxMGEyLDIsMCwwLDAsMy4xOC0yLjQyTDEwLDE4SDI2YTIsMiwwLDAsMCwwLTRaXCI+PC9wYXRoPjwvZz5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6IGJvdGg7XCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==