@entake/particle 18.0.5 → 19.0.1

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 (207) hide show
  1. package/LICENSE +7 -7
  2. package/app/{modules → shared/components}/accordion/accordion.component.d.ts +3 -3
  3. package/app/{modules/date-picker → shared}/components/calendar/calendar.component.d.ts +7 -12
  4. package/app/{modules → shared/components}/checkbox/checkbox.component.d.ts +5 -7
  5. package/app/{modules → shared/components}/color-picker/color-picker.component.d.ts +3 -9
  6. package/app/{modules → shared/components}/date-picker/date-picker.component.d.ts +20 -26
  7. package/app/{modules/date-picker → shared}/components/date-range-picker/date-range-picker.component.d.ts +10 -11
  8. package/app/{modules → shared/components}/dialog/dialog.component.d.ts +16 -24
  9. package/app/{modules → shared/components}/dropdown/dropdown.component.d.ts +12 -14
  10. package/app/{modules/icons/components → shared/components/icon-select}/icon-select.component.d.ts +14 -17
  11. package/app/{modules → shared/components}/idle-timeout/idle-timeout.component.d.ts +3 -4
  12. package/app/{modules → shared/components}/input-mask/input-mask.component.d.ts +6 -7
  13. package/app/shared/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
  14. package/app/shared/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
  15. package/app/{modules/loader/components → shared/components/loader}/loader.component.d.ts +2 -2
  16. package/app/{modules → shared/components}/multi-select/multi-select.component.d.ts +18 -24
  17. package/app/{modules → shared/components}/notification/notification.component.d.ts +5 -13
  18. package/app/{modules → shared/components}/paginator/paginator.component.d.ts +12 -11
  19. package/app/{modules → shared/components}/popover/popover.component.d.ts +10 -15
  20. package/app/{modules → shared/components}/profile-pic/profile-pic.component.d.ts +1 -1
  21. package/app/shared/components/progress-bar/progress-bar.component.d.ts +15 -0
  22. package/app/{modules → shared/components}/rich-text/rich-text.component.d.ts +11 -12
  23. package/app/shared/components/scroll-to-top/scroll-to-top.component.d.ts +18 -0
  24. package/app/shared/components/slideover/slideover.component.d.ts +35 -0
  25. package/app/{modules → shared/components}/slider/slider.component.d.ts +8 -22
  26. package/app/{modules → shared/components}/toggle-switch/toggle-switch.component.d.ts +4 -6
  27. package/app/{modules → shared/components}/week-picker/week-picker.component.d.ts +21 -22
  28. package/app/{modules/accordion → shared}/directives/accordion-content.directive.d.ts +1 -2
  29. package/app/{modules/accordion → shared}/directives/accordion-header.directive.d.ts +1 -2
  30. package/app/{modules/accordion → shared}/directives/accordion-item.directive.d.ts +1 -1
  31. package/app/{modules/background-carousel → shared/directives}/background-carousel.directive.d.ts +4 -4
  32. package/app/{modules/keyfilter → shared/directives}/keyfilter.directive.d.ts +1 -7
  33. package/app/{modules/tooltip → shared/directives}/tooltip.directive.d.ts +3 -9
  34. package/app/shared/models/carousel-options.model.d.ts +21 -0
  35. package/app/shared/models/pagination-event.model.d.ts +8 -0
  36. package/app/shared/models/particle-component-text.model.d.ts +2 -24
  37. package/app/{modules/icons → shared}/models/particle-icons-solid.model.d.ts +6 -6
  38. package/app/shared/modules/icons/particle-icons.module.d.ts +7 -0
  39. package/app/{modules/ordinal-number-pipe → shared/pipes}/ordinal-number.pipe.d.ts +1 -1
  40. package/app/shared/services/base-data.service.d.ts +2 -2
  41. package/app/shared/services/dialog.service.d.ts +1 -1
  42. package/app/{modules/notification → shared}/services/notification.service.d.ts +0 -4
  43. package/app/{modules/theming → shared}/services/theming.service.d.ts +0 -19
  44. package/fesm2022/entake-particle.mjs +4026 -5721
  45. package/fesm2022/entake-particle.mjs.map +1 -1
  46. package/package.json +16 -25
  47. package/public_api.d.ts +47 -82
  48. package/app/modules/accordion/accordion.module.d.ts +0 -11
  49. package/app/modules/background-carousel/carousel-options.model.d.ts +0 -30
  50. package/app/modules/background-carousel/particle-background-carousel.module.d.ts +0 -8
  51. package/app/modules/checkbox/checkbox.module.d.ts +0 -9
  52. package/app/modules/color-picker/color-picker.module.d.ts +0 -9
  53. package/app/modules/date-picker/date-picker.module.d.ts +0 -15
  54. package/app/modules/dialog/dialog.module.d.ts +0 -9
  55. package/app/modules/dropdown/dropdown.module.d.ts +0 -9
  56. package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +0 -46
  57. package/app/modules/endpoint-state/endpoint-state.module.d.ts +0 -8
  58. package/app/modules/icons/particle-icons.module.d.ts +0 -13
  59. package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +0 -9
  60. package/app/modules/input-mask/input-mask.module.d.ts +0 -8
  61. package/app/modules/keyfilter/keyfilter.module.d.ts +0 -8
  62. package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +0 -27
  63. package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +0 -23
  64. package/app/modules/layout/layout.module.d.ts +0 -10
  65. package/app/modules/loader/loader.module.d.ts +0 -8
  66. package/app/modules/multi-select/multi-select.module.d.ts +0 -8
  67. package/app/modules/notification/notification.module.d.ts +0 -8
  68. package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +0 -8
  69. package/app/modules/paginator/pagination-event.model.d.ts +0 -24
  70. package/app/modules/paginator/particle-paginator.module.d.ts +0 -13
  71. package/app/modules/popover/popover.module.d.ts +0 -9
  72. package/app/modules/profile-pic/particle-profile-pic.module.d.ts +0 -9
  73. package/app/modules/progress-bar/progress-bar.component.d.ts +0 -16
  74. package/app/modules/progress-bar/progress-bar.module.d.ts +0 -8
  75. package/app/modules/push-container/particle-push-container.module.d.ts +0 -9
  76. package/app/modules/push-container/push-container-state.model.d.ts +0 -7
  77. package/app/modules/push-container/push-container.component.d.ts +0 -137
  78. package/app/modules/rich-text/particle-rich-text.module.d.ts +0 -15
  79. package/app/modules/rich-text/render-rich-text.component.d.ts +0 -6
  80. package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +0 -8
  81. package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +0 -19
  82. package/app/modules/slideover/particle-slideover.module.d.ts +0 -8
  83. package/app/modules/slideover/slideover.component.d.ts +0 -35
  84. package/app/modules/slider/slider.module.d.ts +0 -9
  85. package/app/modules/theming/components/theming.component.d.ts +0 -43
  86. package/app/modules/theming/theming.module.d.ts +0 -12
  87. package/app/modules/toggle-switch/toggle-switch.module.d.ts +0 -8
  88. package/app/modules/tooltip/tooltip.module.d.ts +0 -8
  89. package/app/modules/week-picker/week-picker.module.d.ts +0 -13
  90. package/app/shared/enums/endpoint-status.enum.d.ts +0 -9
  91. package/esm2022/app/modules/accordion/accordion.component.mjs +0 -101
  92. package/esm2022/app/modules/accordion/accordion.module.mjs +0 -37
  93. package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +0 -17
  94. package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +0 -17
  95. package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +0 -36
  96. package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +0 -91
  97. package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +0 -36
  98. package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +0 -24
  99. package/esm2022/app/modules/checkbox/checkbox.component.mjs +0 -108
  100. package/esm2022/app/modules/checkbox/checkbox.module.mjs +0 -28
  101. package/esm2022/app/modules/color-picker/color-picker.component.mjs +0 -306
  102. package/esm2022/app/modules/color-picker/color-picker.module.mjs +0 -19
  103. package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +0 -496
  104. package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +0 -250
  105. package/esm2022/app/modules/date-picker/date-picker.component.mjs +0 -538
  106. package/esm2022/app/modules/date-picker/date-picker.module.mjs +0 -56
  107. package/esm2022/app/modules/dialog/dialog.component.mjs +0 -177
  108. package/esm2022/app/modules/dialog/dialog.module.mjs +0 -28
  109. package/esm2022/app/modules/dropdown/dropdown.component.mjs +0 -682
  110. package/esm2022/app/modules/dropdown/dropdown.module.mjs +0 -28
  111. package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +0 -2
  112. package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +0 -2
  113. package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +0 -75
  114. package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +0 -22
  115. package/esm2022/app/modules/icons/components/icon-select.component.mjs +0 -376
  116. package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +0 -471
  117. package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +0 -166
  118. package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +0 -1016
  119. package/esm2022/app/modules/icons/models/particle-icons-brands.model.mjs +0 -24
  120. package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +0 -50
  121. package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +0 -89
  122. package/esm2022/app/modules/icons/particle-icons.module.mjs +0 -66
  123. package/esm2022/app/modules/icons/services/icons.service.mjs +0 -82
  124. package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +0 -85
  125. package/esm2022/app/modules/idle-timeout/idle-timer.mjs +0 -66
  126. package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +0 -28
  127. package/esm2022/app/modules/input-mask/input-mask.component.mjs +0 -594
  128. package/esm2022/app/modules/input-mask/input-mask.module.mjs +0 -18
  129. package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +0 -174
  130. package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +0 -18
  131. package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +0 -81
  132. package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +0 -67
  133. package/esm2022/app/modules/layout/layout.module.mjs +0 -33
  134. package/esm2022/app/modules/loader/components/loader.component.mjs +0 -30
  135. package/esm2022/app/modules/loader/loader.module.mjs +0 -24
  136. package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +0 -2
  137. package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +0 -2
  138. package/esm2022/app/modules/multi-select/multi-select.component.mjs +0 -665
  139. package/esm2022/app/modules/multi-select/multi-select.module.mjs +0 -18
  140. package/esm2022/app/modules/notification/models/notification.model.mjs +0 -2
  141. package/esm2022/app/modules/notification/notification.component.mjs +0 -122
  142. package/esm2022/app/modules/notification/notification.module.mjs +0 -18
  143. package/esm2022/app/modules/notification/services/notification.service.mjs +0 -84
  144. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +0 -20
  145. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +0 -49
  146. package/esm2022/app/modules/paginator/pagination-event.model.mjs +0 -29
  147. package/esm2022/app/modules/paginator/paginator.component.mjs +0 -207
  148. package/esm2022/app/modules/paginator/particle-paginator.module.mjs +0 -48
  149. package/esm2022/app/modules/popover/popover.component.mjs +0 -352
  150. package/esm2022/app/modules/popover/popover.module.mjs +0 -24
  151. package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +0 -28
  152. package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +0 -75
  153. package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +0 -43
  154. package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +0 -24
  155. package/esm2022/app/modules/push-container/particle-push-container.module.mjs +0 -26
  156. package/esm2022/app/modules/push-container/push-container-state.model.mjs +0 -2
  157. package/esm2022/app/modules/push-container/push-container.component.mjs +0 -363
  158. package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +0 -64
  159. package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +0 -18
  160. package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +0 -2
  161. package/esm2022/app/modules/rich-text/rich-text.component.mjs +0 -209
  162. package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +0 -24
  163. package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +0 -49
  164. package/esm2022/app/modules/slideover/particle-slideover.module.mjs +0 -24
  165. package/esm2022/app/modules/slideover/slideover.component.mjs +0 -115
  166. package/esm2022/app/modules/slider/slider.component.mjs +0 -243
  167. package/esm2022/app/modules/slider/slider.module.mjs +0 -26
  168. package/esm2022/app/modules/theming/components/theming.component.mjs +0 -86
  169. package/esm2022/app/modules/theming/models/theme.model.mjs +0 -9
  170. package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +0 -38
  171. package/esm2022/app/modules/theming/services/theming.service.mjs +0 -510
  172. package/esm2022/app/modules/theming/theming.module.mjs +0 -55
  173. package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +0 -2
  174. package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +0 -107
  175. package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +0 -24
  176. package/esm2022/app/modules/tooltip/tooltip.directive.mjs +0 -381
  177. package/esm2022/app/modules/tooltip/tooltip.module.mjs +0 -18
  178. package/esm2022/app/modules/week-picker/week-picker.component.mjs +0 -511
  179. package/esm2022/app/modules/week-picker/week-picker.module.mjs +0 -40
  180. package/esm2022/app/shared/enums/endpoint-status.enum.mjs +0 -11
  181. package/esm2022/app/shared/interceptors/json.interceptor.mjs +0 -23
  182. package/esm2022/app/shared/models/auditable.model.mjs +0 -2
  183. package/esm2022/app/shared/models/data-list.model.mjs +0 -2
  184. package/esm2022/app/shared/models/id.model.mjs +0 -2
  185. package/esm2022/app/shared/models/observable-container.mjs +0 -15
  186. package/esm2022/app/shared/models/particle-component-text.model.mjs +0 -2
  187. package/esm2022/app/shared/services/base-data.service.mjs +0 -190
  188. package/esm2022/app/shared/services/dialog.service.mjs +0 -50
  189. package/esm2022/app/shared/services/local-storage.service.mjs +0 -60
  190. package/esm2022/entake-particle.mjs +0 -5
  191. package/esm2022/public_api.mjs +0 -98
  192. /package/app/{modules/dropdown → shared}/models/dropdown-option-group.model.d.ts +0 -0
  193. /package/app/{modules/dropdown → shared}/models/dropdown-option.model.d.ts +0 -0
  194. /package/app/{modules/icons → shared}/models/fontawesome-icons-brands.model.d.ts +0 -0
  195. /package/app/{modules/icons → shared}/models/fontawesome-icons-regular.model.d.ts +0 -0
  196. /package/app/{modules/icons → shared}/models/fontawesome-icons-solid.model.d.ts +0 -0
  197. /package/app/{modules/multi-select → shared}/models/multi-select-option-group.model.d.ts +0 -0
  198. /package/app/{modules/multi-select → shared}/models/multi-select-option.model.d.ts +0 -0
  199. /package/app/{modules/notification → shared}/models/notification.model.d.ts +0 -0
  200. /package/app/{modules/icons → shared}/models/particle-icons-brands.model.d.ts +0 -0
  201. /package/app/{modules/icons → shared}/models/particle-icons-regular.model.d.ts +0 -0
  202. /package/app/{modules/rich-text → shared/models}/rich-text-capabilities.model.d.ts +0 -0
  203. /package/app/{modules/theming → shared}/models/theme.model.d.ts +0 -0
  204. /package/app/{modules/toggle-switch → shared}/models/toggle-options.model.d.ts +0 -0
  205. /package/app/{modules/icons → shared}/services/icons.service.d.ts +0 -0
  206. /package/app/{modules/idle-timeout → shared/services}/idle-timer.d.ts +0 -0
  207. /package/app/{modules/theming → shared}/services/theme-change-detection.service.d.ts +0 -0
@@ -1,376 +0,0 @@
1
- import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
4
- import { map, tap, withLatestFrom } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../services/icons.service";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "@angular/forms";
9
- import * as i4 from "../../tooltip/tooltip.directive";
10
- import * as i5 from "../../dialog/dialog.component";
11
- import * as i6 from "../../endpoint-state/components/endpoint-state.component";
12
- /**
13
- * Particle Icon Select component provides a button and an icon picker that includes all of the Particle Icons as well as the FAS icons.
14
- */
15
- export class IconSelectComponent {
16
- service;
17
- changeDetectorRef;
18
- /**
19
- * The number of items to display per page
20
- * @private
21
- */
22
- static PAGE_SIZE = 48;
23
- /**
24
- * Set the value of the icon select
25
- * @param value the value to set
26
- */
27
- set value(value) {
28
- this._value = value;
29
- if (value) {
30
- const [prefix, name] = value.split(' ');
31
- this._internalValue.next({ prefix, name });
32
- this.showIconSelectionPreview = true;
33
- }
34
- }
35
- /**
36
- * Set disabled
37
- * @param disabled whether or not the icon picker should be disabled
38
- */
39
- set disabled(disabled) {
40
- this._disabled = disabled;
41
- }
42
- /**
43
- * Color class of the button
44
- */
45
- buttonColorClass = null;
46
- /**
47
- * The value to set to the button's width, min-width, height and min-height
48
- */
49
- buttonSizing = '40px';
50
- text = {
51
- selectAnIcon: 'Select an Icon',
52
- seeAllIcons: 'See All Icons',
53
- fontAwesomeIcons: 'Font Awesome Icons',
54
- all: 'All',
55
- solid: 'Solid',
56
- regular: 'Regular',
57
- brands: 'Brands',
58
- customIcons: 'Custom Icons',
59
- previousPage: 'Previous Page',
60
- nextPage: 'Next Page',
61
- searchIcons: 'Search Icons',
62
- submitSearch: 'Submit Search',
63
- clearResults: 'Clear Results',
64
- couldntFindAnything: 'We couldn\'t find anything',
65
- modifySearchCriteria: 'Please try modifying your search criteria',
66
- selection: 'Selection',
67
- confirm: 'Confirm',
68
- select: 'Select',
69
- close: 'Close'
70
- };
71
- /**
72
- * Icon select opened event emitter
73
- */
74
- opened = new EventEmitter();
75
- /**
76
- * Icon selected event emitter
77
- */
78
- selected = new EventEmitter();
79
- /**
80
- * Dialog closed event emitter
81
- */
82
- closed = new EventEmitter();
83
- /**
84
- * The scrollable icon container
85
- */
86
- iconScrollContainer = null;
87
- /**
88
- * BehaviorSubject tracking the input value destructed into its prefix and class name
89
- */
90
- _internalValue = new BehaviorSubject(null);
91
- /**
92
- * BehaviorSubject tracking the current filter value selection for icons
93
- */
94
- _filter = new BehaviorSubject({ style: 'all', type: 'all' });
95
- /**
96
- * BehaviorSubject tracking the current icon search text value
97
- */
98
- _searchText = new BehaviorSubject('');
99
- /**
100
- * BehaviorSubject that emits when search button has been clicked
101
- */
102
- _searchClick = new BehaviorSubject('');
103
- /**
104
- * BehaviorSubject tracking the active pagination page
105
- */
106
- _activePage = new BehaviorSubject(0);
107
- /**
108
- * Subject that emits on search input enter keyup
109
- */
110
- _searchInputEnterKeyup = new Subject();
111
- /**
112
- * An array of all icons (as strings) that meet the current filter/search criteria as an Observable
113
- * @private
114
- */
115
- icons$ = combineLatest([
116
- this._filter,
117
- this._searchClick
118
- ]).pipe(map(([filter, searchText]) => this.service.getIcons(filter.type, filter.style, searchText)));
119
- /**
120
- * The count of total paginator pages as an Observable
121
- */
122
- totalPages$ = this.icons$.pipe(map(icons => icons.length
123
- ? Math.ceil(icons.length / IconSelectComponent.PAGE_SIZE)
124
- : 0));
125
- /**
126
- * Observable boolean indicating whether or not the user can perform an icon text search
127
- */
128
- canSearch$ = this._searchText.pipe(map(searchText => !!searchText.trim().length));
129
- /**
130
- * Observable boolean indicating whether or not the user can paginate to the previous page
131
- */
132
- canPaginatePrevious$ = this._activePage.pipe(map(activePage => activePage > 0));
133
- /**
134
- * Observable boolean indicating whether or not the user can paginate to the next page
135
- */
136
- canPaginateNext$ = this.totalPages$.pipe(withLatestFrom(this._activePage), map(([totalPages, activePage]) => activePage < (totalPages - 1)));
137
- /**
138
- * Paginated icons array as an Observable
139
- */
140
- paginatedIcons$ = combineLatest([
141
- this._activePage,
142
- this.icons$
143
- ]).pipe(map(([activePage, icons]) => {
144
- let paginatedIcons = null;
145
- if (activePage >= 0 && icons.length) {
146
- paginatedIcons = icons.slice(IconSelectComponent.PAGE_SIZE * activePage, IconSelectComponent.PAGE_SIZE * (activePage + 1));
147
- }
148
- return paginatedIcons;
149
- }), tap(() => {
150
- if (this.iconScrollContainer) {
151
- this.iconScrollContainer.nativeElement.scrollTop = 0;
152
- }
153
- }));
154
- /**
155
- * Object that controls whether to show the dialog or not
156
- */
157
- showDialog;
158
- /**
159
- * Whether or not to show the icon selection preview
160
- */
161
- showIconSelectionPreview = false;
162
- /**
163
- * Subscription object to store search input enter keyup subscription
164
- * @private
165
- */
166
- subscription;
167
- /**
168
- * The value of the icon select
169
- * @private
170
- */
171
- _value = null;
172
- /**
173
- * Whether or not the icon picker is disabled
174
- * @private
175
- */
176
- _disabled = false;
177
- /**
178
- * Function to call on change
179
- */
180
- onChange = () => { };
181
- /**
182
- * Function to call on touch
183
- */
184
- onTouched = () => { };
185
- /**
186
- * Dependency injection site
187
- * @param service the IconsService
188
- * @param changeDetectorRef the Angular ChangeDetectorRef
189
- */
190
- constructor(service, changeDetectorRef) {
191
- this.service = service;
192
- this.changeDetectorRef = changeDetectorRef;
193
- this.subscription = this._searchInputEnterKeyup.pipe(withLatestFrom(this.canSearch$)).subscribe(([___, canSearch]) => {
194
- if (canSearch) {
195
- this._searchClick.next(this._searchText.getValue());
196
- this._activePage.next(0);
197
- }
198
- });
199
- }
200
- /**
201
- * Get disabled
202
- */
203
- get disabled() {
204
- return this._disabled;
205
- }
206
- /**
207
- * Destroy component, unsubscribe from search input enter keyup subscription
208
- */
209
- ngOnDestroy() {
210
- this.subscription.unsubscribe();
211
- }
212
- /**
213
- * Write the input value
214
- * @param value the value to write
215
- */
216
- writeValue(value) {
217
- this.value = value;
218
- this.changeDetectorRef.markForCheck();
219
- }
220
- /**
221
- * Register onChange function
222
- * @param fn the function to register
223
- */
224
- registerOnChange(fn) {
225
- this.onChange = fn;
226
- }
227
- /**
228
- * Register onTouched function
229
- * @param fn the function to register
230
- */
231
- registerOnTouched(fn) {
232
- this.onTouched = fn;
233
- }
234
- /**
235
- * Set disabled state
236
- * @param isDisabled whether or not the icon picker should be disabled
237
- */
238
- setDisabledState(isDisabled) {
239
- this.disabled = isDisabled;
240
- this.changeDetectorRef.markForCheck();
241
- }
242
- /**
243
- * Open the icon select dialog
244
- */
245
- openDialog() {
246
- if (!this.disabled) {
247
- this.reset();
248
- this.showDialog = {};
249
- this.opened.emit();
250
- if (this.value) {
251
- this.showIconSelectionPreview = true;
252
- }
253
- }
254
- }
255
- /**
256
- * Close the icon select dialog
257
- */
258
- closeDialog() {
259
- let internalValue = null;
260
- if (this._value) {
261
- const [prefix, name] = this._value.split(' ');
262
- internalValue = { prefix, name };
263
- }
264
- this._internalValue.next(internalValue);
265
- this.showDialog = null;
266
- this.closed.emit();
267
- }
268
- /**
269
- * Handle filter select
270
- * @param filter the selected filter
271
- */
272
- handleFilterSelect(filter) {
273
- this._filter.next(filter);
274
- this._activePage.next(0);
275
- }
276
- /**
277
- * Update internal value on icon select
278
- * @param icon the selected icon
279
- */
280
- handleIconSelect(icon) {
281
- this._internalValue.next(icon);
282
- this.showIconSelectionPreview = false;
283
- setTimeout(() => this.showIconSelectionPreview = true);
284
- }
285
- /**
286
- * Write value on confirm
287
- */
288
- handleIconSelectConfirm() {
289
- const icon = this._internalValue.getValue();
290
- this.updateModel(`${icon.prefix} ${icon.name}`);
291
- this.closeDialog();
292
- }
293
- /**
294
- * Go to the next pagination page
295
- */
296
- paginateNext() {
297
- this._activePage.next(this._activePage.getValue() + 1);
298
- }
299
- /**
300
- * Go to the previous pagination page
301
- */
302
- paginatePrevious() {
303
- this._activePage.next(this._activePage.getValue() - 1);
304
- }
305
- /**
306
- * Clear search text and reset paginator
307
- */
308
- clearSearch() {
309
- this._searchText.next('');
310
- this._searchClick.next('');
311
- this._activePage.next(0);
312
- }
313
- /**
314
- * Update model
315
- * @param value the new value of the model
316
- * @private
317
- */
318
- updateModel(value) {
319
- const valueBeforeUpdate = this._value;
320
- if (!this.disabled) {
321
- this.value = value;
322
- if (valueBeforeUpdate !== this._value) {
323
- this.onChange(this._value);
324
- }
325
- this.selected.emit({ value: this._value });
326
- }
327
- }
328
- /**
329
- * Reset filtering/pagination BehaviorSubject values
330
- * @private
331
- */
332
- reset() {
333
- this._filter.next({ style: 'all', type: 'all' });
334
- this._searchText.next('');
335
- this._searchClick.next('');
336
- this._activePage.next(0);
337
- }
338
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: IconSelectComponent, deps: [{ token: i1.IconsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
339
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: IconSelectComponent, selector: "particle-icon-select", inputs: { value: "value", disabled: "disabled", buttonColorClass: "buttonColorClass", buttonSizing: "buttonSizing", text: "text" }, outputs: { opened: "opened", selected: "selected", closed: "closed" }, providers: [
340
- {
341
- provide: NG_VALUE_ACCESSOR,
342
- useExisting: forwardRef(() => IconSelectComponent),
343
- multi: true
344
- }
345
- ], viewQueries: [{ propertyName: "iconScrollContainer", first: true, predicate: ["iconScrollContainer"], descendants: true }], ngImport: i0, template: "<!-- choose button -->\r\n<button [ngClass]=\"buttonColorClass ? buttonColorClass : 'content_color'\"\r\n [ngStyle]=\"{\r\n 'width': buttonSizing,\r\n 'min-width': buttonSizing,\r\n 'height': buttonSizing,\r\n 'min-height': buttonSizing\r\n }\"\r\n (click)=\"openDialog()\"\r\n [particleTooltip]=\"(_internalValue | async)?.prefix + ' ' + (_internalValue | async)?.name\"\r\n [tooltipDisabled]=\"(_internalValue | async) === undefined\"\r\n [disabled]=\"disabled\"\r\n class=\"access wis_button bg_overlay brdr brad_3\"\r\n [attr.aria-label]=\"text.selectAnIcon\">\r\n <ng-container *ngIf=\"!showDialog else placeholderIcon\">\r\n <div *ngIf=\"_internalValue | async as selectedIcon else noSelection\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} wis_icon\"></i>\r\n </div>\r\n <ng-template #noSelection>\r\n <div><i class=\"fas fa-icons opacity_20\"></i></div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderIcon>\r\n <div><i class=\"fas fa-spinner fa-spin\"></i></div>\r\n </ng-template>\r\n</button>\r\n\r\n<!-- TODO: at some point, maybe implement infinite scroll to icons -->\r\n\r\n<!-- picker dialog -->\r\n<particle-dialog [title]=\"text.selectAnIcon\"\r\n [object]=\"showDialog\"\r\n [width]=\"'850px'\"\r\n [height]=\"'500px'\"\r\n (closed)=\"closeDialog()\">\r\n <div class=\"row height100\">\r\n\r\n <!-- FILTERS -->\r\n <div class=\"col min_w250 bg_overlay brdr border_right mobile_hide\">\r\n <div class=\"row_block width100\">\r\n <ng-container *ngIf=\"_filter | async as filter\">\r\n <!-- all icons -->\r\n <div class=\"mar_5 pad_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'all' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'all' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.seeAllIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'all' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.seeAllIcons}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- fontawesome icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.fontAwesomeIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.all}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.solid}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.regular}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'brands', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'brands' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.brands + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'brands'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.brands}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- custom icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.customIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">All</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.solid}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.regular}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'brands', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'brands' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.brands + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'brands'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.brands}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- ICONS -->\r\n <div class=\"col size_2 column\">\r\n <div class=\"col content_color_dark_1 pad_x5\">\r\n <!-- paginator -->\r\n <div *ngIf=\"totalPages$ | async as totalPages\"\r\n class=\"col v_center mar_10\">\r\n <button *ngIf=\"canPaginatePrevious$ | async else disabledPreviousButton\"\r\n (click)=\"paginatePrevious()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n <ng-template #disabledPreviousButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n </ng-template>\r\n <div\r\n class=\"text sm bolder center\"\r\n style=\"min-width:65px;\">\r\n {{(_activePage | async)! + 1}} / {{totalPages}}\r\n </div>\r\n <button *ngIf=\"canPaginateNext$ | async else disabledNextButton\"\r\n (click)=\"paginateNext()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n <ng-template #disabledNextButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n <!-- search -->\r\n <div class=\"col size_1 wis_search mar_10\">\r\n <input #iconSearchInput\r\n [ngModel]=\"_searchText | async\"\r\n (input)=\"_searchText.next(iconSearchInput.value)\"\r\n (keyup.enter)=\"_searchInputEnterKeyup.next($any(null))\"\r\n class=\"access input md bg_overlay brdr content_color\"\r\n [attr.aria-label]=\"text.searchIcons\" [placeholder]=\"text.searchIcons + '...'\" />\r\n <button *ngIf=\"(canSearch$ | async) && (_searchClick | async)\"\r\n (click)=\"clearSearch()\" aria-label=\"Clear search\"\r\n class=\"access btn circle_18px overlay wis_clear_btn\">\r\n <span class=\"icon grow\"><i class=\"fas fa-times fa-sm\"></i></span>\r\n </button>\r\n <button *ngIf=\"canSearch$ | async else disabledSearchButton\"\r\n (click)=\"_searchClick.next(iconSearchInput.value); _activePage.next(0)\"\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n <ng-template #disabledSearchButton>\r\n <button disabled\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- icons -->\r\n <div #iconScrollContainer class=\"col size_1 top_left scroll_y pad_5\" style=\"scroll-behavior: smooth\">\r\n <ng-container *ngIf=\"paginatedIcons$ | async as icons else noResults\">\r\n <div class=\"row wrap top_left\" style=\"align-items:stretch;\">\r\n <ng-container *ngFor=\"let icon of paginatedIcons$ | async\">\r\n <div class=\"col size_1 min_w75 mar_5\">\r\n <button class=\"access wis_icon_btn\" (click)=\"handleIconSelect(icon)\" [attr.aria-label]=\"text.select + ' ' + icon.name\">\r\n <div [ngClass]=\"((_internalValue | async)?.prefix === icon.prefix) && ((_internalValue | async)?.name === icon.name) ? 'ok_button_color' : 'content_color'\"\r\n class=\"wis_icon_btn_preview square_50px brad_3 bg_overlay brdr mar_bot5\">\r\n <i class=\"{{icon.prefix}} {{icon.name}}\"></i>\r\n </div>\r\n <div class=\"text sm center faded\">{{icon.name}}</div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noResults>\r\n <div class=\"row column min_h300 center_center\">\r\n <particle-endpoint-state\r\n [empty]=\"true\"\r\n [emptyIcon]=\"'fas fa-search fa-3x mar_bot5'\"\r\n [text]=\"{emptyText: text.couldntFindAnything, emptySubtext: text.modifySearchCriteria}\">\r\n </particle-endpoint-state>\r\n <button class=\"access btnset clear mar_10\"\r\n [attr.aria-label]=\"text.close\"\r\n (click)=\"clearSearch()\">\r\n <div class=\"circle_20px ptl_brdr_color ptl_brdr_size ptl_input_bg_color\">\r\n <i class=\"fas fa-times\"></i>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"_internalValue | async as selectedIcon\"\r\n class=\"col space_between bg_overlay brdr border_top pad_x5 wis_selection_bar\">\r\n <div class=\"col v_center mar_10\">\r\n <div class=\"text md faded mar_right10 mobile_hide\">{{text.selection}}:</div>\r\n <div class=\"v_center\" *ngIf=\"showIconSelectionPreview\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} fa-fw mar_right5\" style=\"font-size:16px;\"></i>\r\n <div class=\"text md bold\">{{selectedIcon.prefix}} {{selectedIcon.name}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col v_center mar_10\">\r\n <button\r\n type=\"button\"\r\n class=\"access btnset spaced md hov_glow save_button_color ptl_brdr_radius\"\r\n [attr.aria-label]=\"text.confirm\"\r\n (click)=\"handleIconSelectConfirm()\"\r\n >\r\n <div>{{text.confirm}}</div>\r\n <div class=\"brdr border_left mar_left10 pad_left10\"><i class=\"fas fa-check\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-dialog>\r\n", styles: [".wis_button{width:40px;min-width:40px;height:40px;min-height:40px;cursor:pointer;transition:all .1s ease}.wis_button:disabled{cursor:default;opacity:1!important}.wis_button:hover:not(:disabled){filter:brightness(1.05)}.wis_button svg{transition:transform .1s ease}.wis_button:hover:not(:disabled) .wis_icon{transform:scale(1.15)}@supports not (-ms-high-contrast:none){.wis_button svg{width:75%;height:75%}}.wis_search{position:relative}.wis_search input{padding-right:40px!important}.wis_search .wis_search_btn{position:absolute;right:0;top:0;z-index:var(--z-frame);border-top-left-radius:0;border-bottom-left-radius:0;height:100%;width:32px}.wis_search .wis_clear_btn{position:absolute;right:40px;top:7px;z-index:var(--z-frame)}.wis_filter_btn{width:100%;padding:5px 10px;border-radius:3px}.wis_filter_btn:not(:hover):not(.selected){background-color:inherit;color:inherit}.wis_icon_btn{cursor:pointer;transition:all .1s ease;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;border:none;border-radius:3px;padding:5px 2px;background-color:inherit;color:inherit}.wis_icon_btn:hover{background-color:#7878781a}.wis_icon_btn_preview{transition:all .1s ease}.wis_selection_bar{z-index:var(--z-frame);box-shadow:0 -6px 10px -8px #00000040;animation-name:slideUpSelectionBar;animation-duration:.2s;transform-origin:bottom center}@keyframes slideUpSelectionBar{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[particleTooltip]", inputs: ["particleTooltip", "tooltipPosition", "tooltipDisabled"] }, { kind: "component", type: i5.DialogComponent, selector: "particle-dialog", inputs: ["object", "title", "titleClass", "showTitle", "allowClose", "bodyClass", "height", "width", "borderRadius", "text"], outputs: ["closed", "opened"] }, { kind: "component", type: i6.EndpointStateComponent, selector: "particle-endpoint-state", inputs: ["loading", "loadingIcon", "empty", "emptyIcon", "error", "errorIcon", "loadingOverlay", "loadingOverlayIcon", "text"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
346
- }
347
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: IconSelectComponent, decorators: [{
348
- type: Component,
349
- args: [{ selector: 'particle-icon-select', providers: [
350
- {
351
- provide: NG_VALUE_ACCESSOR,
352
- useExisting: forwardRef(() => IconSelectComponent),
353
- multi: true
354
- }
355
- ], template: "<!-- choose button -->\r\n<button [ngClass]=\"buttonColorClass ? buttonColorClass : 'content_color'\"\r\n [ngStyle]=\"{\r\n 'width': buttonSizing,\r\n 'min-width': buttonSizing,\r\n 'height': buttonSizing,\r\n 'min-height': buttonSizing\r\n }\"\r\n (click)=\"openDialog()\"\r\n [particleTooltip]=\"(_internalValue | async)?.prefix + ' ' + (_internalValue | async)?.name\"\r\n [tooltipDisabled]=\"(_internalValue | async) === undefined\"\r\n [disabled]=\"disabled\"\r\n class=\"access wis_button bg_overlay brdr brad_3\"\r\n [attr.aria-label]=\"text.selectAnIcon\">\r\n <ng-container *ngIf=\"!showDialog else placeholderIcon\">\r\n <div *ngIf=\"_internalValue | async as selectedIcon else noSelection\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} wis_icon\"></i>\r\n </div>\r\n <ng-template #noSelection>\r\n <div><i class=\"fas fa-icons opacity_20\"></i></div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderIcon>\r\n <div><i class=\"fas fa-spinner fa-spin\"></i></div>\r\n </ng-template>\r\n</button>\r\n\r\n<!-- TODO: at some point, maybe implement infinite scroll to icons -->\r\n\r\n<!-- picker dialog -->\r\n<particle-dialog [title]=\"text.selectAnIcon\"\r\n [object]=\"showDialog\"\r\n [width]=\"'850px'\"\r\n [height]=\"'500px'\"\r\n (closed)=\"closeDialog()\">\r\n <div class=\"row height100\">\r\n\r\n <!-- FILTERS -->\r\n <div class=\"col min_w250 bg_overlay brdr border_right mobile_hide\">\r\n <div class=\"row_block width100\">\r\n <ng-container *ngIf=\"_filter | async as filter\">\r\n <!-- all icons -->\r\n <div class=\"mar_5 pad_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'all' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'all' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.seeAllIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'all' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.seeAllIcons}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- fontawesome icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.fontAwesomeIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.all}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.solid}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.regular}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'brands', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'brands' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.brands + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'brands'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.brands}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- custom icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.customIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">All</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.solid}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.regular}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'brands', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'brands' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.brands + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'brands'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.brands}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- ICONS -->\r\n <div class=\"col size_2 column\">\r\n <div class=\"col content_color_dark_1 pad_x5\">\r\n <!-- paginator -->\r\n <div *ngIf=\"totalPages$ | async as totalPages\"\r\n class=\"col v_center mar_10\">\r\n <button *ngIf=\"canPaginatePrevious$ | async else disabledPreviousButton\"\r\n (click)=\"paginatePrevious()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n <ng-template #disabledPreviousButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n </ng-template>\r\n <div\r\n class=\"text sm bolder center\"\r\n style=\"min-width:65px;\">\r\n {{(_activePage | async)! + 1}} / {{totalPages}}\r\n </div>\r\n <button *ngIf=\"canPaginateNext$ | async else disabledNextButton\"\r\n (click)=\"paginateNext()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n <ng-template #disabledNextButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n <!-- search -->\r\n <div class=\"col size_1 wis_search mar_10\">\r\n <input #iconSearchInput\r\n [ngModel]=\"_searchText | async\"\r\n (input)=\"_searchText.next(iconSearchInput.value)\"\r\n (keyup.enter)=\"_searchInputEnterKeyup.next($any(null))\"\r\n class=\"access input md bg_overlay brdr content_color\"\r\n [attr.aria-label]=\"text.searchIcons\" [placeholder]=\"text.searchIcons + '...'\" />\r\n <button *ngIf=\"(canSearch$ | async) && (_searchClick | async)\"\r\n (click)=\"clearSearch()\" aria-label=\"Clear search\"\r\n class=\"access btn circle_18px overlay wis_clear_btn\">\r\n <span class=\"icon grow\"><i class=\"fas fa-times fa-sm\"></i></span>\r\n </button>\r\n <button *ngIf=\"canSearch$ | async else disabledSearchButton\"\r\n (click)=\"_searchClick.next(iconSearchInput.value); _activePage.next(0)\"\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n <ng-template #disabledSearchButton>\r\n <button disabled\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- icons -->\r\n <div #iconScrollContainer class=\"col size_1 top_left scroll_y pad_5\" style=\"scroll-behavior: smooth\">\r\n <ng-container *ngIf=\"paginatedIcons$ | async as icons else noResults\">\r\n <div class=\"row wrap top_left\" style=\"align-items:stretch;\">\r\n <ng-container *ngFor=\"let icon of paginatedIcons$ | async\">\r\n <div class=\"col size_1 min_w75 mar_5\">\r\n <button class=\"access wis_icon_btn\" (click)=\"handleIconSelect(icon)\" [attr.aria-label]=\"text.select + ' ' + icon.name\">\r\n <div [ngClass]=\"((_internalValue | async)?.prefix === icon.prefix) && ((_internalValue | async)?.name === icon.name) ? 'ok_button_color' : 'content_color'\"\r\n class=\"wis_icon_btn_preview square_50px brad_3 bg_overlay brdr mar_bot5\">\r\n <i class=\"{{icon.prefix}} {{icon.name}}\"></i>\r\n </div>\r\n <div class=\"text sm center faded\">{{icon.name}}</div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noResults>\r\n <div class=\"row column min_h300 center_center\">\r\n <particle-endpoint-state\r\n [empty]=\"true\"\r\n [emptyIcon]=\"'fas fa-search fa-3x mar_bot5'\"\r\n [text]=\"{emptyText: text.couldntFindAnything, emptySubtext: text.modifySearchCriteria}\">\r\n </particle-endpoint-state>\r\n <button class=\"access btnset clear mar_10\"\r\n [attr.aria-label]=\"text.close\"\r\n (click)=\"clearSearch()\">\r\n <div class=\"circle_20px ptl_brdr_color ptl_brdr_size ptl_input_bg_color\">\r\n <i class=\"fas fa-times\"></i>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"_internalValue | async as selectedIcon\"\r\n class=\"col space_between bg_overlay brdr border_top pad_x5 wis_selection_bar\">\r\n <div class=\"col v_center mar_10\">\r\n <div class=\"text md faded mar_right10 mobile_hide\">{{text.selection}}:</div>\r\n <div class=\"v_center\" *ngIf=\"showIconSelectionPreview\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} fa-fw mar_right5\" style=\"font-size:16px;\"></i>\r\n <div class=\"text md bold\">{{selectedIcon.prefix}} {{selectedIcon.name}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col v_center mar_10\">\r\n <button\r\n type=\"button\"\r\n class=\"access btnset spaced md hov_glow save_button_color ptl_brdr_radius\"\r\n [attr.aria-label]=\"text.confirm\"\r\n (click)=\"handleIconSelectConfirm()\"\r\n >\r\n <div>{{text.confirm}}</div>\r\n <div class=\"brdr border_left mar_left10 pad_left10\"><i class=\"fas fa-check\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-dialog>\r\n", styles: [".wis_button{width:40px;min-width:40px;height:40px;min-height:40px;cursor:pointer;transition:all .1s ease}.wis_button:disabled{cursor:default;opacity:1!important}.wis_button:hover:not(:disabled){filter:brightness(1.05)}.wis_button svg{transition:transform .1s ease}.wis_button:hover:not(:disabled) .wis_icon{transform:scale(1.15)}@supports not (-ms-high-contrast:none){.wis_button svg{width:75%;height:75%}}.wis_search{position:relative}.wis_search input{padding-right:40px!important}.wis_search .wis_search_btn{position:absolute;right:0;top:0;z-index:var(--z-frame);border-top-left-radius:0;border-bottom-left-radius:0;height:100%;width:32px}.wis_search .wis_clear_btn{position:absolute;right:40px;top:7px;z-index:var(--z-frame)}.wis_filter_btn{width:100%;padding:5px 10px;border-radius:3px}.wis_filter_btn:not(:hover):not(.selected){background-color:inherit;color:inherit}.wis_icon_btn{cursor:pointer;transition:all .1s ease;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;border:none;border-radius:3px;padding:5px 2px;background-color:inherit;color:inherit}.wis_icon_btn:hover{background-color:#7878781a}.wis_icon_btn_preview{transition:all .1s ease}.wis_selection_bar{z-index:var(--z-frame);box-shadow:0 -6px 10px -8px #00000040;animation-name:slideUpSelectionBar;animation-duration:.2s;transform-origin:bottom center}@keyframes slideUpSelectionBar{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}\n"] }]
356
- }], ctorParameters: () => [{ type: i1.IconsService }, { type: i0.ChangeDetectorRef }], propDecorators: { value: [{
357
- type: Input
358
- }], disabled: [{
359
- type: Input
360
- }], buttonColorClass: [{
361
- type: Input
362
- }], buttonSizing: [{
363
- type: Input
364
- }], text: [{
365
- type: Input
366
- }], opened: [{
367
- type: Output
368
- }], selected: [{
369
- type: Output
370
- }], closed: [{
371
- type: Output
372
- }], iconScrollContainer: [{
373
- type: ViewChild,
374
- args: ['iconScrollContainer']
375
- }] } });
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2ljb25zL2NvbXBvbmVudHMvaWNvbi1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2ljb25zL2NvbXBvbmVudHMvaWNvbi1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQUkxRDs7R0FFRztBQWFILE1BQU0sT0FBTyxtQkFBbUI7SUFnUFY7SUFBK0I7SUE5T25EOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXZDOzs7T0FHRztJQUNILElBQ0ksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxLQUFLLEVBQUcsQ0FBQztZQUNYLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENB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VSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2dCQUNsRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0Ysc0pDOUJILDR0a0JBZ1RBOzsyRkRoUmEsbUJBQW1CO2tCQVovQixTQUFTOytCQUNFLHNCQUFzQixhQUdyQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUhBZUcsS0FBSztzQkFEUixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBU04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBT04sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkEyQk4sTUFBTTtzQkFETCxNQUFNO2dCQU9QLFFBQVE7c0JBRFAsTUFBTTtnQkFPUCxNQUFNO3NCQURMLE1BQU07Z0JBT1AsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHRhcCwgd2l0aExhdGVzdEZyb20gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEljb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ljb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQge0ljb25TZWxlY3RUZXh0fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvbW9kZWxzL3BhcnRpY2xlLWNvbXBvbmVudC10ZXh0Lm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBQYXJ0aWNsZSBJY29uIFNlbGVjdCBjb21wb25lbnQgcHJvdmlkZXMgYSBidXR0b24gYW5kIGFuIGljb24gcGlja2VyIHRoYXQgaW5jbHVkZXMgYWxsIG9mIHRoZSBQYXJ0aWNsZSBJY29ucyBhcyB3ZWxsIGFzIHRoZSBGQVMgaWNvbnMuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BhcnRpY2xlLWljb24tc2VsZWN0JyxcclxuICB0ZW1wbGF0ZVVybDogJ2ljb24tc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pY29uLXNlbGVjdC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJY29uU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJY29uU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgdG8gZGlzcGxheSBwZXIgcGFnZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUEFHRV9TSVpFID0gNDg7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGljb24gc2VsZWN0XHJcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh2YWx1ZSkgIHtcclxuICAgICAgY29uc3QgW3ByZWZpeCwgbmFtZV0gPSB2YWx1ZS5zcGxpdCgnICcpO1xyXG4gICAgICB0aGlzLl9pbnRlcm5hbFZhbHVlLm5leHQoeyBwcmVmaXgsIG5hbWUgfSk7XHJcbiAgICAgIHRoaXMuc2hvd0ljb25TZWxlY3Rpb25QcmV2aWV3ID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkaXNhYmxlZFxyXG4gICAqIEBwYXJhbSBkaXNhYmxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgaWNvbiBwaWNrZXIgc2hvdWxkIGJlIGRpc2FibGVkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xvciBjbGFzcyBvZiB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBidXR0b25Db2xvckNsYXNzOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHZhbHVlIHRvIHNldCB0byB0aGUgYnV0dG9uJ3Mgd2lkdGgsIG1pbi13aWR0aCwgaGVpZ2h0IGFuZCBtaW4taGVpZ2h0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBidXR0b25TaXppbmcgPSAnNDBweCc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdGV4dDogSWNvblNlbGVjdFRleHQgPSB7XHJcbiAgICBzZWxlY3RBbkljb246ICdTZWxlY3QgYW4gSWNvbicsXHJcbiAgICBzZWVBbGxJY29uczogJ1NlZSBBbGwgSWNvbnMnLFxyXG4gICAgZm9udEF3ZXNvbWVJY29uczogJ0ZvbnQgQXdlc29tZSBJY29ucycsXHJcbiAgICBhbGw6ICdBbGwnLFxyXG4gICAgc29saWQ6ICdTb2xpZCcsXHJcbiAgICByZWd1bGFyOiAnUmVndWxhcicsXHJcbiAgICBicmFuZHM6ICdCcmFuZHMnLFxyXG4gICAgY3VzdG9tSWNvbnM6ICdDdXN0b20gSWNvbnMnLFxyXG4gICAgcHJldmlvdXNQYWdlOiAnUHJldmlvdXMgUGFnZScsXHJcbiAgICBuZXh0UGFnZTogJ05leHQgUGFnZScsXHJcbiAgICBzZWFyY2hJY29uczogJ1NlYXJjaCBJY29ucycsXHJcbiAgICBzdWJtaXRTZWFyY2g6ICdTdWJtaXQgU2VhcmNoJyxcclxuICAgIGNsZWFyUmVzdWx0czogJ0NsZWFyIFJlc3VsdHMnLFxyXG4gICAgY291bGRudEZpbmRBbnl0aGluZzogJ1dlIGNvdWxkblxcJ3QgZmluZCBhbnl0aGluZycsXHJcbiAgICBtb2RpZnlTZWFyY2hDcml0ZXJpYTogJ1BsZWFzZSB0cnkgbW9kaWZ5aW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhJyxcclxuICAgIHNlbGVjdGlvbjogJ1NlbGVjdGlvbicsXHJcbiAgICBjb25maXJtOiAnQ29uZmlybScsXHJcbiAgICBzZWxlY3Q6ICdTZWxlY3QnLFxyXG4gICAgY2xvc2U6ICdDbG9zZSdcclxuICB9IGFzIEljb25TZWxlY3RUZXh0O1xyXG5cclxuICAvKipcclxuICAgKiBJY29uIHNlbGVjdCBvcGVuZWQgZXZlbnQgZW1pdHRlclxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSWNvbiBzZWxlY3RlZCBldmVudCBlbWl0dGVyXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBEaWFsb2cgY2xvc2VkIGV2ZW50IGVtaXR0ZXJcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNjcm9sbGFibGUgaWNvbiBjb250YWluZXJcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdpY29uU2Nyb2xsQ29udGFpbmVyJylcclxuICBpY29uU2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGlucHV0IHZhbHVlIGRlc3RydWN0ZWQgaW50byBpdHMgcHJlZml4IGFuZCBjbGFzcyBuYW1lXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX2ludGVybmFsVmFsdWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgcHJlZml4OiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9PihudWxsIGFzIGFueSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJlaGF2aW9yU3ViamVjdCB0cmFja2luZyB0aGUgY3VycmVudCBmaWx0ZXIgdmFsdWUgc2VsZWN0aW9uIGZvciBpY29uc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9maWx0ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PCB7XHJcbiAgICBzdHlsZTogJ2FsbCcgfCAnc29saWQnIHwgJ3JlZ3VsYXInIHwgJ2JyYW5kcycsXHJcbiAgICB0eXBlOiAnYWxsJyB8ICdwYXJ0aWNsZScgfCAnZm9udGF3ZXNvbWUnXHJcbiAgfT4oeyBzdHlsZTogJ2FsbCcsIHR5cGU6ICdhbGwnIH0pO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGN1cnJlbnQgaWNvbiBzZWFyY2ggdGV4dCB2YWx1ZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWFyY2hUZXh0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJlaGF2aW9yU3ViamVjdCB0aGF0IGVtaXRzIHdoZW4gc2VhcmNoIGJ1dHRvbiBoYXMgYmVlbiBjbGlja2VkXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX3NlYXJjaENsaWNrID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJlaGF2aW9yU3ViamVjdCB0cmFja2luZyB0aGUgYWN0aXZlIHBhZ2luYXRpb24gcGFnZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9hY3RpdmVQYWdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcclxuXHJcbiAgLyoqXHJcbiAgICogU3ViamVjdCB0aGF0IGVtaXRzIG9uIHNlYXJjaCBpbnB1dCBlbnRlciBrZXl1cFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWFyY2hJbnB1dEVudGVyS2V5dXAgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBBbiBhcnJheSBvZiBhbGwgaWNvbnMgKGFzIHN0cmluZ3MpIHRoYXQgbWVldCB0aGUgY3VycmVudCBmaWx0ZXIvc2VhcmNoIGNyaXRlcmlhIGFzIGFuIE9ic2VydmFibGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaWNvbnMkOiBPYnNlcnZhYmxlPEFycmF5PHsgcHJlZml4OiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9Pj4gPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgIHRoaXMuX2ZpbHRlcixcclxuICAgIHRoaXMuX3NlYXJjaENsaWNrXHJcbiAgXSkucGlwZShcclxuICAgIG1hcCgoW2ZpbHRlciwgc2VhcmNoVGV4dF0pID0+IHRoaXMuc2VydmljZS5nZXRJY29ucyhcclxuICAgICAgZmlsdGVyLnR5cGUsXHJcbiAgICAgIGZpbHRlci5zdHlsZSxcclxuICAgICAgc2VhcmNoVGV4dFxyXG4gICAgKSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY291bnQgb2YgdG90YWwgcGFnaW5hdG9yIHBhZ2VzIGFzIGFuIE9ic2VydmFibGVcclxuICAgKi9cclxuICByZWFkb25seSB0b3RhbFBhZ2VzJDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy5pY29ucyQucGlwZShcclxuICAgIG1hcChpY29ucyA9PiBpY29ucy5sZW5ndGhcclxuICAgICAgPyBNYXRoLmNlaWwoaWNvbnMubGVuZ3RoIC8gSWNvblNlbGVjdENvbXBvbmVudC5QQUdFX1NJWkUpXHJcbiAgICAgIDogMFxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNhbiBwZXJmb3JtIGFuIGljb24gdGV4dCBzZWFyY2hcclxuICAgKi9cclxuICByZWFkb25seSBjYW5TZWFyY2gkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fc2VhcmNoVGV4dC5waXBlKFxyXG4gICAgbWFwKHNlYXJjaFRleHQgPT4gISFzZWFyY2hUZXh0LnRyaW0oKS5sZW5ndGgpXHJcbiAgKTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHVzZXIgY2FuIHBhZ2luYXRlIHRvIHRoZSBwcmV2aW91cyBwYWdlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY2FuUGFnaW5hdGVQcmV2aW91cyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9hY3RpdmVQYWdlLnBpcGUoXHJcbiAgICBtYXAoYWN0aXZlUGFnZSA9PiBhY3RpdmVQYWdlID4gMClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBjYW4gcGFnaW5hdGUgdG8gdGhlIG5leHQgcGFnZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGNhblBhZ2luYXRlTmV4dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnRvdGFsUGFnZXMkLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLl9hY3RpdmVQYWdlKSxcclxuICAgIG1hcCgoW3RvdGFsUGFnZXMsIGFjdGl2ZVBhZ2VdKSA9PiBhY3RpdmVQYWdlIDwgKHRvdGFsUGFnZXMgLSAxKSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBQYWdpbmF0ZWQgaWNvbnMgYXJyYXkgYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHBhZ2luYXRlZEljb25zJDogT2JzZXJ2YWJsZTxBcnJheTx7IHByZWZpeDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgfT4+ID0gY29tYmluZUxhdGVzdChbXHJcbiAgICB0aGlzLl9hY3RpdmVQYWdlLFxyXG4gICAgdGhpcy5pY29ucyRcclxuICBdKS5waXBlKFxyXG4gICAgbWFwKChbYWN0aXZlUGFnZSwgaWNvbnNdKSA9PiB7XHJcbiAgICAgIGxldCBwYWdpbmF0ZWRJY29uczogQXJyYXk8eyBwcmVmaXg6IHN0cmluZywgbmFtZTogc3RyaW5nIH0+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gICAgICBpZiAoYWN0aXZlUGFnZSA+PSAwICYmIGljb25zLmxlbmd0aCkge1xyXG4gICAgICAgIHBhZ2luYXRlZEljb25zID0gaWNvbnMuc2xpY2UoXHJcbiAgICAgICAgICBJY29uU2VsZWN0Q29tcG9uZW50LlBBR0VfU0laRSAqIGFjdGl2ZVBhZ2UsXHJcbiAgICAgICAgICBJY29uU2VsZWN0Q29tcG9uZW50LlBBR0VfU0laRSAqIChhY3RpdmVQYWdlICsgMSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcGFnaW5hdGVkSWNvbnM7XHJcbiAgICB9KSxcclxuICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmljb25TY3JvbGxDb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmljb25TY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9iamVjdCB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdG8gc2hvdyB0aGUgZGlhbG9nIG9yIG5vdFxyXG4gICAqL1xyXG4gIHNob3dEaWFsb2c6IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgdG8gc2hvdyB0aGUgaWNvbiBzZWxlY3Rpb24gcHJldmlld1xyXG4gICAqL1xyXG4gIHNob3dJY29uU2VsZWN0aW9uUHJldmlldyA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTdWJzY3JpcHRpb24gb2JqZWN0IHRvIHN0b3JlIHNlYXJjaCBpbnB1dCBlbnRlciBrZXl1cCBzdWJzY3JpcHRpb25cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgaWNvbiBzZWxlY3RcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgdGhlIGljb24gcGlja2VyIGlzIGRpc2FibGVkXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIGNoYW5nZVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIHRvdWNoXHJcbiAgICovXHJcbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVwZW5kZW5jeSBpbmplY3Rpb24gc2l0ZVxyXG4gICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBJY29uc1NlcnZpY2VcclxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgdGhlIEFuZ3VsYXIgQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IEljb25zU2VydmljZSwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5fc2VhcmNoSW5wdXRFbnRlcktleXVwLnBpcGUoXHJcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuY2FuU2VhcmNoJClcclxuICAgICkuc3Vic2NyaWJlKChbX19fLCBjYW5TZWFyY2hdKSA9PiB7XHJcbiAgICAgIGlmIChjYW5TZWFyY2gpIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hDbGljay5uZXh0KHRoaXMuX3NlYXJjaFRleHQuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KDApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc3Ryb3kgY29tcG9uZW50LCB1bnN1YnNjcmliZSBmcm9tIHNlYXJjaCBpbnB1dCBlbnRlciBrZXl1cCBzdWJzY3JpcHRpb25cclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZSB0aGUgaW5wdXQgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXHJcbiAgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgb25DaGFuZ2UgZnVuY3Rpb25cclxuICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBvblRvdWNoZWQgZnVuY3Rpb25cclxuICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkaXNhYmxlZCBzdGF0ZVxyXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIHdoZXRoZXIgb3Igbm90IHRoZSBpY29uIHBpY2tlciBzaG91bGQgYmUgZGlzYWJsZWRcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gdGhlIGljb24gc2VsZWN0IGRpYWxvZ1xyXG4gICAqL1xyXG4gIG9wZW5EaWFsb2coKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSB7fTtcclxuICAgICAgdGhpcy5vcGVuZWQuZW1pdCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNob3dJY29uU2VsZWN0aW9uUHJldmlldyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIHRoZSBpY29uIHNlbGVjdCBkaWFsb2dcclxuICAgKi9cclxuICBjbG9zZURpYWxvZygpOiB2b2lkIHtcclxuICAgIGxldCBpbnRlcm5hbFZhbHVlID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl92YWx1ZSkge1xyXG4gICAgICBjb25zdCBbcHJlZml4LCBuYW1lXSA9IHRoaXMuX3ZhbHVlLnNwbGl0KCcgJyk7XHJcbiAgICAgIGludGVybmFsVmFsdWUgPSB7IHByZWZpeCwgbmFtZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2ludGVybmFsVmFsdWUubmV4dChpbnRlcm5hbFZhbHVlIGFzIGFueSk7XHJcbiAgICB0aGlzLnNob3dEaWFsb2cgPSBudWxsO1xyXG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGZpbHRlciBzZWxlY3RcclxuICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBzZWxlY3RlZCBmaWx0ZXJcclxuICAgKi9cclxuICBoYW5kbGVGaWx0ZXJTZWxlY3QoXHJcbiAgICBmaWx0ZXI6IHsgc3R5bGU6ICdhbGwnIHwgJ3NvbGlkJyB8ICdyZWd1bGFyJyB8ICdicmFuZHMnLFxyXG4gICAgdHlwZTogJ2FsbCcgfCAncGFydGljbGUnIHwgJ2ZvbnRhd2Vzb21lJyB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWx0ZXIubmV4dChmaWx0ZXIpO1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGludGVybmFsIHZhbHVlIG9uIGljb24gc2VsZWN0XHJcbiAgICogQHBhcmFtIGljb24gdGhlIHNlbGVjdGVkIGljb25cclxuICAgKi9cclxuICBoYW5kbGVJY29uU2VsZWN0KGljb246IHsgcHJlZml4OiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9KTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbnRlcm5hbFZhbHVlLm5leHQoaWNvbik7XHJcbiAgICB0aGlzLnNob3dJY29uU2VsZWN0aW9uUHJldmlldyA9IGZhbHNlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dJY29uU2VsZWN0aW9uUHJldmlldyA9IHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgdmFsdWUgb24gY29uZmlybVxyXG4gICAqL1xyXG4gIGhhbmRsZUljb25TZWxlY3RDb25maXJtKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWNvbiA9IHRoaXMuX2ludGVybmFsVmFsdWUuZ2V0VmFsdWUoKTtcclxuICAgIHRoaXMudXBkYXRlTW9kZWwoYCR7aWNvbi5wcmVmaXh9ICR7aWNvbi5uYW1lfWApO1xyXG4gICAgdGhpcy5jbG9zZURpYWxvZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR28gdG8gdGhlIG5leHQgcGFnaW5hdGlvbiBwYWdlXHJcbiAgICovXHJcbiAgcGFnaW5hdGVOZXh0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KHRoaXMuX2FjdGl2ZVBhZ2UuZ2V0VmFsdWUoKSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR28gdG8gdGhlIHByZXZpb3VzIHBhZ2luYXRpb24gcGFnZVxyXG4gICAqL1xyXG4gIHBhZ2luYXRlUHJldmlvdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVQYWdlLm5leHQodGhpcy5fYWN0aXZlUGFnZS5nZXRWYWx1ZSgpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBzZWFyY2ggdGV4dCBhbmQgcmVzZXQgcGFnaW5hdG9yXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWFyY2hUZXh0Lm5leHQoJycpO1xyXG4gICAgdGhpcy5fc2VhcmNoQ2xpY2submV4dCgnJyk7XHJcbiAgICB0aGlzLl9hY3RpdmVQYWdlLm5leHQoMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbW9kZWxcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbW9kZWxcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWVCZWZvcmVVcGRhdGUgPSB0aGlzLl92YWx1ZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgaWYgKHZhbHVlQmVmb3JlVXBkYXRlICE9PSB0aGlzLl92YWx1ZSkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5fdmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoeyB2YWx1ZTogdGhpcy5fdmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBmaWx0ZXJpbmcvcGFnaW5hdGlvbiBCZWhhdmlvclN1YmplY3QgdmFsdWVzXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZmlsdGVyLm5leHQoeyBzdHlsZTogJ2FsbCcsIHR5cGU6ICdhbGwnIH0pO1xyXG4gICAgdGhpcy5fc2VhcmNoVGV4dC5uZXh0KCcnKTtcclxuICAgIHRoaXMuX3NlYXJjaENsaWNrLm5leHQoJycpO1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KDApO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIGNob29zZSBidXR0b24gLS0+XHJcbjxidXR0b24gW25nQ2xhc3NdPVwiYnV0dG9uQ29sb3JDbGFzcyA/IGJ1dHRvbkNvbG9yQ2xhc3MgOiAnY29udGVudF9jb2xvcidcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogYnV0dG9uU2l6aW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAnbWluLXdpZHRoJzogYnV0dG9uU2l6aW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogYnV0dG9uU2l6aW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAnbWluLWhlaWdodCc6IGJ1dHRvblNpemluZ1xyXG4gICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5EaWFsb2coKVwiXHJcbiAgICAgICAgW3BhcnRpY2xlVG9vbHRpcF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/LnByZWZpeCArICcgJyArIChfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKT8ubmFtZVwiXHJcbiAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYykgPT09IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBjbGFzcz1cImFjY2VzcyB3aXNfYnV0dG9uIGJnX292ZXJsYXkgYnJkciBicmFkXzNcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RBbkljb25cIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dEaWFsb2cgZWxzZSBwbGFjZWhvbGRlckljb25cIj5cclxuICAgIDxkaXYgKm5nSWY9XCJfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jIGFzIHNlbGVjdGVkSWNvbiBlbHNlIG5vU2VsZWN0aW9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwie3tzZWxlY3RlZEljb24ucHJlZml4fX0ge3tzZWxlY3RlZEljb24ubmFtZX19IHdpc19pY29uXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI25vU2VsZWN0aW9uPlxyXG4gICAgICA8ZGl2PjxpIGNsYXNzPVwiZmFzIGZhLWljb25zIG9wYWNpdHlfMjBcIj48L2k+PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXJJY29uPlxyXG4gICAgPGRpdj48aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXNwaW5cIj48L2k+PC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9idXR0b24+XHJcblxyXG48IS0tIFRPRE86IGF0IHNvbWUgcG9pbnQsIG1heWJlIGltcGxlbWVudCBpbmZpbml0ZSBzY3JvbGwgdG8gaWNvbnMgLS0+XHJcblxyXG48IS0tIHBpY2tlciBkaWFsb2cgLS0+XHJcbjxwYXJ0aWNsZS1kaWFsb2cgW3RpdGxlXT1cInRleHQuc2VsZWN0QW5JY29uXCJcclxuICBbb2JqZWN0XT1cInNob3dEaWFsb2dcIlxyXG4gIFt3aWR0aF09XCInODUwcHgnXCJcclxuICBbaGVpZ2h0XT1cIic1MDBweCdcIlxyXG4gIChjbG9zZWQpPVwiY2xvc2VEaWFsb2coKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBoZWlnaHQxMDBcIj5cclxuXHJcbiAgICAgIDwhLS0gRklMVEVSUyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbCBtaW5fdzI1MCBiZ19vdmVybGF5IGJyZHIgYm9yZGVyX3JpZ2h0IG1vYmlsZV9oaWRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd19ibG9jayB3aWR0aDEwMFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9maWx0ZXIgfCBhc3luYyBhcyBmaWx0ZXJcIj5cclxuICAgICAgICAgICAgPCEtLSBhbGwgaWNvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNSBwYWRfNVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUZpbHRlclNlbGVjdCh7IHN0eWxlOiAnYWxsJywgdHlwZTogJ2FsbCcgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQnOiBmaWx0ZXIudHlwZSA9PT0gJ2FsbCcgJiYgZmlsdGVyLnN0eWxlID09PSAnYWxsJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnNlZUFsbEljb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidl9jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdhbGwnICYmIGZpbHRlci5zdHlsZSA9PT0gJ2FsbCdcIiBjbGFzcz1cImNpcmNsZV84cHggb2tfYnV0dG9uX2NvbG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZFwiPnt7dGV4dC5zZWVBbGxJY29uc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb19pY29uXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBmYS1mdyBmYS1zbSBvcGFjaXR5XzYwXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnX292ZXJsYXkgYnJkciBociBtYXJfMTBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBmb250YXdlc29tZSBpY29ucyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgbWQgYm9sZGVyXCIgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTBweCA1cHggMTVweDtcIj57e3RleHQuZm9udEF3ZXNvbWVJY29uc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVGaWx0ZXJTZWxlY3QoeyBzdHlsZTogJ2FsbCcsIHR5cGU6ICdmb250YXdlc29tZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAnZm9udGF3ZXNvbWUnICYmIGZpbHRlci5zdHlsZSA9PT0gJ2FsbCcgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LmZvbnRBd2Vzb21lSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ2ZvbnRhd2Vzb21lJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdhbGwnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LmFsbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlRmlsdGVyU2VsZWN0KHsgc3R5bGU6ICdzb2xpZCcsIHR5cGU6ICdmb250YXdlc29tZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAnZm9udGF3ZXNvbWUnICYmICBmaWx0ZXIuc3R5bGUgPT09ICdzb2xpZCcgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LnNvbGlkICsgJyAnICsgdGV4dC5mb250QXdlc29tZUljb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2X2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMTZweCBiZ19vdmVybGF5X3JldiBicmRyIG1hcl9yaWdodDEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ3NvbGlkJ1wiIGNsYXNzPVwiY2lyY2xlXzhweCBva19idXR0b25fY29sb3JcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZFwiPnt7dGV4dC5zb2xpZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlRmlsdGVyU2VsZWN0KHsgc3R5bGU6ICdyZWd1bGFyJywgdHlwZTogJ2ZvbnRhd2Vzb21lJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ3JlZ3VsYXInIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBsaXN0X2J0biByb3cgc3BhY2VfYmV0d2VlbiB3aXNfZmlsdGVyX2J0biBiZ19vdmVybGF5X3JldiBicmRyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LmZpbHRlckJ5ICsgJyAnICsgdGV4dC5yZWd1bGFyICsgJyAnICsgdGV4dC5mb250QXdlc29tZUljb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2X2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMTZweCBiZ19vdmVybGF5X3JldiBicmRyIG1hcl9yaWdodDEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ3JlZ3VsYXInXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LnJlZ3VsYXJ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvX2ljb25cIj48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IGZhLWZ3IGZhLXNtIG9wYWNpdHlfNjBcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyXzVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUZpbHRlclNlbGVjdCh7IHN0eWxlOiAnYnJhbmRzJywgdHlwZTogJ2ZvbnRhd2Vzb21lJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ2JyYW5kcycgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LmJyYW5kcyArICcgJyArIHRleHQuZm9udEF3ZXNvbWVJY29uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidl9jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlXzE2cHggYmdfb3ZlcmxheV9yZXYgYnJkciBtYXJfcmlnaHQxMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlci50eXBlID09PSAnZm9udGF3ZXNvbWUnICYmICBmaWx0ZXIuc3R5bGUgPT09ICdicmFuZHMnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LmJyYW5kc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnX292ZXJsYXkgYnJkciBociBtYXJfMTBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBjdXN0b20gaWNvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kIGJvbGRlclwiIHN0eWxlPVwicGFkZGluZzoxMHB4IDEwcHggNXB4IDE1cHg7XCI+e3t0ZXh0LmN1c3RvbUljb25zfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyXzVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUZpbHRlclNlbGVjdCh7IHN0eWxlOiAnYWxsJywgdHlwZTogJ3BhcnRpY2xlJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdwYXJ0aWNsZScgJiYgZmlsdGVyLnN0eWxlID09PSAnYWxsJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgbGlzdF9idG4gcm93IHNwYWNlX2JldHdlZW4gd2lzX2ZpbHRlcl9idG4gYmdfb3ZlcmxheV9yZXYgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5maWx0ZXJCeSArICcgJyArIHRleHQuY3VzdG9tSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdhbGwnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+QWxsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlRmlsdGVyU2VsZWN0KHsgc3R5bGU6ICdzb2xpZCcsIHR5cGU6ICdwYXJ0aWNsZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAncGFydGljbGUnICYmIGZpbHRlci5zdHlsZSA9PT0gJ3NvbGlkJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgbGlzdF9idG4gcm93IHNwYWNlX2JldHdlZW4gd2lzX2ZpbHRlcl9idG4gYmdfb3ZlcmxheV9yZXYgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5maWx0ZXJCeSArICcgJyArIHRleHQuc29saWQgKyAnICcgKyB0ZXh0LmN1c3RvbUljb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2X2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMTZweCBiZ19vdmVybGF5X3JldiBicmRyIG1hcl9yaWdodDEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdwYXJ0aWNsZScgJiYgZmlsdGVyLnN0eWxlID09PSAnc29saWQnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LnNvbGlkfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb19pY29uXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBmYS1mdyBmYS1zbSBvcGFjaXR5XzYwXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVGaWx0ZXJTZWxlY3QoeyBzdHlsZTogJ3JlZ3VsYXInLCB0eXBlOiAncGFydGljbGUnIH0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQnOiBmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdyZWd1bGFyJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgbGlzdF9idG4gcm93IHNwYWNlX2JldHdlZW4gd2lzX2ZpbHRlcl9idG4gYmdfb3ZlcmxheV9yZXYgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5maWx0ZXJCeSArICcgJyArIHRleHQucmVndWxhciArICcgJyArIHRleHQuY3VzdG9tSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdyZWd1bGFyJ1wiIGNsYXNzPVwiY2lyY2xlXzhweCBva19idXR0b25fY29sb3JcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZFwiPnt7dGV4dC5yZWd1bGFyfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb19pY29uXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBmYS1mdyBmYS1zbSBvcGFjaXR5XzYwXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVGaWx0ZXJTZWxlY3QoeyBzdHlsZTogJ2JyYW5kcycsIHR5cGU6ICdwYXJ0aWNsZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAncGFydGljbGUnICYmIGZpbHRlci5zdHlsZSA9PT0gJ2JyYW5kcycgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LmJyYW5kcyArICcgJyArIHRleHQuY3VzdG9tSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdicmFuZHMnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LmJyYW5kc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gSUNPTlMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8yIGNvbHVtblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgY29udGVudF9jb2xvcl9kYXJrXzEgcGFkX3g1XCI+XHJcbiAgICAgICAgICA8IS0tIHBhZ2luYXRvciAtLT5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0b3RhbFBhZ2VzJCB8IGFzeW5jIGFzIHRvdGFsUGFnZXNcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImNvbCB2X2NlbnRlciBtYXJfMTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNhblBhZ2luYXRlUHJldmlvdXMkIHwgYXN5bmMgZWxzZSBkaXNhYmxlZFByZXZpb3VzQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFnaW5hdGVQcmV2aW91cygpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc3F1YXJlXzI0cHggYmdfb3ZlcmxheSBicmRyIG9rX2J1dHRvbl9jb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnByZXZpb3VzUGFnZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBzbGlkZV9sZWZ0XCI+PGkgY2xhc3M9XCJmYXMgZmEtYXJyb3ctbGVmdFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc2FibGVkUHJldmlvdXNCdXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cImFjY2VzcyBidG4gc3F1YXJlXzI0cHggYmdfb3ZlcmxheSBicmRyIG9rX2J1dHRvbl9jb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQucHJldmlvdXNQYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gc2xpZGVfbGVmdFwiPjxpIGNsYXNzPVwiZmFzIGZhLWFycm93LWxlZnRcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0IHNtIGJvbGRlciBjZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjY1cHg7XCI+XHJcbiAgICAgICAgICAgICAge3soX2FjdGl2ZVBhZ2UgfCBhc3luYykhICsgMX19IC8ge3t0b3RhbFBhZ2VzfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjYW5QYWdpbmF0ZU5leHQkIHwgYXN5bmMgZWxzZSBkaXNhYmxlZE5leHRCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYWdpbmF0ZU5leHQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNxdWFyZV8yNHB4IGJnX292ZXJsYXkgYnJkciBva19idXR0b25fY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5uZXh0UGFnZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBzbGlkZV9yaWdodFwiPjxpIGNsYXNzPVwiZmFzIGZhLWFycm93LXJpZ2h0XCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWROZXh0QnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJhY2Nlc3MgYnRuIHNxdWFyZV8yNHB4IGJnX292ZXJsYXkgYnJkciBva19idXR0b25fY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0Lm5leHRQYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gc2xpZGVfcmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1hcnJvdy1yaWdodFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gc2VhcmNoIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzEgd2lzX3NlYXJjaCBtYXJfMTBcIj5cclxuICAgICAgICAgICAgPGlucHV0ICNpY29uU2VhcmNoSW5wdXRcclxuICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIl9zZWFyY2hUZXh0IHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIl9zZWFyY2hUZXh0Lm5leHQoaWNvblNlYXJjaElucHV0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiX3NlYXJjaElucHV0RW50ZXJLZXl1cC5uZXh0KCRhbnkobnVsbCkpXCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGlucHV0IG1kIGJnX292ZXJsYXkgYnJkciBjb250ZW50X2NvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWFyY2hJY29uc1wiIFtwbGFjZWhvbGRlcl09XCJ0ZXh0LnNlYXJjaEljb25zICsgJy4uLidcIiAvPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiKGNhblNlYXJjaCQgfCBhc3luYykgJiYgKF9zZWFyY2hDbGljayB8IGFzeW5jKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIiBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gY2lyY2xlXzE4cHggb3ZlcmxheSB3aXNfY2xlYXJfYnRuXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGdyb3dcIj48aSBjbGFzcz1cImZhcyBmYS10aW1lcyBmYS1zbVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY2FuU2VhcmNoJCB8IGFzeW5jIGVsc2UgZGlzYWJsZWRTZWFyY2hCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfc2VhcmNoQ2xpY2submV4dChpY29uU2VhcmNoSW5wdXQudmFsdWUpOyBfYWN0aXZlUGFnZS5uZXh0KDApXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc3F1YXJlXzI4cHggYmdfb3ZlcmxheSBicmRyIG9rX2J1dHRvbl9jb2xvciBicmFkXzMgd2lzX3NlYXJjaF9idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zdWJtaXRTZWFyY2hcIiB0eXBlPVwic3VibWl0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGdyb3dcIj48aSBjbGFzcz1cImZhcyBmYS1zZWFyY2ggZmEtc21cIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZFNlYXJjaEJ1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc3F1YXJlXzI4cHggYmdfb3ZlcmxheSBicmRyIG9rX2J1dHRvbl9jb2xvciBicmFkXzMgd2lzX3NlYXJjaF9idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnN1Ym1pdFNlYXJjaFwiIHR5cGU9XCJzdWJtaXRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBncm93XCI+PGkgY2xhc3M9XCJmYXMgZmEtc2VhcmNoIGZhLXNtXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gaWNvbnMgLS0+XHJcbiAgICAgICAgPGRpdiAjaWNvblNjcm9sbENvbnRhaW5lciBjbGFzcz1cImNvbCBzaXplXzEgdG9wX2xlZnQgc2Nyb2xsX3kgcGFkXzVcIiBzdHlsZT1cInNjcm9sbC1iZWhhdmlvcjogc21vb3RoXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnaW5hdGVkSWNvbnMkIHwgYXN5bmMgYXMgaWNvbnMgZWxzZSBub1Jlc3VsdHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3cmFwIHRvcF9sZWZ0XCIgc3R5bGU9XCJhbGlnbi1pdGVtczpzdHJldGNoO1wiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgcGFnaW5hdGVkSWNvbnMkIHwgYXN5bmNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8xIG1pbl93NzUgbWFyXzVcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjY2VzcyB3aXNfaWNvbl9idG5cIiAoY2xpY2spPVwiaGFuZGxlSWNvblNlbGVjdChpY29uKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3QgKyAnICcgKyBpY29uLm5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIigoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/LnByZWZpeCA9PT0gaWNvbi5wcmVmaXgpICYmICgoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/Lm5hbWUgPT09IGljb24ubmFtZSkgPyAnb2tfYnV0dG9uX2NvbG9yJyA6ICdjb250ZW50X2NvbG9yJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIndpc19pY29uX2J0bl9wcmV2aWV3IHNxdWFyZV81MHB4IGJyYWRfMyBiZ19vdmVybGF5IGJyZHIgbWFyX2JvdDVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uLnByZWZpeH19IHt7aWNvbi5uYW1lfX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgc20gY2VudGVyIGZhZGVkXCI+e3tpY29uLm5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdHM+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29sdW1uIG1pbl9oMzAwIGNlbnRlcl9jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8cGFydGljbGUtZW5kcG9pbnQtc3RhdGVcclxuICAgICAgICAgICAgICAgIFtlbXB0eV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtlbXB0eUljb25dPVwiJ2ZhcyBmYS1zZWFyY2ggZmEtM3ggbWFyX2JvdDUnXCJcclxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIntlbXB0eVRleHQ6IHRleHQuY291bGRudEZpbmRBbnl0aGluZywgZW1wdHlTdWJ0ZXh0OiB0ZXh0Lm1vZGlmeVNlYXJjaENyaXRlcmlhfVwiPlxyXG4gICAgICAgICAgICAgIDwvcGFydGljbGUtZW5kcG9pbnQtc3RhdGU+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjY2VzcyBidG5zZXQgY2xlYXIgbWFyXzEwXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5jbG9zZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8yMHB4IHB0bF9icmRyX2NvbG9yIHB0bF9icmRyX3NpemUgcHRsX2lucHV0X2JnX2NvbG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiX2ludGVybmFsVmFsdWUgfCBhc3luYyBhcyBzZWxlY3RlZEljb25cIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJjb2wgc3BhY2VfYmV0d2VlbiBiZ19vdmVybGF5IGJyZHIgYm9yZGVyX3RvcCBwYWRfeDUgd2lzX3NlbGVjdGlvbl9iYXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdl9jZW50ZXIgbWFyXzEwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kIGZhZGVkIG1hcl9yaWdodDEwIG1vYmlsZV9oaWRlXCI+e3t0ZXh0LnNlbGVjdGlvbn19OjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidl9jZW50ZXJcIiAqbmdJZj1cInNob3dJY29uU2VsZWN0aW9uUHJldmlld1wiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tzZWxlY3RlZEljb24ucHJlZml4fX0ge3tzZWxlY3RlZEljb24ubmFtZX19IGZhLWZ3IG1hcl9yaWdodDVcIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O1wiPjwvaT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZCBib2xkXCI+e3tzZWxlY3RlZEljb24ucHJlZml4fX0ge3tzZWxlY3RlZEljb24ubmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHZfY2VudGVyIG1hcl8xMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuc2V0IHNwYWNlZCBtZCBob3ZfZ2xvdyBzYXZlX2J1dHRvbl9jb2xvciBwdGxfYnJkcl9yYWRpdXNcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5jb25maXJtXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSWNvblNlbGVjdENvbmZpcm0oKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2Pnt7dGV4dC5jb25maXJtfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJkciBib3JkZXJfbGVmdCBtYXJfbGVmdDEwIHBhZF9sZWZ0MTBcIj48aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9wYXJ0aWNsZS1kaWFsb2c+XHJcbiJdfQ==