@indice/ng-components 0.2.162 → 0.2.165

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 (183) hide show
  1. package/README.md +4 -4
  2. package/_styles.css +4270 -4270
  3. package/bundles/indice-ng-components.umd.js +5000 -0
  4. package/bundles/indice-ng-components.umd.js.map +1 -0
  5. package/{esm2020/indice-ng-components.mjs → esm2015/indice-ng-components.js} +0 -0
  6. package/esm2015/lib/controls/advanced-search/advanced-search.component.js +116 -0
  7. package/esm2015/lib/controls/advanced-search/models.js +91 -0
  8. package/{esm2020/lib/controls/avatar-initials/avatar-initials.component.mjs → esm2015/lib/controls/avatar-initials/avatar-initials.component.js} +8 -5
  9. package/esm2015/lib/controls/collapsible-panel/collapsible-panel.component.js +23 -0
  10. package/esm2015/lib/controls/combobox/combobox.component.js +100 -0
  11. package/esm2015/lib/controls/date-picker/date-picker.component.js +301 -0
  12. package/esm2015/lib/controls/drop-down-menu/drop-down-menu.component.js +72 -0
  13. package/esm2015/lib/controls/kpi-tile/kpi-tile.component.js +39 -0
  14. package/esm2015/lib/controls/language-selection/language-selection.component.js +35 -0
  15. package/{esm2020/lib/controls/list-view/list-column.component.mjs → esm2015/lib/controls/list-view/list-column.component.js} +4 -4
  16. package/{esm2020/lib/controls/list-view/list-details-section.component.mjs → esm2015/lib/controls/list-view/list-details-section.component.js} +4 -4
  17. package/{esm2020/lib/controls/list-view/list-tile.component.mjs → esm2015/lib/controls/list-view/list-tile.component.js} +4 -4
  18. package/esm2015/lib/controls/list-view/list-view-empty-state.component.js +32 -0
  19. package/esm2015/lib/controls/list-view/list-view.component.js +209 -0
  20. package/esm2015/lib/controls/nav-links-list/nav-links-list.component.js +51 -0
  21. package/esm2015/lib/controls/notifications-indicator/notifications-indicator.component.js +82 -0
  22. package/esm2015/lib/controls/pager/pager.component.js +133 -0
  23. package/esm2015/lib/controls/side-pane/side-pane.component.js +76 -0
  24. package/esm2015/lib/controls/skeleton-loader/skeleton-loader.component.js +29 -0
  25. package/{esm2020/lib/controls/stepper/lib-step-info.directive.mjs → esm2015/lib/controls/stepper/lib-step-info.directive.js} +4 -4
  26. package/{esm2020/lib/controls/stepper/lib-step-label.directive.mjs → esm2015/lib/controls/stepper/lib-step-label.directive.js} +4 -4
  27. package/esm2015/lib/controls/stepper/lib-step.component.js +82 -0
  28. package/esm2015/lib/controls/stepper/lib-stepper.component.js +115 -0
  29. package/esm2015/lib/controls/stepper/types/step-selected-event.js +4 -0
  30. package/{esm2020/lib/controls/stepper/types/stepper-type.mjs → esm2015/lib/controls/stepper/types/stepper-type.js} +1 -1
  31. package/esm2015/lib/controls/tabs/lib-tab-group.component.js +67 -0
  32. package/esm2015/lib/controls/tabs/lib-tab.component.js +58 -0
  33. package/esm2015/lib/controls/toaster/toaster-container.component.js +31 -0
  34. package/esm2015/lib/controls/toaster/toaster.component.js +34 -0
  35. package/esm2015/lib/controls/toggle/toggle.component.js +68 -0
  36. package/esm2015/lib/controls/user-profile-menu/user-profile-menu.component.js +75 -0
  37. package/{esm2020/lib/directives/click-outside.directive.mjs → esm2015/lib/directives/click-outside.directive.js} +4 -4
  38. package/{esm2020/lib/directives/dynamic-component-host.directive.mjs → esm2015/lib/directives/dynamic-component-host.directive.js} +4 -4
  39. package/esm2015/lib/helpers/base-list.component.js +227 -0
  40. package/{esm2020/lib/icons.mjs → esm2015/lib/icons.js} +1 -1
  41. package/esm2015/lib/layouts/shell/shell-footer/shell-footer.component.js +22 -0
  42. package/esm2015/lib/layouts/shell/shell-header/shell-header.component.js +135 -0
  43. package/esm2015/lib/layouts/shell/shell-layout/shell-layout.component.js +106 -0
  44. package/esm2015/lib/layouts/shell/shell-sidebar/shell-sidebar.component.js +50 -0
  45. package/esm2015/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.js +48 -0
  46. package/esm2015/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.js +28 -0
  47. package/esm2015/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.js +24 -0
  48. package/esm2015/lib/layouts/views/form-layout/form-layout.component.js +85 -0
  49. package/esm2015/lib/layouts/views/model-view-layout/model-view-layout.component.js +53 -0
  50. package/esm2015/lib/layouts/views/side-view-layout/side-view-layout.component.js +101 -0
  51. package/esm2015/lib/layouts/views/view-layout/view-layout.component.js +110 -0
  52. package/{esm2020/lib/ng-components.module.mjs → esm2015/lib/ng-components.module.js} +10 -8
  53. package/esm2015/lib/pages/auth/auth-callback/auth-callback.component.js +34 -0
  54. package/{esm2020/lib/pages/auth/auth-renew/auth-renew.component.mjs → esm2015/lib/pages/auth/auth-renew/auth-renew.component.js} +4 -4
  55. package/esm2015/lib/pages/auth/logged-out/logged-out.component.js +32 -0
  56. package/esm2015/lib/pages/http-status/error/error.component.js +20 -0
  57. package/esm2015/lib/pages/http-status/page-not-found/page-not-found.component.js +18 -0
  58. package/esm2015/lib/pages/http-status/unauthorized/unauthorized.component.js +17 -0
  59. package/{esm2020/lib/pipes/address.pipe.mjs → esm2015/lib/pipes/address.pipe.js} +4 -4
  60. package/{esm2020/lib/pipes/duration-format.pipe.mjs → esm2015/lib/pipes/duration-format.pipe.js} +4 -4
  61. package/esm2015/lib/services/component-loader/component-loader-options.class.js +8 -0
  62. package/esm2015/lib/services/component-loader/component-loader.class.js +192 -0
  63. package/{esm2020/lib/services/component-loader/component-loader.factory.mjs → esm2015/lib/services/component-loader/component-loader.factory.js} +4 -4
  64. package/{esm2020/lib/services/component-loader/content-ref.class.mjs → esm2015/lib/services/component-loader/content-ref.class.js} +1 -1
  65. package/esm2015/lib/services/modal-service/modal-backdrop-component.js +44 -0
  66. package/esm2015/lib/services/modal-service/modal-container-component.js +128 -0
  67. package/esm2015/lib/services/modal-service/modal-options.class.js +35 -0
  68. package/esm2015/lib/services/modal-service/modal-service.js +220 -0
  69. package/{esm2020/lib/services/modal-service/modal-styles.class.mjs → esm2015/lib/services/modal-service/modal-styles.class.js} +1 -1
  70. package/esm2015/lib/services/modal-service/modal.class.js +27 -0
  71. package/{esm2020/lib/services/toaster.service.mjs → esm2015/lib/services/toaster.service.js} +4 -4
  72. package/{esm2020/lib/tokens.mjs → esm2015/lib/tokens.js} +1 -1
  73. package/{esm2020/lib/types.mjs → esm2015/lib/types.js} +1 -1
  74. package/{esm2020/public-api.mjs → esm2015/public-api.js} +1 -1
  75. package/fesm2015/indice-ng-components.js +4352 -0
  76. package/fesm2015/indice-ng-components.js.map +1 -0
  77. package/{index.d.ts → indice-ng-components.d.ts} +0 -0
  78. package/lib/controls/advanced-search/advanced-search.component.d.ts +1 -1
  79. package/lib/controls/avatar-initials/avatar-initials.component.d.ts +1 -1
  80. package/lib/controls/collapsible-panel/collapsible-panel.component.d.ts +1 -1
  81. package/lib/controls/combobox/combobox.component.d.ts +1 -1
  82. package/lib/controls/date-picker/date-picker.component.d.ts +1 -1
  83. package/lib/controls/drop-down-menu/drop-down-menu.component.d.ts +1 -1
  84. package/lib/controls/kpi-tile/kpi-tile.component.d.ts +1 -1
  85. package/lib/controls/language-selection/language-selection.component.d.ts +1 -1
  86. package/lib/controls/list-view/list-column.component.d.ts +1 -1
  87. package/lib/controls/list-view/list-details-section.component.d.ts +1 -1
  88. package/lib/controls/list-view/list-tile.component.d.ts +1 -1
  89. package/lib/controls/list-view/list-view-empty-state.component.d.ts +1 -1
  90. package/lib/controls/list-view/list-view.component.d.ts +1 -1
  91. package/lib/controls/nav-links-list/nav-links-list.component.d.ts +1 -1
  92. package/lib/controls/notifications-indicator/notifications-indicator.component.d.ts +1 -1
  93. package/lib/controls/pager/pager.component.d.ts +1 -1
  94. package/lib/controls/side-pane/side-pane.component.d.ts +1 -1
  95. package/lib/controls/skeleton-loader/skeleton-loader.component.d.ts +1 -1
  96. package/lib/controls/stepper/lib-step-info.directive.d.ts +1 -1
  97. package/lib/controls/stepper/lib-step-label.directive.d.ts +1 -1
  98. package/lib/controls/stepper/lib-step.component.d.ts +1 -1
  99. package/lib/controls/stepper/lib-stepper.component.d.ts +1 -1
  100. package/lib/controls/tabs/lib-tab-group.component.d.ts +1 -1
  101. package/lib/controls/tabs/lib-tab.component.d.ts +1 -1
  102. package/lib/controls/toaster/toaster-container.component.d.ts +1 -1
  103. package/lib/controls/toaster/toaster.component.d.ts +1 -1
  104. package/lib/controls/toggle/toggle.component.d.ts +1 -1
  105. package/lib/controls/user-profile-menu/user-profile-menu.component.d.ts +1 -1
  106. package/lib/directives/click-outside.directive.d.ts +1 -1
  107. package/lib/directives/dynamic-component-host.directive.d.ts +1 -1
  108. package/lib/helpers/base-list.component.d.ts +1 -1
  109. package/lib/layouts/shell/shell-footer/shell-footer.component.d.ts +1 -1
  110. package/lib/layouts/shell/shell-header/shell-header.component.d.ts +1 -1
  111. package/lib/layouts/shell/shell-layout/shell-layout.component.d.ts +1 -1
  112. package/lib/layouts/shell/shell-sidebar/shell-sidebar.component.d.ts +1 -1
  113. package/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.d.ts +1 -1
  114. package/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.d.ts +1 -1
  115. package/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.d.ts +1 -1
  116. package/lib/layouts/views/form-layout/form-layout.component.d.ts +1 -1
  117. package/lib/layouts/views/model-view-layout/model-view-layout.component.d.ts +1 -1
  118. package/lib/layouts/views/side-view-layout/side-view-layout.component.d.ts +1 -1
  119. package/lib/layouts/views/view-layout/view-layout.component.d.ts +1 -1
  120. package/lib/pages/auth/auth-callback/auth-callback.component.d.ts +1 -1
  121. package/lib/pages/auth/auth-renew/auth-renew.component.d.ts +1 -1
  122. package/lib/pages/auth/logged-out/logged-out.component.d.ts +1 -1
  123. package/lib/pages/http-status/error/error.component.d.ts +1 -1
  124. package/lib/pages/http-status/page-not-found/page-not-found.component.d.ts +1 -1
  125. package/lib/pages/http-status/unauthorized/unauthorized.component.d.ts +1 -1
  126. package/lib/pipes/address.pipe.d.ts +1 -1
  127. package/lib/pipes/duration-format.pipe.d.ts +1 -1
  128. package/lib/services/modal-service/modal-backdrop-component.d.ts +1 -1
  129. package/lib/services/modal-service/modal-container-component.d.ts +1 -1
  130. package/modal.css +157 -157
  131. package/package.json +8 -21
  132. package/esm2020/lib/controls/advanced-search/advanced-search.component.mjs +0 -112
  133. package/esm2020/lib/controls/advanced-search/models.mjs +0 -90
  134. package/esm2020/lib/controls/collapsible-panel/collapsible-panel.component.mjs +0 -20
  135. package/esm2020/lib/controls/combobox/combobox.component.mjs +0 -97
  136. package/esm2020/lib/controls/date-picker/date-picker.component.mjs +0 -292
  137. package/esm2020/lib/controls/drop-down-menu/drop-down-menu.component.mjs +0 -68
  138. package/esm2020/lib/controls/kpi-tile/kpi-tile.component.mjs +0 -36
  139. package/esm2020/lib/controls/language-selection/language-selection.component.mjs +0 -31
  140. package/esm2020/lib/controls/list-view/list-view-empty-state.component.mjs +0 -29
  141. package/esm2020/lib/controls/list-view/list-view.component.mjs +0 -206
  142. package/esm2020/lib/controls/nav-links-list/nav-links-list.component.mjs +0 -46
  143. package/esm2020/lib/controls/notifications-indicator/notifications-indicator.component.mjs +0 -77
  144. package/esm2020/lib/controls/pager/pager.component.mjs +0 -130
  145. package/esm2020/lib/controls/side-pane/side-pane.component.mjs +0 -72
  146. package/esm2020/lib/controls/skeleton-loader/skeleton-loader.component.mjs +0 -25
  147. package/esm2020/lib/controls/stepper/lib-step.component.mjs +0 -81
  148. package/esm2020/lib/controls/stepper/lib-stepper.component.mjs +0 -108
  149. package/esm2020/lib/controls/stepper/types/step-selected-event.mjs +0 -4
  150. package/esm2020/lib/controls/tabs/lib-tab-group.component.mjs +0 -60
  151. package/esm2020/lib/controls/tabs/lib-tab.component.mjs +0 -57
  152. package/esm2020/lib/controls/toaster/toaster-container.component.mjs +0 -28
  153. package/esm2020/lib/controls/toaster/toaster.component.mjs +0 -31
  154. package/esm2020/lib/controls/toggle/toggle.component.mjs +0 -64
  155. package/esm2020/lib/controls/user-profile-menu/user-profile-menu.component.mjs +0 -71
  156. package/esm2020/lib/helpers/base-list.component.mjs +0 -226
  157. package/esm2020/lib/layouts/shell/shell-footer/shell-footer.component.mjs +0 -19
  158. package/esm2020/lib/layouts/shell/shell-header/shell-header.component.mjs +0 -130
  159. package/esm2020/lib/layouts/shell/shell-layout/shell-layout.component.mjs +0 -101
  160. package/esm2020/lib/layouts/shell/shell-sidebar/shell-sidebar.component.mjs +0 -47
  161. package/esm2020/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.mjs +0 -45
  162. package/esm2020/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.mjs +0 -25
  163. package/esm2020/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.mjs +0 -21
  164. package/esm2020/lib/layouts/views/form-layout/form-layout.component.mjs +0 -80
  165. package/esm2020/lib/layouts/views/model-view-layout/model-view-layout.component.mjs +0 -49
  166. package/esm2020/lib/layouts/views/side-view-layout/side-view-layout.component.mjs +0 -98
  167. package/esm2020/lib/layouts/views/view-layout/view-layout.component.mjs +0 -104
  168. package/esm2020/lib/pages/auth/auth-callback/auth-callback.component.mjs +0 -30
  169. package/esm2020/lib/pages/auth/logged-out/logged-out.component.mjs +0 -28
  170. package/esm2020/lib/pages/http-status/error/error.component.mjs +0 -17
  171. package/esm2020/lib/pages/http-status/page-not-found/page-not-found.component.mjs +0 -15
  172. package/esm2020/lib/pages/http-status/unauthorized/unauthorized.component.mjs +0 -14
  173. package/esm2020/lib/services/component-loader/component-loader-options.class.mjs +0 -8
  174. package/esm2020/lib/services/component-loader/component-loader.class.mjs +0 -188
  175. package/esm2020/lib/services/modal-service/modal-backdrop-component.mjs +0 -44
  176. package/esm2020/lib/services/modal-service/modal-container-component.mjs +0 -126
  177. package/esm2020/lib/services/modal-service/modal-options.class.mjs +0 -35
  178. package/esm2020/lib/services/modal-service/modal-service.mjs +0 -219
  179. package/esm2020/lib/services/modal-service/modal.class.mjs +0 -27
  180. package/fesm2015/indice-ng-components.mjs +0 -4264
  181. package/fesm2015/indice-ng-components.mjs.map +0 -1
  182. package/fesm2020/indice-ng-components.mjs +0 -4191
  183. package/fesm2020/indice-ng-components.mjs.map +0 -1
@@ -1,20 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- export class CollapsiblePanelComponent {
5
- constructor() {
6
- this.title = null;
7
- this.visible = false;
8
- }
9
- ngOnInit() {
10
- }
11
- }
12
- CollapsiblePanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: CollapsiblePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
- CollapsiblePanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: CollapsiblePanelComponent, selector: "lib-collapsible-panel", inputs: { title: "title" }, ngImport: i0, template: "<div class=\"collapsible-panel-container\">\n <div class=\"collapsible-panel-container-shadow\">\n <div class=\"collapsible-panel-container-inner\">\n <button type=\"button\" class=\"collapsible-panel-button\" (click)=\"visible = !visible\">\n <div class=\"collapsible-panel-button-content-container\">\n <span>{{ title }} </span>\n <span class=\"ico-plus\"></span>\n </div>\n </button>\n <div class=\"collapsible-panel-content-container\" *ngIf=\"visible\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: CollapsiblePanelComponent, decorators: [{
15
- type: Component,
16
- args: [{ selector: 'lib-collapsible-panel', template: "<div class=\"collapsible-panel-container\">\n <div class=\"collapsible-panel-container-shadow\">\n <div class=\"collapsible-panel-container-inner\">\n <button type=\"button\" class=\"collapsible-panel-button\" (click)=\"visible = !visible\">\n <div class=\"collapsible-panel-button-content-container\">\n <span>{{ title }} </span>\n <span class=\"ico-plus\"></span>\n </div>\n </button>\n <div class=\"collapsible-panel-content-container\" *ngIf=\"visible\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n" }]
17
- }], ctorParameters: function () { return []; }, propDecorators: { title: [{
18
- type: Input
19
- }] } });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2libGUtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbGxhcHNpYmxlLXBhbmVsL2NvbGxhcHNpYmxlLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb2xsYXBzaWJsZS1wYW5lbC9jb2xsYXBzaWJsZS1wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7O0FBTXpELE1BQU0sT0FBTyx5QkFBeUI7SUFJcEM7UUFIUyxVQUFLLEdBQWtCLElBQUksQ0FBQztRQUM5QixZQUFPLEdBQUcsS0FBSyxDQUFDO0lBRVAsQ0FBQztJQUVqQixRQUFRO0lBQ1IsQ0FBQzs7c0hBUFUseUJBQXlCOzBHQUF6Qix5QkFBeUIseUZDTnRDLGdsQkFlQTsyRkRUYSx5QkFBeUI7a0JBSnJDLFNBQVM7K0JBQ0UsdUJBQXVCOzBFQUl4QixLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNvbGxhcHNpYmxlLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbGxhcHNpYmxlLXBhbmVsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDb2xsYXBzaWJsZVBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgdmlzaWJsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImNvbGxhcHNpYmxlLXBhbmVsLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiY29sbGFwc2libGUtcGFuZWwtY29udGFpbmVyLXNoYWRvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzaWJsZS1wYW5lbC1jb250YWluZXItaW5uZXJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY29sbGFwc2libGUtcGFuZWwtYnV0dG9uXCIgKGNsaWNrKT1cInZpc2libGUgPSAhdmlzaWJsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2libGUtcGFuZWwtYnV0dG9uLWNvbnRlbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgPHNwYW4+e3sgdGl0bGUgfX0gPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvLXBsdXNcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2libGUtcGFuZWwtY29udGVudC1jb250YWluZXJcIiAqbmdJZj1cInZpc2libGVcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,97 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "../../directives/click-outside.directive";
8
- export class ComboboxComponent {
9
- constructor() {
10
- this._debouncer = new Subject();
11
- this._items = [];
12
- this._defaultItemsFilter = (item) => {
13
- const selectedItem = this.selectedItems.find(x => x == item);
14
- return selectedItem == null || selectedItem == undefined;
15
- };
16
- this.id = 'combobox';
17
- this.itemTemplate = null;
18
- this.selectedItemsFilter = () => true;
19
- this.selectedItemTemplate = null;
20
- this.busy = false;
21
- this.debounceMs = 1000;
22
- this.onSearch = new EventEmitter();
23
- this.onItemSelected = new EventEmitter();
24
- this.showOptions = false;
25
- this.selectedItems = [];
26
- }
27
- set items(items) {
28
- if (!this.itemTemplate) {
29
- this._items = items.filter(this._defaultItemsFilter);
30
- }
31
- else {
32
- this._items = items.filter(this.selectedItemsFilter);
33
- }
34
- }
35
- get items() {
36
- if (!this.itemTemplate) {
37
- return this._items.filter(this._defaultItemsFilter);
38
- }
39
- else {
40
- return this._items.filter(this.selectedItemsFilter);
41
- }
42
- }
43
- ngOnInit() {
44
- this.emitSearchEvent();
45
- this._debouncer
46
- .pipe(debounceTime(this.debounceMs), distinctUntilChanged())
47
- .subscribe((value) => this.emitSearchEvent(value));
48
- }
49
- onInputClick() {
50
- this.showOptions = true;
51
- }
52
- onInputClickOutside() {
53
- this.showOptions = false;
54
- }
55
- onInputKeyUp(event) {
56
- this._debouncer.next(event.currentTarget.value);
57
- }
58
- onListItemSelected(item) {
59
- this.onItemSelected.emit(item);
60
- this.selectedItems.push(item);
61
- }
62
- removeSelectedItem(item) {
63
- const index = this.selectedItems.indexOf(item);
64
- if (index > -1) {
65
- this.selectedItems.splice(index, 1);
66
- }
67
- }
68
- emitSearchEvent(searchTerm = undefined) {
69
- this.onSearch.emit(searchTerm);
70
- }
71
- }
72
- ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
73
- ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: ComboboxComponent, selector: "lib-combobox", inputs: { id: "id", items: "items", itemTemplate: "itemTemplate", selectedItemsFilter: "selectedItemsFilter", selectedItemTemplate: "selectedItemTemplate", busy: "busy", debounceMs: "debounceMs" }, outputs: { onSearch: "onSearch", onItemSelected: "onItemSelected" }, ngImport: i0, template: "<div class=\"relative mt-1\">\n <form autocomplete=\"off\" [id]=\"id + '-form'\">\n <input [id]=\"id + '-input'\" type=\"text\" (click)=\"onInputClick()\" (clickOutside)=\"onInputClickOutside()\" (keyup)=\"onInputKeyUp($event)\"\n class=\"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-12 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\" role=\"combobox\" aria-controls=\"options\"\n aria-expanded=\"false\" autocomplete=\"off\" list=\"autocomplete\">\n </form>\n <div class=\"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\">\n <svg *ngIf=\"!busy\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-6 w-6 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <svg *ngIf=\"busy\" class=\"animate-spin h-6 w-6 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n <ul [id]=\"id + '-options'\" *ngIf=\"showOptions\" class=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\" role=\"listbox\">\n <li *ngFor=\"let item of items; let i = index;\" [id]=\"'option-'+ i\" (click)=\"onListItemSelected(item)\" role=\"option\" tabindex=\"-1\">\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n </ul>\n</div>\n<ul *ngIf=\"selectedItems.length > 0\" role=\"list\" class=\"grid grid-cols-1\">\n <li *ngFor=\"let item of selectedItems; let i = index;\" class=\"mt-3\">\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n</ul>\n<ng-template #defaultItemTemplate let-item>\n <span class=\"hover:bg-gray-100 relative cursor-pointer select-none py-2 pl-3 pr-3 block truncate\">{{ item }}</span>\n</ng-template>\n<ng-template #defaultSelectedItemTemplate let-item>\n <div class=\"grid grid-cols-1\">\n <div class=\"relative rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm flex items-center space-x-3 hover:border-gray-400\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"focus:outline-none\">\n <span class=\"absolute\" aria-hidden=\"true\"></span>\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\n </div>\n </div>\n <div class=\"ml-4 flex-shrink-0 flex\">\n <button type=\"button\" (click)=\"removeSelectedItem(item)\" class=\"cursor-pointer bg-white rounded-md inline-flex text-gray-400 hover:text-gray-500\">\n <span class=\"sr-only\">Close</span>\n <svg class=\"h-5 w-5\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</ng-template>", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }] });
74
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: ComboboxComponent, decorators: [{
75
- type: Component,
76
- args: [{ selector: 'lib-combobox', template: "<div class=\"relative mt-1\">\n <form autocomplete=\"off\" [id]=\"id + '-form'\">\n <input [id]=\"id + '-input'\" type=\"text\" (click)=\"onInputClick()\" (clickOutside)=\"onInputClickOutside()\" (keyup)=\"onInputKeyUp($event)\"\n class=\"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-12 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\" role=\"combobox\" aria-controls=\"options\"\n aria-expanded=\"false\" autocomplete=\"off\" list=\"autocomplete\">\n </form>\n <div class=\"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\">\n <svg *ngIf=\"!busy\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-6 w-6 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <svg *ngIf=\"busy\" class=\"animate-spin h-6 w-6 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n <ul [id]=\"id + '-options'\" *ngIf=\"showOptions\" class=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\" role=\"listbox\">\n <li *ngFor=\"let item of items; let i = index;\" [id]=\"'option-'+ i\" (click)=\"onListItemSelected(item)\" role=\"option\" tabindex=\"-1\">\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n </ul>\n</div>\n<ul *ngIf=\"selectedItems.length > 0\" role=\"list\" class=\"grid grid-cols-1\">\n <li *ngFor=\"let item of selectedItems; let i = index;\" class=\"mt-3\">\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n</ul>\n<ng-template #defaultItemTemplate let-item>\n <span class=\"hover:bg-gray-100 relative cursor-pointer select-none py-2 pl-3 pr-3 block truncate\">{{ item }}</span>\n</ng-template>\n<ng-template #defaultSelectedItemTemplate let-item>\n <div class=\"grid grid-cols-1\">\n <div class=\"relative rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm flex items-center space-x-3 hover:border-gray-400\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"focus:outline-none\">\n <span class=\"absolute\" aria-hidden=\"true\"></span>\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\n </div>\n </div>\n <div class=\"ml-4 flex-shrink-0 flex\">\n <button type=\"button\" (click)=\"removeSelectedItem(item)\" class=\"cursor-pointer bg-white rounded-md inline-flex text-gray-400 hover:text-gray-500\">\n <span class=\"sr-only\">Close</span>\n <svg class=\"h-5 w-5\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</ng-template>" }]
77
- }], ctorParameters: function () { return []; }, propDecorators: { id: [{
78
- type: Input
79
- }], items: [{
80
- type: Input,
81
- args: ['items']
82
- }], itemTemplate: [{
83
- type: Input
84
- }], selectedItemsFilter: [{
85
- type: Input
86
- }], selectedItemTemplate: [{
87
- type: Input
88
- }], busy: [{
89
- type: Input
90
- }], debounceMs: [{
91
- type: Input
92
- }], onSearch: [{
93
- type: Output
94
- }], onItemSelected: [{
95
- type: Output
96
- }] } });
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRTVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQU9wRSxNQUFNLE9BQU8saUJBQWlCO0lBUzFCO1FBUlEsZUFBVSxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BELFdBQU0sR0FBVSxFQUFFLENBQUM7UUFFbkIsd0JBQW1CLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM3RCxPQUFPLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLFNBQVMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFJYyxPQUFFLEdBQVcsVUFBVSxDQUFDO1FBa0J4QixpQkFBWSxHQUFvQyxJQUFJLENBQUM7UUFDckQsd0JBQW1CLEdBQWtDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNoRSx5QkFBb0IsR0FBb0MsSUFBSSxDQUFDO1FBQzdELFNBQUksR0FBWSxLQUFLLENBQUM7UUFDdEIs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IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1jb21ib2JveCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbWJvYm94LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSBfZGVib3VuY2VyOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdID0gW107XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0SXRlbXNGaWx0ZXIgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5maW5kKHggPT4geCA9PSBpdGVtKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PSBudWxsIHx8IHNlbGVjdGVkSXRlbSA9PSB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ6IHN0cmluZyA9ICdjb21ib2JveCc7XG5cbiAgICBASW5wdXQoJ2l0ZW1zJykgcHVibGljIHNldCBpdGVtcyhpdGVtczogYW55W10pIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faXRlbXMgPSBpdGVtcy5maWx0ZXIodGhpcy5fZGVmYXVsdEl0ZW1zRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMuZmlsdGVyKHRoaXMuc2VsZWN0ZWRJdGVtc0ZpbHRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IGFueVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbHRlcih0aGlzLl9kZWZhdWx0SXRlbXNGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbHRlcih0aGlzLnNlbGVjdGVkSXRlbXNGaWx0ZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkSXRlbXNGaWx0ZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW4gfCBudWxsID0gKCkgPT4gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBidXN5OiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRlYm91bmNlTXM6IG51bWJlciA9IDEwMDA7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZyB8IHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkl0ZW1TZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHVibGljIHNob3dPcHRpb25zOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaEV2ZW50KCk7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VNcyksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4gdGhpcy5lbWl0U2VhcmNoRXZlbnQodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrT3V0c2lkZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0S2V5VXAoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZWJvdW5jZXIubmV4dChldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25MaXN0SXRlbVNlbGVjdGVkKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLmVtaXQoaXRlbSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdFNlYXJjaEV2ZW50KHNlYXJjaFRlcm06IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uU2VhcmNoLmVtaXQoc2VhcmNoVGVybSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJlbGF0aXZlIG10LTFcIj5cbiAgICA8Zm9ybSBhdXRvY29tcGxldGU9XCJvZmZcIiBbaWRdPVwiaWQgKyAnLWZvcm0nXCI+XG4gICAgICAgIDxpbnB1dCBbaWRdPVwiaWQgKyAnLWlucHV0J1wiIHR5cGU9XCJ0ZXh0XCIgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCIgKGNsaWNrT3V0c2lkZSk9XCJvbklucHV0Q2xpY2tPdXRzaWRlKClcIiAoa2V5dXApPVwib25JbnB1dEtleVVwKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWdyYXktMzAwIGJnLXdoaXRlIHB5LTIgcGwtMyBwci0xMiBzaGFkb3ctc20gZm9jdXM6Ym9yZGVyLWluZGlnby01MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWluZGlnby01MDAgc206dGV4dC1zbVwiIHJvbGU9XCJjb21ib2JveFwiIGFyaWEtY29udHJvbHM9XCJvcHRpb25zXCJcbiAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGxpc3Q9XCJhdXRvY29tcGxldGVcIj5cbiAgICA8L2Zvcm0+XG4gICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGluc2V0LXktMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtci1tZCBweC0yIGZvY3VzOm91dGxpbmUtbm9uZVwiPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiIWJ1c3lcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJoLTYgdy02IHRleHQtZ3JheS00MDBcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+XG4gICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBkPVwiTTIxIDIxbC02LTZtMi01YTcgNyAwIDExLTE0IDAgNyA3IDAgMDExNCAwelwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiYnVzeVwiIGNsYXNzPVwiYW5pbWF0ZS1zcGluIGgtNiB3LTYgdGV4dC1ncmF5LTQwMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJvcGFjaXR5LTI1XCIgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8cGF0aCBjbGFzcz1cIm9wYWNpdHktNzVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiPjwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPHVsIFtpZF09XCJpZCArICctb3B0aW9ucydcIiAqbmdJZj1cInNob3dPcHRpb25zXCIgY2xhc3M9XCJhYnNvbHV0ZSB6LTEwIG10LTEgbWF4LWgtNjAgdy1mdWxsIG92ZXJmbG93LWF1dG8gcm91bmRlZC1tZCBiZy13aGl0ZSBweS0xIHRleHQtYmFzZSBzaGFkb3ctbGcgcmluZy0xIHJpbmctYmxhY2sgcmluZy1vcGFjaXR5LTUgZm9jdXM6b3V0bGluZS1ub25lIHNtOnRleHQtc21cIiByb2xlPVwibGlzdGJveFwiPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBpID0gaW5kZXg7XCIgW2lkXT1cIidvcHRpb24tJysgaVwiIChjbGljayk9XCJvbkxpc3RJdGVtU2VsZWN0ZWQoaXRlbSlcIiByb2xlPVwib3B0aW9uXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGUgfHwgZGVmYXVsdEl0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbGk+XG4gICAgPC91bD5cbjwvZGl2PlxuPHVsICpuZ0lmPVwic2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwXCIgcm9sZT1cImxpc3RcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTFcIj5cbiAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtczsgbGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RlZEl0ZW1UZW1wbGF0ZSB8fCBkZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbGk+XG48L3VsPlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0SXRlbVRlbXBsYXRlIGxldC1pdGVtPlxuICAgIDxzcGFuIGNsYXNzPVwiaG92ZXI6YmctZ3JheS0xMDAgcmVsYXRpdmUgY3Vyc29yLXBvaW50ZXIgc2VsZWN0LW5vbmUgcHktMiBwbC0zIHByLTMgYmxvY2sgdHJ1bmNhdGVcIj57eyBpdGVtIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlIGxldC1pdGVtPlxuICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZ3JheS0zMDAgYmctd2hpdGUgcHgtNiBweS01IHNoYWRvdy1zbSBmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgaG92ZXI6Ym9yZGVyLWdyYXktNDAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9jdXM6b3V0bGluZS1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWJzb2x1dGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+e3sgaXRlbSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTQgZmxleC1zaHJpbmstMCBmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgYmctd2hpdGUgcm91bmRlZC1tZCBpbmxpbmUtZmxleCB0ZXh0LWdyYXktNDAwIGhvdmVyOnRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTUgdy01XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuMjkzIDQuMjkzYTEgMSAwIDAxMS40MTQgMEwxMCA4LjU4Nmw0LjI5My00LjI5M2ExIDEgMCAxMTEuNDE0IDEuNDE0TDExLjQxNCAxMGw0LjI5MyA0LjI5M2ExIDEgMCAwMS0xLjQxNCAxLjQxNEwxMCAxMS40MTRsLTQuMjkzIDQuMjkzYTEgMSAwIDAxLTEuNDE0LTEuNDE0TDguNTg2IDEwIDQuMjkzIDUuNzA3YTEgMSAwIDAxMC0xLjQxNHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
@@ -1,292 +0,0 @@
1
- import { getLocaleMonthNames, FormStyle, TranslationWidth, getLocaleDayNames } from '@angular/common';
2
- import { Component, EventEmitter, forwardRef, Inject, Input, LOCALE_ID, Output, ViewChild } from '@angular/core';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "../../directives/click-outside.directive";
7
- // freaksly simple date picker : https://tailwind-elements.com/docs/standard/forms/datepicker/
8
- export class DatepickerComponent {
9
- constructor(locale) {
10
- this.locale = locale;
11
- this.readonly = false;
12
- this.disabled = false;
13
- this.inline = false;
14
- this.displayFormat = 'dd/MM/yyyy';
15
- this.placeholder = '';
16
- this.value = null;
17
- this.valueChange = new EventEmitter();
18
- this.minDate = undefined;
19
- this.maxDate = undefined;
20
- this.showCalendar = false;
21
- this.showYears = false;
22
- this.monthNames = getLocaleMonthNames(this.locale, FormStyle.Standalone, TranslationWidth.Wide);
23
- this.dayNames = getLocaleDayNames(this.locale, FormStyle.Standalone, TranslationWidth.Abbreviated);
24
- this.month = -1;
25
- this.year = -1;
26
- this.calendarDates = [];
27
- this.calendarYears = [];
28
- this.showCalendarYears = [];
29
- this.blankDays = [];
30
- this.calendarYearPage = 1;
31
- this.yearsPerPage = 30;
32
- this.onChange$ = undefined;
33
- this.onTouched$ = undefined;
34
- }
35
- ngOnInit() {
36
- let today = new Date();
37
- this.month = today.getMonth();
38
- this.year = today.getFullYear();
39
- this.calendarDates = [{ day: this.value, today: this.value, selected: this.value }];
40
- this.calendarYears = [{ year: this.value?.getFullYear(), today: this.value, selected: this.value }];
41
- const yearsArray = [];
42
- for (let i = 1950; i <= today.getFullYear() + 2; i++) {
43
- yearsArray.push({ year: i, today: this.compareDates(today, null, i), selected: i == this.value?.getFullYear() });
44
- }
45
- this.calendarYears = yearsArray;
46
- this.showCalendarYears = this.paginate(this.calendarYears, 1);
47
- this.calcDays();
48
- }
49
- writeValue(obj) {
50
- if (obj) {
51
- this.value = new Date(obj);
52
- this.month = this.value.getMonth();
53
- this.year = this.value.getFullYear();
54
- }
55
- }
56
- registerOnChange(fn) {
57
- this.onChange$ = fn;
58
- }
59
- registerOnTouched(fn) {
60
- this.onTouched$ = fn;
61
- }
62
- onBlur(event) {
63
- if (this.onTouched$) {
64
- this.onTouched$();
65
- }
66
- this.getDateFromInput();
67
- }
68
- selectDateValue(date) {
69
- // This should be in UTC
70
- if (!this.outOfRangeDate(date.day)) {
71
- let selectedDate = new Date(this.year, this.month, date.day, 3, 0, 0, 0);
72
- this.value = selectedDate;
73
- this.valueChange.emit(this.value);
74
- if (this.onChange$) {
75
- this.onChange$(this.value);
76
- }
77
- this.updateDays();
78
- if (this.onTouched$) {
79
- this.onTouched$();
80
- }
81
- this.calcDays();
82
- this.showCalendar = false;
83
- }
84
- }
85
- selectYearValue(year) {
86
- // This should be in UTC
87
- const tempYear = this.year;
88
- this.year = year.year;
89
- if (!this.outOfRangeDate(this.calendarDates?.find(x => x.selected == true) ?? { day: 1 })) {
90
- let selectedDate = new Date(year.year, this.month ?? 1, this.calendarDates?.find(x => x.selected == true).day ?? 1, 3, 0, 0, 0);
91
- this.value = selectedDate;
92
- this.valueChange.emit(this.value);
93
- if (this.onChange$) {
94
- this.onChange$(this.value);
95
- }
96
- this.updateDays();
97
- if (this.onTouched$) {
98
- this.onTouched$();
99
- }
100
- this.showYears = false;
101
- this.showCalendar = true;
102
- this.calcDays();
103
- }
104
- else {
105
- this.year = tempYear;
106
- this.showYears = false;
107
- this.showCalendar = true;
108
- }
109
- }
110
- previousMonth() {
111
- if (this.month !== 0) {
112
- this.month = this.month - 1;
113
- this.calcDays();
114
- }
115
- else {
116
- this.month = 11;
117
- this.year = this.year - 1;
118
- this.calcDays();
119
- }
120
- if (this.onTouched$) {
121
- this.onTouched$();
122
- }
123
- }
124
- nextMonth() {
125
- if (this.month !== 11) {
126
- this.month = this.month + 1;
127
- this.calcDays();
128
- }
129
- else {
130
- this.month = 0;
131
- this.year = this.year + 1;
132
- this.calcDays();
133
- }
134
- if (this.onTouched$) {
135
- this.onTouched$();
136
- }
137
- }
138
- previousYear() {
139
- this.showCalendarYears = this.paginate(this.calendarYears, this.calendarYearPage > 1 ? --this.calendarYearPage : 1);
140
- this.calcDays();
141
- if (this.onTouched$) {
142
- this.onTouched$();
143
- }
144
- }
145
- nextYear() {
146
- this.showCalendarYears = this.paginate(this.calendarYears, this.calendarYearPage <= this.calendarYears.length / this.yearsPerPage
147
- ? ++this.calendarYearPage
148
- : this.calendarYearPage);
149
- this.calcDays();
150
- if (this.onTouched$) {
151
- this.onTouched$();
152
- }
153
- }
154
- compareDates(date1, day, year) {
155
- if (!date1) {
156
- return false;
157
- }
158
- const d = new Date(year ?? this.year, this.month, day ?? this.value?.getDay());
159
- return date1.toDateString() === d.toDateString();
160
- }
161
- ;
162
- calcDays() {
163
- const daysInMonth = new Date(this.year, this.month + 1, 0).getDate();
164
- // find where to start calendar day of week
165
- const dayOfWeek = new Date(this.year, this.month).getDay();
166
- const blankdaysArray = new Array();
167
- for (var i = 1; i <= dayOfWeek; i++) {
168
- // check if month is February
169
- blankdaysArray.push(this.month != 2 ? (32 - i) : (29 - i));
170
- blankdaysArray.reverse().sort();
171
- }
172
- const daysArray = [];
173
- const today = new Date();
174
- for (var i = 1; i <= daysInMonth; i++) {
175
- daysArray.push({ day: i, today: this.compareDates(today, i, null), selected: this.compareDates(this.value ?? today, i, null) });
176
- }
177
- const yearsArray = [];
178
- for (let i = 1950; i <= today.getFullYear() + 2; i++) {
179
- yearsArray.push({ year: i, today: this.compareDates(today, null, i), selected: i == this.year });
180
- }
181
- this.calendarYears = yearsArray;
182
- this.blankDays = blankdaysArray;
183
- this.calendarDates = daysArray;
184
- }
185
- updateDays() {
186
- const today = new Date();
187
- this.calendarDates.forEach(d => {
188
- d.today = this.compareDates(today, d, this.year);
189
- d.selected = this.compareDates(this.value, d, this.year);
190
- });
191
- }
192
- paginate(array, page_number) {
193
- return array.slice((page_number - 1) * this.yearsPerPage, page_number * this.yearsPerPage);
194
- }
195
- getDateFromInput() {
196
- if (this.dateInput?.nativeElement.value !== '' && !this.inline) {
197
- var dateParts = this.dateInput?.nativeElement.value.split("/");
198
- let dateInGrFormat = new Date(+dateParts[2], dateParts[1] - 1, +dateParts[0], 3, 0, 0);
199
- if (dateInGrFormat.toString() !== 'Invalid Date') {
200
- this.writeValue(dateInGrFormat);
201
- this.calcDays();
202
- this.valueChange.emit(dateInGrFormat);
203
- }
204
- if (this.onChange$) {
205
- this.onChange$(this.value);
206
- }
207
- this.updateDays();
208
- if (this.onTouched$) {
209
- this.onTouched$();
210
- }
211
- }
212
- this.showCalendar = false;
213
- }
214
- openYears() {
215
- this.showYears = !this.showYears;
216
- this.calendarYearPage = Math.ceil(this.calendarYears.map(x => x.year).indexOf(this.year) / this.yearsPerPage);
217
- this.showCalendarYears = this.paginate(this.calendarYears, this.calendarYearPage !== 0 ? this.calendarYearPage : 1);
218
- this.calcDays();
219
- }
220
- openCalendar() {
221
- this.showCalendar = !this.showCalendar;
222
- this.calcDays();
223
- }
224
- closeCalendar() {
225
- this.showCalendar = false;
226
- this.getDateFromInput();
227
- }
228
- outOfRangeDate(date) {
229
- let outOfRange = false;
230
- if (this.minDate || this.maxDate) {
231
- const d = new Date(this.year, this.month, date.day);
232
- const dateInMillis = d.getTime();
233
- if (this.minDate) {
234
- let minDate = this.minDate.getTime();
235
- if (dateInMillis < minDate && this.minDate.toDateString() !== d.toDateString()) {
236
- outOfRange = true;
237
- }
238
- }
239
- if (this.maxDate) {
240
- let maxDate = this.maxDate.getTime();
241
- if (dateInMillis > maxDate && this.maxDate.toDateString() !== d.toDateString()) {
242
- outOfRange = true;
243
- }
244
- }
245
- }
246
- return outOfRange;
247
- }
248
- }
249
- DatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: DatepickerComponent, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component });
250
- DatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: DatepickerComponent, selector: "lib-date-picker", inputs: { readonly: "readonly", disabled: "disabled", inline: "inline", displayFormat: ["display-format", "displayFormat"], placeholder: "placeholder", value: "value", minDate: "minDate", maxDate: "maxDate" }, outputs: { valueChange: "valueChange" }, providers: [
251
- {
252
- provide: NG_VALUE_ACCESSOR,
253
- useExisting: forwardRef(() => DatepickerComponent),
254
- multi: true
255
- }
256
- ], viewQueries: [{ propertyName: "dateInput", first: true, predicate: ["dateInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex\"\n [ngClass]=\"{'relative': !inline}\"\n (clickOutside)=\"closeCalendar()\">\n\n <input type=\"text\"\n *ngIf=\"!inline\"\n #dateInput\n [readonly]=\"readonly\"\n name=\"dateInput\"\n (blur)=\"onBlur($event)\"\n id=\"dateInput\"\n (focus)=\"showCalendar = false\"\n [value]=\"value | date: displayFormat\"\n class=\"detapicker-input\"\n [ngClass]=\"{'cursor-not-allowed': disabled}\"\n [placeholder]=\"disabled ? '' : placeholder\">\n\n <button type=\"button\"\n *ngIf=\"!inline\"\n class=\"datepicker-button\"\n [disabled]=\"disabled\"\n (click)=\"openCalendar()\"\n [ngClass]=\"{'cursor-not-allowed': disabled}\">\n <i class=\"ms-Icon ms-Icon--DateTime2\"></i>\n </button>\n\n <div *ngIf=\"showCalendar || inline\"\n [ngClass]=\"{'absolute': !inline}\"\n class=\"datepicker-background\"\n style=\"height:18rem;min-width:16rem;\"\n name=\"calendar\">\n <div class=\"datepicker-btn-wrapper\">\n <div>\n <button type=\"button\"\n (click)=\"openYears()\">\n <span class=\"datepicker-selected-month\">\n {{monthNames[month]}}\n </span>\n <span class=\"datepicker-selected-year\">\n {{year}}</span>\n </button>\n </div>\n <div *ngIf=\"!showYears; else showYearsPickerTmpl\">\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"previousMonth();\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"nextMonth()\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n <ng-template #showYearsPickerTmpl>\n <div>\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"previousYear();\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"nextYear()\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </ng-template>\n </div>\n\n <div class=\"datepicker-wrapper\"\n *ngIf=\"!showYears; else showCalYearsTmpl\">\n <div *ngFor=\"let day of dayNames\"\n class=\"datepicker-day-name\"\n style=\"width: 14.28%\">{{day}}</div>\n </div>\n\n <ng-template #showCalYearsTmpl>\n <div class=\"datepicker-content-wrapper\">\n <div *ngFor=\"let year of showCalendarYears\"\n style=\"width: 18.28%\"\n class=\"px-1 mb-1\">\n <div (click)=\"selectYearValue(year)\"\n class=\"datepicker-year\"\n [class]=\"year.selected ? 'selected' : 'not-selected'\">\n {{year.year}}</div>\n </div>\n </div>\n </ng-template>\n\n <div class=\"datepicker-content-wrapper\"\n *ngIf=\"!showYears\">\n <div *ngFor=\"let blankday of blankDays\"\n style=\"width: 14.28%\"\n class=\"datepicker-blank-days\">{{blankday}}</div>\n <div *ngFor=\"let date of calendarDates;\"\n style=\"width: 14.28%\"\n class=\"px-1 mb-1\">\n <div (click)=\"selectDateValue(date)\"\n class=\"datepicker-days\"\n [ngClass]=\"{'out-of-range': outOfRangeDate(date),'selected': date.selected, 'not-selected':!date.selected }\">\n {{date.day}}</div>\n </div>\n </div>\n </div>\n\n</div>", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: DatepickerComponent, decorators: [{
258
- type: Component,
259
- args: [{ selector: 'lib-date-picker', providers: [
260
- {
261
- provide: NG_VALUE_ACCESSOR,
262
- useExisting: forwardRef(() => DatepickerComponent),
263
- multi: true
264
- }
265
- ], template: "<div class=\"flex\"\n [ngClass]=\"{'relative': !inline}\"\n (clickOutside)=\"closeCalendar()\">\n\n <input type=\"text\"\n *ngIf=\"!inline\"\n #dateInput\n [readonly]=\"readonly\"\n name=\"dateInput\"\n (blur)=\"onBlur($event)\"\n id=\"dateInput\"\n (focus)=\"showCalendar = false\"\n [value]=\"value | date: displayFormat\"\n class=\"detapicker-input\"\n [ngClass]=\"{'cursor-not-allowed': disabled}\"\n [placeholder]=\"disabled ? '' : placeholder\">\n\n <button type=\"button\"\n *ngIf=\"!inline\"\n class=\"datepicker-button\"\n [disabled]=\"disabled\"\n (click)=\"openCalendar()\"\n [ngClass]=\"{'cursor-not-allowed': disabled}\">\n <i class=\"ms-Icon ms-Icon--DateTime2\"></i>\n </button>\n\n <div *ngIf=\"showCalendar || inline\"\n [ngClass]=\"{'absolute': !inline}\"\n class=\"datepicker-background\"\n style=\"height:18rem;min-width:16rem;\"\n name=\"calendar\">\n <div class=\"datepicker-btn-wrapper\">\n <div>\n <button type=\"button\"\n (click)=\"openYears()\">\n <span class=\"datepicker-selected-month\">\n {{monthNames[month]}}\n </span>\n <span class=\"datepicker-selected-year\">\n {{year}}</span>\n </button>\n </div>\n <div *ngIf=\"!showYears; else showYearsPickerTmpl\">\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"previousMonth();\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"nextMonth()\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n <ng-template #showYearsPickerTmpl>\n <div>\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"previousYear();\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button type=\"button\"\n class=\"datepicker-nav-btn\"\n (click)=\"nextYear()\">\n <svg fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </ng-template>\n </div>\n\n <div class=\"datepicker-wrapper\"\n *ngIf=\"!showYears; else showCalYearsTmpl\">\n <div *ngFor=\"let day of dayNames\"\n class=\"datepicker-day-name\"\n style=\"width: 14.28%\">{{day}}</div>\n </div>\n\n <ng-template #showCalYearsTmpl>\n <div class=\"datepicker-content-wrapper\">\n <div *ngFor=\"let year of showCalendarYears\"\n style=\"width: 18.28%\"\n class=\"px-1 mb-1\">\n <div (click)=\"selectYearValue(year)\"\n class=\"datepicker-year\"\n [class]=\"year.selected ? 'selected' : 'not-selected'\">\n {{year.year}}</div>\n </div>\n </div>\n </ng-template>\n\n <div class=\"datepicker-content-wrapper\"\n *ngIf=\"!showYears\">\n <div *ngFor=\"let blankday of blankDays\"\n style=\"width: 14.28%\"\n class=\"datepicker-blank-days\">{{blankday}}</div>\n <div *ngFor=\"let date of calendarDates;\"\n style=\"width: 14.28%\"\n class=\"px-1 mb-1\">\n <div (click)=\"selectDateValue(date)\"\n class=\"datepicker-days\"\n [ngClass]=\"{'out-of-range': outOfRangeDate(date),'selected': date.selected, 'not-selected':!date.selected }\">\n {{date.day}}</div>\n </div>\n </div>\n </div>\n\n</div>" }]
266
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
267
- type: Inject,
268
- args: [LOCALE_ID]
269
- }] }]; }, propDecorators: { readonly: [{
270
- type: Input
271
- }], disabled: [{
272
- type: Input
273
- }], inline: [{
274
- type: Input
275
- }], displayFormat: [{
276
- type: Input,
277
- args: ['display-format']
278
- }], placeholder: [{
279
- type: Input
280
- }], value: [{
281
- type: Input
282
- }], valueChange: [{
283
- type: Output
284
- }], dateInput: [{
285
- type: ViewChild,
286
- args: ['dateInput']
287
- }], minDate: [{
288
- type: Input
289
- }], maxDate: [{
290
- type: Input
291
- }] } });
292
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckksT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRXpFLDhGQUE4RjtBQVk5RixNQUFNLE9BQU8sbUJBQW1CO0lBMkM5QixZQUFzQyxNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTFDM0MsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDUixrQkFBYSxHQUF1QixZQUFZLENBQUM7UUFDakUsZ0JBQVcsR0FBdUIsRUFBRSxDQUFDO1FBQ3JDLFVBQUssR0FBNEIsSUFBSSxDQUFDO1FBQ3JDLGdCQUFXLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFFNUQsWUFBTyxHQUFxQixTQUFTLENBQUM7UUFDdEMsWUFBTyxHQUFxQixTQUFTLENBQUM7UUFDeEMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixlQUFVLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNGLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFOUYsVUFBSyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ25CLFNBQUksR0FBVyxDQUFDLENBQUMsQ0FBQztRQUNsQixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQixzQkFBaUIsR0FBVSxFQUFFLENBQUM7UUFDOUIsY0FBUyxHQUFVLEVBQUUsQ0FBQztRQUN0QixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDcEIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFFbEIsY0FBUyxHQUFvQixTQUFTLENBQUM7UUFDdkMsZUFBVSxHQUFvQixTQUFTLENBQUM7SUFpQlEsQ0FBQztJQWZ6RCxRQUFRO1FBQ04sSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbEg7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBSUQsVUFBVSxDQUFDLEdBQVE7UUFDakIsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBb0I7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFVO1FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sZUFBZSxDQUFDLElBQVM7UUFDOUIsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQyxJQUFJLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNuQjtZQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsSUFBUztRQUM5Qix3QkFBd0I7UUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDekYsSUFBSSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoSSxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNuQjtZQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQ3BDLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQ3BDLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNwRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBOEIsRUFBRSxHQUE4QixFQUFFLElBQStCO1FBQ2xILElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBQUEsQ0FBQztJQUVNLFFBQVE7UUFDZCxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JFLDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsNkJBQTZCO1lBQzdCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNqQztRQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pJO1FBQ0QsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BELFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNsRztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQVksRUFBRSxXQUFtQjtRQUNoRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELElBQUksY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxjQUFjLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUE7Z0JBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDdkM7WUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ25CO1NBQ0Y7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUztRQUN0QixJQUFJLFVBQVUsR0FBWSxLQUFLLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNoQixJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QyxJQUFJLFlBQVksR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7b0JBQzlFLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ25CO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdDLElBQUksWUFBWSxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQkFDOUUsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDbkI7YUFDRjtTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQzs7Z0hBclFVLG1CQUFtQixrQkEyQ1YsU0FBUztvR0EzQ2xCLG1CQUFtQixxU0FSbkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0Ysa0lDZEgseW5KQXNJTTsyRkR0SE8sbUJBQW1CO2tCQVgvQixTQUFTOytCQUNFLGlCQUFpQixhQUVoQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7OzBCQTZDWSxNQUFNOzJCQUFDLFNBQVM7NENBMUNwQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNtQixhQUFhO3NCQUFyQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDZCxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNpQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ2IsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvY2FsZU1vbnRoTmFtZXMsIEZvcm1TdHlsZSwgVHJhbnNsYXRpb25XaWR0aCwgZ2V0TG9jYWxlRGF5TmFtZXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEluamVjdCwgSW5wdXQsIExPQ0FMRV9JRCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vLyBmcmVha3NseSBzaW1wbGUgZGF0ZSBwaWNrZXIgOiBodHRwczovL3RhaWx3aW5kLWVsZW1lbnRzLmNvbS9kb2NzL3N0YW5kYXJkL2Zvcm1zL2RhdGVwaWNrZXIvXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0ZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVwaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCdkaXNwbGF5LWZvcm1hdCcpIGRpc3BsYXlGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9ICdkZC9NTS95eXl5JztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9ICcnO1xuICBASW5wdXQoKSB2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcbiAgQFZpZXdDaGlsZCgnZGF0ZUlucHV0JykgZGF0ZUlucHV0OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSBtYXhEYXRlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgc2hvd0NhbGVuZGFyID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93WWVhcnMgPSBmYWxzZTtcbiAgcHVibGljIG1vbnRoTmFtZXMgPSBnZXRMb2NhbGVNb250aE5hbWVzKHRoaXMubG9jYWxlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSwgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTtcbiAgcHVibGljIGRheU5hbWVzID0gZ2V0TG9jYWxlRGF5TmFtZXModGhpcy5sb2NhbGUsIEZvcm1TdHlsZS5TdGFuZGFsb25lLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTtcblxuICBwdWJsaWMgbW9udGg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgeWVhcjogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBjYWxlbmRhckRhdGVzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgY2FsZW5kYXJZZWFyczogYW55W10gPSBbXTtcbiAgcHVibGljIHNob3dDYWxlbmRhclllYXJzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgYmxhbmtEYXlzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgY2FsZW5kYXJZZWFyUGFnZSA9IDE7XG4gIHByaXZhdGUgeWVhcnNQZXJQYWdlID0gMzA7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZSQ6IGFueSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQkOiBhbnkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTtcbiAgICB0aGlzLnllYXIgPSB0b2RheS5nZXRGdWxsWWVhcigpO1xuICAgIHRoaXMuY2FsZW5kYXJEYXRlcyA9IFt7IGRheTogdGhpcy52YWx1ZSwgdG9kYXk6IHRoaXMudmFsdWUsIHNlbGVjdGVkOiB0aGlzLnZhbHVlIH1dO1xuICAgIHRoaXMuY2FsZW5kYXJZZWFycyA9IFt7IHllYXI6IHRoaXMudmFsdWU/LmdldEZ1bGxZZWFyKCksIHRvZGF5OiB0aGlzLnZhbHVlLCBzZWxlY3RlZDogdGhpcy52YWx1ZSB9XTtcbiAgICBjb25zdCB5ZWFyc0FycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE5NTA7IGkgPD0gdG9kYXkuZ2V0RnVsbFllYXIoKSArIDI7IGkrKykge1xuICAgICAgeWVhcnNBcnJheS5wdXNoKHsgeWVhcjogaSwgdG9kYXk6IHRoaXMuY29tcGFyZURhdGVzKHRvZGF5LCBudWxsLCBpKSwgc2VsZWN0ZWQ6IGkgPT0gdGhpcy52YWx1ZT8uZ2V0RnVsbFllYXIoKSB9KTtcbiAgICB9XG4gICAgdGhpcy5jYWxlbmRhclllYXJzID0geWVhcnNBcnJheTtcbiAgICB0aGlzLnNob3dDYWxlbmRhclllYXJzID0gdGhpcy5wYWdpbmF0ZSh0aGlzLmNhbGVuZGFyWWVhcnMsIDEpO1xuICAgIHRoaXMuY2FsY0RheXMoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTE9DQUxFX0lEKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmcpIHsgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAob2JqKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3IERhdGUob2JqKTtcbiAgICAgIHRoaXMubW9udGggPSB0aGlzLnZhbHVlLmdldE1vbnRoKCk7XG4gICAgICB0aGlzLnllYXIgPSB0aGlzLnZhbHVlLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UkID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQkID0gZm47XG4gIH1cblxuICBwdWJsaWMgb25CbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vblRvdWNoZWQkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCQoKTtcbiAgICB9XG4gICAgdGhpcy5nZXREYXRlRnJvbUlucHV0KCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0RGF0ZVZhbHVlKGRhdGU6IGFueSk6IHZvaWQge1xuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGluIFVUQ1xuICAgIGlmICghdGhpcy5vdXRPZlJhbmdlRGF0ZShkYXRlLmRheSkpIHtcbiAgICAgIGxldCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIGRhdGUuZGF5LCAzLCAwLCAwLCAwKTtcbiAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZERhdGU7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICBpZiAodGhpcy5vbkNoYW5nZSQpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSQodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZURheXMoKTtcbiAgICAgIGlmICh0aGlzLm9uVG91Y2hlZCQpIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGNEYXlzKCk7XG4gICAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RZZWFyVmFsdWUoeWVhcjogYW55KTogdm9pZCB7XG4gICAgLy8gVGhpcyBzaG91bGQgYmUgaW4gVVRDXG4gICAgY29uc3QgdGVtcFllYXIgPSB0aGlzLnllYXI7XG4gICAgdGhpcy55ZWFyID0geWVhci55ZWFyO1xuICAgIGlmICghdGhpcy5vdXRPZlJhbmdlRGF0ZSh0aGlzLmNhbGVuZGFyRGF0ZXM/LmZpbmQoeCA9PiB4LnNlbGVjdGVkID09IHRydWUpID8/IHsgZGF5OiAxIH0pKSB7XG4gICAgICBsZXQgc2VsZWN0ZWREYXRlID0gbmV3IERhdGUoeWVhci55ZWFyLCB0aGlzLm1vbnRoID8/IDEsIHRoaXMuY2FsZW5kYXJEYXRlcz8uZmluZCh4ID0+IHguc2VsZWN0ZWQgPT0gdHJ1ZSkuZGF5ID8/IDEsIDMsIDAsIDAsIDApO1xuICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkRGF0ZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIGlmICh0aGlzLm9uQ2hhbmdlJCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlJCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICAgICAgaWYgKHRoaXMub25Ub3VjaGVkJCkge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd1llYXJzID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dDYWxlbmRhciA9IHRydWU7XG4gICAgICB0aGlzLmNhbGNEYXlzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueWVhciA9IHRlbXBZZWFyO1xuICAgICAgdGhpcy5zaG93WWVhcnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb250aCAhPT0gMCkge1xuICAgICAgdGhpcy5tb250aCA9IHRoaXMubW9udGggLSAxO1xuICAgICAgdGhpcy5jYWxjRGF5cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vbnRoID0gMTE7XG4gICAgICB0aGlzLnllYXIgPSB0aGlzLnllYXIgLSAxO1xuICAgICAgdGhpcy5jYWxjRGF5cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vblRvdWNoZWQkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vbnRoICE9PSAxMSkge1xuICAgICAgdGhpcy5tb250aCA9IHRoaXMubW9udGggKyAxO1xuICAgICAgdGhpcy5jYWxjRGF5cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vbnRoID0gMDtcbiAgICAgIHRoaXMueWVhciA9IHRoaXMueWVhciArIDE7XG4gICAgICB0aGlzLmNhbGNEYXlzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uVG91Y2hlZCQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkJCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcmV2aW91c1llYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q2FsZW5kYXJZZWFycyA9IHRoaXMucGFnaW5hdGUoXG4gICAgICB0aGlzLmNhbGVuZGFyWWVhcnMsXG4gICAgICB0aGlzLmNhbGVuZGFyWWVhclBhZ2UgPiAxID8gLS10aGlzLmNhbGVuZGFyWWVhclBhZ2UgOiAxKTtcbiAgICB0aGlzLmNhbGNEYXlzKCk7XG4gICAgaWYgKHRoaXMub25Ub3VjaGVkJCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQkKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHRZZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NhbGVuZGFyWWVhcnMgPSB0aGlzLnBhZ2luYXRlKFxuICAgICAgdGhpcy5jYWxlbmRhclllYXJzLFxuICAgICAgdGhpcy5jYWxlbmRhclllYXJQYWdlIDw9IHRoaXMuY2FsZW5kYXJZZWFycy5sZW5ndGggLyB0aGlzLnllYXJzUGVyUGFnZVxuICAgICAgICA/ICsrdGhpcy5jYWxlbmRhclllYXJQYWdlXG4gICAgICAgIDogdGhpcy5jYWxlbmRhclllYXJQYWdlKTtcbiAgICB0aGlzLmNhbGNEYXlzKCk7XG4gICAgaWYgKHRoaXMub25Ub3VjaGVkJCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlRGF0ZXMoZGF0ZTE6IERhdGUgfCB1bmRlZmluZWQgfCBudWxsLCBkYXk6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHllYXI6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAoIWRhdGUxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyID8/IHRoaXMueWVhciwgdGhpcy5tb250aCwgZGF5ID8/IHRoaXMudmFsdWU/LmdldERheSgpKTtcbiAgICByZXR1cm4gZGF0ZTEudG9EYXRlU3RyaW5nKCkgPT09IGQudG9EYXRlU3RyaW5nKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjYWxjRGF5cygpOiB2b2lkIHtcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHRoaXMueWVhciwgdGhpcy5tb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIHN0YXJ0IGNhbGVuZGFyIGRheSBvZiB3ZWVrXG4gICAgY29uc3QgZGF5T2ZXZWVrID0gbmV3IERhdGUodGhpcy55ZWFyLCB0aGlzLm1vbnRoKS5nZXREYXkoKTtcbiAgICBjb25zdCBibGFua2RheXNBcnJheSA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gZGF5T2ZXZWVrOyBpKyspIHtcbiAgICAgIC8vIGNoZWNrIGlmIG1vbnRoIGlzIEZlYnJ1YXJ5XG4gICAgICBibGFua2RheXNBcnJheS5wdXNoKHRoaXMubW9udGggIT0gMiA/ICgzMiAtIGkpIDogKDI5IC0gaSkpO1xuICAgICAgYmxhbmtkYXlzQXJyYXkucmV2ZXJzZSgpLnNvcnQoKTtcbiAgICB9XG4gICAgY29uc3QgZGF5c0FycmF5ID0gW107XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGRheXNJbk1vbnRoOyBpKyspIHtcbiAgICAgIGRheXNBcnJheS5wdXNoKHsgZGF5OiBpLCB0b2RheTogdGhpcy5jb21wYXJlRGF0ZXModG9kYXksIGksIG51bGwpLCBzZWxlY3RlZDogdGhpcy5jb21wYXJlRGF0ZXModGhpcy52YWx1ZSA/PyB0b2RheSwgaSwgbnVsbCkgfSk7XG4gICAgfVxuICAgIGNvbnN0IHllYXJzQXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTk1MDsgaSA8PSB0b2RheS5nZXRGdWxsWWVhcigpICsgMjsgaSsrKSB7XG4gICAgICB5ZWFyc0FycmF5LnB1c2goeyB5ZWFyOiBpLCB0b2RheTogdGhpcy5jb21wYXJlRGF0ZXModG9kYXksIG51bGwsIGkpLCBzZWxlY3RlZDogaSA9PSB0aGlzLnllYXIgfSk7XG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJZZWFycyA9IHllYXJzQXJyYXk7XG4gICAgdGhpcy5ibGFua0RheXMgPSBibGFua2RheXNBcnJheTtcbiAgICB0aGlzLmNhbGVuZGFyRGF0ZXMgPSBkYXlzQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURheXMoKTogdm9pZCB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMuY2FsZW5kYXJEYXRlcy5mb3JFYWNoKGQgPT4ge1xuICAgICAgZC50b2RheSA9IHRoaXMuY29tcGFyZURhdGVzKHRvZGF5LCBkLCB0aGlzLnllYXIpO1xuICAgICAgZC5zZWxlY3RlZCA9IHRoaXMuY29tcGFyZURhdGVzKHRoaXMudmFsdWUsIGQsIHRoaXMueWVhcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHBhZ2luYXRlKGFycmF5OiBhbnlbXSwgcGFnZV9udW1iZXI6IG51bWJlcik6IGFueVtdIHtcbiAgICByZXR1cm4gYXJyYXkuc2xpY2UoKHBhZ2VfbnVtYmVyIC0gMSkgKiB0aGlzLnllYXJzUGVyUGFnZSwgcGFnZV9udW1iZXIgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGVGcm9tSW5wdXQoKSB7XG4gICAgaWYgKHRoaXMuZGF0ZUlucHV0Py5uYXRpdmVFbGVtZW50LnZhbHVlICE9PSAnJyAmJiAhdGhpcy5pbmxpbmUpIHtcbiAgICAgIHZhciBkYXRlUGFydHMgPSB0aGlzLmRhdGVJbnB1dD8ubmF0aXZlRWxlbWVudC52YWx1ZS5zcGxpdChcIi9cIik7XG4gICAgICBsZXQgZGF0ZUluR3JGb3JtYXQgPSBuZXcgRGF0ZSgrZGF0ZVBhcnRzWzJdLCBkYXRlUGFydHNbMV0gLSAxLCArZGF0ZVBhcnRzWzBdLCAzLCAwLCAwKTtcbiAgICAgIGlmIChkYXRlSW5HckZvcm1hdC50b1N0cmluZygpICE9PSAnSW52YWxpZCBEYXRlJykge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoZGF0ZUluR3JGb3JtYXQpXG4gICAgICAgIHRoaXMuY2FsY0RheXMoKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGVJbkdyRm9ybWF0KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9uQ2hhbmdlJCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlJCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRGF5cygpO1xuICAgICAgaWYgKHRoaXMub25Ub3VjaGVkJCkge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuWWVhcnMoKSB7XG4gICAgdGhpcy5zaG93WWVhcnMgPSAhdGhpcy5zaG93WWVhcnM7XG4gICAgdGhpcy5jYWxlbmRhclllYXJQYWdlID0gTWF0aC5jZWlsKHRoaXMuY2FsZW5kYXJZZWFycy5tYXAoeCA9PiB4LnllYXIpLmluZGV4T2YodGhpcy55ZWFyKSAvIHRoaXMueWVhcnNQZXJQYWdlKTtcbiAgICB0aGlzLnNob3dDYWxlbmRhclllYXJzID0gdGhpcy5wYWdpbmF0ZSh0aGlzLmNhbGVuZGFyWWVhcnMsIHRoaXMuY2FsZW5kYXJZZWFyUGFnZSAhPT0gMCA/IHRoaXMuY2FsZW5kYXJZZWFyUGFnZSA6IDEpO1xuICAgIHRoaXMuY2FsY0RheXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuQ2FsZW5kYXIoKSB7XG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gICAgdGhpcy5jYWxjRGF5cygpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlQ2FsZW5kYXIoKSB7XG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgICB0aGlzLmdldERhdGVGcm9tSW5wdXQoKTtcbiAgfVxuXG4gIG91dE9mUmFuZ2VEYXRlKGRhdGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBvdXRPZlJhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubWluRGF0ZSB8fCB0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIGRhdGUuZGF5KTtcbiAgICAgIGNvbnN0IGRhdGVJbk1pbGxpcyA9IGQuZ2V0VGltZSgpO1xuICAgICAgaWYgKHRoaXMubWluRGF0ZSkge1xuICAgICAgICBsZXQgbWluRGF0ZTogbnVtYmVyID0gdGhpcy5taW5EYXRlLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKGRhdGVJbk1pbGxpcyA8IG1pbkRhdGUgJiYgdGhpcy5taW5EYXRlLnRvRGF0ZVN0cmluZygpICE9PSBkLnRvRGF0ZVN0cmluZygpKSB7XG4gICAgICAgICAgb3V0T2ZSYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgICAgbGV0IG1heERhdGU6IG51bWJlciA9IHRoaXMubWF4RGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIGlmIChkYXRlSW5NaWxsaXMgPiBtYXhEYXRlICYmIHRoaXMubWF4RGF0ZS50b0RhdGVTdHJpbmcoKSAhPT0gZC50b0RhdGVTdHJpbmcoKSkge1xuICAgICAgICAgIG91dE9mUmFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRPZlJhbmdlO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICBbbmdDbGFzc109XCJ7J3JlbGF0aXZlJzogIWlubGluZX1cIlxuICAgICAoY2xpY2tPdXRzaWRlKT1cImNsb3NlQ2FsZW5kYXIoKVwiPlxuXG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAqbmdJZj1cIiFpbmxpbmVcIlxuICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgIG5hbWU9XCJkYXRlSW5wdXRcIlxuICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICAgaWQ9XCJkYXRlSW5wdXRcIlxuICAgICAgICAgKGZvY3VzKT1cInNob3dDYWxlbmRhciA9IGZhbHNlXCJcbiAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZSB8IGRhdGU6IGRpc3BsYXlGb3JtYXRcIlxuICAgICAgICAgY2xhc3M9XCJkZXRhcGlja2VyLWlucHV0XCJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWR9XCJcbiAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkaXNhYmxlZCA/ICcnIDogcGxhY2Vob2xkZXJcIj5cblxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICpuZ0lmPVwiIWlubGluZVwiXG4gICAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyLWJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkNhbGVuZGFyKClcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWR9XCI+XG4gICAgPGkgY2xhc3M9XCJtcy1JY29uIG1zLUljb24tLURhdGVUaW1lMlwiPjwvaT5cbiAgPC9idXR0b24+XG5cbiAgPGRpdiAqbmdJZj1cInNob3dDYWxlbmRhciB8fCBpbmxpbmVcIlxuICAgICAgIFtuZ0NsYXNzXT1cInsnYWJzb2x1dGUnOiAhaW5saW5lfVwiXG4gICAgICAgY2xhc3M9XCJkYXRlcGlja2VyLWJhY2tncm91bmRcIlxuICAgICAgIHN0eWxlPVwiaGVpZ2h0OjE4cmVtO21pbi13aWR0aDoxNnJlbTtcIlxuICAgICAgIG5hbWU9XCJjYWxlbmRhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWJ0bi13cmFwcGVyXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuWWVhcnMoKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZXBpY2tlci1zZWxlY3RlZC1tb250aFwiPlxuICAgICAgICAgICAge3ttb250aE5hbWVzW21vbnRoXX19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZXBpY2tlci1zZWxlY3RlZC15ZWFyXCI+XG4gICAgICAgICAgICB7e3llYXJ9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd1llYXJzOyBlbHNlIHNob3dZZWFyc1BpY2tlclRtcGxcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGVwaWNrZXItbmF2LWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzTW9udGgoKTtcIj5cbiAgICAgICAgICA8c3ZnIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xNSAxOWwtNy03IDctN1wiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZXBpY2tlci1uYXYtYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICA8c3ZnIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgZD1cIk05IDVsNyA3LTcgN1wiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctdGVtcGxhdGUgI3Nob3dZZWFyc1BpY2tlclRtcGw+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZXBpY2tlci1uYXYtYnRuXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c1llYXIoKTtcIj5cbiAgICAgICAgICAgIDxzdmcgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE1IDE5bC03LTcgNy03XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGVwaWNrZXItbmF2LWJ0blwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmV4dFllYXIoKVwiPlxuICAgICAgICAgICAgPHN2ZyBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNOSA1bDcgNy03IDdcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXdyYXBwZXJcIlxuICAgICAgICAgKm5nSWY9XCIhc2hvd1llYXJzOyBlbHNlIHNob3dDYWxZZWFyc1RtcGxcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlOYW1lc1wiXG4gICAgICAgICAgIGNsYXNzPVwiZGF0ZXBpY2tlci1kYXktbmFtZVwiXG4gICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE0LjI4JVwiPnt7ZGF5fX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0NhbFllYXJzVG1wbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNvbnRlbnQtd3JhcHBlclwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHNob3dDYWxlbmRhclllYXJzXCJcbiAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxOC4yOCVcIlxuICAgICAgICAgICAgIGNsYXNzPVwicHgtMSBtYi0xXCI+XG4gICAgICAgICAgPGRpdiAoY2xpY2spPVwic2VsZWN0WWVhclZhbHVlKHllYXIpXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZXBpY2tlci15ZWFyXCJcbiAgICAgICAgICAgICAgIFtjbGFzc109XCJ5ZWFyLnNlbGVjdGVkICA/ICdzZWxlY3RlZCcgOiAnbm90LXNlbGVjdGVkJ1wiPlxuICAgICAgICAgICAge3t5ZWFyLnllYXJ9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jb250ZW50LXdyYXBwZXJcIlxuICAgICAgICAgKm5nSWY9XCIhc2hvd1llYXJzXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBibGFua2RheSBvZiBibGFua0RheXNcIlxuICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxNC4yOCVcIlxuICAgICAgICAgICBjbGFzcz1cImRhdGVwaWNrZXItYmxhbmstZGF5c1wiPnt7YmxhbmtkYXl9fTwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGF0ZSBvZiBjYWxlbmRhckRhdGVzO1wiXG4gICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE0LjI4JVwiXG4gICAgICAgICAgIGNsYXNzPVwicHgtMSBtYi0xXCI+XG4gICAgICAgIDxkaXYgKGNsaWNrKT1cInNlbGVjdERhdGVWYWx1ZShkYXRlKVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyLWRheXNcIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnb3V0LW9mLXJhbmdlJzogb3V0T2ZSYW5nZURhdGUoZGF0ZSksJ3NlbGVjdGVkJzogZGF0ZS5zZWxlY3RlZCwgJ25vdC1zZWxlY3RlZCc6IWRhdGUuc2VsZWN0ZWQgfVwiPlxuICAgICAgICAgIHt7ZGF0ZS5kYXl9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj4iXX0=