@decaf-ts/for-angular 0.0.12 → 0.0.14

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 (143) hide show
  1. package/{dist/lib/components → components}/component-renderer/component-renderer.component.d.ts +0 -1
  2. package/{dist/lib/components → components}/crud-field/crud-field.component.d.ts +0 -1
  3. package/{dist/lib/components → components}/crud-form/constants.d.ts +0 -1
  4. package/{dist/lib/components → components}/crud-form/crud-form.component.d.ts +0 -1
  5. package/{dist/lib/components → components}/crud-form/types.d.ts +0 -1
  6. package/{dist/lib/components → components}/empty-state/empty-state.component.d.ts +0 -1
  7. package/{dist/lib/components → components}/fieldset/fieldset.component.d.ts +0 -1
  8. package/{dist/lib/components → components}/filter/filter.component.d.ts +0 -1
  9. package/{dist/lib/components → components}/for-angular-components.module.d.ts +0 -1
  10. package/{dist/lib/components → components}/index.d.ts +0 -1
  11. package/{dist/lib/components → components}/layout/layout.component.d.ts +0 -1
  12. package/{dist/lib/components → components}/list/constants.d.ts +0 -1
  13. package/{dist/lib/components → components}/list/list.component.d.ts +0 -1
  14. package/{dist/lib/components → components}/list-item/list-item.component.d.ts +0 -1
  15. package/{dist/lib/components → components}/model-renderer/model-renderer.component.d.ts +0 -1
  16. package/{dist/lib/components → components}/pagination/constants.d.ts +0 -1
  17. package/{dist/lib/components → components}/pagination/pagination.component.d.ts +0 -1
  18. package/{dist/lib/components → components}/searchbar/searchbar.component.d.ts +0 -1
  19. package/{dist/lib/directives → directives}/collapsable.directive.d.ts +0 -1
  20. package/{dist/lib/directives → directives}/index.d.ts +0 -1
  21. package/{dist/lib/engine → engine}/DynamicModule.d.ts +0 -1
  22. package/{dist/lib/engine → engine}/NgxBaseComponent.d.ts +0 -1
  23. package/{dist/lib/engine → engine}/NgxCrudFormField.d.ts +0 -1
  24. package/{dist/lib/engine → engine}/NgxFormService.d.ts +0 -1
  25. package/{dist/lib/engine → engine}/NgxRenderingEngine.d.ts +0 -1
  26. package/{dist/lib/engine → engine}/NgxRenderingEngine2.d.ts +0 -1
  27. package/{dist/lib/engine → engine}/ValidatorFactory.d.ts +0 -1
  28. package/{dist/lib/engine → engine}/constants.d.ts +0 -1
  29. package/{dist/lib/engine → engine}/decorators.d.ts +0 -1
  30. package/{dist/lib/engine → engine}/index.d.ts +0 -1
  31. package/{dist/lib/engine → engine}/types.d.ts +0 -1
  32. package/esm2022/components/component-renderer/component-renderer.component.mjs +313 -0
  33. package/esm2022/components/crud-field/crud-field.component.mjs +301 -0
  34. package/esm2022/components/crud-form/crud-form.component.mjs +139 -0
  35. package/esm2022/components/empty-state/empty-state.component.mjs +348 -0
  36. package/esm2022/components/fieldset/fieldset.component.mjs +225 -0
  37. package/esm2022/components/filter/filter.component.mjs +689 -0
  38. package/esm2022/components/for-angular-components.module.mjs +71 -0
  39. package/esm2022/components/layout/layout.component.mjs +176 -0
  40. package/esm2022/components/list/list.component.mjs +1236 -0
  41. package/esm2022/components/list-item/list-item.component.mjs +408 -0
  42. package/esm2022/components/model-renderer/model-renderer.component.mjs +138 -0
  43. package/esm2022/components/pagination/pagination.component.mjs +323 -0
  44. package/esm2022/components/searchbar/searchbar.component.mjs +493 -0
  45. package/esm2022/directives/collapsable.directive.mjs +28 -0
  46. package/esm2022/engine/NgxBaseComponent.mjs +539 -0
  47. package/esm2022/for-angular.module.mjs +118 -0
  48. package/{dist/lib/fesm2022 → fesm2022}/decaf-ts-for-angular.mjs +621 -1805
  49. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
  50. package/{dist/lib/for-angular.module.d.ts → for-angular.module.d.ts} +0 -1
  51. package/{dist/lib/helpers → helpers}/index.d.ts +0 -1
  52. package/{dist/lib/helpers → helpers}/utils.d.ts +0 -1
  53. package/{dist/lib/index.d.ts → index.d.ts} +0 -1
  54. package/{dist/lib/interfaces.d.ts → interfaces.d.ts} +0 -1
  55. package/package.json +19 -95
  56. package/{dist/lib/public-apis.d.ts → public-apis.d.ts} +0 -1
  57. package/LICENSE.md +0 -659
  58. package/dist/for-angular/cli/cli-module.d.ts +0 -22
  59. package/dist/for-angular/cli/cli-module.d.ts.map +0 -1
  60. package/dist/for-angular/cli/cli-module.js +0 -131
  61. package/dist/for-angular/cli/cli-module.js.map +0 -1
  62. package/dist/lib/README.md +0 -92
  63. package/dist/lib/components/component-renderer/component-renderer.component.d.ts.map +0 -1
  64. package/dist/lib/components/crud-field/crud-field.component.d.ts.map +0 -1
  65. package/dist/lib/components/crud-form/constants.d.ts.map +0 -1
  66. package/dist/lib/components/crud-form/crud-form.component.d.ts.map +0 -1
  67. package/dist/lib/components/crud-form/types.d.ts.map +0 -1
  68. package/dist/lib/components/empty-state/empty-state.component.d.ts.map +0 -1
  69. package/dist/lib/components/fieldset/fieldset.component.d.ts.map +0 -1
  70. package/dist/lib/components/filter/filter.component.d.ts.map +0 -1
  71. package/dist/lib/components/for-angular-components.module.d.ts.map +0 -1
  72. package/dist/lib/components/index.d.ts.map +0 -1
  73. package/dist/lib/components/layout/layout.component.d.ts.map +0 -1
  74. package/dist/lib/components/list/constants.d.ts.map +0 -1
  75. package/dist/lib/components/list/list.component.d.ts.map +0 -1
  76. package/dist/lib/components/list-item/list-item.component.d.ts.map +0 -1
  77. package/dist/lib/components/model-renderer/model-renderer.component.d.ts.map +0 -1
  78. package/dist/lib/components/pagination/constants.d.ts.map +0 -1
  79. package/dist/lib/components/pagination/pagination.component.d.ts.map +0 -1
  80. package/dist/lib/components/searchbar/searchbar.component.d.ts.map +0 -1
  81. package/dist/lib/decaf-ts-for-angular.d.ts.map +0 -1
  82. package/dist/lib/directives/collapsable.directive.d.ts.map +0 -1
  83. package/dist/lib/directives/index.d.ts.map +0 -1
  84. package/dist/lib/engine/DynamicModule.d.ts.map +0 -1
  85. package/dist/lib/engine/NgxBaseComponent.d.ts.map +0 -1
  86. package/dist/lib/engine/NgxCrudFormField.d.ts.map +0 -1
  87. package/dist/lib/engine/NgxFormService.d.ts.map +0 -1
  88. package/dist/lib/engine/NgxRenderingEngine.d.ts.map +0 -1
  89. package/dist/lib/engine/NgxRenderingEngine2.d.ts.map +0 -1
  90. package/dist/lib/engine/ValidatorFactory.d.ts.map +0 -1
  91. package/dist/lib/engine/constants.d.ts.map +0 -1
  92. package/dist/lib/engine/decorators.d.ts.map +0 -1
  93. package/dist/lib/engine/index.d.ts.map +0 -1
  94. package/dist/lib/engine/types.d.ts.map +0 -1
  95. package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +0 -359
  96. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -456
  97. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -272
  98. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -410
  99. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -250
  100. package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -906
  101. package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -72
  102. package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -245
  103. package/dist/lib/esm2022/components/list/list.component.mjs +0 -1405
  104. package/dist/lib/esm2022/components/list-item/list-item.component.mjs +0 -612
  105. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -182
  106. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -364
  107. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -503
  108. package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
  109. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -546
  110. package/dist/lib/esm2022/for-angular.module.mjs +0 -119
  111. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
  112. package/dist/lib/for-angular.module.d.ts.map +0 -1
  113. package/dist/lib/helpers/index.d.ts.map +0 -1
  114. package/dist/lib/helpers/utils.d.ts.map +0 -1
  115. package/dist/lib/interfaces.d.ts.map +0 -1
  116. package/dist/lib/public-apis.d.ts.map +0 -1
  117. /package/{dist/lib/assets → assets}/i18n/en.json +0 -0
  118. /package/{dist/lib/assets → assets}/images/angular-logo.svg +0 -0
  119. /package/{dist/lib/assets → assets}/images/decaf-logo-black.svg +0 -0
  120. /package/{dist/lib/assets → assets}/images/decaf-logo-lw.svg +0 -0
  121. /package/{dist/lib/assets → assets}/images/decaf-logo-white.svg +0 -0
  122. /package/{dist/lib/assets → assets}/images/decaf-logo.svg +0 -0
  123. /package/{dist/lib/esm2022 → esm2022}/components/crud-form/constants.mjs +0 -0
  124. /package/{dist/lib/esm2022 → esm2022}/components/crud-form/types.mjs +0 -0
  125. /package/{dist/lib/esm2022 → esm2022}/components/index.mjs +0 -0
  126. /package/{dist/lib/esm2022 → esm2022}/components/list/constants.mjs +0 -0
  127. /package/{dist/lib/esm2022 → esm2022}/components/pagination/constants.mjs +0 -0
  128. /package/{dist/lib/esm2022 → esm2022}/decaf-ts-for-angular.mjs +0 -0
  129. /package/{dist/lib/esm2022 → esm2022}/directives/index.mjs +0 -0
  130. /package/{dist/lib/esm2022 → esm2022}/engine/DynamicModule.mjs +0 -0
  131. /package/{dist/lib/esm2022 → esm2022}/engine/NgxCrudFormField.mjs +0 -0
  132. /package/{dist/lib/esm2022 → esm2022}/engine/NgxFormService.mjs +0 -0
  133. /package/{dist/lib/esm2022 → esm2022}/engine/NgxRenderingEngine.mjs +0 -0
  134. /package/{dist/lib/esm2022 → esm2022}/engine/NgxRenderingEngine2.mjs +0 -0
  135. /package/{dist/lib/esm2022 → esm2022}/engine/ValidatorFactory.mjs +0 -0
  136. /package/{dist/lib/esm2022 → esm2022}/engine/constants.mjs +0 -0
  137. /package/{dist/lib/esm2022 → esm2022}/engine/decorators.mjs +0 -0
  138. /package/{dist/lib/esm2022 → esm2022}/engine/index.mjs +0 -0
  139. /package/{dist/lib/esm2022 → esm2022}/engine/types.mjs +0 -0
  140. /package/{dist/lib/esm2022 → esm2022}/helpers/index.mjs +0 -0
  141. /package/{dist/lib/esm2022 → esm2022}/helpers/utils.mjs +0 -0
  142. /package/{dist/lib/esm2022 → esm2022}/interfaces.mjs +0 -0
  143. /package/{dist/lib/esm2022 → esm2022}/public-apis.mjs +0 -0
@@ -1,612 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { Component, EventEmitter, HostListener, inject, Input, Output, ViewChild } from '@angular/core';
3
- import { OperationKeys } from '@decaf-ts/db-decorators';
4
- import { NgxBaseComponent } from '../../engine/NgxBaseComponent';
5
- import { ForAngularModule } from '../../for-angular.module';
6
- import { removeFocusTrap, stringToBoolean } from '../../helpers/utils';
7
- import { getWindowWidth, windowEventEmitter } from '../../helpers/utils';
8
- import { Dynamic, EventConstants } from '../../engine';
9
- import { NavController } from '@ionic/angular';
10
- import { IonButton, IonItem, IonLabel, IonList, IonContent, IonIcon, IonListHeader, IonPopover, IonItemSliding, IonItemOptions, IonItemOption } from '@ionic/angular/standalone';
11
- import * as AllIcons from 'ionicons/icons';
12
- import { addIcons } from 'ionicons';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@ionic/angular/standalone";
15
- import * as i2 from "@angular/common";
16
- import * as i3 from "@ngx-translate/core";
17
- const _c0 = ["actionMenuComponent"];
18
- const _c1 = [[["", "slot", "end"]]];
19
- const _c2 = ["[slot='end']"];
20
- const _c3 = () => ["update", "delete"];
21
- function ListItemComponent_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
22
- i0.ɵɵelementStart(0, "div", 3)(1, "ion-button", 15);
23
- i0.ɵɵelement(2, "ion-icon", 16);
24
- i0.ɵɵelementEnd()();
25
- } if (rf & 2) {
26
- const ctx_r2 = i0.ɵɵnextContext(2);
27
- i0.ɵɵproperty("slot", ctx_r2.iconSlot);
28
- } }
29
- function ListItemComponent_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "div", 6)(1, "ion-button", 15);
31
- i0.ɵɵelement(2, "ion-icon", 16);
32
- i0.ɵɵelementEnd()();
33
- } }
34
- function ListItemComponent_Conditional_0_div_9_Template(rf, ctx) { if (rf & 1) {
35
- i0.ɵɵelement(0, "div", 17);
36
- } if (rf & 2) {
37
- const ctx_r2 = i0.ɵɵnextContext(2);
38
- i0.ɵɵproperty("innerHTML", ctx_r2.description, i0.ɵɵsanitizeHtml);
39
- } }
40
- function ListItemComponent_Conditional_0_Conditional_10_span_2_Template(rf, ctx) { if (rf & 1) {
41
- i0.ɵɵelement(0, "span", 20);
42
- } if (rf & 2) {
43
- const ctx_r2 = i0.ɵɵnextContext(3);
44
- i0.ɵɵproperty("innerHTML", ctx_r2.info, i0.ɵɵsanitizeHtml);
45
- } }
46
- function ListItemComponent_Conditional_0_Conditional_10_div_3_Template(rf, ctx) { if (rf & 1) {
47
- i0.ɵɵelement(0, "div", 21);
48
- } if (rf & 2) {
49
- const ctx_r2 = i0.ɵɵnextContext(3);
50
- i0.ɵɵproperty("innerHTML", ctx_r2.subinfo, i0.ɵɵsanitizeHtml);
51
- } }
52
- function ListItemComponent_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "div", 10)(1, "div");
54
- i0.ɵɵtemplate(2, ListItemComponent_Conditional_0_Conditional_10_span_2_Template, 1, 1, "span", 18)(3, ListItemComponent_Conditional_0_Conditional_10_div_3_Template, 1, 1, "div", 19);
55
- i0.ɵɵelementEnd()();
56
- } if (rf & 2) {
57
- const ctx_r2 = i0.ɵɵnextContext(2);
58
- i0.ɵɵadvance(2);
59
- i0.ɵɵproperty("ngIf", ctx_r2.info);
60
- i0.ɵɵadvance();
61
- i0.ɵɵproperty("ngIf", ctx_r2.subinfo);
62
- } }
63
- function ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
64
- i0.ɵɵelement(0, "ion-icon", 31);
65
- } }
66
- function ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵelement(0, "ion-icon", 32);
68
- } }
69
- function ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Template(rf, ctx) { if (rf & 1) {
70
- const _r5 = i0.ɵɵgetCurrentView();
71
- i0.ɵɵelementStart(0, "ion-item", 29);
72
- i0.ɵɵlistener("click", function ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Template_ion_item_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const operation_r6 = i0.ɵɵnextContext().$implicit; i0.ɵɵnextContext(3); const component_r2 = i0.ɵɵreference(1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.handleAction(operation_r6, $event, component_r2)); });
73
- i0.ɵɵelementStart(1, "ion-avatar", 30);
74
- i0.ɵɵtemplate(2, ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Conditional_2_Template, 1, 0, "ion-icon", 31)(3, ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Conditional_3_Template, 1, 0, "ion-icon", 32);
75
- i0.ɵɵelementEnd();
76
- i0.ɵɵelementStart(4, "ion-label", 33);
77
- i0.ɵɵtext(5);
78
- i0.ɵɵpipe(6, "translate");
79
- i0.ɵɵelementEnd()();
80
- } if (rf & 2) {
81
- const operation_r6 = i0.ɵɵnextContext().$implicit;
82
- i0.ɵɵproperty("button", true);
83
- i0.ɵɵadvance(2);
84
- i0.ɵɵconditional(operation_r6 === "update" ? 2 : 3);
85
- i0.ɵɵadvance(3);
86
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 3, operation_r6));
87
- } }
88
- function ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Template(rf, ctx) { if (rf & 1) {
89
- i0.ɵɵtemplate(0, ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Conditional_0_Template, 7, 5, "ion-item", 28);
90
- } if (rf & 2) {
91
- const operation_r6 = ctx.$implicit;
92
- const ctx_r2 = i0.ɵɵnextContext(4);
93
- i0.ɵɵconditional(ctx_r2.operations.includes(operation_r6) ? 0 : -1);
94
- } }
95
- function ListItemComponent_Conditional_0_Conditional_12_ng_template_5_Template(rf, ctx) { if (rf & 1) {
96
- i0.ɵɵelementStart(0, "ion-content", 25)(1, "ion-list", 26)(2, "ion-list-header");
97
- i0.ɵɵelement(3, "h4", 27);
98
- i0.ɵɵpipe(4, "translate");
99
- i0.ɵɵelementEnd();
100
- i0.ɵɵrepeaterCreate(5, ListItemComponent_Conditional_0_Conditional_12_ng_template_5_For_6_Template, 1, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
101
- i0.ɵɵelementEnd()();
102
- } if (rf & 2) {
103
- i0.ɵɵadvance(3);
104
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(4, 1, "actions"), i0.ɵɵsanitizeHtml);
105
- i0.ɵɵadvance(2);
106
- i0.ɵɵrepeater(i0.ɵɵpureFunction0(3, _c3));
107
- } }
108
- function ListItemComponent_Conditional_0_Conditional_12_Template(rf, ctx) { if (rf & 1) {
109
- const _r4 = i0.ɵɵgetCurrentView();
110
- i0.ɵɵelementStart(0, "div", 12)(1, "ion-button", 22);
111
- i0.ɵɵlistener("click", function ListItemComponent_Conditional_0_Conditional_12_Template_ion_button_click_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.presentActionsMenu($event)); });
112
- i0.ɵɵelement(2, "ion-icon", 23);
113
- i0.ɵɵelementEnd();
114
- i0.ɵɵelementStart(3, "ion-popover", 24, 1);
115
- i0.ɵɵlistener("didDismiss", function ListItemComponent_Conditional_0_Conditional_12_Template_ion_popover_didDismiss_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.actionMenuOpen = false); });
116
- i0.ɵɵtemplate(5, ListItemComponent_Conditional_0_Conditional_12_ng_template_5_Template, 7, 4, "ng-template");
117
- i0.ɵɵelementEnd()();
118
- } if (rf & 2) {
119
- const ctx_r2 = i0.ɵɵnextContext(2);
120
- i0.ɵɵadvance(3);
121
- i0.ɵɵproperty("isOpen", ctx_r2.actionMenuOpen);
122
- } }
123
- function ListItemComponent_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "div", 13);
125
- i0.ɵɵprojection(1);
126
- i0.ɵɵelementEnd();
127
- } }
128
- function ListItemComponent_Conditional_0_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
129
- const _r8 = i0.ɵɵgetCurrentView();
130
- i0.ɵɵelementStart(0, "ion-item-option", 37);
131
- i0.ɵɵlistener("click", function ListItemComponent_Conditional_0_Conditional_14_Conditional_1_Template_ion_item_option_click_0_listener($event) { i0.ɵɵrestoreView(_r8); i0.ɵɵnextContext(2); const component_r2 = i0.ɵɵreference(1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.handleAction("update", $event, component_r2)); });
132
- i0.ɵɵelement(1, "ion-icon", 38);
133
- i0.ɵɵelementEnd();
134
- } if (rf & 2) {
135
- const ctx_r2 = i0.ɵɵnextContext(3);
136
- i0.ɵɵproperty("expandable", ctx_r2.operations.length === 1);
137
- } }
138
- function ListItemComponent_Conditional_0_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
139
- const _r9 = i0.ɵɵgetCurrentView();
140
- i0.ɵɵelementStart(0, "ion-item-option", 39);
141
- i0.ɵɵlistener("click", function ListItemComponent_Conditional_0_Conditional_14_Conditional_2_Template_ion_item_option_click_0_listener($event) { i0.ɵɵrestoreView(_r9); i0.ɵɵnextContext(2); const component_r2 = i0.ɵɵreference(1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.handleAction("delete", $event, component_r2)); });
142
- i0.ɵɵelement(1, "ion-icon", 40);
143
- i0.ɵɵelementEnd();
144
- } if (rf & 2) {
145
- const ctx_r2 = i0.ɵɵnextContext(3);
146
- i0.ɵɵproperty("expandable", ctx_r2.operations.length === 1);
147
- } }
148
- function ListItemComponent_Conditional_0_Conditional_14_Template(rf, ctx) { if (rf & 1) {
149
- const _r7 = i0.ɵɵgetCurrentView();
150
- i0.ɵɵelementStart(0, "ion-item-options", 34);
151
- i0.ɵɵlistener("ionSwipe", function ListItemComponent_Conditional_0_Conditional_14_Template_ion_item_options_ionSwipe_0_listener($event) { i0.ɵɵrestoreView(_r7); i0.ɵɵnextContext(); const component_r2 = i0.ɵɵreference(1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.operations.length === 1 ? ctx_r2.handleAction(ctx_r2.operations[0], $event, component_r2) : ""); });
152
- i0.ɵɵtemplate(1, ListItemComponent_Conditional_0_Conditional_14_Conditional_1_Template, 2, 1, "ion-item-option", 35)(2, ListItemComponent_Conditional_0_Conditional_14_Conditional_2_Template, 2, 1, "ion-item-option", 36);
153
- i0.ɵɵelementEnd();
154
- } if (rf & 2) {
155
- const ctx_r2 = i0.ɵɵnextContext(2);
156
- i0.ɵɵadvance();
157
- i0.ɵɵconditional((ctx_r2.operations == null ? null : ctx_r2.operations.includes("update")) ? 1 : -1);
158
- i0.ɵɵadvance();
159
- i0.ɵɵconditional((ctx_r2.operations == null ? null : ctx_r2.operations.includes("delete")) ? 2 : -1);
160
- } }
161
- function ListItemComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
162
- const _r1 = i0.ɵɵgetCurrentView();
163
- i0.ɵɵelementStart(0, "ion-item-sliding", null, 0)(2, "ion-item", 2);
164
- i0.ɵɵlistener("click", function ListItemComponent_Conditional_0_Template_ion_item_click_2_listener($event) { i0.ɵɵrestoreView(_r1); const component_r2 = i0.ɵɵreference(1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView((ctx_r2.operations == null ? null : ctx_r2.operations.includes("read")) ? ctx_r2.handleAction("read", $event, component_r2) : ""); });
165
- i0.ɵɵtemplate(3, ListItemComponent_Conditional_0_Conditional_3_Template, 3, 1, "div", 3);
166
- i0.ɵɵelementStart(4, "div", 4)(5, "div", 5);
167
- i0.ɵɵtemplate(6, ListItemComponent_Conditional_0_Conditional_6_Template, 3, 0, "div", 6);
168
- i0.ɵɵelementStart(7, "div", 7);
169
- i0.ɵɵelement(8, "ion-label", 8);
170
- i0.ɵɵtemplate(9, ListItemComponent_Conditional_0_div_9_Template, 1, 1, "div", 9);
171
- i0.ɵɵelementEnd();
172
- i0.ɵɵtemplate(10, ListItemComponent_Conditional_0_Conditional_10_Template, 4, 2, "div", 10);
173
- i0.ɵɵelementStart(11, "div", 11);
174
- i0.ɵɵtemplate(12, ListItemComponent_Conditional_0_Conditional_12_Template, 6, 1, "div", 12)(13, ListItemComponent_Conditional_0_Conditional_13_Template, 2, 0, "div", 13);
175
- i0.ɵɵelementEnd()()()();
176
- i0.ɵɵtemplate(14, ListItemComponent_Conditional_0_Conditional_14_Template, 3, 2, "ion-item-options", 14);
177
- i0.ɵɵelementEnd();
178
- } if (rf & 2) {
179
- const ctx_r2 = i0.ɵɵnextContext();
180
- i0.ɵɵadvance(2);
181
- i0.ɵɵclassMap(ctx_r2.className);
182
- i0.ɵɵproperty("lines", ctx_r2.lines)("button", ctx_r2.button);
183
- i0.ɵɵadvance();
184
- i0.ɵɵconditional(ctx_r2.icon && ctx_r2.lines !== "inset" ? 3 : -1);
185
- i0.ɵɵadvance(3);
186
- i0.ɵɵconditional(ctx_r2.icon && ctx_r2.lines === "inset" ? 6 : -1);
187
- i0.ɵɵadvance(2);
188
- i0.ɵɵproperty("innerHTML", ctx_r2.uid + " - " + ctx_r2.title, i0.ɵɵsanitizeHtml);
189
- i0.ɵɵadvance();
190
- i0.ɵɵproperty("ngIf", ctx_r2.description);
191
- i0.ɵɵadvance();
192
- i0.ɵɵconditional(ctx_r2.info || ctx_r2.subinfo ? 10 : -1);
193
- i0.ɵɵadvance(2);
194
- i0.ɵɵconditional((ctx_r2.operations.includes("delete") || ctx_r2.operations.includes("update")) && ctx_r2.uid ? 12 : -1);
195
- i0.ɵɵadvance();
196
- i0.ɵɵconditional(ctx_r2.windowWidth > 768 ? 13 : -1);
197
- i0.ɵɵadvance();
198
- i0.ɵɵconditional(ctx_r2.showSlideItems && ctx_r2.uid ? 14 : -1);
199
- } }
200
- /**
201
- * @description A component for displaying a list item with various customization options.
202
- * @summary The ListItemComponent is an Angular component that extends NgxBaseComponent. It provides a flexible and customizable list item interface with support for icons, buttons, and various text elements. The component also handles actions and navigation based on user interactions.
203
- *
204
- * @class
205
- * @extends NgxBaseComponent
206
- *
207
- * @param {string} [lines='none'] - Determines the line style of the item. Can be 'inset', 'inseet', or 'none'.
208
- * @param {Record<string, any>} item - The data item to be displayed in the list item.
209
- * @param {string} icon - The name of the icon to be displayed.
210
- * @param {'start' | 'end'} [iconSlot='start'] - The position of the icon within the item.
211
- * @param {StringOrBoolean} [button=true] - Determines if the item should behave as a button.
212
- * @param {string} [title] - The main title of the list item.
213
- * @param {string} [description] - A description for the list item.
214
- * @param {string} [info] - Additional information for the list item.
215
- * @param {string} [subinfo] - Sub-information for the list item.
216
- *
217
- * @example
218
- * <ngx-decaf-list-item
219
- * [item]="dataItem"
220
- * icon="star"
221
- * title="Item Title"
222
- * description="Item Description"
223
- * (clickEvent)="handleItemClick($event)">
224
- * </ngx-decaf-list-item>
225
- *
226
- * @mermaid
227
- * sequenceDiagram
228
- * participant C as Component
229
- * participant V as View
230
- * participant U as User
231
- * C->>V: Initialize component
232
- * V->>U: Display list item
233
- * U->>V: Click on item or action
234
- * V->>C: Trigger handleAction()
235
- * C->>C: Process action
236
- * C->>V: Update view or navigate
237
- */
238
- let ListItemComponent = class ListItemComponent extends NgxBaseComponent {
239
- /**
240
- * @description Creates an instance of ListItemComponent.
241
- * @summary Initializes a new ListItemComponent by calling the parent class constructor
242
- * with the component name for logging and identification purposes. Also registers
243
- * all available Ionic icons to ensure they can be displayed in the component.
244
- *
245
- * @memberOf ListItemComponent
246
- */
247
- constructor() {
248
- super("ListItemComponent");
249
- /**
250
- * @description Controls the display of lines around the list item.
251
- * @summary Determines how lines are displayed around the list item borders.
252
- * 'inset' shows lines with padding, 'full' shows full-width lines, and 'none'
253
- * removes all lines. This affects the visual separation between list items.
254
- *
255
- * @type {'inset' | 'full' | 'none'}
256
- * @default 'inset'
257
- * @memberOf ListItemComponent
258
- */
259
- this.lines = 'inset';
260
- /**
261
- * @description Position of the icon within the list item.
262
- * @summary Determines whether the icon appears at the start (left in LTR languages)
263
- * or end (right in LTR languages) of the list item. This affects the overall
264
- * layout and visual hierarchy of the item content.
265
- *
266
- * @type {'start' | 'end'}
267
- * @default 'start'
268
- * @memberOf ListItemComponent
269
- */
270
- this.iconSlot = 'start';
271
- /**
272
- * @description Controls whether the list item behaves as a clickable button.
273
- * @summary When set to true, the list item will have button-like behavior including
274
- * hover effects, click handling, and appropriate accessibility attributes.
275
- * When false, the item is displayed as static content without interactive behavior.
276
- *
277
- * @type {StringOrBoolean}
278
- * @default true
279
- * @memberOf ListItemComponent
280
- */
281
- this.button = true;
282
- /**
283
- * @description Event emitter for list item click interactions.
284
- * @summary Emits custom events when the list item is clicked or when actions
285
- * are performed on it. The emitted event contains information about the action,
286
- * the item data, and other relevant context for parent components to handle.
287
- *
288
- * @type {EventEmitter<ListItemCustomEvent>}
289
- * @memberOf ListItemComponent
290
- */
291
- this.clickEvent = new EventEmitter();
292
- /**
293
- * @description Flag indicating whether slide items are currently enabled.
294
- * @summary Controls the visibility of slide actions based on screen size and
295
- * available operations. When true, users can swipe on the item to reveal
296
- * action buttons for operations like edit and delete.
297
- *
298
- * @type {boolean}
299
- * @default false
300
- * @memberOf ListItemComponent
301
- */
302
- this.showSlideItems = false;
303
- /**
304
- * @description Flag indicating whether the action menu popover is currently open.
305
- * @summary Tracks the state of the action menu to prevent multiple instances
306
- * from being opened simultaneously and to ensure proper cleanup when actions
307
- * are performed. Used for managing the popover lifecycle.
308
- *
309
- * @type {boolean}
310
- * @default false
311
- * @memberOf ListItemComponent
312
- */
313
- this.actionMenuOpen = false;
314
- /**
315
- * @description Angular NavController service for handling navigation.
316
- * @summary Injected service that provides methods for programmatic navigation
317
- * within the Ionic application. Used for navigating to different routes when
318
- * list item actions are performed or when the item itself is clicked.
319
- *
320
- * @private
321
- * @type {NavController}
322
- * @memberOf ListItemComponent
323
- */
324
- this.navController = inject(NavController);
325
- addIcons(AllIcons);
326
- }
327
- /**
328
- * @description Initializes the component after Angular first displays the data-bound properties.
329
- * @summary Sets up the component by determining slide item visibility, processing boolean inputs,
330
- * building CSS class names based on properties, and capturing the current window width.
331
- * This method prepares the component for user interaction by ensuring all properties are
332
- * properly initialized and responsive behavior is configured.
333
- *
334
- * @mermaid
335
- * sequenceDiagram
336
- * participant A as Angular Lifecycle
337
- * participant L as ListItemComponent
338
- * participant W as Window
339
- *
340
- * A->>L: ngOnInit()
341
- * L->>L: enableSlideItems()
342
- * L->>L: Process button boolean
343
- * L->>L: Build className with flex classes
344
- * alt operations exist
345
- * L->>L: Add 'action' class
346
- * end
347
- * L->>W: getWindowWidth()
348
- * W-->>L: Return current width
349
- * L->>L: Store windowWidth
350
- *
351
- * @return {Promise<void>}
352
- * @memberOf ListItemComponent
353
- */
354
- async ngOnInit() {
355
- this.showSlideItems = this.enableSlideItems();
356
- this.button = stringToBoolean(this.button);
357
- this.className = `${this.className} dcf-flex dcf-flex-middle grid-item`;
358
- if (this.operations?.length)
359
- this.className += ` action`;
360
- this.windowWidth = getWindowWidth();
361
- }
362
- /**
363
- * @description Handles user interactions and actions performed on the list item.
364
- * @summary This method is the central action handler for list item interactions. It manages
365
- * event propagation, dismisses open action menus, removes focus traps, and either emits
366
- * events for parent components to handle or performs navigation based on the component's
367
- * route configuration. This method supports both event-driven and navigation-driven architectures.
368
- *
369
- * @param {CrudOperations} action - The type of CRUD operation being performed
370
- * @param {Event} event - The browser event that triggered the action
371
- * @param {HTMLElement} [target] - Optional target element for the event
372
- * @return {Promise<boolean|void>} A promise that resolves to navigation success or void for events
373
- *
374
- * @mermaid
375
- * sequenceDiagram
376
- * participant U as User
377
- * participant L as ListItemComponent
378
- * participant P as Parent Component
379
- * participant N as NavController
380
- * participant E as Event System
381
- *
382
- * U->>L: Perform action (click/swipe)
383
- * L->>L: stopPropagation()
384
- * alt actionMenuOpen
385
- * L->>L: Dismiss action menu
386
- * end
387
- * L->>L: removeFocusTrap()
388
- * alt No route configured
389
- * L->>E: windowEventEmitter()
390
- * L->>P: clickEvent.emit()
391
- * else Route configured
392
- * L->>N: redirect(action, uid)
393
- * N-->>L: Return navigation result
394
- * end
395
- *
396
- * @memberOf ListItemComponent
397
- */
398
- async handleAction(action, event, target) {
399
- event.stopPropagation();
400
- if (this.actionMenuOpen)
401
- await this.actionMenuComponent.dismiss();
402
- // forcing trap focus
403
- removeFocusTrap();
404
- if (!this.route) {
405
- const event = { target: target, action, pk: this.pk, data: this.uid, name: EventConstants.CLICK_EVENT, component: this.componentName };
406
- windowEventEmitter(`ListItem${EventConstants.CLICK_EVENT}`, event);
407
- return this.clickEvent.emit(event);
408
- }
409
- return await this.redirect(action, (typeof this.uid === 'number' ? `${this.uid}` : this.uid));
410
- }
411
- /**
412
- * @description Responsive handler that enables or disables slide items based on screen size and operations.
413
- * @summary This method is automatically called when the window is resized and also during component
414
- * initialization. It determines whether slide actions should be available based on the current
415
- * window width and the presence of UPDATE or DELETE operations. Slide items are typically hidden
416
- * on larger screens where there's space for dedicated action buttons.
417
- *
418
- * @return {boolean} True if slide items should be shown, false otherwise
419
- *
420
- * @mermaid
421
- * sequenceDiagram
422
- * participant W as Window
423
- * participant L as ListItemComponent
424
- * participant U as UI
425
- *
426
- * W->>L: resize event
427
- * L->>W: getWindowWidth()
428
- * W-->>L: Return current width
429
- * L->>L: Store windowWidth
430
- * alt No operations OR width > 768px
431
- * L->>U: showSlideItems = false
432
- * else Operations include UPDATE/DELETE
433
- * L->>U: showSlideItems = true
434
- * end
435
- * L-->>U: Return showSlideItems value
436
- *
437
- * @memberOf ListItemComponent
438
- */
439
- enableSlideItems() {
440
- this.windowWidth = getWindowWidth();
441
- if (!this.operations?.length || this.windowWidth > 768)
442
- return this.showSlideItems = false;
443
- this.showSlideItems = this.operations.includes(OperationKeys.UPDATE) || this.operations.includes(OperationKeys.DELETE);
444
- return this.showSlideItems;
445
- }
446
- /**
447
- * @description Animates and removes an element from the DOM.
448
- * @summary This method applies CSS animation classes to create a smooth fade-out effect
449
- * before removing the element from the DOM. The animation enhances user experience by
450
- * providing visual feedback when items are deleted or removed from lists. The timing
451
- * is coordinated with the CSS animation duration to ensure the element is removed
452
- * after the animation completes.
453
- *
454
- * @param {HTMLElement} element - The DOM element to animate and remove
455
- * @return {void}
456
- *
457
- * @mermaid
458
- * sequenceDiagram
459
- * participant L as ListItemComponent
460
- * participant E as HTMLElement
461
- * participant D as DOM
462
- *
463
- * L->>E: Add animation classes
464
- * Note over E: uk-animation-fade, uk-animation-medium, uk-animation-reverse
465
- * E->>E: Start fade animation
466
- * L->>L: setTimeout(600ms)
467
- * Note over L: Wait for animation to complete
468
- * L->>D: element.remove()
469
- * D->>D: Remove element from DOM
470
- *
471
- * @memberOf ListItemComponent
472
- */
473
- removeElement(element) {
474
- element.classList.add('uk-animation-fade', 'uk-animation-medium', 'uk-animation-reverse');
475
- setTimeout(() => { element.remove(); }, 600);
476
- }
477
- /**
478
- * @description Navigates to a new route based on the specified action and item ID.
479
- * @summary This method constructs a navigation URL using the component's route configuration,
480
- * the specified action, and an item identifier. It uses Ionic's NavController to perform
481
- * forward navigation with appropriate animations. This method is typically used for
482
- * CRUD operations where each action (create, read, update, delete) has its own route.
483
- *
484
- * @param {string} action - The action to be performed (e.g., 'edit', 'view', 'delete')
485
- * @param {string} [id] - The unique identifier of the item to be acted upon
486
- * @return {Promise<boolean>} A promise that resolves to true if navigation was successful
487
- *
488
- * @mermaid
489
- * sequenceDiagram
490
- * participant L as ListItemComponent
491
- * participant N as NavController
492
- * participant R as Router
493
- *
494
- * L->>L: redirect(action, id)
495
- * L->>L: Construct URL: /{route}/{action}/{id}
496
- * L->>N: navigateForward(url)
497
- * N->>R: Navigate to constructed URL
498
- * R-->>N: Return navigation result
499
- * N-->>L: Return boolean success
500
- *
501
- * @memberOf ListItemComponent
502
- */
503
- async redirect(action, id) {
504
- return await this.navController.navigateForward(`/${this.route}/${action}/${id || this.uid}`);
505
- }
506
- /**
507
- * @description Presents the actions menu popover for the list item.
508
- * @summary This method handles the display of a contextual action menu when triggered by user
509
- * interaction (typically a long press or right-click). It stops event propagation to prevent
510
- * unwanted side effects, removes any existing focus traps for accessibility, configures the
511
- * popover with the triggering event, and opens the action menu. The menu typically contains
512
- * available CRUD operations for the item.
513
- *
514
- * @param {Event} event - The event that triggered the action menu request
515
- * @return {void}
516
- *
517
- * @mermaid
518
- * sequenceDiagram
519
- * participant U as User
520
- * participant L as ListItemComponent
521
- * participant P as Popover
522
- * participant A as Accessibility
523
- *
524
- * U->>L: Trigger action menu (long press/right-click)
525
- * L->>L: stopPropagation()
526
- * L->>A: removeFocusTrap()
527
- * L->>P: Set event reference
528
- * L->>L: actionMenuOpen = true
529
- * L->>P: Display popover with actions
530
- *
531
- * @memberOf ListItemComponent
532
- */
533
- presentActionsMenu(event) {
534
- event.stopPropagation();
535
- // forcing trap focus
536
- removeFocusTrap();
537
- this.actionMenuComponent.event = event;
538
- this.actionMenuOpen = true;
539
- }
540
- static { this.ɵfac = function ListItemComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListItemComponent)(); }; }
541
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListItemComponent, selectors: [["ngx-decaf-list-item"]], viewQuery: function ListItemComponent_Query(rf, ctx) { if (rf & 1) {
542
- i0.ɵɵviewQuery(_c0, 5);
543
- } if (rf & 2) {
544
- let _t;
545
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.actionMenuComponent = _t.first);
546
- } }, hostBindings: function ListItemComponent_HostBindings(rf, ctx) { if (rf & 1) {
547
- i0.ɵɵlistener("resize", function ListItemComponent_resize_HostBindingHandler($event) { return ctx.enableSlideItems($event); }, false, i0.ɵɵresolveWindow);
548
- } }, inputs: { lines: "lines", item: "item", icon: "icon", iconSlot: "iconSlot", button: "button", title: "title", description: "description", info: "info", subinfo: "subinfo" }, outputs: { clickEvent: "clickEvent" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c2, decls: 1, vars: 1, consts: [["component", ""], ["actionMenuComponent", ""], [3, "click", "lines", "button"], [1, "dcf-icon", 3, "slot"], [1, "dcf-width-expand"], ["dcf-grid", "", 1, "dcf-flex", "dcf-flex-middle", "dcf-grid-collapse"], [1, "dcf-icon", "dcf-grid-icon"], [1, "dcf-width-expand@s", "dcf-width-1-1", "dcf-label"], [1, "dcf-item-title", 3, "innerHTML"], ["class", "dcf-description", 3, "innerHTML", 4, "ngIf"], [1, "dcf-width-auto@s", "dcf-width-expand", "dcf-info", "dcf-flex", "dcf-flex-right@s"], [1, "dcf-width-auto", "dcf-flex", "dcf-flex-middle", "dcf-flex-right"], ["id", "dcf-actions", 1, "dcf-visible@m"], ["id", "end"], ["side", "end"], ["shape", "round", "fill", "clear"], ["aria-hidden", "true", "name", "reader-outline", "color", "dark", "size", "default"], [1, "dcf-description", 3, "innerHTML"], [3, "innerHTML", 4, "ngIf"], ["class", "dcf-subinfo dcf-text-truncate", 3, "innerHTML", 4, "ngIf"], [3, "innerHTML"], [1, "dcf-subinfo", "dcf-text-truncate", 3, "innerHTML"], ["shape", "round", "fill", "clear", "color", "primary", 1, "dcf-hidden@m", 3, "click"], ["slot", "icon-only", "aria-hidden", "true", "name", "ellipsis-vertical-outline"], ["side", "bottom", "alignment", "left", 3, "didDismiss", "isOpen"], [1, "ion-padding"], ["lines", "none"], [1, "dcf-text-capitalize", 3, "innerHTML"], [3, "button"], [3, "click", "button"], ["aria-hidden", "true", "slot", "start", 1, "dcf-flex", "dcf-flex-middle"], ["color", "primary", "aria-hidden", "true", "name", "create-outline"], ["color", "danger", "aria-hidden", "true", "name", "trash"], [1, "dcf-text-capitalize"], ["side", "end", 3, "ionSwipe"], [1, "update", 3, "expandable"], [1, "delete", 3, "expandable"], [1, "update", 3, "click", "expandable"], ["aria-hidden", "true", "slot", "icon-only", "name", "create-outline"], [1, "delete", 3, "click", "expandable"], ["aria-hidden", "true", "slot", "icon-only", "name", "trash"]], template: function ListItemComponent_Template(rf, ctx) { if (rf & 1) {
549
- i0.ɵɵprojectionDef(_c1);
550
- i0.ɵɵtemplate(0, ListItemComponent_Conditional_0_Template, 15, 12, "ion-item-sliding");
551
- } if (rf & 2) {
552
- i0.ɵɵconditional(ctx.title || ctx.description ? 0 : -1);
553
- } }, dependencies: [ForAngularModule, i1.IonButton, i1.IonContent, i2.NgIf, i3.TranslatePipe, IonList,
554
- IonListHeader,
555
- IonItem,
556
- IonItemSliding,
557
- IonItemOptions,
558
- IonItemOption,
559
- IonIcon,
560
- IonLabel,
561
- IonPopover], styles: ["ion-item[_ngcontent-%COMP%]{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--ion-color-gray-2)}ion-item.item-lines-inset[_ngcontent-%COMP%]{--padding-top: 0rem !important;--padding-bottom: 0rem !important;--inner-padding-top: .5rem !important;--inner-padding-bottom: .65rem !important;--border-color: var(--ion-color-gray-2)}ion-item[_ngcontent-%COMP%]:hover .dcf-info[_ngcontent-%COMP%]{background:transparent!important}ion-item[_ngcontent-%COMP%] .dcf-info[_ngcontent-%COMP%]{min-width:10vw;color:var(--ion-color-gray-6)}ion-item[_ngcontent-%COMP%] .dcf-grid[_ngcontent-%COMP%]{padding:0!important;margin:0!important;min-width:100%!important}ion-item[_ngcontent-%COMP%] .dcf-item-title[_ngcontent-%COMP%]{color:var(--ion-color-gray-8);font-style:normal;font-weight:700}ion-item[_ngcontent-%COMP%] .dcf-description[_ngcontent-%COMP%]{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ion-color-gray-6);font-style:normal;font-weight:400;font-size:.925rem}ion-item[_ngcontent-%COMP%]::part(native){min-width:100%}ion-item[_ngcontent-%COMP%] [slot=start][_ngcontent-%COMP%]{margin-right:.5rem!important}ion-item[_ngcontent-%COMP%] [slot=end][_ngcontent-%COMP%]{margin-left:.5rem!important}ion-item[_ngcontent-%COMP%] .dcf-info[_ngcontent-%COMP%]{font-size:.9rem;background:#fff}ion-item[_ngcontent-%COMP%] .dcf-info[_ngcontent-%COMP%] .dcf-subinfo.dcf-line[_ngcontent-%COMP%]{margin-left:.5rem}@media (min-width: var(--dcf-width-sm)){ion-item[_ngcontent-%COMP%] .dcf-info[_ngcontent-%COMP%] .dcf-subinfo.dcf-line[_ngcontent-%COMP%]{display:block;margin-left:0}}ion-item[_ngcontent-%COMP%] #dcf-actions[_ngcontent-%COMP%]{padding:5px}@media (max-width: 768px){ion-item[_ngcontent-%COMP%] #dcf-actions[_ngcontent-%COMP%]{display:none;pointer-events:none!important;cursor:text!important}ion-item[_ngcontent-%COMP%] #dcf-actions[_ngcontent-%COMP%] *[_ngcontent-%COMP%]{display:none;pointer-events:none!important;cursor:text!important}}ion-item[_ngcontent-%COMP%] #dcf-actions[_ngcontent-%COMP%] ion-button[_ngcontent-%COMP%]{--padding-start: 1rem;--padding-end: .75rem;--padding-top: .85rem !important;--padding-bottom: .85rem !important;color:#ccc;margin-right:.5rem!important;--background: var(--ion-color-gray-2) !important}ion-item[_ngcontent-%COMP%] #dcf-actions[_ngcontent-%COMP%] ion-button[_ngcontent-%COMP%] ion-icon[_ngcontent-%COMP%]{position:relative;left:-1px}@media (max-width: 768px){ion-item[_ngcontent-%COMP%] #dcf-end[_ngcontent-%COMP%], ion-item[_ngcontent-%COMP%] [slot=end][_ngcontent-%COMP%]{display:none!important}}ion-item[_ngcontent-%COMP%] #dcf-end[_ngcontent-%COMP%]{padding-top:5px;display:flex;align-items:flex-end}ion-item[_ngcontent-%COMP%] .dcf-icon[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;text-align:center;margin-right:.5rem!important}ion-item[_ngcontent-%COMP%] .dcf-icon.dcf-grid-icon[_ngcontent-%COMP%]{min-width:50px;text-align:left;display:flex;justify-content:flex-start}@media (max-width: 578px){ion-item[_ngcontent-%COMP%] .dcf-icon[_ngcontent-%COMP%]{align-items:flex-start!important}}ion-item[_ngcontent-%COMP%] .dcf-icon[_ngcontent-%COMP%] ion-button[_ngcontent-%COMP%]{color:var(--dcf-color-gray-3);--padding-start: 1rem;--padding-end: .85rem;--padding-top: .85rem !important;--padding-bottom: .85rem !important;--background: var(--ion-color-gray-1) !important}ion-item[_ngcontent-%COMP%] .dcf-icon[_ngcontent-%COMP%] ion-button[_ngcontent-%COMP%] ion-icon[_ngcontent-%COMP%]{font-size:20px}ion-item[_ngcontent-%COMP%] .dcf-icon[_ngcontent-%COMP%] ion-avatar[_ngcontent-%COMP%]{transform:scale(.9);background:var(--ion-color-gray-1);display:flex;justify-content:center;align-items:center;text-align:center;box-sizing:border-box!important}ion-item[_ngcontent-%COMP%] .dcf-icon[_ngcontent-%COMP%] ion-avatar[_ngcontent-%COMP%] .dcf-icon-large[_ngcontent-%COMP%]{transform:translateY(5px)}ion-item-sliding[_ngcontent-%COMP%]{box-sizing:border-box}ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]:not(.dcf-delete), ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]:not(.dcf-update){background:rgba(var(--ion-color-dark-rgb),.25)!important}ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]:not(.dcf-delete) .dcf-ti[_ngcontent-%COMP%], ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]:not(.dcf-delete) ion-icon[_ngcontent-%COMP%], ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]:not(.dcf-update) .dcf-ti[_ngcontent-%COMP%], ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]:not(.dcf-update) ion-icon[_ngcontent-%COMP%]{color:var(--ion-color-gray-7)!important}ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-delete[_ngcontent-%COMP%]{background:rgba(var(--ion-color-danger-rgb),.15)!important}ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-delete[_ngcontent-%COMP%] .dcf-ti[_ngcontent-%COMP%], ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-delete[_ngcontent-%COMP%] *[_ngcontent-%COMP%], ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-delete[_ngcontent-%COMP%] ion-icon[_ngcontent-%COMP%]{color:var(--ion-color-danger)!important}ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-update[_ngcontent-%COMP%]{background:rgba(var(--ion-color-primary-rgb),.25)!important}ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-update[_ngcontent-%COMP%] .dcf-ti[_ngcontent-%COMP%], ion-item-sliding[_ngcontent-%COMP%] ion-item-option.dcf-update[_ngcontent-%COMP%] ion-icon[_ngcontent-%COMP%]{color:var(--ion-color-gray-7)!important}ion-item-sliding[class*=active-slide][_ngcontent-%COMP%]{border-color:var(--ion-color-gray-3)}ion-item-sliding[_ngcontent-%COMP%] ion-item-option[_ngcontent-%COMP%]{color:var(--ion-color-gray-5);box-shadow:inset 0 0 5px rgba(var(--ion-color-dark-rgb),.15)!important;background:var(--ion-color-gray-3)}"] }); }
562
- };
563
- ListItemComponent = __decorate([
564
- Dynamic(),
565
- __metadata("design:paramtypes", [])
566
- ], ListItemComponent);
567
- export { ListItemComponent };
568
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListItemComponent, [{
569
- type: Component,
570
- args: [{ selector: 'ngx-decaf-list-item', standalone: true, imports: [
571
- ForAngularModule,
572
- IonList,
573
- IonListHeader,
574
- IonItem,
575
- IonItemSliding,
576
- IonItemOptions,
577
- IonItemOption,
578
- IonIcon,
579
- IonLabel,
580
- IonButton,
581
- IonContent,
582
- IonPopover
583
- ], template: "\n@if(title || description) {\n <ion-item-sliding #component>\n <ion-item\n [lines]=\"lines\"\n [button]=\"button\"\n [class]=\"className\"\n (click)=\"operations?.includes('read') ? handleAction('read', $event, component) : ''\n \">\n @if(icon && lines !== 'inset') {\n <div class=\"dcf-icon\" [slot]=\"iconSlot\">\n <ion-button shape=\"round\" fill=\"clear\">\n <ion-icon aria-hidden=\"true\" name=\"reader-outline\" color=\"dark\" size=\"default\"></ion-icon>\n </ion-button>\n </div>\n }\n <div class=\"dcf-width-expand\">\n <div class=\"dcf-flex dcf-flex-middle dcf-grid-collapse\" dcf-grid>\n @if(icon && lines === 'inset') {\n <div class=\"dcf-icon dcf-grid-icon\">\n <ion-button shape=\"round\" fill=\"clear\">\n <ion-icon aria-hidden=\"true\" name=\"reader-outline\" color=\"dark\" size=\"default\"></ion-icon>\n </ion-button>\n </div>\n }\n <div class=\"dcf-width-expand@s dcf-width-1-1 dcf-label\">\n <ion-label class=\"dcf-item-title\" [innerHTML]=\"uid + ' - ' + title\" ></ion-label>\n <div *ngIf =\"description\" class=\"dcf-description\" [innerHTML]=\"description\"></div>\n </div>\n @if(info || subinfo) {\n <div class=\"dcf-width-auto@s dcf-width-expand dcf-info dcf-flex dcf-flex-right@s\">\n <div>\n <span *ngIf=\"info\" [innerHTML]=\"info\"></span>\n <div *ngIf=\"subinfo\" class=\"dcf-subinfo dcf-text-truncate\" [innerHTML]=\"subinfo\" ></div>\n </div>\n </div>\n }\n\n <div class=\"dcf-width-auto dcf-flex dcf-flex-middle dcf-flex-right\">\n @if((operations.includes('delete') || operations.includes('update')) && uid) {\n <div class=\"dcf-visible@m\" id=\"dcf-actions\">\n <ion-button class=\"dcf-hidden@m\" shape=\"round\" fill=\"clear\" color=\"primary\" (click)=\"presentActionsMenu($event)\">\n <ion-icon slot=\"icon-only\" aria-hidden=\"true\" name=\"ellipsis-vertical-outline\"></ion-icon>\n </ion-button>\n <ion-popover\n #actionMenuComponent\n side=\"bottom\"\n alignment=\"left\"\n\n [isOpen]=\"actionMenuOpen\"\n (didDismiss)=\"actionMenuOpen = false\">\n <ng-template>\n <ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <ion-list-header>\n <h4 class=\"dcf-text-capitalize\" [innerHTML]=\"'actions' | translate\"></h4>\n </ion-list-header>\n @for (operation of ['update', 'delete']; track operation) {\n @if(operations.includes(operation)) {\n <ion-item [button]=\"true\" (click)=\"handleAction(operation, $event, component)\">\n <ion-avatar class=\"dcf-flex dcf-flex-middle\" aria-hidden=\"true\" slot=\"start\">\n @if(operation === 'update') {\n <ion-icon color=\"primary\" aria-hidden=\"true\" name=\"create-outline\"></ion-icon>\n } @else {\n <ion-icon color=\"danger\" aria-hidden=\"true\" name=\"trash\"></ion-icon>\n }\n </ion-avatar>\n <ion-label class=\"dcf-text-capitalize\">{{ operation | translate }}</ion-label>\n </ion-item>\n }\n }\n </ion-list>\n </ion-content>\n </ng-template>\n </ion-popover>\n </div>\n }\n <!-- @if(operations?.length && uid) {\n <div class=\"dcf-visible@m\" id=\"dcf-actions\">\n @if(operations?.includes('update')) {\n <ion-button fill=\"clear\" size=\"small\" color=\"primary\" (click)=\"handleAction('update', component)\">\n <ion-icon aria-hidden=\"true\" slot=\"icon-only\" name=\"create-outline\"></ion-icon>\n </ion-button>\n }\n @if(operations?.includes('delete')) {\n <ion-button fill=\"clear\" size=\"small\" color=\"danger\" (click)=\"handleAction('delete', component)\">\n <ion-icon aria-hidden=\"true\" slot=\"icon-only\" name=\"trash\"></ion-icon>\n </ion-button>\n }\n </div>\n } -->\n @if(windowWidth > 768) {\n <div id=\"end\">\n <ng-content select=\"[slot='end']\"></ng-content>\n </div>\n }\n </div>\n </div>\n </div>\n </ion-item>\n @if(showSlideItems && uid) {\n <ion-item-options side=\"end\" (ionSwipe)=\"operations.length === 1 ? handleAction(operations[0], $event, component) : ''\">\n @if(operations?.includes('update')) {\n <ion-item-option class=\"update\" (click)=\"handleAction('update', $event, component)\" [expandable]=\"operations.length === 1\">\n <ion-icon aria-hidden=\"true\" slot=\"icon-only\" name=\"create-outline\"></ion-icon>\n </ion-item-option>\n }\n @if(operations?.includes('delete')) {\n <ion-item-option class=\"delete\" (click)=\"handleAction('delete', $event, component)\" [expandable]=\"operations.length === 1\">\n <ion-icon aria-hidden=\"true\" slot=\"icon-only\" name=\"trash\"></ion-icon>\n </ion-item-option>\n }\n </ion-item-options>\n }\n </ion-item-sliding>\n}\n", styles: ["ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--ion-color-gray-2)}ion-item.item-lines-inset{--padding-top: 0rem !important;--padding-bottom: 0rem !important;--inner-padding-top: .5rem !important;--inner-padding-bottom: .65rem !important;--border-color: var(--ion-color-gray-2)}ion-item:hover .dcf-info{background:transparent!important}ion-item .dcf-info{min-width:10vw;color:var(--ion-color-gray-6)}ion-item .dcf-grid{padding:0!important;margin:0!important;min-width:100%!important}ion-item .dcf-item-title{color:var(--ion-color-gray-8);font-style:normal;font-weight:700}ion-item .dcf-description{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ion-color-gray-6);font-style:normal;font-weight:400;font-size:.925rem}ion-item::part(native){min-width:100%}ion-item [slot=start]{margin-right:.5rem!important}ion-item [slot=end]{margin-left:.5rem!important}ion-item .dcf-info{font-size:.9rem;background:#fff}ion-item .dcf-info .dcf-subinfo.dcf-line{margin-left:.5rem}@media (min-width: var(--dcf-width-sm)){ion-item .dcf-info .dcf-subinfo.dcf-line{display:block;margin-left:0}}ion-item #dcf-actions{padding:5px}@media (max-width: 768px){ion-item #dcf-actions{display:none;pointer-events:none!important;cursor:text!important}ion-item #dcf-actions *{display:none;pointer-events:none!important;cursor:text!important}}ion-item #dcf-actions ion-button{--padding-start: 1rem;--padding-end: .75rem;--padding-top: .85rem !important;--padding-bottom: .85rem !important;color:#ccc;margin-right:.5rem!important;--background: var(--ion-color-gray-2) !important}ion-item #dcf-actions ion-button ion-icon{position:relative;left:-1px}@media (max-width: 768px){ion-item #dcf-end,ion-item [slot=end]{display:none!important}}ion-item #dcf-end{padding-top:5px;display:flex;align-items:flex-end}ion-item .dcf-icon{display:flex;justify-content:center;align-items:center;text-align:center;margin-right:.5rem!important}ion-item .dcf-icon.dcf-grid-icon{min-width:50px;text-align:left;display:flex;justify-content:flex-start}@media (max-width: 578px){ion-item .dcf-icon{align-items:flex-start!important}}ion-item .dcf-icon ion-button{color:var(--dcf-color-gray-3);--padding-start: 1rem;--padding-end: .85rem;--padding-top: .85rem !important;--padding-bottom: .85rem !important;--background: var(--ion-color-gray-1) !important}ion-item .dcf-icon ion-button ion-icon{font-size:20px}ion-item .dcf-icon ion-avatar{transform:scale(.9);background:var(--ion-color-gray-1);display:flex;justify-content:center;align-items:center;text-align:center;box-sizing:border-box!important}ion-item .dcf-icon ion-avatar .dcf-icon-large{transform:translateY(5px)}ion-item-sliding{box-sizing:border-box}ion-item-sliding ion-item-option:not(.dcf-delete),ion-item-sliding ion-item-option:not(.dcf-update){background:rgba(var(--ion-color-dark-rgb),.25)!important}ion-item-sliding ion-item-option:not(.dcf-delete) .dcf-ti,ion-item-sliding ion-item-option:not(.dcf-delete) ion-icon,ion-item-sliding ion-item-option:not(.dcf-update) .dcf-ti,ion-item-sliding ion-item-option:not(.dcf-update) ion-icon{color:var(--ion-color-gray-7)!important}ion-item-sliding ion-item-option.dcf-delete{background:rgba(var(--ion-color-danger-rgb),.15)!important}ion-item-sliding ion-item-option.dcf-delete .dcf-ti,ion-item-sliding ion-item-option.dcf-delete *,ion-item-sliding ion-item-option.dcf-delete ion-icon{color:var(--ion-color-danger)!important}ion-item-sliding ion-item-option.dcf-update{background:rgba(var(--ion-color-primary-rgb),.25)!important}ion-item-sliding ion-item-option.dcf-update .dcf-ti,ion-item-sliding ion-item-option.dcf-update ion-icon{color:var(--ion-color-gray-7)!important}ion-item-sliding[class*=active-slide]{border-color:var(--ion-color-gray-3)}ion-item-sliding ion-item-option{color:var(--ion-color-gray-5);box-shadow:inset 0 0 5px rgba(var(--ion-color-dark-rgb),.15)!important;background:var(--ion-color-gray-3)}\n"] }]
584
- }], () => [], { actionMenuComponent: [{
585
- type: ViewChild,
586
- args: ['actionMenuComponent']
587
- }], lines: [{
588
- type: Input
589
- }], item: [{
590
- type: Input
591
- }], icon: [{
592
- type: Input
593
- }], iconSlot: [{
594
- type: Input
595
- }], button: [{
596
- type: Input
597
- }], title: [{
598
- type: Input
599
- }], description: [{
600
- type: Input
601
- }], info: [{
602
- type: Input
603
- }], subinfo: [{
604
- type: Input
605
- }], clickEvent: [{
606
- type: Output
607
- }], enableSlideItems: [{
608
- type: HostListener,
609
- args: ['window:resize', ['$event']]
610
- }] }); })();
611
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListItemComponent, { className: "ListItemComponent", filePath: "components/list-item/list-item.component.ts", lineNumber: 87 }); })();
612
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFHLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBa0IsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQXVCLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsRUFDVixPQUFPLEVBQ1AsYUFBYSxFQUNiLFVBQVUsRUFDVixjQUFjLEVBQ2QsY0FBYyxFQUNkLGFBQWEsRUFDZCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sS0FBSyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7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LElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7a0hBaGFVLGlCQUFpQjtvRUFBakIsaUJBQWlCOzs7Ozs7WUFBakIsOEZBQUEsNEJBQXdCLCtCQUFQOzs7WUNyRjlCLHNGQUEyQjs7WUFBM0IsdURBa0hDOzRCRDVDRyxnQkFBZ0IsMERBQ2hCLE9BQU87WUFDUCxhQUFhO1lBQ2IsT0FBTztZQUNQLGNBQWM7WUFDZCxjQUFjO1lBQ2QsYUFBYTtZQUNiLE9BQU87WUFDUCxRQUFRO1lBR1IsVUFBVTs7QUFJRCxpQkFBaUI7SUF0QjdCLE9BQU8sRUFBRTs7R0FzQkcsaUJBQWlCLENBaWE3Qjs7aUZBamFZLGlCQUFpQjtjQXJCN0IsU0FBUzsyQkFDRSxxQkFBcUIsY0FHbkIsSUFBSSxXQUNQO29CQUNQLGdCQUFnQjtvQkFDaEIsT0FBTztvQkFDUCxhQUFhO29CQUNiLE9BQU87b0JBQ1AsY0FBYztvQkFDZCxjQUFjO29CQUNkLGFBQWE7b0JBQ2IsT0FBTztvQkFDUCxRQUFRO29CQUNSLFNBQVM7b0JBQ1QsVUFBVTtvQkFDVixVQUFVO2lCQUNYO29CQWVELG1CQUFtQjtrQkFEbEIsU0FBUzttQkFBQyxxQkFBcUI7WUFjaEMsS0FBSztrQkFESixLQUFLO1lBYUcsSUFBSTtrQkFEWixLQUFLO1lBYU4sSUFBSTtrQkFESCxLQUFLO1lBY04sUUFBUTtrQkFEUCxLQUFLO1lBY04sTUFBTTtrQkFETCxLQUFLO1lBYU4sS0FBSztrQkFESixLQUFLO1lBYU4sV0FBVztrQkFEVixLQUFLO1lBYU4sSUFBSTtrQkFESCxLQUFLO1lBYU4sT0FBTztrQkFETixLQUFLO1lBYU4sVUFBVTtrQkFEVCxNQUFNO1lBbUxQLGdCQUFnQjtrQkFEZixZQUFZO21CQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBeFQ5QixpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBTdHJpbmdPckJvb2xlYW4gfSBmcm9tICcuLi8uLi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHsgTmd4QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hCYXNlQ29tcG9uZW50JztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgcmVtb3ZlRm9jdXNUcmFwLCBzdHJpbmdUb0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IGdldFdpbmRvd1dpZHRoLCB3aW5kb3dFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IER5bmFtaWMsIEV2ZW50Q29uc3RhbnRzLCBMaXN0SXRlbUN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxuICBJb25MaXN0LFxuICBJb25Db250ZW50LFxuICBJb25JY29uLFxuICBJb25MaXN0SGVhZGVyLFxuICBJb25Qb3BvdmVyLFxuICBJb25JdGVtU2xpZGluZyxcbiAgSW9uSXRlbU9wdGlvbnMsXG4gIElvbkl0ZW1PcHRpb25cbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgKiBhcyBBbGxJY29ucyBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbXBvbmVudCBmb3IgZGlzcGxheWluZyBhIGxpc3QgaXRlbSB3aXRoIHZhcmlvdXMgY3VzdG9taXphdGlvbiBvcHRpb25zLlxuICogQHN1bW1hcnkgVGhlIExpc3RJdGVtQ29tcG9uZW50IGlzIGFuIEFuZ3VsYXIgY29tcG9uZW50IHRoYXQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50LiBJdCBwcm92aWRlcyBhIGZsZXhpYmxlIGFuZCBjdXN0b21pemFibGUgbGlzdCBpdGVtIGludGVyZmFjZSB3aXRoIHN1cHBvcnQgZm9yIGljb25zLCBidXR0b25zLCBhbmQgdmFyaW91cyB0ZXh0IGVsZW1lbnRzLiBUaGUgY29tcG9uZW50IGFsc28gaGFuZGxlcyBhY3Rpb25zIGFuZCBuYXZpZ2F0aW9uIGJhc2VkIG9uIHVzZXIgaW50ZXJhY3Rpb25zLlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGluZXM9J25vbmUnXSAtIERldGVybWluZXMgdGhlIGxpbmUgc3R5bGUgb2YgdGhlIGl0ZW0uIENhbiBiZSAnaW5zZXQnLCAnaW5zZWV0Jywgb3IgJ25vbmUnLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBpdGVtIC0gVGhlIGRhdGEgaXRlbSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgaXRlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpY29uIC0gVGhlIG5hbWUgb2YgdGhlIGljb24gdG8gYmUgZGlzcGxheWVkLlxuICogQHBhcmFtIHsnc3RhcnQnIHwgJ2VuZCd9IFtpY29uU2xvdD0nc3RhcnQnXSAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaWNvbiB3aXRoaW4gdGhlIGl0ZW0uXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gW2J1dHRvbj10cnVlXSAtIERldGVybWluZXMgaWYgdGhlIGl0ZW0gc2hvdWxkIGJlaGF2ZSBhcyBhIGJ1dHRvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGl0bGVdIC0gVGhlIG1haW4gdGl0bGUgb2YgdGhlIGxpc3QgaXRlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gQSBkZXNjcmlwdGlvbiBmb3IgdGhlIGxpc3QgaXRlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5mb10gLSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgbGlzdCBpdGVtLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWJpbmZvXSAtIFN1Yi1pbmZvcm1hdGlvbiBmb3IgdGhlIGxpc3QgaXRlbS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1saXN0LWl0ZW1cbiAqICAgW2l0ZW1dPVwiZGF0YUl0ZW1cIlxuICogICBpY29uPVwic3RhclwiXG4gKiAgIHRpdGxlPVwiSXRlbSBUaXRsZVwiXG4gKiAgIGRlc2NyaXB0aW9uPVwiSXRlbSBEZXNjcmlwdGlvblwiXG4gKiAgIChjbGlja0V2ZW50KT1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1saXN0LWl0ZW0+XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFZpZXdcbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gKiAgIEMtPj5WOiBJbml0aWFsaXplIGNvbXBvbmVudFxuICogICBWLT4+VTogRGlzcGxheSBsaXN0IGl0ZW1cbiAqICAgVS0+PlY6IENsaWNrIG9uIGl0ZW0gb3IgYWN0aW9uXG4gKiAgIFYtPj5DOiBUcmlnZ2VyIGhhbmRsZUFjdGlvbigpXG4gKiAgIEMtPj5DOiBQcm9jZXNzIGFjdGlvblxuICogICBDLT4+VjogVXBkYXRlIHZpZXcgb3IgbmF2aWdhdGVcbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWxpc3QtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvckFuZ3VsYXJNb2R1bGUsXG4gICAgSW9uTGlzdCxcbiAgICBJb25MaXN0SGVhZGVyLFxuICAgIElvbkl0ZW0sXG4gICAgSW9uSXRlbVNsaWRpbmcsXG4gICAgSW9uSXRlbU9wdGlvbnMsXG4gICAgSW9uSXRlbU9wdGlvbixcbiAgICBJb25JY29uLFxuICAgIElvbkxhYmVsLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25Db250ZW50LFxuICAgIElvblBvcG92ZXJcbiAgXVxuXG59KVxuZXhwb3J0IGNsYXNzIExpc3RJdGVtQ29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGFjdGlvbiBtZW51IHBvcG92ZXIgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBIVE1MSW9uUG9wb3ZlckVsZW1lbnRcbiAgICogdXNlZCBmb3IgZGlzcGxheWluZyBhY3Rpb24gbWVudXMuIFRoaXMgcmVmZXJlbmNlIGlzIHVzZWQgdG8gcHJvZ3JhbW1hdGljYWxseVxuICAgKiBjb250cm9sIHRoZSBwb3BvdmVyLCBzdWNoIGFzIGRpc21pc3NpbmcgaXQgd2hlbiBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MSW9uUG9wb3ZlckVsZW1lbnR9XG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnYWN0aW9uTWVudUNvbXBvbmVudCcpXG4gIGFjdGlvbk1lbnVDb21wb25lbnQhOiBIVE1MSW9uUG9wb3ZlckVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgZGlzcGxheSBvZiBsaW5lcyBhcm91bmQgdGhlIGxpc3QgaXRlbS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgbGluZXMgYXJlIGRpc3BsYXllZCBhcm91bmQgdGhlIGxpc3QgaXRlbSBib3JkZXJzLlxuICAgKiAnaW5zZXQnIHNob3dzIGxpbmVzIHdpdGggcGFkZGluZywgJ2Z1bGwnIHNob3dzIGZ1bGwtd2lkdGggbGluZXMsIGFuZCAnbm9uZSdcbiAgICogcmVtb3ZlcyBhbGwgbGluZXMuIFRoaXMgYWZmZWN0cyB0aGUgdmlzdWFsIHNlcGFyYXRpb24gYmV0d2VlbiBsaXN0IGl0ZW1zLlxuICAgKlxuICAgKiBAdHlwZSB7J2luc2V0JyB8ICdmdWxsJyB8ICdub25lJ31cbiAgICogQGRlZmF1bHQgJ2luc2V0J1xuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxpbmVzOiAnaW5zZXQnIHwgJ2Z1bGwnIHwgJ25vbmUnID0gJ2luc2V0JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSByYXcgZGF0YSB0aGF0IHRoaXMgbGlzdCBpdGVtIHJlcHJlc2VudHMuIFRoaXMgb2JqZWN0XG4gICAqIGlzIHVzZWQgdG8gZXh0cmFjdCBkaXNwbGF5IGluZm9ybWF0aW9uIGFuZCBmb3IgcGFzc2luZyB0byBldmVudCBoYW5kbGVyc1xuICAgKiB3aGVuIHRoZSBpdGVtIGlzIGludGVyYWN0ZWQgd2l0aC4gSXQgb3ZlcnJpZGVzIHRoZSBiYXNlIGl0ZW0gcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn1cbiAgICogQG1lbWJlck9mIExpc3RJdGVtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBpdGVtITogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgaWNvbiB0byBkaXNwbGF5IGluIHRoZSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBpY29uIHRvIGRpc3BsYXkgdXNpbmcgSW9uaWMncyBpY29uIHN5c3RlbS5cbiAgICogVGhlIGljb24gbmFtZSBzaG91bGQgY29ycmVzcG9uZCB0byBhbiBhdmFpbGFibGUgSW9uaWMgaWNvbiBvciBhIGN1c3RvbVxuICAgKiBpY29uIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBpY29uIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb24hOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQb3NpdGlvbiBvZiB0aGUgaWNvbiB3aXRoaW4gdGhlIGxpc3QgaXRlbS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpY29uIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IChsZWZ0IGluIExUUiBsYW5ndWFnZXMpXG4gICAqIG9yIGVuZCAocmlnaHQgaW4gTFRSIGxhbmd1YWdlcykgb2YgdGhlIGxpc3QgaXRlbS4gVGhpcyBhZmZlY3RzIHRoZSBvdmVyYWxsXG4gICAqIGxheW91dCBhbmQgdmlzdWFsIGhpZXJhcmNoeSBvZiB0aGUgaXRlbSBjb250ZW50LlxuICAgKlxuICAgKiBAdHlwZSB7J3N0YXJ0JyB8ICdlbmQnfVxuICAgKiBAZGVmYXVsdCAnc3RhcnQnXG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaWNvblNsb3Q6ICdzdGFydCcgfCAnZW5kJyA9J3N0YXJ0JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpc3QgaXRlbSBiZWhhdmVzIGFzIGEgY2xpY2thYmxlIGJ1dHRvbi5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGxpc3QgaXRlbSB3aWxsIGhhdmUgYnV0dG9uLWxpa2UgYmVoYXZpb3IgaW5jbHVkaW5nXG4gICAqIGhvdmVyIGVmZmVjdHMsIGNsaWNrIGhhbmRsaW5nLCBhbmQgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBhdHRyaWJ1dGVzLlxuICAgKiBXaGVuIGZhbHNlLCB0aGUgaXRlbSBpcyBkaXNwbGF5ZWQgYXMgc3RhdGljIGNvbnRlbnQgd2l0aG91dCBpbnRlcmFjdGl2ZSBiZWhhdmlvci5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvbjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYWluIHRpdGxlIHRleHQgZGlzcGxheWVkIGluIHRoZSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgdGV4dCBjb250ZW50IHRoYXQgYXBwZWFycyBwcm9taW5lbnRseSBpbiB0aGUgbGlzdCBpdGVtLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB0aGUgbW9zdCBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGl0ZW0gYW5kIGlzIGRpc3BsYXllZFxuICAgKiB3aXRoIGVtcGhhc2lzIGluIHRoZSBjb21wb25lbnQncyB2aXN1YWwgaGllcmFyY2h5LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2Vjb25kYXJ5IGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFkZGl0aW9uYWwgY29udGV4dCBvciBkZXRhaWxzIGFib3V0IHRoZSBpdGVtLiBUaGlzIHRleHRcbiAgICogaXMgdHlwaWNhbGx5IGRpc3BsYXllZCBiZWxvdyB0aGUgdGl0bGUgd2l0aCBsZXNzIHZpc3VhbCBlbXBoYXNpcy5cbiAgICogVXNlZnVsIGZvciBwcm92aWRpbmcgY29udGV4dCB3aXRob3V0IGNsdXR0ZXJpbmcgdGhlIG1haW4gdGl0bGUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRleHQgZm9yIHRoZSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IERpc3BsYXlzIHN1cHBsZW1lbnRhcnkgaW5mb3JtYXRpb24gdGhhdCBwcm92aWRlcyBleHRyYSBjb250ZXh0XG4gICAqIGFib3V0IHRoZSBpdGVtLiBUaGlzIGNvdWxkIGluY2x1ZGUgbWV0YWRhdGEsIHN0YXR1cyBpbmZvcm1hdGlvbiwgb3JcbiAgICogb3RoZXIgcmVsZXZhbnQgZGV0YWlscyB0aGF0IGRvbid0IGZpdCBpbiB0aGUgdGl0bGUgb3IgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW5mbz86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1Yi1pbmZvcm1hdGlvbiB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgbGlzdCBpdGVtLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyB0ZXJ0aWFyeSBsZXZlbCBpbmZvcm1hdGlvbiB0aGF0IGNvbXBsZW1lbnRzIHRoZSBpbmZvIGZpZWxkLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBhZGRpdGlvbmFsIG1ldGFkYXRhIG9yIGNvbnRleHR1YWwgZGV0YWlsc1xuICAgKiB0aGF0IGFyZSB1c2VmdWwgYnV0IG5vdCBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaXRlbS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIExpc3RJdGVtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJpbmZvPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgbGlzdCBpdGVtIGNsaWNrIGludGVyYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgY3VzdG9tIGV2ZW50cyB3aGVuIHRoZSBsaXN0IGl0ZW0gaXMgY2xpY2tlZCBvciB3aGVuIGFjdGlvbnNcbiAgICogYXJlIHBlcmZvcm1lZCBvbiBpdC4gVGhlIGVtaXR0ZWQgZXZlbnQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdGlvbixcbiAgICogdGhlIGl0ZW0gZGF0YSwgYW5kIG90aGVyIHJlbGV2YW50IGNvbnRleHQgZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIGhhbmRsZS5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxMaXN0SXRlbUN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RJdGVtQ29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgY2xpY2tFdmVudDogIEV2ZW50RW1pdHRlcjxMaXN0SXRlbUN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHNsaWRlIGl0ZW1zIGFyZSBjdXJyZW50bHkgZW5hYmxlZC5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2Ygc2xpZGUgYWN0aW9ucyBiYXNlZCBvbiBzY3JlZW4gc2l6ZSBhbmRcbiAgICogYXZhaWxhYmxlIG9wZXJhdGlvbnMuIFdoZW4gdHJ1ZSwgdXNlcnMgY2FuIHN3aXBlIG9uIHRoZSBpdGVtIHRvIHJldmVhbFxuICAgKiBhY3Rpb24gYnV0dG9ucyBmb3Igb3BlcmF0aW9ucyBsaWtlIGVkaXQgYW5kIGRlbGV0ZS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgc2hvd1NsaWRlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgd2luZG93IHdpZHRoIGluIHBpeGVscy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGJyb3dzZXIgd2luZG93IHdpZHRoIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lXG4gICAqIHJlc3BvbnNpdmUgYmVoYXZpb3IsIHN1Y2ggYXMgd2hlbiB0byBzaG93IG9yIGhpZGUgc2xpZGUgaXRlbXMgYmFzZWQgb25cbiAgICogc2NyZWVuIHNpemUuIFVwZGF0ZWQgYXV0b21hdGljYWxseSBvbiB3aW5kb3cgcmVzaXplIGV2ZW50cy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIExpc3RJdGVtQ29tcG9uZW50XG4gICAqL1xuICB3aW5kb3dXaWR0aCE6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhY3Rpb24gbWVudSBwb3BvdmVyIGlzIGN1cnJlbnRseSBvcGVuLlxuICAgKiBAc3VtbWFyeSBUcmFja3MgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpb24gbWVudSB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlc1xuICAgKiBmcm9tIGJlaW5nIG9wZW5lZCBzaW11bHRhbmVvdXNseSBhbmQgdG8gZW5zdXJlIHByb3BlciBjbGVhbnVwIHdoZW4gYWN0aW9uc1xuICAgKiBhcmUgcGVyZm9ybWVkLiBVc2VkIGZvciBtYW5hZ2luZyB0aGUgcG9wb3ZlciBsaWZlY3ljbGUuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIGFjdGlvbk1lbnVPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIE5hdkNvbnRyb2xsZXIgc2VydmljZSBmb3IgaGFuZGxpbmcgbmF2aWdhdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHByb2dyYW1tYXRpYyBuYXZpZ2F0aW9uXG4gICAqIHdpdGhpbiB0aGUgSW9uaWMgYXBwbGljYXRpb24uIFVzZWQgZm9yIG5hdmlnYXRpbmcgdG8gZGlmZmVyZW50IHJvdXRlcyB3aGVuXG4gICAqIGxpc3QgaXRlbSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQgb3Igd2hlbiB0aGUgaXRlbSBpdHNlbGYgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge05hdkNvbnRyb2xsZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyID0gaW5qZWN0KE5hdkNvbnRyb2xsZXIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMaXN0SXRlbUNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgTGlzdEl0ZW1Db21wb25lbnQgYnkgY2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGNvbnN0cnVjdG9yXG4gICAqIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGZvciBsb2dnaW5nIGFuZCBpZGVudGlmaWNhdGlvbiBwdXJwb3Nlcy4gQWxzbyByZWdpc3RlcnNcbiAgICogYWxsIGF2YWlsYWJsZSBJb25pYyBpY29ucyB0byBlbnN1cmUgdGhleSBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJMaXN0SXRlbUNvbXBvbmVudFwiKTtcbiAgICBhZGRJY29ucyhBbGxJY29ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhZnRlciBBbmd1bGFyIGZpcnN0IGRpc3BsYXlzIHRoZSBkYXRhLWJvdW5kIHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIGNvbXBvbmVudCBieSBkZXRlcm1pbmluZyBzbGlkZSBpdGVtIHZpc2liaWxpdHksIHByb2Nlc3NpbmcgYm9vbGVhbiBpbnB1dHMsXG4gICAqIGJ1aWxkaW5nIENTUyBjbGFzcyBuYW1lcyBiYXNlZCBvbiBwcm9wZXJ0aWVzLCBhbmQgY2FwdHVyaW5nIHRoZSBjdXJyZW50IHdpbmRvdyB3aWR0aC5cbiAgICogVGhpcyBtZXRob2QgcHJlcGFyZXMgdGhlIGNvbXBvbmVudCBmb3IgdXNlciBpbnRlcmFjdGlvbiBieSBlbnN1cmluZyBhbGwgcHJvcGVydGllcyBhcmVcbiAgICogcHJvcGVybHkgaW5pdGlhbGl6ZWQgYW5kIHJlc3BvbnNpdmUgYmVoYXZpb3IgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdEl0ZW1Db21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBXIGFzIFdpbmRvd1xuICAgKlxuICAgKiAgIEEtPj5MOiBuZ09uSW5pdCgpXG4gICAqICAgTC0+Pkw6IGVuYWJsZVNsaWRlSXRlbXMoKVxuICAgKiAgIEwtPj5MOiBQcm9jZXNzIGJ1dHRvbiBib29sZWFuXG4gICAqICAgTC0+Pkw6IEJ1aWxkIGNsYXNzTmFtZSB3aXRoIGZsZXggY2xhc3Nlc1xuICAgKiAgIGFsdCBvcGVyYXRpb25zIGV4aXN0XG4gICAqICAgICBMLT4+TDogQWRkICdhY3Rpb24nIGNsYXNzXG4gICAqICAgZW5kXG4gICAqICAgTC0+Plc6IGdldFdpbmRvd1dpZHRoKClcbiAgICogICBXLS0+Pkw6IFJldHVybiBjdXJyZW50IHdpZHRoXG4gICAqICAgTC0+Pkw6IFN0b3JlIHdpbmRvd1dpZHRoXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaG93U2xpZGVJdGVtcyA9IHRoaXMuZW5hYmxlU2xpZGVJdGVtcygpO1xuICAgIHRoaXMuYnV0dG9uID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuYnV0dG9uKTtcblxuICAgIHRoaXMuY2xhc3NOYW1lID0gYCR7dGhpcy5jbGFzc05hbWV9ICBkY2YtZmxleCBkY2YtZmxleC1taWRkbGUgZ3JpZC1pdGVtYDtcbiAgICBpZih0aGlzLm9wZXJhdGlvbnM/Lmxlbmd0aClcbiAgICAgIHRoaXMuY2xhc3NOYW1lICs9IGAgYWN0aW9uYDtcbiAgICB0aGlzLndpbmRvd1dpZHRoID0gZ2V0V2luZG93V2lkdGgoKSBhcyBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdXNlciBpbnRlcmFjdGlvbnMgYW5kIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGlzIHRoZSBjZW50cmFsIGFjdGlvbiBoYW5kbGVyIGZvciBsaXN0IGl0ZW0gaW50ZXJhY3Rpb25zLiBJdCBtYW5hZ2VzXG4gICAqIGV2ZW50IHByb3BhZ2F0aW9uLCBkaXNtaXNzZXMgb3BlbiBhY3Rpb24gbWVudXMsIHJlbW92ZXMgZm9jdXMgdHJhcHMsIGFuZCBlaXRoZXIgZW1pdHNcbiAgICogZXZlbnRzIGZvciBwYXJlbnQgY29tcG9uZW50cyB0byBoYW5kbGUgb3IgcGVyZm9ybXMgbmF2aWdhdGlvbiBiYXNlZCBvbiB0aGUgY29tcG9uZW50J3NcbiAgICogcm91dGUgY29uZmlndXJhdGlvbi4gVGhpcyBtZXRob2Qgc3VwcG9ydHMgYm90aCBldmVudC1kcml2ZW4gYW5kIG5hdmlnYXRpb24tZHJpdmVuIGFyY2hpdGVjdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3J1ZE9wZXJhdGlvbnN9IGFjdGlvbiAtIFRoZSB0eXBlIG9mIENSVUQgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBicm93c2VyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3RhcmdldF0gLSBPcHRpb25hbCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbnx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gbmF2aWdhdGlvbiBzdWNjZXNzIG9yIHZvaWQgZm9yIGV2ZW50c1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RJdGVtQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYXJlbnQgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgTiBhcyBOYXZDb250cm9sbGVyXG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFdmVudCBTeXN0ZW1cbiAgICpcbiAgICogICBVLT4+TDogUGVyZm9ybSBhY3Rpb24gKGNsaWNrL3N3aXBlKVxuICAgKiAgIEwtPj5MOiBzdG9wUHJvcGFnYXRpb24oKVxuICAgKiAgIGFsdCBhY3Rpb25NZW51T3BlblxuICAgKiAgICAgTC0+Pkw6IERpc21pc3MgYWN0aW9uIG1lbnVcbiAgICogICBlbmRcbiAgICogICBMLT4+TDogcmVtb3ZlRm9jdXNUcmFwKClcbiAgICogICBhbHQgTm8gcm91dGUgY29uZmlndXJlZFxuICAgKiAgICAgTC0+PkU6IHdpbmRvd0V2ZW50RW1pdHRlcigpXG4gICAqICAgICBMLT4+UDogY2xpY2tFdmVudC5lbWl0KClcbiAgICogICBlbHNlIFJvdXRlIGNvbmZpZ3VyZWRcbiAgICogICAgIEwtPj5OOiByZWRpcmVjdChhY3Rpb24sIHVpZClcbiAgICogICAgIE4tLT4+TDogUmV0dXJuIG5hdmlnYXRpb24gcmVzdWx0XG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQWN0aW9uKGFjdGlvbjogQ3J1ZE9wZXJhdGlvbnMsIGV2ZW50OiBFdmVudCwgdGFyZ2V0PzogSFRNTEVsZW1lbnQpOiBQcm9taXNlPGJvb2xlYW58dm9pZD4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmKHRoaXMuYWN0aW9uTWVudU9wZW4pXG4gICAgICBhd2FpdCB0aGlzLmFjdGlvbk1lbnVDb21wb25lbnQuZGlzbWlzcygpO1xuICAgIC8vIGZvcmNpbmcgdHJhcCBmb2N1c1xuICAgIHJlbW92ZUZvY3VzVHJhcCgpO1xuICAgIGlmKCF0aGlzLnJvdXRlKSB7XG4gICAgICBjb25zdCBldmVudCA9IHt0YXJnZXQ6IHRhcmdldCwgYWN0aW9uLCBwazogdGhpcy5waywgZGF0YTogdGhpcy51aWQsIG5hbWU6IEV2ZW50Q29uc3RhbnRzLkNMSUNLX0VWRU5ULCBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50TmFtZSB9IGFzIExpc3RJdGVtQ3VzdG9tRXZlbnQ7XG4gICAgICB3aW5kb3dFdmVudEVtaXR0ZXIoYExpc3RJdGVtJHtFdmVudENvbnN0YW50cy5DTElDS19FVkVOVH1gLCBldmVudCk7XG4gICAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWRpcmVjdChhY3Rpb24sICh0eXBlb2YgdGhpcy51aWQgPT09ICdudW1iZXInID8gYCR7dGhpcy51aWR9YDogdGhpcy51aWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzcG9uc2l2ZSBoYW5kbGVyIHRoYXQgZW5hYmxlcyBvciBkaXNhYmxlcyBzbGlkZSBpdGVtcyBiYXNlZCBvbiBzY3JlZW4gc2l6ZSBhbmQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgYW5kIGFsc28gZHVyaW5nIGNvbXBvbmVudFxuICAgKiBpbml0aWFsaXphdGlvbi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHNsaWRlIGFjdGlvbnMgc2hvdWxkIGJlIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgY3VycmVudFxuICAgKiB3aW5kb3cgd2lkdGggYW5kIHRoZSBwcmVzZW5jZSBvZiBVUERBVEUgb3IgREVMRVRFIG9wZXJhdGlvbnMuIFNsaWRlIGl0ZW1zIGFyZSB0eXBpY2FsbHkgaGlkZGVuXG4gICAqIG9uIGxhcmdlciBzY3JlZW5zIHdoZXJlIHRoZXJlJ3Mgc3BhY2UgZm9yIGRlZGljYXRlZCBhY3Rpb24gYnV0dG9ucy5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBzbGlkZSBpdGVtcyBzaG91bGQgYmUgc2hvd24sIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBXIGFzIFdpbmRvd1xuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdEl0ZW1Db21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVJXG4gICAqXG4gICAqICAgVy0+Pkw6IHJlc2l6ZSBldmVudFxuICAgKiAgIEwtPj5XOiBnZXRXaW5kb3dXaWR0aCgpXG4gICAqICAgVy0tPj5MOiBSZXR1cm4gY3VycmVudCB3aWR0aFxuICAgKiAgIEwtPj5MOiBTdG9yZSB3aW5kb3dXaWR0aFxuICAgKiAgIGFsdCBObyBvcGVyYXRpb25zIE9SIHdpZHRoID4gNzY4cHhcbiAgICogICAgIEwtPj5VOiBzaG93U2xpZGVJdGVtcyA9IGZhbHNlXG4gICAqICAgZWxzZSBPcGVyYXRpb25zIGluY2x1ZGUgVVBEQVRFL0RFTEVURVxuICAgKiAgICAgTC0+PlU6IHNob3dTbGlkZUl0ZW1zID0gdHJ1ZVxuICAgKiAgIGVuZFxuICAgKiAgIEwtLT4+VTogUmV0dXJuIHNob3dTbGlkZUl0ZW1zIHZhbHVlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIGVuYWJsZVNsaWRlSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgdGhpcy53aW5kb3dXaWR0aCA9IGdldFdpbmRvd1dpZHRoKCkgYXMgbnVtYmVyO1xuICAgIGlmKCF0aGlzLm9wZXJhdGlvbnM/Lmxlbmd0aCB8fCB0aGlzLndpbmRvd1dpZHRoID4gNzY4KVxuICAgICAgcmV0dXJuIHRoaXMuc2hvd1NsaWRlSXRlbXMgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dTbGlkZUl0ZW1zID0gdGhpcy5vcGVyYXRpb25zLmluY2x1ZGVzKE9wZXJhdGlvbktleXMuVVBEQVRFKSB8fCB0aGlzLm9wZXJhdGlvbnMuaW5jbHVkZXMoT3BlcmF0aW9uS2V5cy5ERUxFVEUpO1xuICAgIHJldHVybiB0aGlzLnNob3dTbGlkZUl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmltYXRlcyBhbmQgcmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgYXBwbGllcyBDU1MgYW5pbWF0aW9uIGNsYXNzZXMgdG8gY3JlYXRlIGEgc21vb3RoIGZhZGUtb3V0IGVmZmVjdFxuICAgKiBiZWZvcmUgcmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NLiBUaGUgYW5pbWF0aW9uIGVuaGFuY2VzIHVzZXIgZXhwZXJpZW5jZSBieVxuICAgKiBwcm92aWRpbmcgdmlzdWFsIGZlZWRiYWNrIHdoZW4gaXRlbXMgYXJlIGRlbGV0ZWQgb3IgcmVtb3ZlZCBmcm9tIGxpc3RzLiBUaGUgdGltaW5nXG4gICAqIGlzIGNvb3JkaW5hdGVkIHdpdGggdGhlIENTUyBhbmltYXRpb24gZHVyYXRpb24gdG8gZW5zdXJlIHRoZSBlbGVtZW50IGlzIHJlbW92ZWRcbiAgICogYWZ0ZXIgdGhlIGFuaW1hdGlvbiBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgRE9NIGVsZW1lbnQgdG8gYW5pbWF0ZSBhbmQgcmVtb3ZlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdEl0ZW1Db21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEhUTUxFbGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBET01cbiAgICpcbiAgICogICBMLT4+RTogQWRkIGFuaW1hdGlvbiBjbGFzc2VzXG4gICAqICAgTm90ZSBvdmVyIEU6IHVrLWFuaW1hdGlvbi1mYWRlLCB1ay1hbmltYXRpb24tbWVkaXVtLCB1ay1hbmltYXRpb24tcmV2ZXJzZVxuICAgKiAgIEUtPj5FOiBTdGFydCBmYWRlIGFuaW1hdGlvblxuICAgKiAgIEwtPj5MOiBzZXRUaW1lb3V0KDYwMG1zKVxuICAgKiAgIE5vdGUgb3ZlciBMOiBXYWl0IGZvciBhbmltYXRpb24gdG8gY29tcGxldGVcbiAgICogICBMLT4+RDogZWxlbWVudC5yZW1vdmUoKVxuICAgKiAgIEQtPj5EOiBSZW1vdmUgZWxlbWVudCBmcm9tIERPTVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VrLWFuaW1hdGlvbi1mYWRlJywgJ3VrLWFuaW1hdGlvbi1tZWRpdW0nLCAndWstYW5pbWF0aW9uLXJldmVyc2UnKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtlbGVtZW50LnJlbW92ZSgpfSwgNjAwKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOYXZpZ2F0ZXMgdG8gYSBuZXcgcm91dGUgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBhY3Rpb24gYW5kIGl0ZW0gSUQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGNvbnN0cnVjdHMgYSBuYXZpZ2F0aW9uIFVSTCB1c2luZyB0aGUgY29tcG9uZW50J3Mgcm91dGUgY29uZmlndXJhdGlvbixcbiAgICogdGhlIHNwZWNpZmllZCBhY3Rpb24sIGFuZCBhbiBpdGVtIGlkZW50aWZpZXIuIEl0IHVzZXMgSW9uaWMncyBOYXZDb250cm9sbGVyIHRvIHBlcmZvcm1cbiAgICogZm9yd2FyZCBuYXZpZ2F0aW9uIHdpdGggYXBwcm9wcmlhdGUgYW5pbWF0aW9ucy4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgZm9yXG4gICAqIENSVUQgb3BlcmF0aW9ucyB3aGVyZSBlYWNoIGFjdGlvbiAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSkgaGFzIGl0cyBvd24gcm91dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBUaGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCAoZS5nLiwgJ2VkaXQnLCAndmlldycsICdkZWxldGUnKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2lkXSAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSB0byBiZSBhY3RlZCB1cG9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgbmF2aWdhdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RJdGVtQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgTiBhcyBOYXZDb250cm9sbGVyXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSb3V0ZXJcbiAgICpcbiAgICogICBMLT4+TDogcmVkaXJlY3QoYWN0aW9uLCBpZClcbiAgICogICBMLT4+TDogQ29uc3RydWN0IFVSTDogL3tyb3V0ZX0ve2FjdGlvbn0ve2lkfVxuICAgKiAgIEwtPj5OOiBuYXZpZ2F0ZUZvcndhcmQodXJsKVxuICAgKiAgIE4tPj5SOiBOYXZpZ2F0ZSB0byBjb25zdHJ1Y3RlZCBVUkxcbiAgICogICBSLS0+Pk46IFJldHVybiBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgKiAgIE4tLT4+TDogUmV0dXJuIGJvb2xlYW4gc3VjY2Vzc1xuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdEl0ZW1Db21wb25lbnRcbiAgICovXG4gIGFzeW5jIHJlZGlyZWN0KGFjdGlvbjogc3RyaW5nLCBpZD86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVGb3J3YXJkKGAvJHt0aGlzLnJvdXRlfS8ke2FjdGlvbn0vJHtpZCB8fCB0aGlzLnVpZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlc2VudHMgdGhlIGFjdGlvbnMgbWVudSBwb3BvdmVyIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBkaXNwbGF5IG9mIGEgY29udGV4dHVhbCBhY3Rpb24gbWVudSB3aGVuIHRyaWdnZXJlZCBieSB1c2VyXG4gICAqIGludGVyYWN0aW9uICh0eXBpY2FsbHkgYSBsb25nIHByZXNzIG9yIHJpZ2h0LWNsaWNrKS4gSXQgc3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudFxuICAgKiB1bndhbnRlZCBzaWRlIGVmZmVjdHMsIHJlbW92ZXMgYW55IGV4aXN0aW5nIGZvY3VzIHRyYXBzIGZvciBhY2Nlc3NpYmlsaXR5LCBjb25maWd1cmVzIHRoZVxuICAgKiBwb3BvdmVyIHdpdGggdGhlIHRyaWdnZXJpbmcgZXZlbnQsIGFuZCBvcGVucyB0aGUgYWN0aW9uIG1lbnUuIFRoZSBtZW51IHR5cGljYWxseSBjb250YWluc1xuICAgKiBhdmFpbGFibGUgQ1JVRCBvcGVyYXRpb25zIGZvciB0aGUgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGFjdGlvbiBtZW51IHJlcXVlc3RcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0SXRlbUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUG9wb3ZlclxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQWNjZXNzaWJpbGl0eVxuICAgKlxuICAgKiAgIFUtPj5MOiBUcmlnZ2VyIGFjdGlvbiBtZW51IChsb25nIHByZXNzL3JpZ2h0LWNsaWNrKVxuICAgKiAgIEwtPj5MOiBzdG9wUHJvcGFnYXRpb24oKVxuICAgKiAgIEwtPj5BOiByZW1vdmVGb2N1c1RyYXAoKVxuICAgKiAgIEwtPj5QOiBTZXQgZXZlbnQgcmVmZXJlbmNlXG4gICAqICAgTC0+Pkw6IGFjdGlvbk1lbnVPcGVuID0gdHJ1ZVxuICAgKiAgIEwtPj5QOiBEaXNwbGF5IHBvcG92ZXIgd2l0aCBhY3Rpb25zXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0SXRlbUNvbXBvbmVudFxuICAgKi9cbiAgcHJlc2VudEFjdGlvbnNNZW51KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGZvcmNpbmcgdHJhcCBmb2N1c1xuICAgIHJlbW92ZUZvY3VzVHJhcCgpO1xuICAgIHRoaXMuYWN0aW9uTWVudUNvbXBvbmVudC5ldmVudCA9IGV2ZW50O1xuICAgIHRoaXMuYWN0aW9uTWVudU9wZW4gPSB0cnVlO1xuICB9XG59XG4iLCJcbkBpZih0aXRsZSB8fCBkZXNjcmlwdGlvbikge1xuICA8aW9uLWl0ZW0tc2xpZGluZyAjY29tcG9uZW50PlxuICAgIDxpb24taXRlbVxuICAgICAgW2xpbmVzXT1cImxpbmVzXCJcbiAgICAgIFtidXR0b25dPVwiYnV0dG9uXCJcbiAgICAgIFtjbGFzc109XCJjbGFzc05hbWVcIlxuICAgICAgKGNsaWNrKT1cIm9wZXJhdGlvbnM/LmluY2x1ZGVzKCdyZWFkJykgPyBoYW5kbGVBY3Rpb24oJ3JlYWQnLCAkZXZlbnQsIGNvbXBvbmVudCkgOiAnJ1xuICAgIFwiPlxuICAgICAgQGlmKGljb24gJiYgbGluZXMgIT09ICdpbnNldCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1pY29uXCIgW3Nsb3RdPVwiaWNvblNsb3RcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBzaGFwZT1cInJvdW5kXCIgZmlsbD1cImNsZWFyXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgbmFtZT1cInJlYWRlci1vdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2l6ZT1cImRlZmF1bHRcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWV4cGFuZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLWZsZXggZGNmLWZsZXgtbWlkZGxlIGRjZi1ncmlkLWNvbGxhcHNlXCIgZGNmLWdyaWQ+XG4gICAgICAgICAgQGlmKGljb24gJiYgbGluZXMgPT09ICdpbnNldCcpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2YtaWNvbiBkY2YtZ3JpZC1pY29uXCI+XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIHNoYXBlPVwicm91bmRcIiBmaWxsPVwiY2xlYXJcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgbmFtZT1cInJlYWRlci1vdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2l6ZT1cImRlZmF1bHRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRAcyBkY2Ytd2lkdGgtMS0xIGRjZi1sYWJlbFwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImRjZi1pdGVtLXRpdGxlXCIgW2lubmVySFRNTF09XCJ1aWQgKyAnIC0gJyArIHRpdGxlXCIgPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPGRpdiAqbmdJZiA9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZGNmLWRlc2NyaXB0aW9uXCIgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZihpbmZvIHx8IHN1YmluZm8pIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtYXV0b0BzIGRjZi13aWR0aC1leHBhbmQgZGNmLWluZm8gZGNmLWZsZXggZGNmLWZsZXgtcmlnaHRAc1wiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbmZvXCIgW2lubmVySFRNTF09XCJpbmZvXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YmluZm9cIiBjbGFzcz1cImRjZi1zdWJpbmZvIGRjZi10ZXh0LXRydW5jYXRlXCIgW2lubmVySFRNTF09XCJzdWJpbmZvXCIgPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtYXV0byBkY2YtZmxleCBkY2YtZmxleC1taWRkbGUgZGNmLWZsZXgtcmlnaHRcIj5cbiAgICAgICAgICAgIEBpZigob3BlcmF0aW9ucy5pbmNsdWRlcygnZGVsZXRlJykgfHwgb3BlcmF0aW9ucy5pbmNsdWRlcygndXBkYXRlJykpICYmIHVpZCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXZpc2libGVAbVwiIGlkPVwiZGNmLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBjbGFzcz1cImRjZi1oaWRkZW5AbVwiIHNoYXBlPVwicm91bmRcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwicHJlc2VudEFjdGlvbnNNZW51KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgbmFtZT1cImVsbGlwc2lzLXZlcnRpY2FsLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8aW9uLXBvcG92ZXJcbiAgICAgICAgICAgICAgICAgICNhY3Rpb25NZW51Q29tcG9uZW50XG4gICAgICAgICAgICAgICAgICBzaWRlPVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudD1cImxlZnRcIlxuXG4gICAgICAgICAgICAgICAgICBbaXNPcGVuXT1cImFjdGlvbk1lbnVPcGVuXCJcbiAgICAgICAgICAgICAgICAgIChkaWREaXNtaXNzKT1cImFjdGlvbk1lbnVPcGVuID0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxpc3QgbGluZXM9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJkY2YtdGV4dC1jYXBpdGFsaXplXCIgW2lubmVySFRNTF09XCInYWN0aW9ucycgfCB0cmFuc2xhdGVcIj48L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChvcGVyYXRpb24gb2YgWyd1cGRhdGUnLCAnZGVsZXRlJ107IHRyYWNrIG9wZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYob3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taXRlbSBbYnV0dG9uXT1cInRydWVcIiAoY2xpY2spPVwiaGFuZGxlQWN0aW9uKG9wZXJhdGlvbiwgJGV2ZW50LCBjb21wb25lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWF2YXRhciBjbGFzcz1cImRjZi1mbGV4IGRjZi1mbGV4LW1pZGRsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYob3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBjb2xvcj1cInByaW1hcnlcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBuYW1lPVwiY3JlYXRlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBuYW1lPVwidHJhc2hcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1hdmF0YXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiZGNmLXRleHQtY2FwaXRhbGl6ZVwiPnt7IG9wZXJhdGlvbiB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2lvbi1wb3BvdmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gQGlmKG9wZXJhdGlvbnM/Lmxlbmd0aCAmJiB1aWQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi12aXNpYmxlQG1cIiBpZD1cImRjZi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgQGlmKG9wZXJhdGlvbnM/LmluY2x1ZGVzKCd1cGRhdGUnKSkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImhhbmRsZUFjdGlvbigndXBkYXRlJywgIGNvbXBvbmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY3JlYXRlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYob3BlcmF0aW9ucz8uaW5jbHVkZXMoJ2RlbGV0ZScpKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiBjb2xvcj1cImRhbmdlclwiIChjbGljayk9XCJoYW5kbGVBY3Rpb24oJ2RlbGV0ZScsICBjb21wb25lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cInRyYXNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSAtLT5cbiAgICAgICAgICAgIEBpZih3aW5kb3dXaWR0aCA+IDc2OCkge1xuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZW5kXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3Nsb3Q9J2VuZCddXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2lvbi1pdGVtPlxuICAgIEBpZihzaG93U2xpZGVJdGVtcyAmJiB1aWQpIHtcbiAgICAgIDxpb24taXRlbS1vcHRpb25zIHNpZGU9XCJlbmRcIiAoaW9uU3dpcGUpPVwib3BlcmF0aW9ucy5sZW5ndGggPT09IDEgPyBoYW5kbGVBY3Rpb24ob3BlcmF0aW9uc1swXSwgICRldmVudCwgY29tcG9uZW50KSA6ICcnXCI+XG4gICAgICAgIEBpZihvcGVyYXRpb25zPy5pbmNsdWRlcygndXBkYXRlJykpIHtcbiAgICAgICAgICA8aW9uLWl0ZW0tb3B0aW9uIGNsYXNzPVwidXBkYXRlXCIgKGNsaWNrKT1cImhhbmRsZUFjdGlvbigndXBkYXRlJywgJGV2ZW50LCBjb21wb25lbnQpXCIgW2V4cGFuZGFibGVdPVwib3BlcmF0aW9ucy5sZW5ndGggPT09IDFcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNyZWF0ZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1pdGVtLW9wdGlvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYob3BlcmF0aW9ucz8uaW5jbHVkZXMoJ2RlbGV0ZScpKSB7XG4gICAgICAgICAgPGlvbi1pdGVtLW9wdGlvbiBjbGFzcz1cImRlbGV0ZVwiIChjbGljayk9XCJoYW5kbGVBY3Rpb24oJ2RlbGV0ZScsICAkZXZlbnQsIGNvbXBvbmVudClcIiBbZXhwYW5kYWJsZV09XCJvcGVyYXRpb25zLmxlbmd0aCA9PT0gMVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwidHJhc2hcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWl0ZW0tb3B0aW9uPlxuICAgICAgICB9XG4gICAgICA8L2lvbi1pdGVtLW9wdGlvbnM+XG4gICAgfVxuICA8L2lvbi1pdGVtLXNsaWRpbmc+XG59XG4iXX0=