@testgorilla/tgo-ui 1.1.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/components/alert-banner/alert-banner.component.d.ts +1 -1
  2. package/components/autocomplete/autocomplete.component.d.ts +106 -0
  3. package/components/autocomplete/autocomplete.component.module.d.ts +19 -0
  4. package/components/autocomplete/autocomplete.model.d.ts +13 -0
  5. package/components/autocomplete/includes.pipe.d.ts +12 -0
  6. package/components/autocomplete/transform-Item.pipe.d.ts +11 -0
  7. package/components/avatar/avatar.component.d.ts +1 -1
  8. package/components/banner-action/banner-action.component.d.ts +1 -1
  9. package/components/button/button.component.d.ts +1 -1
  10. package/components/card/card.component.d.ts +1 -1
  11. package/components/checkbox/checkbox.component.d.ts +1 -1
  12. package/components/create-account/create-account.component.d.ts +1 -1
  13. package/components/create-password/create-password.component.d.ts +1 -1
  14. package/components/datepicker/datepicker.component.d.ts +1 -1
  15. package/components/dialog/dialog.component.d.ts +1 -1
  16. package/components/dropdown/dropdown.component.d.ts +1 -1
  17. package/components/elevation-shadow/elevation-shadow.component.d.ts +1 -1
  18. package/components/field/field.component.d.ts +1 -1
  19. package/components/file-upload/file-upload.component.d.ts +1 -1
  20. package/components/forgot-password/forgot-password.component.d.ts +1 -1
  21. package/components/icon/icon.component.d.ts +1 -1
  22. package/components/icon-label/icon-label.component.d.ts +1 -1
  23. package/components/label/label.component.d.ts +1 -1
  24. package/components/login/login.component.d.ts +1 -1
  25. package/components/logo/logo.component.d.ts +1 -1
  26. package/components/navbar/navbar.component.d.ts +1 -1
  27. package/components/navigation/navigation.component.d.ts +1 -1
  28. package/components/paginator/paginator.component.d.ts +1 -1
  29. package/components/progress-bar/progress-bar.component.d.ts +1 -1
  30. package/components/radio-button/radio-button.component.d.ts +1 -1
  31. package/components/rating/rating.component.d.ts +1 -1
  32. package/components/snackbar/snackbar.component.d.ts +1 -1
  33. package/components/table/directives/dynamic-component.directive.d.ts +1 -1
  34. package/components/table/table.component.d.ts +1 -1
  35. package/components/tag/tag.component.d.ts +1 -1
  36. package/components/toggle/toggle.component.d.ts +1 -1
  37. package/components/tooltip/tooltip.component.d.ts +1 -1
  38. package/directives/digits-only.directive.d.ts +1 -1
  39. package/directives/select-text.directive.d.ts +19 -0
  40. package/esm2022/components/alert-banner/alert-banner.component.mjs +98 -0
  41. package/{esm2020 → esm2022}/components/alert-banner/alert-banner.component.module.mjs +5 -5
  42. package/esm2022/components/autocomplete/autocomplete.component.mjs +288 -0
  43. package/esm2022/components/autocomplete/autocomplete.component.module.mjs +81 -0
  44. package/esm2022/components/autocomplete/autocomplete.model.mjs +16 -0
  45. package/esm2022/components/autocomplete/includes.pipe.mjs +21 -0
  46. package/esm2022/components/autocomplete/transform-Item.pipe.mjs +29 -0
  47. package/{esm2020 → esm2022}/components/avatar/avatar.component.mjs +4 -4
  48. package/{esm2020 → esm2022}/components/avatar/avatar.component.module.mjs +5 -5
  49. package/{esm2020 → esm2022}/components/banner-action/banner-action.component.mjs +4 -4
  50. package/{esm2020 → esm2022}/components/banner-action/banner-action.component.module.mjs +5 -5
  51. package/{esm2020 → esm2022}/components/button/button.component.mjs +4 -4
  52. package/{esm2020 → esm2022}/components/button/button.component.module.mjs +5 -5
  53. package/{esm2020 → esm2022}/components/card/card.component.mjs +4 -4
  54. package/{esm2020 → esm2022}/components/card/card.component.module.mjs +5 -5
  55. package/esm2022/components/checkbox/checkbox.component.mjs +151 -0
  56. package/{esm2020 → esm2022}/components/checkbox/checkbox.component.module.mjs +5 -5
  57. package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog.component.module.mjs +8 -8
  59. package/{esm2020 → esm2022}/components/create-account/create-account.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/components/create-account/create-account.component.module.mjs +19 -19
  61. package/{esm2020 → esm2022}/components/create-password/create-password.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/components/create-password/create-password.component.module.mjs +17 -17
  63. package/esm2022/components/datepicker/datepicker.component.mjs +179 -0
  64. package/{esm2020 → esm2022}/components/datepicker/datepicker.component.module.mjs +19 -19
  65. package/{esm2020 → esm2022}/components/dialog/dialog.component.mjs +4 -4
  66. package/{esm2020 → esm2022}/components/dialog/dialog.component.module.mjs +5 -5
  67. package/{esm2020 → esm2022}/components/dialog/dialog.service.mjs +4 -4
  68. package/esm2022/components/dropdown/dropdown.component.mjs +158 -0
  69. package/{esm2020 → esm2022}/components/dropdown/dropdown.component.module.mjs +19 -19
  70. package/{esm2020 → esm2022}/components/elevation-shadow/elevation-shadow.component.mjs +4 -4
  71. package/{esm2020 → esm2022}/components/elevation-shadow/elevation-shadow.component.module.mjs +5 -5
  72. package/esm2022/components/field/field.component.mjs +212 -0
  73. package/{esm2020 → esm2022}/components/field/field.component.module.mjs +17 -17
  74. package/esm2022/components/file-upload/file-upload.component.mjs +191 -0
  75. package/{esm2020 → esm2022}/components/file-upload/file-upload.component.module.mjs +5 -5
  76. package/{esm2020 → esm2022}/components/forgot-password/forgot-password.component.mjs +4 -4
  77. package/{esm2020 → esm2022}/components/forgot-password/forgot-password.component.module.mjs +17 -17
  78. package/{esm2020 → esm2022}/components/icon/icon.component.mjs +4 -4
  79. package/{esm2020 → esm2022}/components/icon/icon.component.module.mjs +5 -5
  80. package/{esm2020 → esm2022}/components/icon-label/icon-label.component.mjs +4 -4
  81. package/{esm2020 → esm2022}/components/icon-label/icon-label.component.module.mjs +5 -5
  82. package/{esm2020 → esm2022}/components/label/label.component.mjs +4 -4
  83. package/{esm2020 → esm2022}/components/label/label.component.module.mjs +5 -5
  84. package/{esm2020 → esm2022}/components/login/login.component.mjs +4 -4
  85. package/{esm2020 → esm2022}/components/login/login.component.module.mjs +17 -17
  86. package/{esm2020 → esm2022}/components/logo/logo.component.mjs +4 -4
  87. package/{esm2020 → esm2022}/components/logo/logo.component.module.mjs +5 -5
  88. package/{esm2020 → esm2022}/components/navbar/navbar.component.mjs +4 -4
  89. package/{esm2020 → esm2022}/components/navbar/navbar.component.module.mjs +19 -19
  90. package/{esm2020 → esm2022}/components/navigation/navigation.component.mjs +4 -4
  91. package/{esm2020 → esm2022}/components/navigation/navigation.component.module.mjs +5 -5
  92. package/{esm2020 → esm2022}/components/paginator/paginator.component.mjs +4 -4
  93. package/{esm2020 → esm2022}/components/paginator/paginator.component.module.mjs +5 -5
  94. package/{esm2020 → esm2022}/components/progress-bar/progress-bar.component.mjs +4 -4
  95. package/{esm2020 → esm2022}/components/progress-bar/progress-bar.component.module.mjs +5 -5
  96. package/{esm2020 → esm2022}/components/radio-button/radio-button.component.mjs +4 -4
  97. package/{esm2020 → esm2022}/components/radio-button/radio-button.component.module.mjs +5 -5
  98. package/{esm2020 → esm2022}/components/rating/rating.component.mjs +4 -4
  99. package/{esm2020 → esm2022}/components/rating/rating.component.module.mjs +5 -5
  100. package/esm2022/components/snackbar/snackbar.component.mjs +148 -0
  101. package/esm2022/components/snackbar/snackbar.component.module.mjs +44 -0
  102. package/{esm2020 → esm2022}/components/snackbar/snackbar.service.mjs +4 -4
  103. package/{esm2020 → esm2022}/components/spinner/spinner.component.mjs +4 -4
  104. package/{esm2020 → esm2022}/components/spinner/spinner.module.mjs +5 -5
  105. package/{esm2020 → esm2022}/components/table/directives/dynamic-component.directive.mjs +4 -4
  106. package/{esm2020 → esm2022}/components/table/pipes/data-property-getter.mjs +4 -4
  107. package/esm2022/components/table/table.component.mjs +158 -0
  108. package/{esm2020 → esm2022}/components/table/table.component.module.mjs +5 -5
  109. package/{esm2020 → esm2022}/components/tag/tag.component.mjs +4 -4
  110. package/{esm2020 → esm2022}/components/tag/tag.component.module.mjs +5 -5
  111. package/esm2022/components/toggle/toggle.component.mjs +78 -0
  112. package/{esm2020 → esm2022}/components/toggle/toggle.component.module.mjs +5 -5
  113. package/{esm2020 → esm2022}/components/tooltip/tooltip.component.mjs +4 -4
  114. package/{esm2020 → esm2022}/components/tooltip/tooltip.component.module.mjs +5 -5
  115. package/{esm2020 → esm2022}/directives/digits-only.directive.mjs +4 -4
  116. package/{esm2020 → esm2022}/directives/drag-drop.directive.mjs +4 -4
  117. package/esm2022/directives/select-text.directive.mjs +37 -0
  118. package/{esm2020 → esm2022}/pipes/name-initials.pipe.mjs +4 -4
  119. package/{esm2020 → esm2022}/public-api.mjs +5 -1
  120. package/esm2022/utils/autocomplete-utils.mjs +61 -0
  121. package/esm2022/utils/localization/language.service.mjs +78 -0
  122. package/{fesm2020 → fesm2022}/testgorilla-tgo-ui.mjs +961 -466
  123. package/fesm2022/testgorilla-tgo-ui.mjs.map +1 -0
  124. package/package.json +17 -23
  125. package/public-api.d.ts +3 -0
  126. package/src/assets/i18n/en.json +9 -1
  127. package/utils/autocomplete-utils.d.ts +11 -0
  128. package/esm2020/components/alert-banner/alert-banner.component.mjs +0 -98
  129. package/esm2020/components/checkbox/checkbox.component.mjs +0 -151
  130. package/esm2020/components/datepicker/datepicker.component.mjs +0 -179
  131. package/esm2020/components/dropdown/dropdown.component.mjs +0 -158
  132. package/esm2020/components/field/field.component.mjs +0 -212
  133. package/esm2020/components/file-upload/file-upload.component.mjs +0 -191
  134. package/esm2020/components/snackbar/snackbar.component.mjs +0 -148
  135. package/esm2020/components/snackbar/snackbar.component.module.mjs +0 -44
  136. package/esm2020/components/table/table.component.mjs +0 -158
  137. package/esm2020/components/toggle/toggle.component.mjs +0 -78
  138. package/esm2020/utils/localization/language.service.mjs +0 -78
  139. package/fesm2015/testgorilla-tgo-ui.mjs +0 -4290
  140. package/fesm2015/testgorilla-tgo-ui.mjs.map +0 -1
  141. package/fesm2020/testgorilla-tgo-ui.mjs.map +0 -1
  142. /package/{esm2020 → esm2022}/components/alert-banner/alert-banner.model.mjs +0 -0
  143. /package/{esm2020 → esm2022}/components/avatar/avatar.model.mjs +0 -0
  144. /package/{esm2020 → esm2022}/components/button/button.model.mjs +0 -0
  145. /package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog.constants.mjs +0 -0
  146. /package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog.model.mjs +0 -0
  147. /package/{esm2020 → esm2022}/components/create-account/create-account.constant.mjs +0 -0
  148. /package/{esm2020 → esm2022}/components/create-account/create-account.model.mjs +0 -0
  149. /package/{esm2020 → esm2022}/components/create-password/create-password.constant.mjs +0 -0
  150. /package/{esm2020 → esm2022}/components/create-password/create-password.model.mjs +0 -0
  151. /package/{esm2020 → esm2022}/components/dropdown/dropdown.model.mjs +0 -0
  152. /package/{esm2020 → esm2022}/components/elevation-shadow/elevation-shadow.constant.mjs +0 -0
  153. /package/{esm2020 → esm2022}/components/field/field.model.mjs +0 -0
  154. /package/{esm2020 → esm2022}/components/forgot-password/forgot-password.constant.mjs +0 -0
  155. /package/{esm2020 → esm2022}/components/forgot-password/forgot-password.model.mjs +0 -0
  156. /package/{esm2020 → esm2022}/components/icon/icon.config.mjs +0 -0
  157. /package/{esm2020 → esm2022}/components/icon/icon.model.mjs +0 -0
  158. /package/{esm2020 → esm2022}/components/label/label.model.mjs +0 -0
  159. /package/{esm2020 → esm2022}/components/login/login.constant.mjs +0 -0
  160. /package/{esm2020 → esm2022}/components/login/login.model.mjs +0 -0
  161. /package/{esm2020 → esm2022}/components/logo/logo.model.mjs +0 -0
  162. /package/{esm2020 → esm2022}/components/navbar/navbar.model.mjs +0 -0
  163. /package/{esm2020 → esm2022}/components/radio-button/radio-button.model.mjs +0 -0
  164. /package/{esm2020 → esm2022}/components/snackbar/snackbar.model.mjs +0 -0
  165. /package/{esm2020 → esm2022}/components/table/table.model.mjs +0 -0
  166. /package/{esm2020 → esm2022}/components/tag/tag.model.mjs +0 -0
  167. /package/{esm2020 → esm2022}/components/toggle/toggle.model.mjs +0 -0
  168. /package/{esm2020 → esm2022}/components/tooltip/tooltip.model.mjs +0 -0
  169. /package/{esm2020 → esm2022}/testgorilla-tgo-ui.mjs +0 -0
  170. /package/{esm2020 → esm2022}/utils/alert-bar.model.mjs +0 -0
  171. /package/{esm2020 → esm2022}/utils/alert-bars.utils.mjs +0 -0
  172. /package/{esm2020 → esm2022}/utils/validators.utils.mjs +0 -0
@@ -0,0 +1,98 @@
1
+ import { animate, style, transition, trigger } from '@angular/animations';
2
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
3
+ import { alertBarsUtil } from '../../utils/alert-bars.utils';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "../button/button.component";
7
+ import * as i3 from "../icon/icon.component";
8
+ export class AlertBannerComponent {
9
+ constructor() {
10
+ /**
11
+ * Alert Banner type
12
+ *
13
+ * @type {AlertBarType}
14
+ * @memberof AlertBannerComponent
15
+ */
16
+ this.alertType = 'success';
17
+ /**
18
+ * Alert banner message
19
+ *
20
+ * @memberof AlertBannerComponent
21
+ */
22
+ this.message = '';
23
+ /**
24
+ * Include dismmiss button
25
+ *
26
+ * @memberof AlertBannerComponent
27
+ */
28
+ this.includeDismissButton = true;
29
+ /**
30
+ * Static or fixed position
31
+ *
32
+ * @memberof AlertBannerComponent
33
+ */
34
+ this.fixed = false;
35
+ /**
36
+ * Full width for alert banner
37
+ *
38
+ * @memberof AlertBannerComponent
39
+ */
40
+ this.fullWidth = true;
41
+ /**
42
+ * Link text that will appended at the end of message
43
+ *
44
+ * @memberof AlertBannerComponent
45
+ */
46
+ this.linkText = '';
47
+ /**
48
+ * Link target
49
+ *
50
+ * @type {@type {LinkTargetType}}
51
+ * @memberof AlertBannerComponent
52
+ */
53
+ this.linkTarget = '_blank';
54
+ this.visible = true;
55
+ }
56
+ ngOnInit() {
57
+ this.iconName = alertBarsUtil.setIcon(this.alertType);
58
+ this.position = alertBarsUtil.setPosition(this.fixed);
59
+ this.cssClass = alertBarsUtil.setCssClass(this.fullWidth, this.alertType, this.position);
60
+ }
61
+ //Hide snackbar when dismiss button is clicked
62
+ dismissClick() {
63
+ this.visible = false;
64
+ }
65
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AlertBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
66
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AlertBannerComponent, selector: "ui-alert-banner", inputs: { alertType: "alertType", message: "message", includeDismissButton: "includeDismissButton", fixed: "fixed", fullWidth: "fullWidth", linkText: "linkText", linkUrl: "linkUrl", linkTarget: "linkTarget" }, ngImport: i0, template: "<div [ngClass]=\"cssClass\" [@openClose] *ngIf=\"visible\" class=\"alert-container\">\n <div class=\"alert-text\">\n <ui-icon [name]=\"iconName\" size=\"24\"></ui-icon>\n {{ message }}\n <a *ngIf=\"!!linkText\" [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n </div>\n <ui-button\n *ngIf=\"includeDismissButton\"\n type=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n (buttonClickEvent)=\"dismissClick()\"\n ></ui-button>\n</div>\n", styles: [":host{display:flex;width:100%;justify-content:center}:host .snackbar-container{max-width:600px}:host .alert-container,:host .snackbar-container{margin:0 auto;display:flex;padding:0 14px;border-radius:4px;align-items:center;justify-content:space-between;opacity:1;min-height:48px}:host .alert-container.fixed,:host .snackbar-container.fixed{position:fixed}:host .alert-container.static,:host .snackbar-container.static{position:relative}:host .alert-container ui-icon,:host .snackbar-container ui-icon{margin-right:14px}:host .alert-container ui-button,:host .snackbar-container ui-button{margin-left:14px}:host .alert-container ::ng-deep button.mat-mdc-unelevated-button.big,:host .snackbar-container ::ng-deep button.mat-mdc-unelevated-button.big{padding:0;min-width:auto}:host .alert-container .alert-text,:host .alert-container .snackbar-text,:host .snackbar-container .alert-text,:host .snackbar-container .snackbar-text{display:flex;align-items:center;color:#000}:host .alert-container .alert-text a,:host .alert-container .snackbar-text a,:host .snackbar-container .alert-text a,:host .snackbar-container .snackbar-text a{color:#000;text-decoration:underline;font-weight:700}:host .alert-container .alert-text a:hover,:host .alert-container .alert-text a:visited,:host .alert-container .alert-text a:focus,:host .alert-container .snackbar-text a:hover,:host .alert-container .snackbar-text a:visited,:host .alert-container .snackbar-text a:focus,:host .snackbar-container .alert-text a:hover,:host .snackbar-container .alert-text a:visited,:host .snackbar-container .alert-text a:focus,:host .snackbar-container .snackbar-text a:hover,:host .snackbar-container .snackbar-text a:visited,:host .snackbar-container .snackbar-text a:focus{text-decoration:none}:host .alert-container.success,:host .snackbar-container.success{background-color:#cbd6cb}:host .alert-container.info,:host .snackbar-container.info{background-color:#c8d7de}:host .alert-container.warning,:host .snackbar-container.warning{background-color:#f0d6bb}:host .alert-container.error,:host .snackbar-container.error{background-color:#e3c3c6}@media (max-width: 600px){:host .alert-container,:host .snackbar-container{padding:8px 14px}}:host .alert-container.fixed{top:0;z-index:98}:host .alert-container.full-width{width:100%;min-width:100%}:host .alert-container a{margin-left:7px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ButtonComponent, selector: "ui-button", inputs: ["size", "type", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "component", type: i3.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color"] }], animations: [
67
+ trigger('openClose', [
68
+ transition(':enter', [animate('0.2s ease-out', style({ opacity: 1 }))]),
69
+ transition(':leave', [animate('0.2s ease-in', style({ opacity: 0 }))]),
70
+ ]),
71
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AlertBannerComponent, decorators: [{
74
+ type: Component,
75
+ args: [{ selector: 'ui-alert-banner', animations: [
76
+ trigger('openClose', [
77
+ transition(':enter', [animate('0.2s ease-out', style({ opacity: 1 }))]),
78
+ transition(':leave', [animate('0.2s ease-in', style({ opacity: 0 }))]),
79
+ ]),
80
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"cssClass\" [@openClose] *ngIf=\"visible\" class=\"alert-container\">\n <div class=\"alert-text\">\n <ui-icon [name]=\"iconName\" size=\"24\"></ui-icon>\n {{ message }}\n <a *ngIf=\"!!linkText\" [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n </div>\n <ui-button\n *ngIf=\"includeDismissButton\"\n type=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n (buttonClickEvent)=\"dismissClick()\"\n ></ui-button>\n</div>\n", styles: [":host{display:flex;width:100%;justify-content:center}:host .snackbar-container{max-width:600px}:host .alert-container,:host .snackbar-container{margin:0 auto;display:flex;padding:0 14px;border-radius:4px;align-items:center;justify-content:space-between;opacity:1;min-height:48px}:host .alert-container.fixed,:host .snackbar-container.fixed{position:fixed}:host .alert-container.static,:host .snackbar-container.static{position:relative}:host .alert-container ui-icon,:host .snackbar-container ui-icon{margin-right:14px}:host .alert-container ui-button,:host .snackbar-container ui-button{margin-left:14px}:host .alert-container ::ng-deep button.mat-mdc-unelevated-button.big,:host .snackbar-container ::ng-deep button.mat-mdc-unelevated-button.big{padding:0;min-width:auto}:host .alert-container .alert-text,:host .alert-container .snackbar-text,:host .snackbar-container .alert-text,:host .snackbar-container .snackbar-text{display:flex;align-items:center;color:#000}:host .alert-container .alert-text a,:host .alert-container .snackbar-text a,:host .snackbar-container .alert-text a,:host .snackbar-container .snackbar-text a{color:#000;text-decoration:underline;font-weight:700}:host .alert-container .alert-text a:hover,:host .alert-container .alert-text a:visited,:host .alert-container .alert-text a:focus,:host .alert-container .snackbar-text a:hover,:host .alert-container .snackbar-text a:visited,:host .alert-container .snackbar-text a:focus,:host .snackbar-container .alert-text a:hover,:host .snackbar-container .alert-text a:visited,:host .snackbar-container .alert-text a:focus,:host .snackbar-container .snackbar-text a:hover,:host .snackbar-container .snackbar-text a:visited,:host .snackbar-container .snackbar-text a:focus{text-decoration:none}:host .alert-container.success,:host .snackbar-container.success{background-color:#cbd6cb}:host .alert-container.info,:host .snackbar-container.info{background-color:#c8d7de}:host .alert-container.warning,:host .snackbar-container.warning{background-color:#f0d6bb}:host .alert-container.error,:host .snackbar-container.error{background-color:#e3c3c6}@media (max-width: 600px){:host .alert-container,:host .snackbar-container{padding:8px 14px}}:host .alert-container.fixed{top:0;z-index:98}:host .alert-container.full-width{width:100%;min-width:100%}:host .alert-container a{margin-left:7px}\n"] }]
81
+ }], ctorParameters: function () { return []; }, propDecorators: { alertType: [{
82
+ type: Input
83
+ }], message: [{
84
+ type: Input
85
+ }], includeDismissButton: [{
86
+ type: Input
87
+ }], fixed: [{
88
+ type: Input
89
+ }], fullWidth: [{
90
+ type: Input
91
+ }], linkText: [{
92
+ type: Input
93
+ }], linkUrl: [{
94
+ type: Input
95
+ }], linkTarget: [{
96
+ type: Input
97
+ }] } });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtYmFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2FsZXJ0LWJhbm5lci9hbGVydC1iYW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYWxlcnQtYmFubmVyL2FsZXJ0LWJhbm5lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7OztBQWU3RCxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CO1FBRUE7Ozs7O1dBS0c7UUFDTSxjQUFTLEdBQWlCLFNBQVMsQ0FBQztRQUU3Qzs7OztXQUlHO1FBQ00sWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUV0Qjs7OztXQUlHO1FBQ00seUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRXJDOzs7O1dBSUc7UUFDTSxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRXZCOzs7O1dBSUc7UUFDTSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTFCOzs7O1dBSUc7UUFDTSxhQUFRLEdBQUksRUFBRSxDQUFDO1FBU3hCOzs7OztXQUtHO1FBQ00sZUFBVSxHQUFvQixRQUFRLENBQUM7UUFHaEQsWUFBTyxHQUFHLElBQUksQ0FBQztJQTdEQSxDQUFDO0lBaUVoQixRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7K0dBM0VVLG9CQUFvQjttR0FBcEIsb0JBQW9CLHlRQ25CakMsdWZBZUEsMDVGREpjO1lBQ1YsT0FBTyxDQUFDLFdBQVcsRUFBRTtnQkFDbkIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkUsQ0FBQztTQUNIOzs0RkFHVSxvQkFBb0I7a0JBWmhDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBR2Y7d0JBQ1YsT0FBTyxDQUFDLFdBQVcsRUFBRTs0QkFDbkIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN2RSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3ZFLENBQUM7cUJBQ0gsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07MEVBV3RDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQU9HLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFPRyxLQUFLO3NCQUFiLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQU9HLE9BQU87c0JBQWYsS0FBSztnQkFRRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEljb25OYW1lIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9pY29uL2ljb24ubW9kZWwnO1xuaW1wb3J0IHsgQWxlcnRCYXJUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvYWxlcnQtYmFyLm1vZGVsJztcbmltcG9ydCB7IGFsZXJ0QmFyc1V0aWwgfSBmcm9tICcuLi8uLi91dGlscy9hbGVydC1iYXJzLnV0aWxzJztcbmltcG9ydCB7IExpbmtUYXJnZXRUeXBlIH0gZnJvbSAnLi9hbGVydC1iYW5uZXIubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd1aS1hbGVydC1iYW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYWxlcnQtYmFubmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWxlcnQtYmFubmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdvcGVuQ2xvc2UnLCBbXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbYW5pbWF0ZSgnMC4ycyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSldKSxcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKCcwLjJzIGVhc2UtaW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpXSksXG4gICAgXSksXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBbGVydEJhbm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQWxlcnQgQmFubmVyIHR5cGVcbiAgICpcbiAgICogQHR5cGUge0FsZXJ0QmFyVHlwZX1cbiAgICogQG1lbWJlcm9mIEFsZXJ0QmFubmVyQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBhbGVydFR5cGU6IEFsZXJ0QmFyVHlwZSA9ICdzdWNjZXNzJztcblxuICAvKipcbiAgICogQWxlcnQgYmFubmVyIG1lc3NhZ2VcbiAgICpcbiAgICogQG1lbWJlcm9mIEFsZXJ0QmFubmVyQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlID0gJyc7XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgZGlzbW1pc3MgYnV0dG9uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBBbGVydEJhbm5lckNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgaW5jbHVkZURpc21pc3NCdXR0b24gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgb3IgZml4ZWQgcG9zaXRpb25cbiAgICpcbiAgICogQG1lbWJlcm9mIEFsZXJ0QmFubmVyQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBmaXhlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBGdWxsIHdpZHRoIGZvciBhbGVydCBiYW5uZXJcbiAgICpcbiAgICogQG1lbWJlcm9mIEFsZXJ0QmFubmVyQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBmdWxsV2lkdGggPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBMaW5rIHRleHQgdGhhdCB3aWxsIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgbWVzc2FnZVxuICAgKlxuICAgKiBAbWVtYmVyb2YgQWxlcnRCYW5uZXJDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGxpbmtUZXh0PyA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaW5rIHVybFxuICAgKlxuICAgKiBAbWVtYmVyb2YgQWxlcnRCYW5uZXJDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGxpbmtVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpbmsgdGFyZ2V0XG4gICAqXG4gICAqIEB0eXBlIHtAdHlwZSB7TGlua1RhcmdldFR5cGV9fVxuICAgKiBAbWVtYmVyb2YgQWxlcnRCYW5uZXJDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGxpbmtUYXJnZXQ/OiBMaW5rVGFyZ2V0VHlwZSA9ICdfYmxhbmsnO1xuXG4gIGljb25OYW1lOiBJY29uTmFtZTtcbiAgdmlzaWJsZSA9IHRydWU7XG4gIHBvc2l0aW9uOiBzdHJpbmc7XG4gIGNzc0NsYXNzOiBzdHJpbmc7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pY29uTmFtZSA9IGFsZXJ0QmFyc1V0aWwuc2V0SWNvbih0aGlzLmFsZXJ0VHlwZSk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IGFsZXJ0QmFyc1V0aWwuc2V0UG9zaXRpb24odGhpcy5maXhlZCk7XG4gICAgdGhpcy5jc3NDbGFzcyA9IGFsZXJ0QmFyc1V0aWwuc2V0Q3NzQ2xhc3ModGhpcy5mdWxsV2lkdGgsIHRoaXMuYWxlcnRUeXBlLCB0aGlzLnBvc2l0aW9uKTtcbiAgfVxuXG4gIC8vSGlkZSBzbmFja2JhciB3aGVuIGRpc21pc3MgYnV0dG9uIGlzIGNsaWNrZWRcbiAgZGlzbWlzc0NsaWNrKCkge1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cImNzc0NsYXNzXCIgW0BvcGVuQ2xvc2VdICpuZ0lmPVwidmlzaWJsZVwiIGNsYXNzPVwiYWxlcnQtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJhbGVydC10ZXh0XCI+XG4gICAgPHVpLWljb24gW25hbWVdPVwiaWNvbk5hbWVcIiBzaXplPVwiMjRcIj48L3VpLWljb24+XG4gICAge3sgbWVzc2FnZSB9fVxuICAgIDxhICpuZ0lmPVwiISFsaW5rVGV4dFwiIFt0YXJnZXRdPVwibGlua1RhcmdldFwiIFtocmVmXT1cImxpbmtVcmxcIj57eyBsaW5rVGV4dCB9fTwvYT5cbiAgPC9kaXY+XG4gIDx1aS1idXR0b25cbiAgICAqbmdJZj1cImluY2x1ZGVEaXNtaXNzQnV0dG9uXCJcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgW2p1c3RJY29uXT1cInRydWVcIlxuICAgIGNsYXNzPVwiY2xvc2VcIlxuICAgIGljb25OYW1lPVwiQ2xvc2VcIlxuICAgIChidXR0b25DbGlja0V2ZW50KT1cImRpc21pc3NDbGljaygpXCJcbiAgPjwvdWktYnV0dG9uPlxuPC9kaXY+XG4iXX0=
@@ -5,11 +5,11 @@ import { IconComponentModule } from '../icon/icon.component.module';
5
5
  import { AlertBannerComponent } from './alert-banner.component';
6
6
  import * as i0 from "@angular/core";
7
7
  export class AlertBannerComponentModule {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AlertBannerComponentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: AlertBannerComponentModule, declarations: [AlertBannerComponent], imports: [CommonModule, ButtonComponentModule, IconComponentModule], exports: [AlertBannerComponent] }); }
10
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AlertBannerComponentModule, imports: [CommonModule, ButtonComponentModule, IconComponentModule] }); }
8
11
  }
9
- AlertBannerComponentModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AlertBannerComponentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
- AlertBannerComponentModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: AlertBannerComponentModule, declarations: [AlertBannerComponent], imports: [CommonModule, ButtonComponentModule, IconComponentModule], exports: [AlertBannerComponent] });
11
- AlertBannerComponentModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AlertBannerComponentModule, imports: [CommonModule, ButtonComponentModule, IconComponentModule] });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AlertBannerComponentModule, decorators: [{
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AlertBannerComponentModule, decorators: [{
13
13
  type: NgModule,
14
14
  args: [{
15
15
  declarations: [AlertBannerComponent],
@@ -17,4 +17,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
17
17
  exports: [AlertBannerComponent],
18
18
  }]
19
19
  }] });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtYmFubmVyLmNvbXBvbmVudC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9hbGVydC1iYW5uZXIvYWxlcnQtYmFubmVyLmNvbXBvbmVudC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBT2hFLE1BQU0sT0FBTywwQkFBMEI7O3VIQUExQiwwQkFBMEI7d0hBQTFCLDBCQUEwQixpQkFKdEIsb0JBQW9CLGFBQ3pCLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsYUFDeEQsb0JBQW9CO3dIQUVuQiwwQkFBMEIsWUFIM0IsWUFBWSxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQjsyRkFHdkQsMEJBQTBCO2tCQUx0QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUNwQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ25FLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50TW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQubW9kdWxlJztcbmltcG9ydCB7IEljb25Db21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50Lm1vZHVsZSc7XG5pbXBvcnQgeyBBbGVydEJhbm5lckNvbXBvbmVudCB9IGZyb20gJy4vYWxlcnQtYmFubmVyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW0FsZXJ0QmFubmVyQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnV0dG9uQ29tcG9uZW50TW9kdWxlLCBJY29uQ29tcG9uZW50TW9kdWxlXSxcbiAgZXhwb3J0czogW0FsZXJ0QmFubmVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnRCYW5uZXJDb21wb25lbnRNb2R1bGUge31cbiJdfQ==
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtYmFubmVyLmNvbXBvbmVudC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9hbGVydC1iYW5uZXIvYWxlcnQtYmFubmVyLmNvbXBvbmVudC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBT2hFLE1BQU0sT0FBTywwQkFBMEI7K0dBQTFCLDBCQUEwQjtnSEFBMUIsMEJBQTBCLGlCQUp0QixvQkFBb0IsYUFDekIsWUFBWSxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixhQUN4RCxvQkFBb0I7Z0hBRW5CLDBCQUEwQixZQUgzQixZQUFZLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1COzs0RkFHdkQsMEJBQTBCO2tCQUx0QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUNwQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ25FLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50TW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQubW9kdWxlJztcbmltcG9ydCB7IEljb25Db21wb25lbnRNb2R1bGUgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50Lm1vZHVsZSc7XG5pbXBvcnQgeyBBbGVydEJhbm5lckNvbXBvbmVudCB9IGZyb20gJy4vYWxlcnQtYmFubmVyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW0FsZXJ0QmFubmVyQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnV0dG9uQ29tcG9uZW50TW9kdWxlLCBJY29uQ29tcG9uZW50TW9kdWxlXSxcbiAgZXhwb3J0czogW0FsZXJ0QmFubmVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnRCYW5uZXJDb21wb25lbnRNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,288 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, inject, Input, Output, ViewChild, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { map, ReplaySubject, startWith } from 'rxjs';
4
+ import { AutocompleteUtils } from '../../utils/autocomplete-utils';
5
+ import { Autocomplete, Padding, Timeout } from './autocomplete.model';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/material/form-field";
9
+ import * as i3 from "@angular/material/autocomplete";
10
+ import * as i4 from "@angular/material/core";
11
+ import * as i5 from "@angular/material/input";
12
+ import * as i6 from "@angular/forms";
13
+ import * as i7 from "../tag/tag.component";
14
+ import * as i8 from "../icon/icon.component";
15
+ import * as i9 from "@ngneat/transloco";
16
+ import * as i10 from "../../directives/select-text.directive";
17
+ import * as i11 from "./transform-Item.pipe";
18
+ import * as i12 from "./includes.pipe";
19
+ export class AutocompleteComponent {
20
+ constructor() {
21
+ /**
22
+ * @property itemsList
23
+ * @description The list of items to display in the autocomplete.
24
+ * @memberof AutocompleteComponent
25
+ */
26
+ this.itemsList = [];
27
+ /**
28
+ * @property suggestionsList
29
+ * @description The list of suggestions to display in the autocomplete.
30
+ * @memberof AutocompleteComponent
31
+ */
32
+ this.suggestionsList = [];
33
+ /**
34
+ * @property disabled
35
+ * @description If `true`, the autocomplete is disabled.
36
+ * @memberof AutocompleteComponent
37
+ */
38
+ this.disabled = false;
39
+ /**
40
+ * @property allowAdd
41
+ * @description If `true`, allows adding new values to the autocomplete.
42
+ * @memberof AutocompleteComponent
43
+ */
44
+ this.allowAdd = true;
45
+ /**
46
+ * @property textField
47
+ * @description The field to be used as the display text in the autocomplete.
48
+ * @memberof AutocompleteComponent
49
+ */
50
+ this.textField = '';
51
+ /**
52
+ * @property valueField
53
+ * @description The field to be used as the value in the autocomplete.
54
+ * @memberof AutocompleteComponent
55
+ */
56
+ this.valueField = '';
57
+ /**
58
+ * @property label
59
+ * @description The label for the autocomplete input.
60
+ * @memberof AutocompleteComponent
61
+ */
62
+ this.label = '';
63
+ /**
64
+ * @property type
65
+ * @description The type of the autocomplete ('single', 'multi', etc.).
66
+ * @memberof AutocompleteComponent
67
+ */
68
+ this.type = 'multi';
69
+ /**
70
+ * @property minCharactersSearch
71
+ * @description The minimum characters to trigger search.
72
+ * @memberof AutocompleteComponent
73
+ */
74
+ this.minCharactersSearch = 3;
75
+ this.selectionChange = new EventEmitter();
76
+ this.searchTextChange = new EventEmitter();
77
+ this.cdr = inject(ChangeDetectorRef);
78
+ this.inputValue = '';
79
+ this.isInputFocus = false;
80
+ this.autocompleteType = Autocomplete;
81
+ this.isOverLapping = false;
82
+ this.isOverlapChecking = true;
83
+ this.overlapIndex = 0;
84
+ this.inputValueSearch$ = new ReplaySubject(1);
85
+ this.filteredItemsList$ = this.inputValueSearch$.pipe(startWith(''), map(inputValue => inputValue.length ? AutocompleteUtils.filterItems(this.itemsList, inputValue, this.textField) : null));
86
+ this.filteredSuggestionList$ = this.inputValueSearch$.pipe(map(inputValue => inputValue.length ? AutocompleteUtils.filterItems(this.suggestionsList, inputValue, this.textField) : null));
87
+ this.searchResult$ = this.inputValueSearch$.pipe(map(inputValue => !!inputValue.trim()));
88
+ this.translationContext = 'AUTOCOMPLETE.';
89
+ this.onChange = (_) => { };
90
+ this.onTouch = () => { };
91
+ }
92
+ /**
93
+ * @property value
94
+ * @description The selected value(s) in the autocomplete.
95
+ * @memberof AutocompleteComponent
96
+ */
97
+ set itemValue(v) {
98
+ this.value = AutocompleteUtils.isArray(v) ? v : [v];
99
+ }
100
+ ngOnChanges() {
101
+ this.itemsList = AutocompleteUtils.excludeSuggestions(this.itemsList, this.suggestionsList, this.valueField);
102
+ this.initValue();
103
+ }
104
+ ngAfterViewInit() {
105
+ if (this.type !== Autocomplete.LARGE) {
106
+ this.checkOverlap(Timeout.VIEW_INITIALIZED_COMPONENT_LOAD);
107
+ }
108
+ }
109
+ registerOnChange(fn) {
110
+ this.onChange = fn;
111
+ }
112
+ registerOnTouched(fn) {
113
+ this.onTouch = fn;
114
+ }
115
+ setDisabledState(isDisabled) {
116
+ this.disabled = isDisabled;
117
+ }
118
+ writeValue(value) {
119
+ this.value = value;
120
+ }
121
+ onOptionSelected(event) {
122
+ const inputValue = event.option.value;
123
+ const itemValue = AutocompleteUtils.createValueItem(inputValue, this.textField, this.valueField);
124
+ this.addNewValue(itemValue);
125
+ if (this.type === this.autocompleteType.MULTI) {
126
+ this.checkOverlap();
127
+ }
128
+ queueMicrotask(() => {
129
+ if (this.type !== this.autocompleteType.SINGLE) {
130
+ this.inputValue = '';
131
+ }
132
+ else {
133
+ this.inputValue = AutocompleteUtils.transformDisplayValue(this.value, this.textField);
134
+ }
135
+ this.cdr.markForCheck();
136
+ });
137
+ this.onUpdate();
138
+ }
139
+ onOptionRemoved(input, option) {
140
+ setTimeout(() => (input.showPanel = false), 0);
141
+ const foundValue = this.value.find((v) => v === option);
142
+ if (foundValue) {
143
+ this.value = this.value.filter((v) => v !== option);
144
+ }
145
+ if (this.type === this.autocompleteType.MULTI) {
146
+ this.checkOverlap();
147
+ }
148
+ if (!this.value.length) {
149
+ this.inputValue = '';
150
+ }
151
+ this.onUpdate();
152
+ }
153
+ onInputChange(event) {
154
+ const inputValue = event.target.value;
155
+ if (inputValue.length >= this.minCharactersSearch) {
156
+ this.inputValueSearch$.next(inputValue);
157
+ this.searchTextChange.emit(inputValue);
158
+ }
159
+ else {
160
+ this.inputValueSearch$.next('');
161
+ }
162
+ }
163
+ onClear() {
164
+ this.inputValue = '';
165
+ this.value = AutocompleteUtils.isArray(this.value) ? [] : '';
166
+ this.isOverLapping = false;
167
+ this.overlapIndex = 0;
168
+ this.onUpdate();
169
+ }
170
+ refillInput() {
171
+ if (this.value && this.type === this.autocompleteType.SINGLE && !this.inputValue) {
172
+ this.inputValue = AutocompleteUtils.transformDisplayValue(this.value, this.textField);
173
+ this.inputValueSearch$.next('');
174
+ }
175
+ if (!this.inputValue && this.value?.length) {
176
+ this.inputValue = ' ';
177
+ }
178
+ this.isInputFocus = false;
179
+ }
180
+ onFocus() {
181
+ this.isInputFocus = true;
182
+ const inputValue = AutocompleteUtils.isArray(this.inputValue) ? this.inputValue[0] : this.inputValue;
183
+ if (AutocompleteUtils.isPrimitive(inputValue)) {
184
+ if (inputValue?.match(/^\s+/gm)) {
185
+ this.inputValue = inputValue.trimStart();
186
+ }
187
+ }
188
+ else {
189
+ if (inputValue[this.textField]?.match(/^\s+/gm)) {
190
+ this.inputValue = inputValue[this.textField].trimStart();
191
+ }
192
+ }
193
+ }
194
+ checkOverlap(delay = Timeout.VIEW_INITIALIZED_AFTER_ACTION) {
195
+ this.isOverLapping = false;
196
+ this.isOverlapChecking = true;
197
+ setTimeout(() => {
198
+ const inputWidth = this.matFormFieldElement?._textField.nativeElement.clientWidth - Padding.AUTOCOMPLETE_CONTAINER;
199
+ const tags = this.tagContainer?.nativeElement.querySelectorAll('.value-tag');
200
+ if (tags) {
201
+ let width = 0;
202
+ tags.forEach((tag, index) => {
203
+ width += tag.getBoundingClientRect().width;
204
+ if (!this.isOverLapping && width > inputWidth) {
205
+ this.isOverLapping = true;
206
+ this.overlapIndex = index;
207
+ }
208
+ });
209
+ this.isOverlapChecking = false;
210
+ this.cdr.markForCheck();
211
+ }
212
+ }, delay);
213
+ }
214
+ onUpdate() {
215
+ this.inputValueSearch$.next('');
216
+ this.selectionChange.emit(this.value);
217
+ this.onChange(this.value);
218
+ }
219
+ initValue() {
220
+ if (this.type === this.autocompleteType.SINGLE) {
221
+ this.inputValue = AutocompleteUtils.transformDisplayValue(this.value[0], this.textField);
222
+ }
223
+ if (this.type === this.autocompleteType.MULTI) {
224
+ this.checkOverlap();
225
+ }
226
+ }
227
+ addNewValue(newValue) {
228
+ if (this.type !== this.autocompleteType.SINGLE && !this.value) {
229
+ this.value = [];
230
+ }
231
+ const foundDuplicate = AutocompleteUtils.findDuplicate(this.value, newValue, this.textField);
232
+ if (this.type !== this.autocompleteType.SINGLE) {
233
+ this.value = foundDuplicate ? this.value.filter((v) => v !== foundDuplicate) : [...this.value, newValue];
234
+ }
235
+ else {
236
+ this.value = newValue;
237
+ }
238
+ }
239
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
240
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AutocompleteComponent, selector: "ui-autocomplete", inputs: { itemsList: "itemsList", suggestionsList: "suggestionsList", disabled: "disabled", allowAdd: "allowAdd", textField: "textField", valueField: "valueField", label: "label", itemValue: "itemValue", type: "type", minCharactersSearch: "minCharactersSearch" }, outputs: { selectionChange: "selectionChange", searchTextChange: "searchTextChange" }, providers: [
241
+ {
242
+ provide: NG_VALUE_ACCESSOR,
243
+ useExisting: forwardRef(() => AutocompleteComponent),
244
+ multi: true,
245
+ },
246
+ ], viewQueries: [{ propertyName: "matFormFieldElement", first: true, predicate: ["matFormField"], descendants: true }, { propertyName: "tagContainer", first: true, predicate: ["tagContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <div class=\"autocomplete-wrapper\">\n <mat-form-field\n [appearance]=\"'outline'\"\n #matFormField\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, disabled: disabled }\"\n >\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <div class=\"input-container\">\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [style.display]=\"isOverLapping && i >= overlapIndex ? 'none' : 'block'\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(autocomplete, valueItem)\"\n ></ui-tag>\n <ng-container *ngIf=\"isOverLapping\">\n <div *ngIf=\"!overlapIndex; else overlapTag\" class=\"overlap-count\">\n {{ t(translationContext + 'SELECTED_AMOUNT', { numberSelected: (value | slice: overlapIndex).length }) }}\n </div>\n <ng-template #overlapTag>\n <ui-tag [readOnly]=\"true\" [label]=\"'+' + (value | slice: overlapIndex).length\"></ui-tag>\n </ng-template>\n </ng-container>\n </div>\n <input\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n matInput\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n </div>\n\n <ui-icon\n class=\"remove-selected\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear()\"\n *ngIf=\"inputValue || value?.length\"\n [size]=\"'24'\"\n [name]=\"'Close'\"\n ></ui-icon>\n\n <mat-autocomplete\n #autocomplete\n (optionSelected)=\"onOptionSelected($event)\"\n [hideSingleSelectionIndicator]=\"false\"\n >\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <mat-optgroup [label]=\"t(translationContext + 'SUGGESTED')\" *ngIf=\"suggestionsList.length\">\n <mat-option\n [ngClass]=\"{ 'selected-option': suggested | includes: value }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"inputValue\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"t(translationContext + 'SELECTED') | uppercase\" *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n <mat-optgroup [label]=\"t(translationContext + 'SUGGESTED') | uppercase\" *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"inputValue\">{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length; else showItemListWithGroup\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"inputValue\">{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"t(translationContext + 'ALL_ITEMS') | uppercase\" *ngIf=\"filteredItemsList.length\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"inputValue\">{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n <ng-container *ngIf=\"!filteredItemsList.length && !filteredSuggestionList.length && inputValue\">\n <ng-container *ngIf=\"allowAdd; else notFound\">\n <mat-option [value]=\"inputValue\">\n <span>{{ t('COMMON.ADD') }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n </ng-container>\n\n <ng-template #notFound>\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ t(translationContext + 'NO_RESULTS_FOUND') }}</span>\n </mat-option>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:block}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled ui-icon{opacity:.5}.input-container{width:100%;margin:auto;display:flex}.input-container .selected-items{display:flex}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px;width:80px}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:4px}.input-container input.unset-margin{margin-top:unset}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer}.remove-selected.large-input-icon{margin-top:10px}::ng-deep .mdc-menu-surface.mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-form-field{min-width:330px!important}::ng-deep .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#E9F0F1!important}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:50%!important}::ng-deep .mat-mdc-text-field-wrapper{padding-left:12px!important}::ng-deep .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .mat-mdc-form-field-infix,::ng-deep .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-option.selected-option{background:#E9F0F1}::ng-deep .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}\n"], 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: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled"], outputs: ["close", "press"] }, { kind: "component", type: i8.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color"] }, { kind: "directive", type: i9.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "directive", type: i10.SelectTextDirective, selector: "[selectText]", inputs: ["selectText"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i11.TransformItemPipe, name: "transformItem" }, { kind: "pipe", type: i12.IncludesPipe, name: "includes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
247
+ }
248
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AutocompleteComponent, decorators: [{
249
+ type: Component,
250
+ args: [{ selector: 'ui-autocomplete', providers: [
251
+ {
252
+ provide: NG_VALUE_ACCESSOR,
253
+ useExisting: forwardRef(() => AutocompleteComponent),
254
+ multi: true,
255
+ },
256
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <div class=\"autocomplete-wrapper\">\n <mat-form-field\n [appearance]=\"'outline'\"\n #matFormField\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, disabled: disabled }\"\n >\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <div class=\"input-container\">\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [style.display]=\"isOverLapping && i >= overlapIndex ? 'none' : 'block'\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(autocomplete, valueItem)\"\n ></ui-tag>\n <ng-container *ngIf=\"isOverLapping\">\n <div *ngIf=\"!overlapIndex; else overlapTag\" class=\"overlap-count\">\n {{ t(translationContext + 'SELECTED_AMOUNT', { numberSelected: (value | slice: overlapIndex).length }) }}\n </div>\n <ng-template #overlapTag>\n <ui-tag [readOnly]=\"true\" [label]=\"'+' + (value | slice: overlapIndex).length\"></ui-tag>\n </ng-template>\n </ng-container>\n </div>\n <input\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n matInput\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n </div>\n\n <ui-icon\n class=\"remove-selected\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear()\"\n *ngIf=\"inputValue || value?.length\"\n [size]=\"'24'\"\n [name]=\"'Close'\"\n ></ui-icon>\n\n <mat-autocomplete\n #autocomplete\n (optionSelected)=\"onOptionSelected($event)\"\n [hideSingleSelectionIndicator]=\"false\"\n >\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <mat-optgroup [label]=\"t(translationContext + 'SUGGESTED')\" *ngIf=\"suggestionsList.length\">\n <mat-option\n [ngClass]=\"{ 'selected-option': suggested | includes: value }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"inputValue\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"t(translationContext + 'SELECTED') | uppercase\" *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n <mat-optgroup [label]=\"t(translationContext + 'SUGGESTED') | uppercase\" *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"inputValue\">{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length; else showItemListWithGroup\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"inputValue\">{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"t(translationContext + 'ALL_ITEMS') | uppercase\" *ngIf=\"filteredItemsList.length\">\n <mat-option\n [ngClass]=\"{ 'selected-option': item | includes: value }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"inputValue\">{{ item | transformItem: textField }}</span>\n <ui-icon [name]=\"'Check'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n <ng-container *ngIf=\"!filteredItemsList.length && !filteredSuggestionList.length && inputValue\">\n <ng-container *ngIf=\"allowAdd; else notFound\">\n <mat-option [value]=\"inputValue\">\n <span>{{ t('COMMON.ADD') }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n </ng-container>\n\n <ng-template #notFound>\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ t(translationContext + 'NO_RESULTS_FOUND') }}</span>\n </mat-option>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:block}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled ui-icon{opacity:.5}.input-container{width:100%;margin:auto;display:flex}.input-container .selected-items{display:flex}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px;width:80px}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:4px}.input-container input.unset-margin{margin-top:unset}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer}.remove-selected.large-input-icon{margin-top:10px}::ng-deep .mdc-menu-surface.mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-form-field{min-width:330px!important}::ng-deep .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#E9F0F1!important}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:50%!important}::ng-deep .mat-mdc-text-field-wrapper{padding-left:12px!important}::ng-deep .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .mat-mdc-form-field-infix,::ng-deep .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-option.selected-option{background:#E9F0F1}::ng-deep .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}\n"] }]
257
+ }], propDecorators: { itemsList: [{
258
+ type: Input
259
+ }], suggestionsList: [{
260
+ type: Input
261
+ }], disabled: [{
262
+ type: Input
263
+ }], allowAdd: [{
264
+ type: Input
265
+ }], textField: [{
266
+ type: Input
267
+ }], valueField: [{
268
+ type: Input
269
+ }], label: [{
270
+ type: Input
271
+ }], itemValue: [{
272
+ type: Input
273
+ }], type: [{
274
+ type: Input
275
+ }], minCharactersSearch: [{
276
+ type: Input
277
+ }], selectionChange: [{
278
+ type: Output
279
+ }], searchTextChange: [{
280
+ type: Output
281
+ }], matFormFieldElement: [{
282
+ type: ViewChild,
283
+ args: ['matFormField']
284
+ }], tagContainer: [{
285
+ type: ViewChild,
286
+ args: ['tagContainer']
287
+ }] } });
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBZXhGLE1BQU0sT0FBTyxxQkFBcUI7SUFibEM7UUFjRTs7OztXQUlHO1FBQ00sY0FBUyxHQUFVLEVBQUUsQ0FBQztRQUUvQjs7OztXQUlHO1FBQ00sb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFFckM7Ozs7V0FJRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7Ozs7V0FJRztRQUNNLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFFekI7Ozs7V0FJRztRQUNNLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFeEI7Ozs7V0FJRztRQUNNLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFekI7Ozs7V0FJRztRQUNNLFVBQUssR0FBRyxFQUFFLENBQUM7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QUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMvRzthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7U0FDdkI7SUFDSCxDQUFDOytHQWxSVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix5WUFUckI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO2dCQUNwRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsbVFDL0JILGt5TUFrSkE7OzRGRGhIYSxxQkFBcUI7a0JBYmpDLFNBQVM7K0JBQ0UsaUJBQWlCLGFBR2hCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDOzRCQUNwRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFRdEMsU0FBUztzQkFBakIsS0FBSztnQkFPRyxlQUFlO3NCQUF2QixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxTQUFTO3NCQUFqQixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBT0csS0FBSztzQkFBYixLQUFLO2dCQU9PLFNBQVM7c0JBQXJCLEtBQUs7Z0JBU0csSUFBSTtzQkFBWixLQUFLO2dCQU9HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFb0IsbUJBQW1CO3NCQUE3QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0UsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgbWFwLCBSZXBsYXlTdWJqZWN0LCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXV0b2NvbXBsZXRlLXV0aWxzJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZSwgQXV0b2NvbXBsZXRlVHlwZSwgUGFkZGluZywgVGltZW91dCB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWktYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaXRlbXNMaXN0XG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGlzdCBvZiBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1zTGlzdDogYW55W10gPSBbXTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHN1Z2dlc3Rpb25zTGlzdFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBzdWdnZXN0aW9uc0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb24gSWYgYHRydWVgLCB0aGUgYXV0b2NvbXBsZXRlIGlzIGRpc2FibGVkLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWxsb3dBZGRcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIGFkZGluZyBuZXcgdmFsdWVzIHRvIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGFsbG93QWRkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHRleHRGaWVsZFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGZpZWxkIHRvIGJlIHVzZWQgYXMgdGhlIGRpc3BsYXkgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB0ZXh0RmllbGQgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlRmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWVsZCB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZUZpZWxkID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsYWJlbFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzZWxlY3RlZCB2YWx1ZShzKSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBzZXQgaXRlbVZhbHVlKHY6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHYpID8gdiA6IFt2XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdHlwZVxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHR5cGUgb2YgdGhlIGF1dG9jb21wbGV0ZSAoJ3NpbmdsZScsICdtdWx0aScsIGV0Yy4pLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB0eXBlOiBBdXRvY29tcGxldGVUeXBlID0gJ211bHRpJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IG1pbkNoYXJhY3RlcnNTZWFyY2hcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtaW5pbXVtIGNoYXJhY3RlcnMgdG8gdHJpZ2dlciBzZWFyY2guXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIG1pbkNoYXJhY3RlcnNTZWFyY2ggPSAzO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaFRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCdtYXRGb3JtRmllbGQnKSBtYXRGb3JtRmllbGRFbGVtZW50OiBNYXRGb3JtRmllbGQ7XG4gIEBWaWV3Q2hpbGQoJ3RhZ0NvbnRhaW5lcicpIHRhZ0NvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcm90ZWN0ZWQgdmFsdWU6IGFueTtcbiAgcHJvdGVjdGVkIGlucHV0VmFsdWU6IGFueSA9ICcnO1xuICBwcm90ZWN0ZWQgaXNJbnB1dEZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhdXRvY29tcGxldGVUeXBlID0gQXV0b2NvbXBsZXRlO1xuICBwcm90ZWN0ZWQgaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNPdmVybGFwQ2hlY2tpbmcgPSB0cnVlO1xuICBwcm90ZWN0ZWQgb3ZlcmxhcEluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIGlucHV0VmFsdWVTZWFyY2gkID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShcbiAgICBzdGFydFdpdGgoJycpLFxuICAgIG1hcChpbnB1dFZhbHVlID0+XG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aCA/IEF1dG9jb21wbGV0ZVV0aWxzLmZpbHRlckl0ZW1zKHRoaXMuaXRlbXNMaXN0LCBpbnB1dFZhbHVlLCB0aGlzLnRleHRGaWVsZCkgOiBudWxsXG4gICAgKVxuICApO1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdCQgPSB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLnBpcGUoXG4gICAgbWFwKGlucHV0VmFsdWUgPT5cbiAgICAgIGlucHV0VmFsdWUubGVuZ3RoID8gQXV0b2NvbXBsZXRlVXRpbHMuZmlsdGVySXRlbXModGhpcy5zdWdnZXN0aW9uc0xpc3QsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6IG51bGxcbiAgICApXG4gICk7XG4gIHByb3RlY3RlZCBzZWFyY2hSZXN1bHQkID0gdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5waXBlKG1hcChpbnB1dFZhbHVlID0+ICEhaW5wdXRWYWx1ZS50cmltKCkpKTtcblxuICBwcm90ZWN0ZWQgdHJhbnNsYXRpb25Db250ZXh0ID0gJ0FVVE9DT01QTEVURS4nO1xuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXNMaXN0ID0gQXV0b2NvbXBsZXRlVXRpbHMuZXhjbHVkZVN1Z2dlc3Rpb25zKHRoaXMuaXRlbXNMaXN0LCB0aGlzLnN1Z2dlc3Rpb25zTGlzdCwgdGhpcy52YWx1ZUZpZWxkKTtcbiAgICB0aGlzLmluaXRWYWx1ZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IEF1dG9jb21wbGV0ZS5MQVJHRSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0NPTVBPTkVOVF9MT0FEKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuICBvblRvdWNoID0gKCkgPT4ge307XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25PcHRpb25TZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBldmVudC5vcHRpb24udmFsdWU7XG4gICAgY29uc3QgaXRlbVZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuY3JlYXRlVmFsdWVJdGVtKGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkLCB0aGlzLnZhbHVlRmllbGQpO1xuICAgIHRoaXMuYWRkTmV3VmFsdWUoaXRlbVZhbHVlKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBpZiAodGhpcy50eXBlICE9PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudGV4dEZpZWxkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vblVwZGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uT3B0aW9uUmVtb3ZlZChpbnB1dDogYW55LCBvcHRpb246IGFueSk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKGlucHV0LnNob3dQYW5lbCA9IGZhbHNlKSwgMCk7XG5cbiAgICBjb25zdCBmb3VuZFZhbHVlID0gdGhpcy52YWx1ZS5maW5kKCh2OiBhbnkpID0+IHYgPT09IG9wdGlvbik7XG5cbiAgICBpZiAoZm91bmRWYWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKCh2OiBhbnkpID0+IHYgIT09IG9wdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLk1VTFRJKSB7XG4gICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMub25VcGRhdGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGlmIChpbnB1dFZhbHVlLmxlbmd0aCA+PSB0aGlzLm1pbkNoYXJhY3RlcnNTZWFyY2gpIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQubmV4dChpbnB1dFZhbHVlKTtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZS5lbWl0KGlucHV0VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLm5leHQoJycpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgIHRoaXMudmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpID8gW10gOiAnJztcbiAgICB0aGlzLmlzT3ZlckxhcHBpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm92ZXJsYXBJbmRleCA9IDA7XG4gICAgdGhpcy5vblVwZGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZmlsbElucHV0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudHlwZSA9PT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiAhdGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUodGhpcy52YWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuICAgICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaW5wdXRWYWx1ZSAmJiB0aGlzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcgJztcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5wdXRGb2N1cyA9IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pc0lucHV0Rm9jdXMgPSB0cnVlO1xuXG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy5pbnB1dFZhbHVlKSA/IHRoaXMuaW5wdXRWYWx1ZVswXSA6IHRoaXMuaW5wdXRWYWx1ZTtcblxuICAgIGlmIChBdXRvY29tcGxldGVVdGlscy5pc1ByaW1pdGl2ZShpbnB1dFZhbHVlKSkge1xuICAgICAgaWYgKGlucHV0VmFsdWU/Lm1hdGNoKC9eXFxzKy9nbSkpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS50cmltU3RhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlucHV0VmFsdWVbdGhpcy50ZXh0RmllbGRdPy5tYXRjaCgvXlxccysvZ20pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWVbdGhpcy50ZXh0RmllbGRdLnRyaW1TdGFydCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tPdmVybGFwKGRlbGF5ID0gVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0FGVEVSX0FDVElPTik6IHZvaWQge1xuICAgIHRoaXMuaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNPdmVybGFwQ2hlY2tpbmcgPSB0cnVlO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dFdpZHRoID1cbiAgICAgICAgdGhpcy5tYXRGb3JtRmllbGRFbGVtZW50Py5fdGV4dEZpZWxkLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLSBQYWRkaW5nLkFVVE9DT01QTEVURV9DT05UQUlORVI7XG4gICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnZhbHVlLXRhZycpO1xuXG4gICAgICBpZiAodGFncykge1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuXG4gICAgICAgIHRhZ3MuZm9yRWFjaCgodGFnOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICB3aWR0aCArPSB0YWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNPdmVyTGFwcGluZyAmJiB3aWR0aCA+IGlucHV0V2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNPdmVyTGFwcGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXBJbmRleCA9IGluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNPdmVybGFwQ2hlY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblVwZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLm5leHQoJycpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlWzBdLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgZm91bmREdXBsaWNhdGUgPSBBdXRvY29tcGxldGVVdGlscy5maW5kRHVwbGljYXRlKHRoaXMudmFsdWUsIG5ld1ZhbHVlLCB0aGlzLnRleHRGaWVsZCk7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZm91bmREdXBsaWNhdGUgPyB0aGlzLnZhbHVlLmZpbHRlcigodjogYW55KSA9PiB2ICE9PSBmb3VuZER1cGxpY2F0ZSkgOiBbLi4udGhpcy52YWx1ZSwgbmV3VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICp0cmFuc2xvY289XCJsZXQgdFwiPlxuICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXdyYXBwZXJcIj5cbiAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgIFthcHBlYXJhbmNlXT1cIidvdXRsaW5lJ1wiXG4gICAgICAjbWF0Rm9ybUZpZWxkXG4gICAgICBbbmdDbGFzc109XCJ7ICdsYXJnZS1zaXplJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIlxuICAgID5cbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdGVkLWl0ZW1zXCJcbiAgICAgICAgICAjdGFnQ29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICh0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLkxBUkdFICYmIHRoaXMudmFsdWUpIHx8XG4gICAgICAgICAgICAoIShpbnB1dFZhbHVlICYmIHRoaXMuaXNJbnB1dEZvY3VzKSAmJiB0aGlzLnZhbHVlICYmIHR5cGUgIT09IGF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8dWktdGFnXG4gICAgICAgICAgICBjbGFzcz1cInZhbHVlLXRhZ1wiXG4gICAgICAgICAgICBbaWRdPVwiJ3VpLXRhZy0nICsgaVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWVJdGVtIG9mIHZhbHVlOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZUl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGRcIlxuICAgICAgICAgICAgW2FsbG93Q2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc092ZXJMYXBwaW5nICYmIGkgPj0gb3ZlcmxhcEluZGV4ID8gJ25vbmUnIDogJ2Jsb2NrJ1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdvdmVybGFwLXRhZyc6IGlzT3ZlcmxhcENoZWNraW5nICYmIG92ZXJsYXBJbmRleCAmJiBpID49IG92ZXJsYXBJbmRleCAmJiB0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIChjbG9zZSk9XCJvbk9wdGlvblJlbW92ZWQoYXV0b2NvbXBsZXRlLCB2YWx1ZUl0ZW0pXCJcbiAgICAgICAgICA+PC91aS10YWc+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3ZlckxhcHBpbmdcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhb3ZlcmxhcEluZGV4OyBlbHNlIG92ZXJsYXBUYWdcIiBjbGFzcz1cIm92ZXJsYXAtY291bnRcIj5cbiAgICAgICAgICAgICAge3sgdCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnU0VMRUNURURfQU1PVU5UJywgeyBudW1iZXJTZWxlY3RlZDogKHZhbHVlIHwgc2xpY2U6IG92ZXJsYXBJbmRleCkubGVuZ3RoIH0pIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3ZlcmxhcFRhZz5cbiAgICAgICAgICAgICAgPHVpLXRhZyBbcmVhZE9ubHldPVwidHJ1ZVwiIFtsYWJlbF09XCInKycgKyAodmFsdWUgfCBzbGljZTogb3ZlcmxhcEluZGV4KS5sZW5ndGhcIj48L3VpLXRhZz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2V0LW1hcmdpbic6IHRoaXMudmFsdWUgJiYgdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSB9XCJcbiAgICAgICAgICAoYmx1cik9XCJyZWZpbGxJbnB1dCgpXCJcbiAgICAgICAgICAoZm9jdXNpbik9XCJvbkZvY3VzKClcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8dWktaWNvblxuICAgICAgICBjbGFzcz1cInJlbW92ZS1zZWxlY3RlZFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2xhcmdlLWlucHV0LWljb24nOiB0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLkxBUkdFIH1cIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhcigpXCJcbiAgICAgICAgKm5nSWY9XCJpbnB1dFZhbHVlIHx8IHZhbHVlPy5sZW5ndGhcIlxuICAgICAgICBbc2l6ZV09XCInMjQnXCJcbiAgICAgICAgW25hbWVdPVwiJ0Nsb3NlJ1wiXG4gICAgICA+PC91aS1pY29uPlxuXG4gICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAjYXV0b2NvbXBsZXRlXG4gICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICBbaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcl09XCJmYWxzZVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHNlYXJjaFJlc3VsdCQgfCBhc3luYylcIj5cbiAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCJ0KHRyYW5zbGF0aW9uQ29udGV4dCArICdTVUdHRVNURUQnKVwiICpuZ0lmPVwic3VnZ2VzdGlvbnNMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogc3VnZ2VzdGVkIHwgaW5jbHVkZXM6IHZhbHVlIH1cIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkIG9mIHN1Z2dlc3Rpb25zTGlzdFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdWdnZXN0ZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJpbnB1dFZhbHVlXCI+e3sgc3VnZ2VzdGVkIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8dWktaWNvbiBbbmFtZV09XCInQ2hlY2snXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuXG4gICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwidCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnU0VMRUNURUQnKSB8IHVwcGVyY2FzZVwiICpuZ0lmPVwidmFsdWU/Lmxlbmd0aCAmJiB0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRVwiPlxuICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSB9XCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmFsdWVcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDx1aS1pY29uIFtuYW1lXT1cIidDaGVjaydcIj48L3VpLWljb24+XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0JCB8IGFzeW5jIGFzIGZpbHRlcmVkU3VnZ2VzdGlvbkxpc3RcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyZWRJdGVtc0xpc3QkIHwgYXN5bmMgYXMgZmlsdGVyZWRJdGVtc0xpc3RcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cInQodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NVR0dFU1RFRCcpIHwgdXBwZXJjYXNlXCIgKm5nSWY9XCJmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgfVwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwiaW5wdXRWYWx1ZVwiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHVpLWljb24gW25hbWVdPVwiJ0NoZWNrJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGg7IGVsc2Ugc2hvd0l0ZW1MaXN0V2l0aEdyb3VwXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSB9XCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zTGlzdFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwiaW5wdXRWYWx1ZVwiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHVpLWljb24gW25hbWVdPVwiJ0NoZWNrJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0l0ZW1MaXN0V2l0aEdyb3VwPlxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCJ0KHRyYW5zbGF0aW9uQ29udGV4dCArICdBTExfSVRFTVMnKSB8IHVwcGVyY2FzZVwiICpuZ0lmPVwiZmlsdGVyZWRJdGVtc0xpc3QubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgfVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwiaW5wdXRWYWx1ZVwiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbbmFtZV09XCInQ2hlY2snXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpbHRlcmVkSXRlbXNMaXN0Lmxlbmd0aCAmJiAhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGggJiYgaW5wdXRWYWx1ZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsb3dBZGQ7IGVsc2Ugbm90Rm91bmRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaW5wdXRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnQ09NTU9OLkFERCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtc3VnZ2VzdGlvblwiPlwie3sgaW5wdXRWYWx1ZSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZD5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiJ25vbmUnXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0KHRyYW5zbGF0aW9uQ29udGV4dCArICdOT19SRVNVTFRTX0ZPVU5EJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=