@mediusinc/mng-commons 0.6.1 → 0.8.0-rc.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 (285) hide show
  1. package/assets/i18n/en.json +3 -3
  2. package/assets/i18n/sl.json +3 -3
  3. package/esm2020/lib/api/models/builders/query-param.builder.mjs +59 -53
  4. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  5. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  6. package/esm2020/lib/api/models/index.mjs +8 -8
  7. package/esm2020/lib/api/models/mappers.mjs +12 -12
  8. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  9. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  10. package/esm2020/lib/api/models/query-result.model.mjs +17 -17
  11. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  12. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  13. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +66 -66
  14. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  15. package/esm2020/lib/api/services/index.mjs +3 -3
  16. package/esm2020/lib/api/utils/index.mjs +2 -2
  17. package/esm2020/lib/api/utils/medius-rest.util.mjs +152 -126
  18. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  19. package/esm2020/lib/components/action/action.component.mjs +174 -161
  20. package/esm2020/lib/components/action/editor/action-editor.component.mjs +230 -236
  21. package/esm2020/lib/components/action/index.mjs +3 -3
  22. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  23. package/esm2020/lib/components/action/models/action-execution.model.mjs +231 -59
  24. package/esm2020/lib/components/action/models/index.mjs +2 -2
  25. package/esm2020/lib/components/action/route/action-route.component.mjs +125 -127
  26. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +268 -268
  27. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +160 -160
  28. package/esm2020/lib/components/form/editor/form-editor.component.mjs +189 -189
  29. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +18 -18
  30. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +43 -43
  31. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +24 -24
  32. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +79 -56
  33. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +16 -16
  34. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +179 -179
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +156 -165
  36. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +126 -126
  37. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  38. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  39. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  40. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  41. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  42. package/esm2020/lib/components/form/index.mjs +3 -3
  43. package/esm2020/lib/components/form/models/form-editor.event.mjs +34 -34
  44. package/esm2020/lib/components/form/models/index.mjs +1 -1
  45. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  46. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  47. package/esm2020/lib/components/layout/index.mjs +6 -6
  48. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  49. package/esm2020/lib/components/layout/menu-item.component.mjs +216 -216
  50. package/esm2020/lib/components/layout/menu.component.mjs +19 -19
  51. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  52. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  53. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  54. package/esm2020/lib/components/tableview/index.mjs +6 -6
  55. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  56. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  57. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +35 -35
  58. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +53 -53
  59. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +102 -85
  60. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +41 -41
  61. package/esm2020/lib/components/tableview/table/table.component.mjs +430 -339
  62. package/esm2020/lib/components/tableview/tableview.component.mjs +89 -97
  63. package/esm2020/lib/config/formly.config.mjs +172 -163
  64. package/esm2020/lib/config/index.mjs +1 -1
  65. package/esm2020/lib/config/models/index.mjs +1 -1
  66. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  67. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  68. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  69. package/esm2020/lib/data-providers/index.mjs +5 -5
  70. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  71. package/esm2020/lib/data-providers/table.data-provider.mjs +16 -16
  72. package/esm2020/lib/data-providers/tableview.data-provider.mjs +16 -16
  73. package/esm2020/lib/descriptors/action.descriptor.mjs +623 -600
  74. package/esm2020/lib/descriptors/column.descriptor.mjs +228 -197
  75. package/esm2020/lib/descriptors/editor.descriptor.mjs +154 -154
  76. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  77. package/esm2020/lib/descriptors/field.descriptor.interface.mjs +1 -1
  78. package/esm2020/lib/descriptors/field.descriptor.mjs +823 -793
  79. package/esm2020/lib/descriptors/filter.descriptor.mjs +295 -237
  80. package/esm2020/lib/descriptors/index.mjs +11 -11
  81. package/esm2020/lib/descriptors/lookup.descriptor.mjs +1 -1
  82. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  83. package/esm2020/lib/descriptors/table.descriptor.mjs +214 -171
  84. package/esm2020/lib/descriptors/tableview.descriptor.mjs +134 -134
  85. package/esm2020/lib/directives/component.directive.mjs +43 -43
  86. package/esm2020/lib/directives/index.mjs +2 -2
  87. package/esm2020/lib/directives/template.directive.mjs +27 -27
  88. package/esm2020/lib/mng-commons.module.mjs +426 -426
  89. package/esm2020/lib/models/column-value.model.mjs +1 -1
  90. package/esm2020/lib/models/enum.model.mjs +1 -1
  91. package/esm2020/lib/models/error.model.mjs +1 -1
  92. package/esm2020/lib/models/index.mjs +6 -6
  93. package/esm2020/lib/models/menu.model.mjs +1 -1
  94. package/esm2020/lib/models/user.model.mjs +1 -1
  95. package/esm2020/lib/models/view-container.model.mjs +1 -1
  96. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  97. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  98. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  99. package/esm2020/lib/pipes/index.mjs +5 -5
  100. package/esm2020/lib/pipes/json-path.pipe.mjs +79 -79
  101. package/esm2020/lib/pipes/link-formatter.pipe.mjs +38 -38
  102. package/esm2020/lib/router/index.mjs +1 -1
  103. package/esm2020/lib/router/models/index.mjs +1 -1
  104. package/esm2020/lib/router/models/router.model.mjs +1 -1
  105. package/esm2020/lib/router/route-builder.mjs +431 -431
  106. package/esm2020/lib/services/action-executor.service.mjs +535 -361
  107. package/esm2020/lib/services/commons.service.mjs +344 -344
  108. package/esm2020/lib/services/configuration.service.mjs +110 -110
  109. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  110. package/esm2020/lib/services/index.mjs +6 -6
  111. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  112. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  113. package/esm2020/lib/services/internal/index.mjs +2 -2
  114. package/esm2020/lib/services/navigation.service.mjs +47 -47
  115. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  116. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  117. package/esm2020/lib/services/providers/index.mjs +2 -2
  118. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  119. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  120. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  121. package/esm2020/lib/services/tokens/index.mjs +4 -4
  122. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  123. package/esm2020/lib/services/view-container.component.service.mjs +34 -34
  124. package/esm2020/lib/types/index.mjs +2 -2
  125. package/esm2020/lib/types/type.decorator.mjs +12 -12
  126. package/esm2020/lib/types/type.model.mjs +2 -2
  127. package/esm2020/lib/utils/action-data-provider.util.mjs +116 -116
  128. package/esm2020/lib/utils/editor-formly.util.mjs +205 -202
  129. package/esm2020/lib/utils/enum.util.mjs +82 -82
  130. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  131. package/esm2020/lib/utils/index.mjs +7 -7
  132. package/esm2020/lib/utils/model.util.mjs +59 -59
  133. package/esm2020/lib/utils/notification.util.mjs +45 -45
  134. package/esm2020/lib/utils/route.util.mjs +23 -23
  135. package/esm2020/lib/utils/styles.util.mjs +41 -0
  136. package/esm2020/lib/utils/type.util.mjs +76 -76
  137. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  138. package/esm2020/public-api.mjs +39 -39
  139. package/fesm2015/mediusinc-mng-commons.mjs +9702 -8977
  140. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  141. package/fesm2020/mediusinc-mng-commons.mjs +9574 -8848
  142. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  143. package/lib/api/models/builders/query-param.builder.d.ts +13 -12
  144. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  145. package/lib/api/models/filter-param.model.d.ts +23 -23
  146. package/lib/api/models/index.d.ts +8 -8
  147. package/lib/api/models/mappers.d.ts +6 -6
  148. package/lib/api/models/query-mode.model.d.ts +16 -16
  149. package/lib/api/models/query-param.model.d.ts +31 -31
  150. package/lib/api/models/query-result.model.d.ts +23 -23
  151. package/lib/api/models/serialization.model.d.ts +8 -8
  152. package/lib/api/services/api.abstract.service.d.ts +24 -24
  153. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  154. package/lib/api/services/get-all-api.abstract.service.d.ts +11 -11
  155. package/lib/api/services/index.d.ts +3 -3
  156. package/lib/api/utils/index.d.ts +2 -2
  157. package/lib/api/utils/medius-rest.util.d.ts +14 -12
  158. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  159. package/lib/components/action/action.component.d.ts +66 -65
  160. package/lib/components/action/editor/action-editor.component.d.ts +62 -59
  161. package/lib/components/action/index.d.ts +3 -3
  162. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  163. package/lib/components/action/models/action-execution.model.d.ts +126 -57
  164. package/lib/components/action/models/index.d.ts +2 -2
  165. package/lib/components/action/route/action-route.component.d.ts +31 -31
  166. package/lib/components/form/autocomplete/autocomplete.component.d.ts +53 -53
  167. package/lib/components/form/dropdown/dropdown.component.d.ts +44 -44
  168. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  169. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +12 -12
  170. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  171. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +12 -12
  172. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +19 -14
  173. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +6 -6
  174. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +44 -44
  175. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +22 -25
  176. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  177. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  178. package/lib/components/form/formly/fields/index.d.ts +9 -9
  179. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  180. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  181. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  182. package/lib/components/form/index.d.ts +3 -3
  183. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  184. package/lib/components/form/models/index.d.ts +1 -1
  185. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  186. package/lib/components/layout/footer.component.d.ts +9 -9
  187. package/lib/components/layout/index.d.ts +6 -6
  188. package/lib/components/layout/main-layout.component.d.ts +20 -20
  189. package/lib/components/layout/menu-item.component.d.ts +37 -37
  190. package/lib/components/layout/menu.component.d.ts +10 -10
  191. package/lib/components/layout/services/index.d.ts +1 -1
  192. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  193. package/lib/components/layout/topbar.component.d.ts +24 -24
  194. package/lib/components/tableview/index.d.ts +6 -6
  195. package/lib/components/tableview/models/index.d.ts +1 -1
  196. package/lib/components/tableview/models/table.event.d.ts +17 -17
  197. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +19 -19
  198. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  199. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +31 -29
  200. package/lib/components/tableview/table/column-value/column-value.component.d.ts +17 -17
  201. package/lib/components/tableview/table/table.component.d.ts +104 -93
  202. package/lib/components/tableview/tableview.component.d.ts +37 -39
  203. package/lib/config/formly.config.d.ts +15 -15
  204. package/lib/config/index.d.ts +1 -1
  205. package/lib/config/models/index.d.ts +1 -1
  206. package/lib/config/models/mng-config.model.d.ts +34 -34
  207. package/lib/data-providers/base.data-provider.d.ts +14 -14
  208. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  209. package/lib/data-providers/index.d.ts +5 -5
  210. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  211. package/lib/data-providers/table.data-provider.d.ts +14 -14
  212. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  213. package/lib/descriptors/action.descriptor.d.ts +277 -270
  214. package/lib/descriptors/column.descriptor.d.ts +76 -66
  215. package/lib/descriptors/editor.descriptor.d.ts +44 -44
  216. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  217. package/lib/descriptors/field.descriptor.d.ts +326 -314
  218. package/lib/descriptors/field.descriptor.interface.d.ts +9 -9
  219. package/lib/descriptors/filter.descriptor.d.ts +127 -108
  220. package/lib/descriptors/index.d.ts +11 -11
  221. package/lib/descriptors/lookup.descriptor.d.ts +17 -17
  222. package/lib/descriptors/model.descriptor.d.ts +15 -15
  223. package/lib/descriptors/table.descriptor.d.ts +80 -63
  224. package/lib/descriptors/tableview.descriptor.d.ts +42 -42
  225. package/lib/directives/component.directive.d.ts +16 -16
  226. package/lib/directives/index.d.ts +2 -2
  227. package/lib/directives/template.directive.d.ts +13 -13
  228. package/lib/mng-commons.module.d.ts +86 -86
  229. package/lib/models/column-value.model.d.ts +4 -4
  230. package/lib/models/enum.model.d.ts +6 -6
  231. package/lib/models/error.model.d.ts +14 -14
  232. package/lib/models/index.d.ts +6 -6
  233. package/lib/models/menu.model.d.ts +25 -25
  234. package/lib/models/user.model.d.ts +8 -8
  235. package/lib/models/view-container.model.d.ts +6 -6
  236. package/lib/pipes/boolean.pipe.d.ts +7 -7
  237. package/lib/pipes/enum.pipe.d.ts +8 -8
  238. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  239. package/lib/pipes/index.d.ts +5 -5
  240. package/lib/pipes/json-path.pipe.d.ts +13 -13
  241. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  242. package/lib/router/index.d.ts +1 -1
  243. package/lib/router/models/index.d.ts +1 -1
  244. package/lib/router/models/router.model.d.ts +22 -22
  245. package/lib/router/route-builder.d.ts +86 -86
  246. package/lib/services/action-executor.service.d.ts +149 -104
  247. package/lib/services/commons.service.d.ts +72 -72
  248. package/lib/services/configuration.service.d.ts +36 -36
  249. package/lib/services/error-mapper.service.d.ts +7 -7
  250. package/lib/services/index.d.ts +6 -6
  251. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  252. package/lib/services/internal/commons-init.service.d.ts +16 -16
  253. package/lib/services/internal/index.d.ts +2 -2
  254. package/lib/services/navigation.service.d.ts +14 -14
  255. package/lib/services/providers/config-service.provider.d.ts +6 -6
  256. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  257. package/lib/services/providers/index.d.ts +2 -2
  258. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  259. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  260. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  261. package/lib/services/tokens/index.d.ts +4 -4
  262. package/lib/services/tokens/module-config.token.d.ts +3 -3
  263. package/lib/services/view-container.component.service.d.ts +22 -22
  264. package/lib/types/index.d.ts +2 -2
  265. package/lib/types/type.decorator.d.ts +4 -4
  266. package/lib/types/type.model.d.ts +20 -17
  267. package/lib/utils/action-data-provider.util.d.ts +16 -17
  268. package/lib/utils/editor-formly.util.d.ts +10 -10
  269. package/lib/utils/enum.util.d.ts +50 -50
  270. package/lib/utils/i18n.util.d.ts +56 -56
  271. package/lib/utils/index.d.ts +7 -7
  272. package/lib/utils/model.util.d.ts +8 -8
  273. package/lib/utils/notification.util.d.ts +11 -11
  274. package/lib/utils/route.util.d.ts +4 -4
  275. package/lib/utils/styles.util.d.ts +14 -0
  276. package/lib/utils/type.util.d.ts +36 -36
  277. package/mediusinc-mng-commons-0.8.0-rc.1.tgz +0 -0
  278. package/mediusinc-mng-commons.d.ts +5 -5
  279. package/package.json +1 -1
  280. package/public-api.d.ts +28 -28
  281. package/scss/common/theme/designer/_components.scss +1 -1
  282. package/scss/mng-overrides/_theme_datatable.scss +57 -0
  283. package/scss/mng-overrides/_theme_forms.scss +16 -0
  284. package/scss/mng-overrides/_theme_styles.scss +1 -0
  285. package/scss/mng-overrides/_theme_tableview.scss +0 -43
@@ -1,793 +1,823 @@
1
- import { Validators } from '@angular/forms';
2
- import { Subject, of } from 'rxjs';
3
- import { MngFormFieldEvent } from '../components/form/models';
4
- import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
- import { EnumUtil, I18nUtils, ModelUtil, TypeUtil } from '../utils';
6
- import { EditorDescriptor, FieldValidationDescriptor, FilterLookupDescriptor } from './';
7
- export class AGenericFieldDescriptor {
8
- constructor(editor) {
9
- this._config = {};
10
- this._editor = editor;
11
- }
12
- get editor() {
13
- return this._editor;
14
- }
15
- get config() {
16
- return this._config;
17
- }
18
- withConfig(config) {
19
- this._config = config;
20
- return this;
21
- }
22
- }
23
- export class AFieldDescriptor extends AGenericFieldDescriptor {
24
- constructor(editor, property) {
25
- super(editor);
26
- this._required = false;
27
- this._disabled = false;
28
- this._validations = [];
29
- this._className = '';
30
- this._labelClassName = '';
31
- this._inputClassName = '';
32
- this._size = FieldDescriptor.SizeEnum.Normal;
33
- this._eventsSubject = new Subject();
34
- this._property = property;
35
- this._label = I18nUtils.Type.getPropertyKey(this._editor.model.typeName, property);
36
- }
37
- get property() {
38
- return this._property;
39
- }
40
- get group() {
41
- return this._group;
42
- }
43
- get label() {
44
- return this._label;
45
- }
46
- get placeholder() {
47
- return this._placeholder;
48
- }
49
- get helpText() {
50
- return this._helpText;
51
- }
52
- get required() {
53
- return this._required;
54
- }
55
- get disabled() {
56
- return this._disabled;
57
- }
58
- get defaultValue() {
59
- return this._defaultValue;
60
- }
61
- get getter() {
62
- return this._getter;
63
- }
64
- get setter() {
65
- return this._setter;
66
- }
67
- get validations() {
68
- return this._validations;
69
- }
70
- get requiredExpression() {
71
- return this._requiredExpression;
72
- }
73
- get disabledExpression() {
74
- return this._disabledExpression;
75
- }
76
- get hiddenExpression() {
77
- return this._hiddenExpression;
78
- }
79
- get className() {
80
- return this._className;
81
- }
82
- get fieldClassName() {
83
- return this._fieldClassName;
84
- }
85
- get labelClassName() {
86
- return this._labelClassName;
87
- }
88
- get inputClassName() {
89
- return this._inputClassName;
90
- }
91
- get size() {
92
- return this._size;
93
- }
94
- get isSizeSmall() {
95
- return this._size === FieldDescriptor.SizeEnum.Small;
96
- }
97
- get isSizeLarge() {
98
- return this._size === FieldDescriptor.SizeEnum.Large;
99
- }
100
- withLabel(label) {
101
- this._label = label;
102
- return this;
103
- }
104
- withPlaceholder(placeholder) {
105
- this._placeholder = placeholder;
106
- return this;
107
- }
108
- withHelpText(helpText) {
109
- this._helpText = helpText;
110
- return this;
111
- }
112
- withRequired(required = true, requiredExpression) {
113
- this._required = required;
114
- if (requiredExpression) {
115
- this._requiredExpression = requiredExpression;
116
- }
117
- return this;
118
- }
119
- withDisabled(disabled = true, disabledExpression) {
120
- this._disabled = disabled;
121
- if (disabledExpression) {
122
- this._disabledExpression = disabledExpression;
123
- }
124
- return this;
125
- }
126
- withHidden(hiddenExpression) {
127
- this._hiddenExpression = hiddenExpression;
128
- return this;
129
- }
130
- withDefaultValue(defaultValue) {
131
- this._defaultValue = defaultValue;
132
- return this;
133
- }
134
- withGetter(getter) {
135
- this._getter = getter;
136
- return this;
137
- }
138
- withSetter(setter) {
139
- this._setter = setter;
140
- return this;
141
- }
142
- withValidation(name, validator, message) {
143
- this._validations.push(new FieldValidationDescriptor(name, validator, message));
144
- return this;
145
- }
146
- withClassName(className, labelClassName = '', inputClassName = '', fieldClassName) {
147
- this._className = className;
148
- this._labelClassName = labelClassName;
149
- this._inputClassName = inputClassName;
150
- this._fieldClassName = fieldClassName;
151
- return this;
152
- }
153
- withSize(size = FieldDescriptor.SizeEnum.Normal) {
154
- this._size = size;
155
- return this;
156
- }
157
- nextEvent(type, cmpType, cmpInstance, data) {
158
- this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
159
- }
160
- get events$() {
161
- return this._eventsSubject.asObservable();
162
- }
163
- copyFieldsTo(obj) {
164
- obj._label = this._label;
165
- obj._placeholder = this._placeholder;
166
- obj._helpText = this._helpText;
167
- obj._required = this._required;
168
- obj._disabled = this._disabled;
169
- obj._defaultValue = this._defaultValue;
170
- obj._requiredExpression = this._requiredExpression;
171
- obj._hiddenExpression = this._hiddenExpression;
172
- obj._disabledExpression = this._disabledExpression;
173
- obj._className = this._className;
174
- obj._size = this.size;
175
- obj._getter = this._getter;
176
- obj._setter = this._setter;
177
- obj._validations = this._validations;
178
- }
179
- }
180
- export var FieldDescriptor;
181
- (function (FieldDescriptor) {
182
- let SizeEnum;
183
- (function (SizeEnum) {
184
- SizeEnum[SizeEnum["Small"] = 0] = "Small";
185
- SizeEnum[SizeEnum["Normal"] = 1] = "Normal";
186
- SizeEnum[SizeEnum["Large"] = 2] = "Large";
187
- })(SizeEnum = FieldDescriptor.SizeEnum || (FieldDescriptor.SizeEnum = {}));
188
- })(FieldDescriptor || (FieldDescriptor = {}));
189
- export class FieldInputDescriptor extends AFieldDescriptor {
190
- constructor(editor, property) {
191
- super(editor, property);
192
- this._fieldType = FieldInputDescriptor.TypeEnum.Text;
193
- this._numberUseGrouping = true;
194
- // radio specific properties
195
- this._radioOptions = [];
196
- this._datePickerShowTime = false;
197
- }
198
- get fieldType() {
199
- return this._fieldType;
200
- }
201
- get rows() {
202
- return this._rows;
203
- }
204
- get numberMin() {
205
- return this._numberMin;
206
- }
207
- get numberMax() {
208
- return this._numberMax;
209
- }
210
- get numberStep() {
211
- return this._numberStep;
212
- }
213
- get numberMinFractionDigits() {
214
- return this._numberMinFractionDigits;
215
- }
216
- get numberMaxFractionDigits() {
217
- return this._numberMaxFractionDigits;
218
- }
219
- get numberUseGrouping() {
220
- return this._numberUseGrouping;
221
- }
222
- get radioOptions() {
223
- return this._radioOptions;
224
- }
225
- get datePickerFormat() {
226
- return this._datePickerFormat;
227
- }
228
- get datePickerMin() {
229
- return this._datePickerMin;
230
- }
231
- get datePickerMax() {
232
- return this._datePickerMax;
233
- }
234
- get datePickerShowTime() {
235
- return this._datePickerShowTime;
236
- }
237
- get maxLength() {
238
- return this._maxLength;
239
- }
240
- get minLength() {
241
- return this._minLength;
242
- }
243
- get pattern() {
244
- return this._pattern;
245
- }
246
- get mask() {
247
- return this._mask;
248
- }
249
- get slotChar() {
250
- return this._slotChar;
251
- }
252
- get customComponentName() {
253
- return this._customComponentName;
254
- }
255
- asHidden() {
256
- this._fieldType = FieldInputDescriptor.TypeEnum.Hidden;
257
- return this;
258
- }
259
- asLabel() {
260
- this._fieldType = FieldInputDescriptor.TypeEnum.Label;
261
- return this;
262
- }
263
- asText(minLength, maxLength, pattern, isEmail) {
264
- this._fieldType = FieldInputDescriptor.TypeEnum.Text;
265
- this._minLength = minLength;
266
- this._maxLength = maxLength;
267
- this._pattern = pattern;
268
- if (isEmail) {
269
- this.withValidation('email', control => Validators.email(control));
270
- }
271
- return this;
272
- }
273
- asTextarea(rows = 3, minLength, maxLength, pattern) {
274
- this._fieldType = FieldInputDescriptor.TypeEnum.Textarea;
275
- this._rows = rows;
276
- this._minLength = minLength;
277
- this._maxLength = maxLength;
278
- this._pattern = pattern;
279
- return this;
280
- }
281
- asNumber(step, min, max, minFractionDigits, maxFractionDigits, numberUseGrouping = true) {
282
- this._fieldType = FieldInputDescriptor.TypeEnum.Number;
283
- this._numberStep = step;
284
- this._numberMinFractionDigits = minFractionDigits;
285
- this._numberMaxFractionDigits = maxFractionDigits;
286
- this._numberMin = min ?? Number.MIN_SAFE_INTEGER;
287
- this._numberMax = max ?? Number.MAX_SAFE_INTEGER;
288
- this._numberUseGrouping = numberUseGrouping;
289
- return this;
290
- }
291
- asSwitch() {
292
- this._fieldType = FieldInputDescriptor.TypeEnum.Switch;
293
- return this;
294
- }
295
- asRadio(options, optionsTitlePath) {
296
- this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
297
- this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
298
- return this;
299
- }
300
- asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
301
- this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
302
- if (typeof optionsTitlePath === 'undefined') {
303
- optionsTitlePath = TypeUtil.findEnumName(enumType);
304
- }
305
- this._radioOptions = Array.isArray(values)
306
- ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
307
- : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
308
- return this;
309
- }
310
- asDatePicker(format, min, max, showTime) {
311
- this._fieldType = FieldInputDescriptor.TypeEnum.Datepicker;
312
- this._datePickerFormat = format ? format : 'dd.mm.yy';
313
- this._datePickerMin = min;
314
- this._datePickerMax = max;
315
- this._datePickerShowTime = showTime ?? false;
316
- return this;
317
- }
318
- asMask(mask, slotChar) {
319
- this._fieldType = FieldInputDescriptor.TypeEnum.Mask;
320
- this._mask = mask;
321
- this._slotChar = slotChar;
322
- return this;
323
- }
324
- asCustomComponent(customComponentName) {
325
- this._fieldType = FieldInputDescriptor.TypeEnum.Custom;
326
- this._customComponentName = customComponentName;
327
- return this;
328
- }
329
- copy() {
330
- const field = new FieldInputDescriptor(this._editor, this._property);
331
- this.copyFieldsTo(field);
332
- field._fieldType = this._fieldType;
333
- field._rows = this._rows;
334
- field._numberMin = this._numberMin;
335
- field._numberMax = this._numberMax;
336
- field._numberStep = this._numberStep;
337
- field._numberMinFractionDigits = this._numberMinFractionDigits;
338
- field._numberMaxFractionDigits = this._numberMaxFractionDigits;
339
- field._numberUseGrouping = this._numberUseGrouping;
340
- field._radioOptions = [...this._radioOptions];
341
- field._datePickerFormat = this._datePickerFormat;
342
- field._datePickerMin = this._datePickerMin;
343
- field._datePickerMax = this._datePickerMax;
344
- field._datePickerShowTime = this._datePickerShowTime;
345
- field._maxLength = this._maxLength;
346
- field._minLength = this._minLength;
347
- field._pattern = this._pattern;
348
- field._mask = this._mask;
349
- field._slotChar = this._slotChar;
350
- field._customComponentName = this._customComponentName;
351
- return field;
352
- }
353
- }
354
- (function (FieldInputDescriptor) {
355
- let TypeEnum;
356
- (function (TypeEnum) {
357
- TypeEnum[TypeEnum["Hidden"] = 0] = "Hidden";
358
- TypeEnum[TypeEnum["Label"] = 1] = "Label";
359
- TypeEnum[TypeEnum["Text"] = 2] = "Text";
360
- TypeEnum[TypeEnum["Textarea"] = 3] = "Textarea";
361
- TypeEnum[TypeEnum["Number"] = 4] = "Number";
362
- TypeEnum[TypeEnum["Switch"] = 5] = "Switch";
363
- TypeEnum[TypeEnum["Radio"] = 6] = "Radio";
364
- TypeEnum[TypeEnum["Datepicker"] = 7] = "Datepicker";
365
- TypeEnum[TypeEnum["Mask"] = 8] = "Mask";
366
- TypeEnum[TypeEnum["Custom"] = 9] = "Custom";
367
- })(TypeEnum = FieldInputDescriptor.TypeEnum || (FieldInputDescriptor.TypeEnum = {}));
368
- })(FieldInputDescriptor || (FieldInputDescriptor = {}));
369
- export class FieldLookupDescriptor extends AFieldDescriptor {
370
- constructor(editor, property, modelType) {
371
- super(editor, property);
372
- this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dropdown;
373
- this._itemsLabelTranslate = false;
374
- this._dropdownClassName = 'mng-filter-lookup-dropdown';
375
- this._autocompleteOpenOnFocus = false;
376
- this._autocompleteInlineSearch = false;
377
- this._modelType = modelType;
378
- ModelUtil.trySetLookupItemsProperties(this);
379
- }
380
- get lookupType() {
381
- return this._lookupType;
382
- }
383
- get itemsLabelProperty() {
384
- return this._itemsLabelProperty;
385
- }
386
- get itemsLabelTranslate() {
387
- return this._itemsLabelTranslate;
388
- }
389
- get itemsValueProperty() {
390
- return this._itemsValueProperty;
391
- }
392
- get itemsDisabledProperty() {
393
- return this._itemsDisabledProperty;
394
- }
395
- get dataKeyProperty() {
396
- return this._dataKeyProperty;
397
- }
398
- get dataProvider() {
399
- return this._dataProvider;
400
- }
401
- get autocompleteOpenOnFocus() {
402
- return this._autocompleteOpenOnFocus;
403
- }
404
- get autocompleteInlineSearch() {
405
- return this._autocompleteInlineSearch;
406
- }
407
- get dropdownClassName() {
408
- return this._dropdownClassName;
409
- }
410
- get modelType() {
411
- return this._modelType;
412
- }
413
- get dialogTableDescriptor() {
414
- return this._dialogTableDescriptor;
415
- }
416
- get dialogTableDataProvider() {
417
- return this._dialogTableDataProvider;
418
- }
419
- withItemsLabelProperty(itemsLabelProperty, translate = false) {
420
- this._itemsLabelProperty = itemsLabelProperty;
421
- this._itemsLabelTranslate = translate;
422
- return this;
423
- }
424
- withItemsValueProperty(itemsValueProperty) {
425
- this._itemsValueProperty = itemsValueProperty;
426
- this._dataKeyProperty = undefined;
427
- return this;
428
- }
429
- withItemsDisabledProperty(itemsDisabledProperty) {
430
- this._itemsDisabledProperty = itemsDisabledProperty;
431
- return this;
432
- }
433
- withDataKeyProperty(property) {
434
- this._dataKeyProperty = property;
435
- this._itemsValueProperty = undefined;
436
- return this;
437
- }
438
- withLookup(lookup, serviceType) {
439
- const dataProvider = new LookupDataProvider(this._modelType);
440
- if (serviceType) {
441
- dataProvider.withServiceType(serviceType);
442
- }
443
- dataProvider.withLookup(lookup);
444
- this._dataProvider = dataProvider;
445
- return this;
446
- }
447
- withLookupDataProvider(dataProvider) {
448
- this._dataProvider = dataProvider;
449
- return this;
450
- }
451
- withConfig(config) {
452
- return super.withConfig(config);
453
- }
454
- asAutocomplete(openOnFocus = false, inlineSearch = false) {
455
- this._lookupType = FilterLookupDescriptor.LookupTypeEnum.Autocomplete;
456
- this._autocompleteOpenOnFocus = openOnFocus;
457
- this._autocompleteInlineSearch = inlineSearch;
458
- return this;
459
- }
460
- asDialog(lookupTableDescriptor, tableDataProvider) {
461
- this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dialog;
462
- this._dialogTableDescriptor = lookupTableDescriptor;
463
- this._dialogTableDataProvider = tableDataProvider;
464
- return this;
465
- }
466
- copy() {
467
- const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
468
- this.copyFieldsTo(field);
469
- field._lookupType = this._lookupType;
470
- field._itemsLabelProperty = this._itemsLabelProperty;
471
- field._itemsLabelTranslate = this._itemsLabelTranslate;
472
- field._itemsValueProperty = this._itemsValueProperty;
473
- field._itemsDisabledProperty = this._itemsDisabledProperty;
474
- field._dataKeyProperty = this._dataKeyProperty;
475
- field._dataProvider = this._dataProvider;
476
- field._dropdownClassName = this._dropdownClassName;
477
- field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
478
- field._autocompleteInlineSearch = this._autocompleteInlineSearch;
479
- field._dialogTableDescriptor = this._dialogTableDescriptor;
480
- return field;
481
- }
482
- }
483
- (function (FieldLookupDescriptor) {
484
- let LookupTypeEnum;
485
- (function (LookupTypeEnum) {
486
- LookupTypeEnum[LookupTypeEnum["Dropdown"] = 0] = "Dropdown";
487
- LookupTypeEnum[LookupTypeEnum["Autocomplete"] = 1] = "Autocomplete";
488
- LookupTypeEnum[LookupTypeEnum["Dialog"] = 2] = "Dialog";
489
- })(LookupTypeEnum = FieldLookupDescriptor.LookupTypeEnum || (FieldLookupDescriptor.LookupTypeEnum = {}));
490
- })(FieldLookupDescriptor || (FieldLookupDescriptor = {}));
491
- export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
492
- constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
493
- super(editor, property, null);
494
- this._nameAsValue = false;
495
- this._enumType = enumType;
496
- this._nameAsValue = nameAsValue;
497
- if (typeof optionsTitlePath === 'undefined') {
498
- optionsTitlePath = TypeUtil.findEnumName(enumType);
499
- }
500
- this._optionEnumValues = Array.isArray(options)
501
- ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
502
- : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
503
- const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
504
- this.withLookupDataProvider(dataProvider);
505
- this.withItemsLabelProperty('title', optionsTitlePath !== null);
506
- this.withItemsValueProperty('value');
507
- this.withItemsDisabledProperty('disabled');
508
- }
509
- get enumType() {
510
- return this._enumType;
511
- }
512
- withDisabledOptions(...disabledOptions) {
513
- for (const disabledOption of disabledOptions) {
514
- const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
515
- if (disabledOptionValue) {
516
- const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
517
- if (option) {
518
- option.disabled = true;
519
- }
520
- }
521
- }
522
- return this;
523
- }
524
- withDefaultValueEnum(defaultValue) {
525
- const defaultOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, defaultValue) : defaultValue;
526
- if (defaultOptionValue) {
527
- const option = this._optionEnumValues.find(o => o.value === defaultOptionValue);
528
- if (option) {
529
- this.withDefaultValue(option);
530
- }
531
- }
532
- return this;
533
- }
534
- asAutocomplete(openOnFocus = true) {
535
- super.asAutocomplete(openOnFocus, true);
536
- return this;
537
- }
538
- copy() {
539
- const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
540
- this.copyFieldsTo(field);
541
- field._lookupType = this._lookupType;
542
- field._itemsLabelProperty = this._itemsLabelProperty;
543
- field._itemsValueProperty = this._itemsValueProperty;
544
- field._itemsDisabledProperty = this._itemsDisabledProperty;
545
- field._dataKeyProperty = this._dataKeyProperty;
546
- field._dataProvider = this._dataProvider;
547
- return field;
548
- }
549
- }
550
- export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
551
- constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
552
- super(editor, property);
553
- this._fieldType = FieldManyToManyEditorDescriptor.TypeEnum.DialogTableMultiselect;
554
- this._lookupTableDataProvider = null;
555
- this._actions = [];
556
- this._hasLookupExcludeValues = false;
557
- this._excludeFilterProperty = '';
558
- this._excludeValueProperty = '';
559
- this._mainTableDescriptor = mainTableDescriptor;
560
- this._lookupTableDescriptor = lookupTableDescriptor;
561
- this._actions.push(FieldManyToManyEditorDescriptor.ActionEnum.Add, FieldManyToManyEditorDescriptor.ActionEnum.Delete);
562
- }
563
- get fieldType() {
564
- return this._fieldType;
565
- }
566
- get lookupTableDataProvider() {
567
- return this._lookupTableDataProvider;
568
- }
569
- get actions() {
570
- return this._actions;
571
- }
572
- get hasLookupExcludeValues() {
573
- return this._hasLookupExcludeValues;
574
- }
575
- get excludeFilterProperty() {
576
- return this._excludeFilterProperty;
577
- }
578
- get excludeValueProperty() {
579
- return this._excludeValueProperty;
580
- }
581
- get mainTableDescriptor() {
582
- return this._mainTableDescriptor;
583
- }
584
- get lookupTableDescriptor() {
585
- return this._lookupTableDescriptor;
586
- }
587
- withLookup(getAll, serviceType) {
588
- const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
589
- if (serviceType) {
590
- dataProvider.withServiceType(serviceType);
591
- }
592
- dataProvider.withGetAll(getAll);
593
- this._lookupTableDataProvider = dataProvider;
594
- return this;
595
- }
596
- withLookupDataProvider(dataProvider) {
597
- this._lookupTableDataProvider = dataProvider;
598
- return this;
599
- }
600
- withActions(actions = []) {
601
- this.actions.push(...actions);
602
- return this;
603
- }
604
- withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
605
- this._hasLookupExcludeValues = hasLookupExclude;
606
- this._excludeFilterProperty = filterProperty;
607
- this._excludeValueProperty = valueProperty;
608
- return this;
609
- }
610
- copy() {
611
- const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
612
- this.copyFieldsTo(field);
613
- field._fieldType = this._fieldType;
614
- field._actions = this._actions.map(a => a);
615
- field._lookupTableDataProvider = this._lookupTableDataProvider;
616
- field._hasLookupExcludeValues = this._hasLookupExcludeValues;
617
- field._excludeFilterProperty = this._excludeFilterProperty;
618
- field._excludeValueProperty = this._excludeValueProperty;
619
- return field;
620
- }
621
- }
622
- (function (FieldManyToManyEditorDescriptor) {
623
- let TypeEnum;
624
- (function (TypeEnum) {
625
- TypeEnum[TypeEnum["DialogTableMultiselect"] = 0] = "DialogTableMultiselect";
626
- })(TypeEnum = FieldManyToManyEditorDescriptor.TypeEnum || (FieldManyToManyEditorDescriptor.TypeEnum = {}));
627
- let ActionEnum;
628
- (function (ActionEnum) {
629
- ActionEnum[ActionEnum["Add"] = 0] = "Add";
630
- ActionEnum[ActionEnum["Delete"] = 1] = "Delete";
631
- })(ActionEnum = FieldManyToManyEditorDescriptor.ActionEnum || (FieldManyToManyEditorDescriptor.ActionEnum = {}));
632
- })(FieldManyToManyEditorDescriptor || (FieldManyToManyEditorDescriptor = {}));
633
- export class FieldManyEditorDescriptor extends AFieldDescriptor {
634
- constructor(editor, property, tableviewDescriptor) {
635
- super(editor, property);
636
- this._fieldType = FieldManyEditorDescriptor.TypeEnum.DialogEditor;
637
- this._fieldActions = [];
638
- this._actions = [];
639
- // this._modelType = modelType;
640
- this._tableviewDescriptor = tableviewDescriptor;
641
- this._fieldActions.push(FieldManyEditorDescriptor.ActionEnum.View, FieldManyEditorDescriptor.ActionEnum.Add, FieldManyEditorDescriptor.ActionEnum.Edit, FieldManyEditorDescriptor.ActionEnum.Delete);
642
- }
643
- get fieldType() {
644
- return this._fieldType;
645
- }
646
- get fieldActions() {
647
- return this._fieldActions;
648
- }
649
- get actions() {
650
- return this._actions;
651
- }
652
- get tableviewDescriptor() {
653
- return this._tableviewDescriptor;
654
- }
655
- get tableDescriptor() {
656
- return this._tableviewDescriptor.table;
657
- }
658
- get editorForCreate() {
659
- return this._tableviewDescriptor.addEditor;
660
- }
661
- get editorForRead() {
662
- return this._tableviewDescriptor.viewEditor;
663
- }
664
- get editorForUpdate() {
665
- return this._tableviewDescriptor.editEditor;
666
- }
667
- withFieldAction(action) {
668
- this._fieldActions.push(action);
669
- return this;
670
- }
671
- withFieldActions(actions) {
672
- this._fieldActions = actions;
673
- return this;
674
- }
675
- withAction(action) {
676
- this._actions.push(action);
677
- return this;
678
- }
679
- copy() {
680
- const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
681
- this.copyFieldsTo(field);
682
- field._fieldType = this._fieldType;
683
- field._fieldActions = this._fieldActions.map(a => a);
684
- return field;
685
- }
686
- }
687
- (function (FieldManyEditorDescriptor) {
688
- let TypeEnum;
689
- (function (TypeEnum) {
690
- TypeEnum[TypeEnum["DialogEditor"] = 0] = "DialogEditor";
691
- })(TypeEnum = FieldManyEditorDescriptor.TypeEnum || (FieldManyEditorDescriptor.TypeEnum = {}));
692
- let ActionEnum;
693
- (function (ActionEnum) {
694
- ActionEnum[ActionEnum["View"] = 0] = "View";
695
- ActionEnum[ActionEnum["Add"] = 1] = "Add";
696
- ActionEnum[ActionEnum["Edit"] = 2] = "Edit";
697
- ActionEnum[ActionEnum["Delete"] = 3] = "Delete";
698
- })(ActionEnum = FieldManyEditorDescriptor.ActionEnum || (FieldManyEditorDescriptor.ActionEnum = {}));
699
- })(FieldManyEditorDescriptor || (FieldManyEditorDescriptor = {}));
700
- export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
701
- constructor(editor, name) {
702
- super(editor);
703
- this._fields = [];
704
- this._validations = [];
705
- this._name = `${this.baseName}${name}`;
706
- this._default = name === EditorDescriptor.defaultGroupName;
707
- }
708
- get title() {
709
- return this._title;
710
- }
711
- get validations() {
712
- return this._validations;
713
- }
714
- get baseName() {
715
- return `${this.groupName()}_`;
716
- }
717
- get name() {
718
- return this._name;
719
- }
720
- get default() {
721
- return this._default;
722
- }
723
- withTitle(title) {
724
- this._title = title;
725
- return this;
726
- }
727
- withValidation(name, validator, message) {
728
- this._validations.push(new FieldValidationDescriptor(name, validator, message));
729
- return this;
730
- }
731
- }
732
- export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
733
- constructor(editor, name) {
734
- super(editor, name);
735
- }
736
- get fields() {
737
- return this._fields;
738
- }
739
- groupName() {
740
- return 'tab';
741
- }
742
- addField(field) {
743
- this._fields.push(field);
744
- return this;
745
- }
746
- copy() {
747
- const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
748
- tab._title = this._title;
749
- tab._fields = this.fields.map(f => f.copy());
750
- return tab;
751
- }
752
- }
753
- export class FieldGroupDescriptor extends AFieldGroupDescriptor {
754
- constructor(editor, name) {
755
- super(editor, name);
756
- this._type = FieldGroupDescriptor.TypeEnum.Fieldset;
757
- if (this._default) {
758
- this.asLogical();
759
- }
760
- }
761
- get type() {
762
- return this._type;
763
- }
764
- get fields() {
765
- return this._fields;
766
- }
767
- groupName() {
768
- return 'group';
769
- }
770
- addField(field) {
771
- this._fields.push(field);
772
- return this;
773
- }
774
- asLogical() {
775
- this._type = FieldGroupDescriptor.TypeEnum.Logical;
776
- return this;
777
- }
778
- copy() {
779
- const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
780
- group._type = this._type;
781
- group._title = this._title;
782
- group._fields = this.fields.map(f => f.copy());
783
- return group;
784
- }
785
- }
786
- (function (FieldGroupDescriptor) {
787
- let TypeEnum;
788
- (function (TypeEnum) {
789
- TypeEnum[TypeEnum["Fieldset"] = 0] = "Fieldset";
790
- TypeEnum[TypeEnum["Logical"] = 1] = "Logical";
791
- })(TypeEnum = FieldGroupDescriptor.TypeEnum || (FieldGroupDescriptor.TypeEnum = {}));
792
- })(FieldGroupDescriptor || (FieldGroupDescriptor = {}));
793
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzY3JpcHRvcnMvZmllbGQuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHMUMsT0FBTyxFQUFhLE9BQU8sRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHN0MsT0FBTyxFQUFDLGlCQUFpQixFQUFtRCxNQUFNLDJCQUEyQixDQUFDO0FBQzlHLE9BQU8sRUFBMEMsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUdySCxPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2xFLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUsc0JBQXNCLEVBQTBELE1BQU0sSUFBSSxDQUFDO0FBR2xLLE1BQU0sT0FBZ0IsdUJBQXVCO0lBSXpDLFlBQXNCLE1BQTRCO1FBRnhDLFlBQU8sR0FBZ0IsRUFBRSxDQUFDO1FBR2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRU0sVUFBVSxDQUFDLE1BQW1CO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBZ0IsZ0JBQXdCLFNBQVEsdUJBQTJCO0lBMEI3RSxZQUFzQixNQUE0QixFQUFFLFFBQWdCO1FBQ2hFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FB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QUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBRUQsV0FBaUIsb0JBQW9CO0lBQ2pDLElBQVksUUFHWDtJQUhELFdBQVksUUFBUTtRQUNoQiwrQ0FBUSxDQUFBO1FBQ1IsNkNBQU8sQ0FBQTtJQUNYLENBQUMsRUFIVyxRQUFRLEdBQVIsNkJBQVEsS0FBUiw2QkFBUSxRQUduQjtBQUNMLENBQUMsRUFMZ0Isb0JBQW9CLEtBQXBCLG9CQUFvQixRQUtwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1ZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3QsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge01uZ0Zvcm1GaWVsZEV2ZW50LCBNbmdGb3JtRmllbGRFdmVudERhdGEsIE1uZ0Zvcm1GaWVsZEV2ZW50VHlwZUVudW19IGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyLCBJVGFibGVEYXRhUHJvdmlkZXIsIExvb2t1cERhdGFQcm92aWRlciwgVGFibGV2aWV3RGF0YVByb3ZpZGVyfSBmcm9tICcuLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0VudW1WYWx1ZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7Q2xhc3NUeXBlLCBFbnVtQ29uc3RhbnRUeXBlLCBFbnVtVHlwZSwgTW5nRmllbGRWYWxpZGF0aW9uTWVzc2FnZSwgTW5nRmllbGRWYWxpZGF0b3J9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7RW51bVV0aWwsIEkxOG5VdGlscywgTW9kZWxVdGlsLCBUeXBlVXRpbH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtBY3Rpb25EZXNjcmlwdG9yLCBFZGl0b3JEZXNjcmlwdG9yLCBGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBJTG9va3VwRGVzY3JpcHRvciwgVGFibGVEZXNjcmlwdG9yLCBUYWJsZXZpZXdEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5pbXBvcnQge0ZpZWxkQ29uZmlnLCBGaWVsZExvb2t1cENvbmZpZ30gZnJvbSAnLi9maWVsZC5kZXNjcmlwdG9yLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2NvbmZpZzogRmllbGRDb25maWcgPSB7fTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+KSB7XG4gICAgICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENvbmZpZyhjb25maWc6IEZpZWxkQ29uZmlnKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcHJvcGVydHk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2dyb3VwPzogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2xhYmVsPzogc3RyaW5nIHwgbnVsbDtcblxuICAgIHByb3RlY3RlZCBfcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9oZWxwVGV4dD86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfcmVxdWlyZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VmFsdWU/OiBUO1xuICAgIHByb3RlY3RlZCBfZ2V0dGVyPzogKGl0ZW06IEVUKSA9PiBUO1xuICAgIHByb3RlY3RlZCBfc2V0dGVyPzogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRpb25zOiBBcnJheTxGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yPiA9IFtdO1xuICAgIHByb3RlY3RlZCBfcmVxdWlyZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgobW9kZWw6IGFueSwgZm9ybVN0YXRlPzogYW55LCBmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9oaWRkZW5FeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByb3RlY3RlZCBfY2xhc3NOYW1lID0gJyc7XG4gICAgcHJvdGVjdGVkIF9maWVsZENsYXNzTmFtZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2xhYmVsQ2xhc3NOYW1lID0gJyc7XG4gICAgcHJvdGVjdGVkIF9pbnB1dENsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2l6ZTogRmllbGREZXNjcmlwdG9yLlNpemVFbnVtID0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLk5vcm1hbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1uZ0Zvcm1GaWVsZEV2ZW50PFQsIEVUPj4oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX3Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gSTE4blV0aWxzLlR5cGUuZ2V0UHJvcGVydHlLZXkodGhpcy5fZWRpdG9yLm1vZGVsLnR5cGVOYW1lLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVscFRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWxwVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRkZW5FeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZENsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxhYmVsQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWxDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbnB1dENsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0Q2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1NpemVTbWFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPT09IEZpZWxkRGVzY3JpcHRvci5TaXplRW51bS5TbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZUxhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLkxhcmdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBjb3B5KCk6IEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+O1xuXG4gICAgcHVibGljIHdpdGhMYWJlbChsYWJlbDogc3RyaW5nIHwgbnVsbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIZWxwVGV4dChoZWxwVGV4dDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hlbHBUZXh0ID0gaGVscFRleHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVxdWlyZWQocmVxdWlyZWQgPSB0cnVlLCByZXF1aXJlZEV4cHJlc3Npb24/OiBzdHJpbmcgfCAoKG1vZGVsOiBhbnksIGZvcm1TdGF0ZT86IGFueSwgZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVkID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmIChyZXF1aXJlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbiA9IHJlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkID0gdHJ1ZSwgZGlzYWJsZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICBpZiAoZGlzYWJsZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZEV4cHJlc3Npb24gPSBkaXNhYmxlZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIaWRkZW4oaGlkZGVuRXhwcmVzc2lvbjogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9oaWRkZW5FeHByZXNzaW9uID0gaGlkZGVuRXhwcmVzc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlOiBUKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhHZXR0ZXIoZ2V0dGVyOiAoaXRlbTogRVQpID0+IFQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZ2V0dGVyID0gZ2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNldHRlcihzZXR0ZXI6IChpdGVtOiBFVCwgdmFsdWU6IFQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2V0dGVyID0gc2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3I/OiBNbmdGaWVsZFZhbGlkYXRvciwgbWVzc2FnZT86IE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcsIGxhYmVsQ2xhc3NOYW1lID0gJycsIGlucHV0Q2xhc3NOYW1lID0gJycsIGZpZWxkQ2xhc3NOYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fbGFiZWxDbGFzc05hbWUgPSBsYWJlbENsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5faW5wdXRDbGFzc05hbWUgPSBpbnB1dENsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fZmllbGRDbGFzc05hbWUgPSBmaWVsZENsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IEZpZWxkRGVzY3JpcHRvci5TaXplRW51bSA9IEZpZWxkRGVzY3JpcHRvci5TaXplRW51bS5Ob3JtYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0RXZlbnQodHlwZTogTW5nRm9ybUZpZWxkRXZlbnRUeXBlRW51bSwgY21wVHlwZTogVHlwZTxhbnk+LCBjbXBJbnN0YW5jZTogYW55LCBkYXRhPzogTW5nRm9ybUZpZWxkRXZlbnREYXRhPFQsIEVUPikge1xuICAgICAgICB0aGlzLl9ldmVudHNTdWJqZWN0Lm5leHQobmV3IE1uZ0Zvcm1GaWVsZEV2ZW50KHR5cGUsIGNtcFR5cGUsIGNtcEluc3RhbmNlLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBldmVudHMkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4pIHtcbiAgICAgICAgb2JqLl9sYWJlbCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICBvYmouX3BsYWNlaG9sZGVyID0gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgICAgIG9iai5faGVscFRleHQgPSB0aGlzLl9oZWxwVGV4dDtcbiAgICAgICAgb2JqLl9yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xuICAgICAgICBvYmouX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIG9iai5fZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICBvYmouX3JlcXVpcmVkRXhwcmVzc2lvbiA9IHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9oaWRkZW5FeHByZXNzaW9uID0gdGhpcy5faGlkZGVuRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9kaXNhYmxlZEV4cHJlc3Npb24gPSB0aGlzLl9kaXNhYmxlZEV4cHJlc3Npb247XG4gICAgICAgIG9iai5fY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xuICAgICAgICBvYmouX3NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIG9iai5fZ2V0dGVyID0gdGhpcy5fZ2V0dGVyO1xuICAgICAgICBvYmouX3NldHRlciA9IHRoaXMuX3NldHRlcjtcbiAgICAgICAgb2JqLl92YWxpZGF0aW9ucyA9IHRoaXMuX3ZhbGlkYXRpb25zO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFNpemVFbnVtIHtcbiAgICAgICAgU21hbGwsXG4gICAgICAgIE5vcm1hbCxcbiAgICAgICAgTGFyZ2VcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlLCBFVD4ge1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuXG4gICAgLy8gdGV4dGFyZWEgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX3Jvd3M/OiBudW1iZXI7XG5cbiAgICAvLyBudW1iZXIgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX251bWJlck1pbj86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyU3RlcD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJVc2VHcm91cGluZyA9IHRydWU7XG5cbiAgICAvLyByYWRpbyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcmFkaW9PcHRpb25zOiBBcnJheTxFbnVtVmFsdWU8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGU+PiA9IFtdO1xuXG4gICAgLy8gZGF0ZXBpY2tlciBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlckZvcm1hdD86IHN0cmluZztcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyTWluPzogRGF0ZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyTWF4PzogRGF0ZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyU2hvd1RpbWUgPSBmYWxzZTtcblxuICAgIC8vIGlucHV0IHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9tYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWluTGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX3BhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XG5cbiAgICAvLyBtYXNrIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9tYXNrPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Nsb3RDaGFyPzogc3RyaW5nO1xuXG4gICAgLy8gY3VzdG9tIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfY3VzdG9tQ29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlclN0ZXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJTdGVwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heEZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJVc2VHcm91cGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNsb3RDaGFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2xvdENoYXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXN0b21Db21wb25lbnROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNIaWRkZW4oKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLkhpZGRlbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTGFiZWwoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLkxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNUZXh0KG1pbkxlbmd0aD86IG51bWJlciwgbWF4TGVuZ3RoPzogbnVtYmVyLCBwYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwLCBpc0VtYWlsPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuICAgICAgICB0aGlzLl9taW5MZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgICAgICB0aGlzLndpdGhWYWxpZGF0aW9uKCdlbWFpbCcsIGNvbnRyb2wgPT4gVmFsaWRhdG9ycy5lbWFpbChjb250cm9sKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dGFyZWEocm93cyA9IDMsIG1pbkxlbmd0aD86IG51bWJlciwgbWF4TGVuZ3RoPzogbnVtYmVyLCBwYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlRleHRhcmVhO1xuICAgICAgICB0aGlzLl9yb3dzID0gcm93cztcbiAgICAgICAgdGhpcy5fbWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgICAgIHRoaXMuX3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNOdW1iZXIoc3RlcD86IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1pbkZyYWN0aW9uRGlnaXRzPzogbnVtYmVyLCBtYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlciwgbnVtYmVyVXNlR3JvdXBpbmcgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLk51bWJlcjtcbiAgICAgICAgdGhpcy5fbnVtYmVyU3RlcCA9IHN0ZXA7XG4gICAgICAgIHRoaXMuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzID0gbWluRnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzID0gbWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIHRoaXMuX251bWJlck1pbiA9IG1pbiA/PyBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgdGhpcy5fbnVtYmVyTWF4ID0gbWF4ID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICB0aGlzLl9udW1iZXJVc2VHcm91cGluZyA9IG51bWJlclVzZUdyb3VwaW5nO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1N3aXRjaCgpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uU3dpdGNoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNSYWRpbyhvcHRpb25zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlJhZGlvO1xuICAgICAgICB0aGlzLl9yYWRpb09wdGlvbnMgPSBvcHRpb25zLm1hcChvID0+IDxFbnVtVmFsdWU8c3RyaW5nIHwgbnVtYmVyPj57dmFsdWU6IG8sIHRpdGxlOiBgJHtvcHRpb25zVGl0bGVQYXRoID8gYCR7b3B0aW9uc1RpdGxlUGF0aH0uYCA6ICcnfSR7b31gfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvRnJvbUVudW0oZW51bVR5cGU6IEVudW1UeXBlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCwgdmFsdWVzPzogQXJyYXk8RW51bUNvbnN0YW50VHlwZT4sIG5hbWVBc1ZhbHVlID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uUmFkaW87XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc1RpdGxlUGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9wdGlvbnNUaXRsZVBhdGggPSBUeXBlVXRpbC5maW5kRW51bU5hbWUoZW51bVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JhZGlvT3B0aW9ucyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKVxuICAgICAgICAgICAgPyBFbnVtVXRpbC5mcm9tVmFsdWVzQXNFbnVtVmFsdWVBcnJheShlbnVtVHlwZSwgdmFsdWVzLCBuYW1lQXNWYWx1ZSwgb3B0aW9uc1RpdGxlUGF0aCA/PyB1bmRlZmluZWQpXG4gICAgICAgICAgICA6IEVudW1VdGlsLmZyb21Db25zdGFudHNBc0VudW1WYWx1ZUFycmF5KGVudW1UeXBlLCBuYW1lQXNWYWx1ZSwgb3B0aW9uc1RpdGxlUGF0aCA/PyB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNEYXRlUGlja2VyKGZvcm1hdD86IHN0cmluZywgbWluPzogRGF0ZSwgbWF4PzogRGF0ZSwgc2hvd1RpbWU/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLkRhdGVwaWNrZXI7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQgPSBmb3JtYXQgPyBmb3JtYXQgOiAnZGQubW0ueXknO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyTWluID0gbWluO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyTWF4ID0gbWF4O1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWUgPSBzaG93VGltZSA/PyBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTWFzayhtYXNrOiBzdHJpbmcsIHNsb3RDaGFyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uTWFzaztcbiAgICAgICAgdGhpcy5fbWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuX3Nsb3RDaGFyID0gc2xvdENoYXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0N1c3RvbUNvbXBvbmVudChjdXN0b21Db21wb25lbnROYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uQ3VzdG9tO1xuICAgICAgICB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lID0gY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRJbnB1dERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9yb3dzID0gdGhpcy5fcm93cztcbiAgICAgICAgZmllbGQuX251bWJlck1pbiA9IHRoaXMuX251bWJlck1pbjtcbiAgICAgICAgZmllbGQuX251bWJlck1heCA9IHRoaXMuX251bWJlck1heDtcbiAgICAgICAgZmllbGQuX251bWJlclN0ZXAgPSB0aGlzLl9udW1iZXJTdGVwO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX251bWJlck1heEZyYWN0aW9uRGlnaXRzID0gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIGZpZWxkLl9udW1iZXJVc2VHcm91cGluZyA9IHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgICAgICBmaWVsZC5fcmFkaW9PcHRpb25zID0gWy4uLnRoaXMuX3JhZGlvT3B0aW9uc107XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyRm9ybWF0ID0gdGhpcy5fZGF0ZVBpY2tlckZvcm1hdDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJNaW4gPSB0aGlzLl9kYXRlUGlja2VyTWluO1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1heCA9IHRoaXMuX2RhdGVQaWNrZXJNYXg7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyU2hvd1RpbWUgPSB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWU7XG4gICAgICAgIGZpZWxkLl9tYXhMZW5ndGggPSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICAgIGZpZWxkLl9taW5MZW5ndGggPSB0aGlzLl9taW5MZW5ndGg7XG4gICAgICAgIGZpZWxkLl9wYXR0ZXJuID0gdGhpcy5fcGF0dGVybjtcbiAgICAgICAgZmllbGQuX21hc2sgPSB0aGlzLl9tYXNrO1xuICAgICAgICBmaWVsZC5fc2xvdENoYXIgPSB0aGlzLl9zbG90Q2hhcjtcbiAgICAgICAgZmllbGQuX2N1c3RvbUNvbXBvbmVudE5hbWUgPSB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkSW5wdXREZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIEhpZGRlbixcbiAgICAgICAgTGFiZWwsXG4gICAgICAgIFRleHQsXG4gICAgICAgIFRleHRhcmVhLFxuICAgICAgICBOdW1iZXIsXG4gICAgICAgIFN3aXRjaCxcbiAgICAgICAgUmFkaW8sXG4gICAgICAgIERhdGVwaWNrZXIsXG4gICAgICAgIE1hc2ssXG4gICAgICAgIEN1c3RvbVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBpbXBsZW1lbnRzIElMb29rdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX21vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2xvb2t1cFR5cGU6IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bSA9IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bS5Ecm9wZG93bjtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFLZXlQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFQcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55PjtcblxuICAgIHByb3RlY3RlZCBfZHJvcGRvd25DbGFzc05hbWUgPSAnbW5nLWZpbHRlci1sb29rdXAtZHJvcGRvd24nO1xuXG4gICAgcHJvdGVjdGVkIF9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcj86IFRhYmxlRGVzY3JpcHRvcjxUPjtcbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyPzogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IG1vZGVsVHlwZTtcbiAgICAgICAgTW9kZWxVdGlsLnRyeVNldExvb2t1cEl0ZW1zUHJvcGVydGllcyh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvb2t1cFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNMYWJlbFByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNMYWJlbFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0Rpc2FibGVkUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvY29tcGxldGVPcGVuT25Gb2N1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZHJvcGRvd25DbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcm9wZG93bkNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcsIHRyYW5zbGF0ZSA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IGl0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc1ZhbHVlUHJvcGVydHkoaXRlbXNWYWx1ZVByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5ID0gaXRlbXNWYWx1ZVByb3BlcnR5O1xuICAgICAgICB0aGlzLl9kYXRhS2V5UHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eSA9IGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEYXRhS2V5UHJvcGVydHkocHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhS2V5UHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cDxTPihsb29rdXA6IChxdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMsIHNlYXJjaD86IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxBcnJheTxUPj4sIHNlcnZpY2VUeXBlPzogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPFQsIFM+KHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhMb29rdXAobG9va3VwKTtcbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoQ29uZmlnKGNvbmZpZzogRmllbGRMb29rdXBDb25maWcpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLndpdGhDb25maWcoY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNBdXRvY29tcGxldGUob3Blbk9uRm9jdXMgPSBmYWxzZSwgaW5saW5lU2VhcmNoID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVHlwZSA9IEZpbHRlckxvb2t1cERlc2NyaXB0b3IuTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IG9wZW5PbkZvY3VzO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPSBpbmxpbmVTZWFyY2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RpYWxvZyhsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPiwgdGFibGVEYXRhUHJvdmlkZXI/OiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkRpYWxvZztcbiAgICAgICAgdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yID0gbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9kaWFsb2dUYWJsZURhdGFQcm92aWRlciA9IHRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFR5cGUgPSB0aGlzLl9sb29rdXBUeXBlO1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9kcm9wZG93bkNsYXNzTmFtZSA9IHRoaXMuX2Ryb3Bkb3duQ2xhc3NOYW1lO1xuICAgICAgICBmaWVsZC5fYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXMgPSB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cztcbiAgICAgICAgZmllbGQuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaDtcbiAgICAgICAgZmllbGQuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvciA9IHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZSxcbiAgICAgICAgRGlhbG9nXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBGaWVsZExvb2t1cERlc2NyaXB0b3I8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bVR5cGU6IEVudW1UeXBlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbkVudW1WYWx1ZXM6IEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+W107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZUFzVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9ucz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcbiAgICAgICAgdGhpcy5fZW51bVR5cGUgPSBlbnVtVHlwZTtcbiAgICAgICAgdGhpcy5fbmFtZUFzVmFsdWUgPSBuYW1lQXNWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0aW9uRW51bVZhbHVlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG9wdGlvbnMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIGFueT4obnVsbCkud2l0aExvb2t1cCgoKSA9PiBvZih0aGlzLl9vcHRpb25FbnVtVmFsdWVzKSk7XG4gICAgICAgIHRoaXMud2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXIpO1xuICAgICAgICB0aGlzLndpdGhJdGVtc0xhYmVsUHJvcGVydHkoJ3RpdGxlJywgb3B0aW9uc1RpdGxlUGF0aCAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMud2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICAgICAgdGhpcy53aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW51bVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbnVtVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkT3B0aW9ucyguLi5kaXNhYmxlZE9wdGlvbnM6IEFycmF5PEVudW1Db25zdGFudFR5cGU+KTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgZGlzYWJsZWRPcHRpb24gb2YgZGlzYWJsZWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlZE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRpc2FibGVkT3B0aW9uKSA6IGRpc2FibGVkT3B0aW9uO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkT3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25FbnVtVmFsdWVzLmZpbmQobyA9PiBvLnZhbHVlID09PSBkaXNhYmxlZE9wdGlvblZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFZhbHVlRW51bShkZWZhdWx0VmFsdWU6IEVudW1Db25zdGFudFR5cGUpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRlZmF1bHRWYWx1ZSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGlmIChkZWZhdWx0T3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX29wdGlvbkVudW1WYWx1ZXMuZmluZChvID0+IG8udmFsdWUgPT09IGRlZmF1bHRPcHRpb25WYWx1ZSk7XG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aXRoRGVmYXVsdFZhbHVlKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGFzQXV0b2NvbXBsZXRlKG9wZW5PbkZvY3VzID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBzdXBlci5hc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb3B5KCk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fZW51bVR5cGUsIFtdKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVHlwZSA9IHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc0xhYmVsUHJvcGVydHkgPSB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIG1haW4gdGFibGUgY29tcG9uZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHdoZXJlIHNlbGVjdCB3aWxsIGJlIGFwcGxpZWRcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtLkRpYWxvZ1RhYmxlTXVsdGlzZWxlY3Q7XG4gICAgcHJpdmF0ZSBfbG9va3VwVGFibGVEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQXJyYXk8RmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtPiA9IFtdO1xuICAgIHByaXZhdGUgX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSAnJztcbiAgICBwcml2YXRlIF9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvciA9IG1haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvciA9IGxvb2t1cFRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fYWN0aW9ucy5wdXNoKEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5BZGQsIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWFpblRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb29rdXBUYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXA8Uz4oZ2V0QWxsOiAocXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+LCBzZXJ2aWNlVHlwZT86IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IFRhYmxldmlld0RhdGFQcm92aWRlcjxULCBTPih0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yLm1vZGVsLnR5cGUpO1xuICAgICAgICBpZiAoc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoU2VydmljZVR5cGUoc2VydmljZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFQcm92aWRlci53aXRoR2V0QWxsKGdldEFsbCk7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEFjdGlvbnMoYWN0aW9uczogQXJyYXk8RmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtPiA9IFtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWN0aW9ucy5wdXNoKC4uLmFjdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cEV4Y2x1ZGUoZmlsdGVyUHJvcGVydHk6IHN0cmluZywgdmFsdWVQcm9wZXJ0eTogc3RyaW5nLCBoYXNMb29rdXBFeGNsdWRlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gaGFzTG9va3VwRXhjbHVkZTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gZmlsdGVyUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5ID0gdmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IuY29weSgpLCB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMubWFwKGEgPT4gYSk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICBmaWVsZC5faGFzTG9va3VwRXhjbHVkZVZhbHVlcyA9IHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgICAgIGZpZWxkLl9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFR5cGVFbnVtIHtcbiAgICAgICAgRGlhbG9nVGFibGVNdWx0aXNlbGVjdFxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBBZGQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bS5EaWFsb2dFZGl0b3I7XG4gICAgcHJpdmF0ZSBfZmllbGRBY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0+ID0gW107XG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjxUPj4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIC8vIHRoaXMuX21vZGVsVHlwZSA9IG1vZGVsVHlwZTtcbiAgICAgICAgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvciA9IHRhYmxldmlld0Rlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLlZpZXcsXG4gICAgICAgICAgICBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uQWRkLFxuICAgICAgICAgICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkVkaXQsXG4gICAgICAgICAgICBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uRGVsZXRlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZEFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZEFjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxldmlld0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci50YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvckNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuYWRkRWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yUmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3Iudmlld0VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvclVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuZWRpdEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpZWxkQWN0aW9uKGFjdGlvbjogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmllbGRBY3Rpb25zKGFjdGlvbnM6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bVtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9uKGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fZmllbGRBY3Rpb25zID0gdGhpcy5fZmllbGRBY3Rpb25zLm1hcChhID0+IGEpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFR5cGVFbnVtIHtcbiAgICAgICAgRGlhbG9nRWRpdG9yXG4gICAgfVxuXG4gICAgZXhwb3J0IGVudW0gQWN0aW9uRW51bSB7XG4gICAgICAgIFZpZXcsXG4gICAgICAgIEFkZCxcbiAgICAgICAgRWRpdCxcbiAgICAgICAgRGVsZXRlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF92YWxpZGF0aW9uczogQXJyYXk8RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGAke3RoaXMuYmFzZU5hbWV9JHtuYW1lfWA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHQgPSBuYW1lID09PSBFZGl0b3JEZXNjcmlwdG9yLmRlZmF1bHRHcm91cE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdldCBmaWVsZHMoKTogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+W107XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiYXNlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ3JvdXBOYW1lKCl9X2A7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0O1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdyb3VwTmFtZSgpOiBzdHJpbmc7XG5cbiAgICBhYnN0cmFjdCBhZGRGaWVsZChmaWVsZDogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+KTogdGhpcztcblxuICAgIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcblxuICAgIHB1YmxpYyB3aXRoVGl0bGUodGl0bGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3I/OiBNbmdGaWVsZFZhbGlkYXRvciwgbWVzc2FnZT86IE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFiJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IG5ldyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIHRhYi5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgdGFiLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IEZpZWxkR3JvdXBEZXNjcmlwdG9yLlR5cGVFbnVtLkZpZWxkc2V0O1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFzTG9naWNhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNMb2dpY2FsKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90eXBlID0gRmllbGRHcm91cERlc2NyaXB0b3IuVHlwZUVudW0uTG9naWNhbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5uYW1lLnN1YnN0cmluZyh0aGlzLmJhc2VOYW1lLmxlbmd0aCkpO1xuICAgICAgICBncm91cC5fdHlwZSA9IHRoaXMuX3R5cGU7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkR3JvdXBEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIEZpZWxkc2V0LFxuICAgICAgICBMb2dpY2FsXG4gICAgfVxufVxuIl19
1
+ import { Validators } from '@angular/forms';
2
+ import { Subject, of } from 'rxjs';
3
+ import { MngFormFieldEvent } from '../components/form/models';
4
+ import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
+ import { EnumUtil, I18nUtils, ModelUtil, TypeUtil } from '../utils';
6
+ import { EditorDescriptor, FieldValidationDescriptor, FilterLookupDescriptor } from './';
7
+ export class AGenericFieldDescriptor {
8
+ constructor(editor) {
9
+ this._config = {};
10
+ this._editor = editor;
11
+ }
12
+ get editor() {
13
+ return this._editor;
14
+ }
15
+ get config() {
16
+ return this._config;
17
+ }
18
+ withConfig(config) {
19
+ this._config = config;
20
+ return this;
21
+ }
22
+ }
23
+ export class AFieldDescriptor extends AGenericFieldDescriptor {
24
+ constructor(editor, property) {
25
+ super(editor);
26
+ this._required = false;
27
+ this._disabled = false;
28
+ this._validations = [];
29
+ this._className = '';
30
+ this._labelClassName = '';
31
+ this._inputClassName = '';
32
+ this._size = FieldDescriptor.SizeEnum.Normal;
33
+ this._eventsSubject = new Subject();
34
+ this._property = property;
35
+ this._label = I18nUtils.Type.getPropertyKey(this._editor.model.typeName, property);
36
+ }
37
+ get property() {
38
+ return this._property;
39
+ }
40
+ get group() {
41
+ return this._group;
42
+ }
43
+ get label() {
44
+ return this._label;
45
+ }
46
+ get placeholder() {
47
+ return this._placeholder;
48
+ }
49
+ get helpText() {
50
+ return this._helpText;
51
+ }
52
+ get required() {
53
+ return this._required;
54
+ }
55
+ get disabled() {
56
+ return this._disabled;
57
+ }
58
+ get defaultValue() {
59
+ return this._defaultValue;
60
+ }
61
+ get getter() {
62
+ return this._getter;
63
+ }
64
+ get setter() {
65
+ return this._setter;
66
+ }
67
+ get validations() {
68
+ return this._validations;
69
+ }
70
+ get requiredExpression() {
71
+ return this._requiredExpression;
72
+ }
73
+ get disabledExpression() {
74
+ return this._disabledExpression;
75
+ }
76
+ get hiddenExpression() {
77
+ return this._hiddenExpression;
78
+ }
79
+ get className() {
80
+ return this._className;
81
+ }
82
+ get fieldClassName() {
83
+ return this._fieldClassName;
84
+ }
85
+ get labelClassName() {
86
+ return this._labelClassName;
87
+ }
88
+ get inputClassName() {
89
+ return this._inputClassName;
90
+ }
91
+ get size() {
92
+ return this._size;
93
+ }
94
+ get isSizeSmall() {
95
+ return this._size === FieldDescriptor.SizeEnum.Small;
96
+ }
97
+ get isSizeLarge() {
98
+ return this._size === FieldDescriptor.SizeEnum.Large;
99
+ }
100
+ withLabel(label) {
101
+ this._label = label;
102
+ return this;
103
+ }
104
+ withPlaceholder(placeholder) {
105
+ this._placeholder = placeholder;
106
+ return this;
107
+ }
108
+ withHelpText(helpText) {
109
+ this._helpText = helpText;
110
+ return this;
111
+ }
112
+ withRequired(required = true, requiredExpression) {
113
+ this._required = required;
114
+ if (requiredExpression) {
115
+ this._requiredExpression = requiredExpression;
116
+ }
117
+ return this;
118
+ }
119
+ withDisabled(disabled = true, disabledExpression) {
120
+ this._disabled = disabled;
121
+ if (disabledExpression) {
122
+ this._disabledExpression = disabledExpression;
123
+ }
124
+ return this;
125
+ }
126
+ withHidden(hiddenExpression) {
127
+ this._hiddenExpression = hiddenExpression;
128
+ return this;
129
+ }
130
+ withDefaultValue(defaultValue) {
131
+ this._defaultValue = defaultValue;
132
+ return this;
133
+ }
134
+ withGetter(getter) {
135
+ this._getter = getter;
136
+ return this;
137
+ }
138
+ withSetter(setter) {
139
+ this._setter = setter;
140
+ return this;
141
+ }
142
+ withValidation(name, validator, message) {
143
+ this._validations.push(new FieldValidationDescriptor(name, validator, message));
144
+ return this;
145
+ }
146
+ withClassName(className, labelClassName = '', inputClassName = '', fieldClassName) {
147
+ this._className = className;
148
+ this._labelClassName = labelClassName;
149
+ this._inputClassName = inputClassName;
150
+ this._fieldClassName = fieldClassName;
151
+ return this;
152
+ }
153
+ withSize(size = FieldDescriptor.SizeEnum.Normal) {
154
+ this._size = size;
155
+ return this;
156
+ }
157
+ nextEvent(type, cmpType, cmpInstance, data) {
158
+ this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
159
+ }
160
+ get events$() {
161
+ return this._eventsSubject.asObservable();
162
+ }
163
+ copyFieldsTo(obj) {
164
+ obj._label = this._label;
165
+ obj._placeholder = this._placeholder;
166
+ obj._helpText = this._helpText;
167
+ obj._required = this._required;
168
+ obj._disabled = this._disabled;
169
+ obj._defaultValue = this._defaultValue;
170
+ obj._requiredExpression = this._requiredExpression;
171
+ obj._hiddenExpression = this._hiddenExpression;
172
+ obj._disabledExpression = this._disabledExpression;
173
+ obj._className = this._className;
174
+ obj._size = this.size;
175
+ obj._getter = this._getter;
176
+ obj._setter = this._setter;
177
+ obj._validations = this._validations;
178
+ }
179
+ }
180
+ export var FieldDescriptor;
181
+ (function (FieldDescriptor) {
182
+ let SizeEnum;
183
+ (function (SizeEnum) {
184
+ SizeEnum[SizeEnum["Small"] = 0] = "Small";
185
+ SizeEnum[SizeEnum["Normal"] = 1] = "Normal";
186
+ SizeEnum[SizeEnum["Large"] = 2] = "Large";
187
+ })(SizeEnum = FieldDescriptor.SizeEnum || (FieldDescriptor.SizeEnum = {}));
188
+ })(FieldDescriptor || (FieldDescriptor = {}));
189
+ export class FieldInputDescriptor extends AFieldDescriptor {
190
+ constructor(editor, property) {
191
+ super(editor, property);
192
+ this._fieldType = FieldInputDescriptor.TypeEnum.Text;
193
+ this._numberUseGrouping = true;
194
+ // radio specific properties
195
+ this._radioOptions = [];
196
+ this._datePickerShowTime = false;
197
+ // file specific properties
198
+ this._fileMultiple = false;
199
+ this._fileMaxFileSize = 500000;
200
+ }
201
+ get fieldType() {
202
+ return this._fieldType;
203
+ }
204
+ get rows() {
205
+ return this._rows;
206
+ }
207
+ get numberMin() {
208
+ return this._numberMin;
209
+ }
210
+ get numberMax() {
211
+ return this._numberMax;
212
+ }
213
+ get numberStep() {
214
+ return this._numberStep;
215
+ }
216
+ get numberMinFractionDigits() {
217
+ return this._numberMinFractionDigits;
218
+ }
219
+ get numberMaxFractionDigits() {
220
+ return this._numberMaxFractionDigits;
221
+ }
222
+ get numberUseGrouping() {
223
+ return this._numberUseGrouping;
224
+ }
225
+ get radioOptions() {
226
+ return this._radioOptions;
227
+ }
228
+ get datePickerFormat() {
229
+ return this._datePickerFormat;
230
+ }
231
+ get datePickerMin() {
232
+ return this._datePickerMin;
233
+ }
234
+ get datePickerMax() {
235
+ return this._datePickerMax;
236
+ }
237
+ get datePickerShowTime() {
238
+ return this._datePickerShowTime;
239
+ }
240
+ get maxLength() {
241
+ return this._maxLength;
242
+ }
243
+ get minLength() {
244
+ return this._minLength;
245
+ }
246
+ get pattern() {
247
+ return this._pattern;
248
+ }
249
+ get mask() {
250
+ return this._mask;
251
+ }
252
+ get slotChar() {
253
+ return this._slotChar;
254
+ }
255
+ get fileMultiple() {
256
+ return this._fileMultiple;
257
+ }
258
+ get fileMaxFileSize() {
259
+ return this._fileMaxFileSize;
260
+ }
261
+ get fileAccept() {
262
+ return this._fileAccept;
263
+ }
264
+ get fileOnSelectHandler() {
265
+ return this._fileOnSelectHandler;
266
+ }
267
+ get customComponentName() {
268
+ return this._customComponentName;
269
+ }
270
+ asHidden() {
271
+ this._fieldType = FieldInputDescriptor.TypeEnum.Hidden;
272
+ return this;
273
+ }
274
+ asLabel() {
275
+ this._fieldType = FieldInputDescriptor.TypeEnum.Label;
276
+ return this;
277
+ }
278
+ asText(minLength, maxLength, pattern, isEmail) {
279
+ this._fieldType = FieldInputDescriptor.TypeEnum.Text;
280
+ this._minLength = minLength;
281
+ this._maxLength = maxLength;
282
+ this._pattern = pattern;
283
+ if (isEmail) {
284
+ this.withValidation('email', control => Validators.email(control));
285
+ }
286
+ return this;
287
+ }
288
+ asTextarea(rows = 3, minLength, maxLength, pattern) {
289
+ this._fieldType = FieldInputDescriptor.TypeEnum.Textarea;
290
+ this._rows = rows;
291
+ this._minLength = minLength;
292
+ this._maxLength = maxLength;
293
+ this._pattern = pattern;
294
+ return this;
295
+ }
296
+ asNumber(step, min, max, minFractionDigits, maxFractionDigits, numberUseGrouping = true) {
297
+ this._fieldType = FieldInputDescriptor.TypeEnum.Number;
298
+ this._numberStep = step;
299
+ this._numberMinFractionDigits = minFractionDigits;
300
+ this._numberMaxFractionDigits = maxFractionDigits;
301
+ this._numberMin = min ?? Number.MIN_SAFE_INTEGER;
302
+ this._numberMax = max ?? Number.MAX_SAFE_INTEGER;
303
+ this._numberUseGrouping = numberUseGrouping;
304
+ return this;
305
+ }
306
+ asSwitch() {
307
+ this._fieldType = FieldInputDescriptor.TypeEnum.Switch;
308
+ return this;
309
+ }
310
+ asRadio(options, optionsTitlePath) {
311
+ this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
312
+ this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
313
+ return this;
314
+ }
315
+ asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
316
+ this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
317
+ if (typeof optionsTitlePath === 'undefined') {
318
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
319
+ }
320
+ this._radioOptions = Array.isArray(values)
321
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
322
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
323
+ return this;
324
+ }
325
+ asDatePicker(format, min, max, showTime) {
326
+ this._fieldType = FieldInputDescriptor.TypeEnum.Datepicker;
327
+ this._datePickerFormat = format;
328
+ this._datePickerMin = min;
329
+ this._datePickerMax = max;
330
+ this._datePickerShowTime = showTime ?? false;
331
+ return this;
332
+ }
333
+ asMask(mask, slotChar) {
334
+ this._fieldType = FieldInputDescriptor.TypeEnum.Mask;
335
+ this._mask = mask;
336
+ this._slotChar = slotChar;
337
+ return this;
338
+ }
339
+ asFile(multiple = false, maxFileSize = 500000, accept) {
340
+ this._fieldType = FieldInputDescriptor.TypeEnum.File;
341
+ this._fileMultiple = multiple;
342
+ this._fileMaxFileSize = maxFileSize;
343
+ this._fileAccept = accept;
344
+ return this;
345
+ }
346
+ asCustomComponent(customComponentName) {
347
+ this._fieldType = FieldInputDescriptor.TypeEnum.Custom;
348
+ this._customComponentName = customComponentName;
349
+ return this;
350
+ }
351
+ withFileOnSelectHandler(fn) {
352
+ this._fileOnSelectHandler = fn;
353
+ }
354
+ copy() {
355
+ const field = new FieldInputDescriptor(this._editor, this._property);
356
+ this.copyFieldsTo(field);
357
+ field._fieldType = this._fieldType;
358
+ field._rows = this._rows;
359
+ field._numberMin = this._numberMin;
360
+ field._numberMax = this._numberMax;
361
+ field._numberStep = this._numberStep;
362
+ field._numberMinFractionDigits = this._numberMinFractionDigits;
363
+ field._numberMaxFractionDigits = this._numberMaxFractionDigits;
364
+ field._numberUseGrouping = this._numberUseGrouping;
365
+ field._radioOptions = [...this._radioOptions];
366
+ field._datePickerFormat = this._datePickerFormat;
367
+ field._datePickerMin = this._datePickerMin;
368
+ field._datePickerMax = this._datePickerMax;
369
+ field._datePickerShowTime = this._datePickerShowTime;
370
+ field._maxLength = this._maxLength;
371
+ field._minLength = this._minLength;
372
+ field._pattern = this._pattern;
373
+ field._mask = this._mask;
374
+ field._slotChar = this._slotChar;
375
+ field._fileMultiple = this._fileMultiple;
376
+ field._fileMaxFileSize = this._fileMaxFileSize;
377
+ field._fileAccept = this._fileAccept;
378
+ field._fileOnSelectHandler = this._fileOnSelectHandler;
379
+ field._customComponentName = this._customComponentName;
380
+ return field;
381
+ }
382
+ }
383
+ (function (FieldInputDescriptor) {
384
+ let TypeEnum;
385
+ (function (TypeEnum) {
386
+ TypeEnum[TypeEnum["Hidden"] = 0] = "Hidden";
387
+ TypeEnum[TypeEnum["Label"] = 1] = "Label";
388
+ TypeEnum[TypeEnum["Text"] = 2] = "Text";
389
+ TypeEnum[TypeEnum["Textarea"] = 3] = "Textarea";
390
+ TypeEnum[TypeEnum["Number"] = 4] = "Number";
391
+ TypeEnum[TypeEnum["Switch"] = 5] = "Switch";
392
+ TypeEnum[TypeEnum["Radio"] = 6] = "Radio";
393
+ TypeEnum[TypeEnum["Datepicker"] = 7] = "Datepicker";
394
+ TypeEnum[TypeEnum["Mask"] = 8] = "Mask";
395
+ TypeEnum[TypeEnum["File"] = 9] = "File";
396
+ TypeEnum[TypeEnum["Custom"] = 10] = "Custom";
397
+ })(TypeEnum = FieldInputDescriptor.TypeEnum || (FieldInputDescriptor.TypeEnum = {}));
398
+ })(FieldInputDescriptor || (FieldInputDescriptor = {}));
399
+ export class FieldLookupDescriptor extends AFieldDescriptor {
400
+ constructor(editor, property, modelType) {
401
+ super(editor, property);
402
+ this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dropdown;
403
+ this._itemsLabelTranslate = false;
404
+ this._dropdownClassName = 'mng-filter-lookup-dropdown';
405
+ this._autocompleteOpenOnFocus = false;
406
+ this._autocompleteInlineSearch = false;
407
+ this._modelType = modelType;
408
+ ModelUtil.trySetLookupItemsProperties(this);
409
+ }
410
+ get lookupType() {
411
+ return this._lookupType;
412
+ }
413
+ get itemsLabelProperty() {
414
+ return this._itemsLabelProperty;
415
+ }
416
+ get itemsLabelTranslate() {
417
+ return this._itemsLabelTranslate;
418
+ }
419
+ get itemsValueProperty() {
420
+ return this._itemsValueProperty;
421
+ }
422
+ get itemsDisabledProperty() {
423
+ return this._itemsDisabledProperty;
424
+ }
425
+ get dataKeyProperty() {
426
+ return this._dataKeyProperty;
427
+ }
428
+ get dataProvider() {
429
+ return this._dataProvider;
430
+ }
431
+ get autocompleteOpenOnFocus() {
432
+ return this._autocompleteOpenOnFocus;
433
+ }
434
+ get autocompleteInlineSearch() {
435
+ return this._autocompleteInlineSearch;
436
+ }
437
+ get dropdownClassName() {
438
+ return this._dropdownClassName;
439
+ }
440
+ get modelType() {
441
+ return this._modelType;
442
+ }
443
+ get dialogTableDescriptor() {
444
+ return this._dialogTableDescriptor;
445
+ }
446
+ get dialogTableDataProvider() {
447
+ return this._dialogTableDataProvider;
448
+ }
449
+ withItemsLabelProperty(itemsLabelProperty, translate = false) {
450
+ this._itemsLabelProperty = itemsLabelProperty;
451
+ this._itemsLabelTranslate = translate;
452
+ return this;
453
+ }
454
+ withItemsValueProperty(itemsValueProperty) {
455
+ this._itemsValueProperty = itemsValueProperty;
456
+ this._dataKeyProperty = undefined;
457
+ return this;
458
+ }
459
+ withItemsDisabledProperty(itemsDisabledProperty) {
460
+ this._itemsDisabledProperty = itemsDisabledProperty;
461
+ return this;
462
+ }
463
+ withDataKeyProperty(property) {
464
+ this._dataKeyProperty = property;
465
+ this._itemsValueProperty = undefined;
466
+ return this;
467
+ }
468
+ withLookup(lookup, serviceType) {
469
+ const dataProvider = new LookupDataProvider(this._modelType);
470
+ if (serviceType) {
471
+ dataProvider.withServiceType(serviceType);
472
+ }
473
+ dataProvider.withLookup(lookup);
474
+ this._dataProvider = dataProvider;
475
+ return this;
476
+ }
477
+ withLookupDataProvider(dataProvider) {
478
+ this._dataProvider = dataProvider;
479
+ return this;
480
+ }
481
+ withConfig(config) {
482
+ return super.withConfig(config);
483
+ }
484
+ asAutocomplete(openOnFocus = false, inlineSearch = false) {
485
+ this._lookupType = FilterLookupDescriptor.LookupTypeEnum.Autocomplete;
486
+ this._autocompleteOpenOnFocus = openOnFocus;
487
+ this._autocompleteInlineSearch = inlineSearch;
488
+ return this;
489
+ }
490
+ asDialog(lookupTableDescriptor, tableDataProvider) {
491
+ this._lookupType = FieldLookupDescriptor.LookupTypeEnum.Dialog;
492
+ this._dialogTableDescriptor = lookupTableDescriptor;
493
+ this._dialogTableDataProvider = tableDataProvider;
494
+ return this;
495
+ }
496
+ copy() {
497
+ const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
498
+ this.copyFieldsTo(field);
499
+ field._lookupType = this._lookupType;
500
+ field._itemsLabelProperty = this._itemsLabelProperty;
501
+ field._itemsLabelTranslate = this._itemsLabelTranslate;
502
+ field._itemsValueProperty = this._itemsValueProperty;
503
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
504
+ field._dataKeyProperty = this._dataKeyProperty;
505
+ field._dataProvider = this._dataProvider;
506
+ field._dropdownClassName = this._dropdownClassName;
507
+ field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
508
+ field._autocompleteInlineSearch = this._autocompleteInlineSearch;
509
+ field._dialogTableDescriptor = this._dialogTableDescriptor;
510
+ return field;
511
+ }
512
+ }
513
+ (function (FieldLookupDescriptor) {
514
+ let LookupTypeEnum;
515
+ (function (LookupTypeEnum) {
516
+ LookupTypeEnum[LookupTypeEnum["Dropdown"] = 0] = "Dropdown";
517
+ LookupTypeEnum[LookupTypeEnum["Autocomplete"] = 1] = "Autocomplete";
518
+ LookupTypeEnum[LookupTypeEnum["Dialog"] = 2] = "Dialog";
519
+ })(LookupTypeEnum = FieldLookupDescriptor.LookupTypeEnum || (FieldLookupDescriptor.LookupTypeEnum = {}));
520
+ })(FieldLookupDescriptor || (FieldLookupDescriptor = {}));
521
+ export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
522
+ constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
523
+ super(editor, property, null);
524
+ this._nameAsValue = false;
525
+ this._enumType = enumType;
526
+ this._nameAsValue = nameAsValue;
527
+ if (typeof optionsTitlePath === 'undefined') {
528
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
529
+ }
530
+ this._optionEnumValues = Array.isArray(options)
531
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
532
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
533
+ const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
534
+ this.withLookupDataProvider(dataProvider);
535
+ this.withItemsLabelProperty('title', optionsTitlePath !== null);
536
+ this.withItemsValueProperty('value');
537
+ this.withItemsDisabledProperty('disabled');
538
+ }
539
+ get enumType() {
540
+ return this._enumType;
541
+ }
542
+ withDisabledOptions(...disabledOptions) {
543
+ for (const disabledOption of disabledOptions) {
544
+ const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
545
+ if (disabledOptionValue) {
546
+ const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
547
+ if (option) {
548
+ option.disabled = true;
549
+ }
550
+ }
551
+ }
552
+ return this;
553
+ }
554
+ withDefaultValueEnum(defaultValue) {
555
+ const defaultOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, defaultValue) : defaultValue;
556
+ if (defaultOptionValue) {
557
+ const option = this._optionEnumValues.find(o => o.value === defaultOptionValue);
558
+ if (option) {
559
+ this.withDefaultValue(option);
560
+ }
561
+ }
562
+ return this;
563
+ }
564
+ asAutocomplete(openOnFocus = true) {
565
+ super.asAutocomplete(openOnFocus, true);
566
+ return this;
567
+ }
568
+ copy() {
569
+ const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
570
+ this.copyFieldsTo(field);
571
+ field._lookupType = this._lookupType;
572
+ field._itemsLabelProperty = this._itemsLabelProperty;
573
+ field._itemsValueProperty = this._itemsValueProperty;
574
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
575
+ field._dataKeyProperty = this._dataKeyProperty;
576
+ field._dataProvider = this._dataProvider;
577
+ return field;
578
+ }
579
+ }
580
+ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
581
+ constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
582
+ super(editor, property);
583
+ this._fieldType = FieldManyToManyEditorDescriptor.TypeEnum.DialogTableMultiselect;
584
+ this._lookupTableDataProvider = null;
585
+ this._actions = [];
586
+ this._hasLookupExcludeValues = false;
587
+ this._excludeFilterProperty = '';
588
+ this._excludeValueProperty = '';
589
+ this._mainTableDescriptor = mainTableDescriptor;
590
+ this._lookupTableDescriptor = lookupTableDescriptor;
591
+ this._actions.push(FieldManyToManyEditorDescriptor.ActionEnum.Add, FieldManyToManyEditorDescriptor.ActionEnum.Delete);
592
+ }
593
+ get fieldType() {
594
+ return this._fieldType;
595
+ }
596
+ get lookupTableDataProvider() {
597
+ return this._lookupTableDataProvider;
598
+ }
599
+ get actions() {
600
+ return this._actions;
601
+ }
602
+ get hasLookupExcludeValues() {
603
+ return this._hasLookupExcludeValues;
604
+ }
605
+ get excludeFilterProperty() {
606
+ return this._excludeFilterProperty;
607
+ }
608
+ get excludeValueProperty() {
609
+ return this._excludeValueProperty;
610
+ }
611
+ get mainTableDescriptor() {
612
+ return this._mainTableDescriptor;
613
+ }
614
+ get lookupTableDescriptor() {
615
+ return this._lookupTableDescriptor;
616
+ }
617
+ withLookup(getAll, serviceType) {
618
+ const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
619
+ if (serviceType) {
620
+ dataProvider.withServiceType(serviceType);
621
+ }
622
+ dataProvider.withGetAll(getAll);
623
+ this._lookupTableDataProvider = dataProvider;
624
+ return this;
625
+ }
626
+ withLookupDataProvider(dataProvider) {
627
+ this._lookupTableDataProvider = dataProvider;
628
+ return this;
629
+ }
630
+ withActions(actions = []) {
631
+ this.actions.push(...actions);
632
+ return this;
633
+ }
634
+ withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
635
+ this._hasLookupExcludeValues = hasLookupExclude;
636
+ this._excludeFilterProperty = filterProperty;
637
+ this._excludeValueProperty = valueProperty;
638
+ return this;
639
+ }
640
+ copy() {
641
+ const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
642
+ this.copyFieldsTo(field);
643
+ field._fieldType = this._fieldType;
644
+ field._actions = this._actions.map(a => a);
645
+ field._lookupTableDataProvider = this._lookupTableDataProvider;
646
+ field._hasLookupExcludeValues = this._hasLookupExcludeValues;
647
+ field._excludeFilterProperty = this._excludeFilterProperty;
648
+ field._excludeValueProperty = this._excludeValueProperty;
649
+ return field;
650
+ }
651
+ }
652
+ (function (FieldManyToManyEditorDescriptor) {
653
+ let TypeEnum;
654
+ (function (TypeEnum) {
655
+ TypeEnum[TypeEnum["DialogTableMultiselect"] = 0] = "DialogTableMultiselect";
656
+ })(TypeEnum = FieldManyToManyEditorDescriptor.TypeEnum || (FieldManyToManyEditorDescriptor.TypeEnum = {}));
657
+ let ActionEnum;
658
+ (function (ActionEnum) {
659
+ ActionEnum[ActionEnum["Add"] = 0] = "Add";
660
+ ActionEnum[ActionEnum["Delete"] = 1] = "Delete";
661
+ })(ActionEnum = FieldManyToManyEditorDescriptor.ActionEnum || (FieldManyToManyEditorDescriptor.ActionEnum = {}));
662
+ })(FieldManyToManyEditorDescriptor || (FieldManyToManyEditorDescriptor = {}));
663
+ export class FieldManyEditorDescriptor extends AFieldDescriptor {
664
+ constructor(editor, property, tableviewDescriptor) {
665
+ super(editor, property);
666
+ this._fieldType = FieldManyEditorDescriptor.TypeEnum.DialogEditor;
667
+ this._fieldActions = [];
668
+ this._actions = [];
669
+ // this._modelType = modelType;
670
+ this._tableviewDescriptor = tableviewDescriptor;
671
+ this._fieldActions.push(FieldManyEditorDescriptor.ActionEnum.View, FieldManyEditorDescriptor.ActionEnum.Add, FieldManyEditorDescriptor.ActionEnum.Edit, FieldManyEditorDescriptor.ActionEnum.Delete);
672
+ }
673
+ get fieldType() {
674
+ return this._fieldType;
675
+ }
676
+ get fieldActions() {
677
+ return this._fieldActions;
678
+ }
679
+ get actions() {
680
+ return this._actions;
681
+ }
682
+ get tableviewDescriptor() {
683
+ return this._tableviewDescriptor;
684
+ }
685
+ get tableDescriptor() {
686
+ return this._tableviewDescriptor.table;
687
+ }
688
+ get editorForCreate() {
689
+ return this._tableviewDescriptor.addEditor;
690
+ }
691
+ get editorForRead() {
692
+ return this._tableviewDescriptor.viewEditor;
693
+ }
694
+ get editorForUpdate() {
695
+ return this._tableviewDescriptor.editEditor;
696
+ }
697
+ withFieldAction(action) {
698
+ this._fieldActions.push(action);
699
+ return this;
700
+ }
701
+ withFieldActions(actions) {
702
+ this._fieldActions = actions;
703
+ return this;
704
+ }
705
+ withAction(action) {
706
+ this._actions.push(action);
707
+ return this;
708
+ }
709
+ copy() {
710
+ const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
711
+ this.copyFieldsTo(field);
712
+ field._fieldType = this._fieldType;
713
+ field._fieldActions = this._fieldActions.map(a => a);
714
+ return field;
715
+ }
716
+ }
717
+ (function (FieldManyEditorDescriptor) {
718
+ let TypeEnum;
719
+ (function (TypeEnum) {
720
+ TypeEnum[TypeEnum["DialogEditor"] = 0] = "DialogEditor";
721
+ })(TypeEnum = FieldManyEditorDescriptor.TypeEnum || (FieldManyEditorDescriptor.TypeEnum = {}));
722
+ let ActionEnum;
723
+ (function (ActionEnum) {
724
+ ActionEnum[ActionEnum["View"] = 0] = "View";
725
+ ActionEnum[ActionEnum["Add"] = 1] = "Add";
726
+ ActionEnum[ActionEnum["Edit"] = 2] = "Edit";
727
+ ActionEnum[ActionEnum["Delete"] = 3] = "Delete";
728
+ })(ActionEnum = FieldManyEditorDescriptor.ActionEnum || (FieldManyEditorDescriptor.ActionEnum = {}));
729
+ })(FieldManyEditorDescriptor || (FieldManyEditorDescriptor = {}));
730
+ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
731
+ constructor(editor, name) {
732
+ super(editor);
733
+ this._fields = [];
734
+ this._validations = [];
735
+ this._name = `${this.baseName}${name}`;
736
+ this._default = name === EditorDescriptor.defaultGroupName;
737
+ }
738
+ get title() {
739
+ return this._title;
740
+ }
741
+ get validations() {
742
+ return this._validations;
743
+ }
744
+ get baseName() {
745
+ return `${this.groupName()}_`;
746
+ }
747
+ get name() {
748
+ return this._name;
749
+ }
750
+ get default() {
751
+ return this._default;
752
+ }
753
+ withTitle(title) {
754
+ this._title = title;
755
+ return this;
756
+ }
757
+ withValidation(name, validator, message) {
758
+ this._validations.push(new FieldValidationDescriptor(name, validator, message));
759
+ return this;
760
+ }
761
+ }
762
+ export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
763
+ constructor(editor, name) {
764
+ super(editor, name);
765
+ }
766
+ get fields() {
767
+ return this._fields;
768
+ }
769
+ groupName() {
770
+ return 'tab';
771
+ }
772
+ addField(field) {
773
+ this._fields.push(field);
774
+ return this;
775
+ }
776
+ copy() {
777
+ const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
778
+ tab._title = this._title;
779
+ tab._fields = this.fields.map(f => f.copy());
780
+ return tab;
781
+ }
782
+ }
783
+ export class FieldGroupDescriptor extends AFieldGroupDescriptor {
784
+ constructor(editor, name) {
785
+ super(editor, name);
786
+ this._type = FieldGroupDescriptor.TypeEnum.Fieldset;
787
+ if (this._default) {
788
+ this.asLogical();
789
+ }
790
+ }
791
+ get type() {
792
+ return this._type;
793
+ }
794
+ get fields() {
795
+ return this._fields;
796
+ }
797
+ groupName() {
798
+ return 'group';
799
+ }
800
+ addField(field) {
801
+ this._fields.push(field);
802
+ return this;
803
+ }
804
+ asLogical() {
805
+ this._type = FieldGroupDescriptor.TypeEnum.Logical;
806
+ return this;
807
+ }
808
+ copy() {
809
+ const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
810
+ group._type = this._type;
811
+ group._title = this._title;
812
+ group._fields = this.fields.map(f => f.copy());
813
+ return group;
814
+ }
815
+ }
816
+ (function (FieldGroupDescriptor) {
817
+ let TypeEnum;
818
+ (function (TypeEnum) {
819
+ TypeEnum[TypeEnum["Fieldset"] = 0] = "Fieldset";
820
+ TypeEnum[TypeEnum["Logical"] = 1] = "Logical";
821
+ })(TypeEnum = FieldGroupDescriptor.TypeEnum || (FieldGroupDescriptor.TypeEnum = {}));
822
+ })(FieldGroupDescriptor || (FieldGroupDescriptor = {}));
823
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzY3JpcHRvcnMvZmllbGQuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWtCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNELE9BQU8sRUFBYSxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBbUQsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RyxPQUFPLEVBQTBDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHckgsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNsRSxPQUFPLEVBQW1CLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUEwRCxNQUFNLElBQUksQ0FBQztBQUdsSyxNQUFNLE9BQWdCLHVCQUF1QjtJQUl6QyxZQUFzQixNQUE0QjtRQUZ4QyxZQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVNLFVBQVUsQ0FBQyxNQUFtQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQWdCLGdCQUF3QixTQUFRLHVCQUEyQjtJQTBCN0UsWUFBc0IsTUFBNEIsRUFBRSxRQUFnQjtRQUNoRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFuQlIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBSWxCLGlCQUFZLEdBQXFDLEVBQUUsQ0FBQztRQUtwRCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLFVBQUssR0FBNkIsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFFekQsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBNEIsQ0FBQztRQUl4RSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBSU0sU0FBUyxDQUFDLEtBQW9CO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxlQUFlLENBQUMsV0FBbUI7UUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFlBQVksQ0FBQyxRQUFnQjtRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsa0JBQXlIO1FBQzFKLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksa0JBQWtCLEVBQUU7WUFDcEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxFQUFFLGtCQUF5SDtRQUMxSixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztTQUNqRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxVQUFVLENBQUMsZ0JBQXNIO1FBQ3BJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsWUFBZTtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sVUFBVSxDQUFDLE1BQXVCO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxVQUFVLENBQUMsTUFBb0M7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFZLEVBQUUsU0FBNkIsRUFBRSxPQUFtQztRQUNsRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLHlCQUF5QixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sYUFBYSxDQUFDLFNBQWlCLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxjQUFjLEdBQUcsRUFBRSxFQUFFLGNBQXVCO1FBQ3JHLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxRQUFRLENBQUMsT0FBaUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1FBQzVFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxTQUFTLENBQUMsSUFBK0IsRUFBRSxPQUFrQixFQUFFLFdBQWdCLEVBQUUsSUFBbUM7UUFDdkgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVTLFlBQVksQ0FBQyxHQUE0QjtRQUMvQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekIsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvQixHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDL0IsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN2QyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ25ELEdBQUcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDL0MsR0FBRyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNuRCxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDakMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7Q0FDSjtBQUVELE1BQU0sS0FBVyxlQUFlLENBTS9CO0FBTkQsV0FBaUIsZUFBZTtJQUM1QixJQUFZLFFBSVg7SUFKRCxXQUFZLFFBQVE7UUFDaEIseUNBQUssQ0FBQTtRQUNMLDJDQUFNLENBQUE7UUFDTix5Q0FBSyxDQUFBO0lBQ1QsQ0FBQyxFQUpXLFFBQVEsR0FBUix3QkFBUSxLQUFSLHdCQUFRLFFBSW5CO0FBQ0wsQ0FBQyxFQU5nQixlQUFlLEtBQWYsZUFBZSxRQU0vQjtBQUVELE1BQU0sT0FBTyxvQkFBeUIsU0FBUSxnQkFBc0U7SUF5Q2hILFlBQVksTUFBNEIsRUFBRSxRQUFnQjtRQUN0RCxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBekNwQixlQUFVLEdBQWtDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFXL0UsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBRWxDLDRCQUE0QjtRQUNwQixrQkFBYSxHQUF1RCxFQUFFLENBQUM7UUFNdkUsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBV3BDLDJCQUEyQjtRQUNuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixxQkFBZ0IsR0FBRyxNQUFNLENBQUM7SUFTbEMsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyx1QkFBdUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsdUJBQXVCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUN4QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNyQyxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sT0FBTztRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQWtCLEVBQUUsU0FBa0IsRUFBRSxPQUF5QixFQUFFLE9BQWlCO1FBQzlGLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQWtCLEVBQUUsU0FBa0IsRUFBRSxPQUF5QjtRQUN6RixJQUFJLENBQUMsVUFBVSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDekQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFFBQVEsQ0FBQyxJQUFhLEVBQUUsR0FBWSxFQUFFLEdBQVksRUFBRSxpQkFBMEIsRUFBRSxpQkFBMEIsRUFBRSxpQkFBaUIsR0FBRyxJQUFJO1FBQ3ZJLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsaUJBQWlCLENBQUM7UUFDbEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBRTVDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBK0IsRUFBRSxnQkFBeUI7UUFDckUsSUFBSSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQTRCLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUMsQ0FBQSxDQUFDLENBQUM7UUFDOUksT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGVBQWUsQ0FBQyxRQUFrQixFQUFFLGdCQUFnQyxFQUFFLE1BQWdDLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDOUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3RELElBQUksT0FBTyxnQkFBZ0IsS0FBSyxXQUFXLEVBQUU7WUFDekMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsSUFBSSxTQUFTLENBQUM7WUFDbkcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ25HLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBZSxFQUFFLEdBQVUsRUFBRSxHQUFVLEVBQUUsUUFBa0I7UUFDM0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsSUFBSSxLQUFLLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRSxXQUFXLEdBQUcsTUFBTSxFQUFFLE1BQWU7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLG1CQUEyQjtRQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDdkQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxFQUEyRDtRQUN0RixJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxJQUFJO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBb0IsQ0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsS0FBSyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUMvRCxLQUFLLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQy9ELEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsS0FBSyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDakQsS0FBSyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzNDLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsS0FBSyxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN2RCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUFFRCxXQUFpQixvQkFBb0I7SUFDakMsSUFBWSxRQVlYO0lBWkQsV0FBWSxRQUFRO1FBQ2hCLDJDQUFNLENBQUE7UUFDTix5Q0FBSyxDQUFBO1FBQ0wsdUNBQUksQ0FBQTtRQUNKLCtDQUFRLENBQUE7UUFDUiwyQ0FBTSxDQUFBO1FBQ04sMkNBQU0sQ0FBQTtRQUNOLHlDQUFLLENBQUE7UUFDTCxtREFBVSxDQUFBO1FBQ1YsdUNBQUksQ0FBQTtRQUNKLHVDQUFJLENBQUE7UUFDSiw0Q0FBTSxDQUFBO0lBQ1YsQ0FBQyxFQVpXLFFBQVEsR0FBUiw2QkFBUSxLQUFSLDZCQUFRLFFBWW5CO0FBQ0wsQ0FBQyxFQWRnQixvQkFBb0IsS0FBcEIsb0JBQW9CLFFBY3BDO0FBRUQsTUFBTSxPQUFPLHFCQUE2QixTQUFRLGdCQUF1QjtJQWtCckUsWUFBWSxNQUE0QixFQUFFLFFBQWdCLEVBQUUsU0FBOEI7UUFDdEYsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQWpCbEIsZ0JBQVcsR0FBeUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUVsRyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFNN0IsdUJBQWtCLEdBQUcsNEJBQTRCLENBQUM7UUFFbEQsNkJBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLDhCQUF5QixHQUFHLEtBQUssQ0FBQztRQU94QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixTQUFTLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBVyxrQkFBa0I7UUFDekIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQVcscUJBQXFCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsdUJBQXVCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFXLHdCQUF3QjtRQUMvQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBVyxpQkFBaUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVcscUJBQXFCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFXLHVCQUF1QjtRQUM5QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUN6QyxDQUFDO0lBRU0sc0JBQXNCLENBQUMsa0JBQTBCLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDdkUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBQzlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLHNCQUFzQixDQUFDLGtCQUEwQjtRQUNwRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0seUJBQXlCLENBQUMscUJBQTZCO1FBQzFELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sbUJBQW1CLENBQUMsUUFBZ0I7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxVQUFVLENBQUksTUFBNkYsRUFBRSxXQUFxQjtRQUNySSxNQUFNLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxJQUFJLFdBQVcsRUFBRTtZQUNiLFlBQVksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDN0M7UUFDRCxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxZQUF5QztRQUNuRSxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRWUsVUFBVSxDQUFDLE1BQXlCO1FBQ2hELE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1FBQ3RFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxXQUFXLENBQUM7UUFDNUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFlBQVksQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sUUFBUSxDQUFDLHFCQUF5QyxFQUFFLGlCQUE4QztRQUNyRyxJQUFJLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDL0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO1FBQ3BELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sSUFBSTtRQUNQLE1BQU0sS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNyRCxLQUFLLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzNELEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsS0FBSyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUMvRCxLQUFLLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1FBQ2pFLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDM0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBRUQsV0FBaUIscUJBQXFCO0lBQ2xDLElBQVksY0FJWDtJQUpELFdBQVksY0FBYztRQUN0QiwyREFBUSxDQUFBO1FBQ1IsbUVBQVksQ0FBQTtRQUNaLHVEQUFNLENBQUE7SUFDVixDQUFDLEVBSlcsY0FBYyxHQUFkLG9DQUFjLEtBQWQsb0NBQWMsUUFJekI7QUFDTCxDQUFDLEVBTmdCLHFCQUFxQixLQUFyQixxQkFBcUIsUUFNckM7QUFFRCxNQUFNLE9BQU8seUJBQThCLFNBQVEscUJBQXFEO0lBS3BHLFlBQVksTUFBNEIsRUFBRSxRQUFnQixFQUFFLFFBQWtCLEVBQUUsT0FBaUMsRUFBRSxXQUFXLEdBQUcsS0FBSyxFQUFFLGdCQUFnQztRQUNwSyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUhqQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUkzQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxFQUFFO1lBQ3pDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsSUFBSSxTQUFTLENBQUM7WUFDcEcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ25HLE1BQU0sWUFBWSxHQUFHLElBQUksa0JBQWtCLENBQWtDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUNoSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEdBQUcsZUFBd0M7UUFDbEUsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUU7WUFDMUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUMxSCxJQUFJLG1CQUFtQixFQUFFO2dCQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNqRixJQUFJLE1BQU0sRUFBRTtvQkFDUixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztpQkFDMUI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLG9CQUFvQixDQUFDLFlBQThCO1FBQ3RELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDckgsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2hGLElBQUksTUFBTSxFQUFFO2dCQUNSLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNqQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVlLGNBQWMsQ0FBQyxXQUFXLEdBQUcsSUFBSTtRQUM3QyxLQUFLLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRWUsSUFBSTtRQUNoQixNQUFNLEtBQUssR0FBRyxJQUFJLHlCQUF5QixDQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDckQsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNyRCxLQUFLLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzNELEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTywrQkFBdUMsU0FBUSxnQkFBdUI7SUFVL0UsWUFBWSxNQUE0QixFQUFFLFFBQWdCLEVBQUUsbUJBQXVDLEVBQUUscUJBQXlDO1FBQzFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFScEIsZUFBVSxHQUE2QywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7UUFDdkgsNkJBQXdCLEdBQXNDLElBQUksQ0FBQztRQUNuRSxhQUFRLEdBQXNELEVBQUUsQ0FBQztRQUNqRSw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDaEMsMkJBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUkvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7UUFDaEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFILENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLHVCQUF1QjtRQUM5QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLHNCQUFzQjtRQUM3QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxxQkFBcUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsb0JBQW9CO1FBQzNCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBVyxxQkFBcUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDdkMsQ0FBQztJQUVNLFVBQVUsQ0FBSSxNQUF1RixFQUFFLFdBQXFCO1FBQy9ILE1BQU0sWUFBWSxHQUFHLElBQUkscUJBQXFCLENBQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRixJQUFJLFdBQVcsRUFBRTtZQUNiLFlBQVksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDN0M7UUFDRCxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxZQUFZLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLHNCQUFzQixDQUFDLFlBQXdDO1FBQ2xFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxZQUFZLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxVQUE2RCxFQUFFO1FBQzlFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLGNBQXNCLEVBQUUsYUFBcUIsRUFBRSxnQkFBZ0IsR0FBRyxJQUFJO1FBQzNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUNoRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxhQUFhLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLCtCQUErQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEosSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFDL0QsS0FBSyxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM3RCxLQUFLLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzNELEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDekQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBRUQsV0FBaUIsK0JBQStCO0lBQzVDLElBQVksUUFFWDtJQUZELFdBQVksUUFBUTtRQUNoQiwyRUFBc0IsQ0FBQTtJQUMxQixDQUFDLEVBRlcsUUFBUSxHQUFSLHdDQUFRLEtBQVIsd0NBQVEsUUFFbkI7SUFFRCxJQUFZLFVBR1g7SUFIRCxXQUFZLFVBQVU7UUFDbEIseUNBQUcsQ0FBQTtRQUNILCtDQUFNLENBQUE7SUFDVixDQUFDLEVBSFcsVUFBVSxHQUFWLDBDQUFVLEtBQVYsMENBQVUsUUFHckI7QUFDTCxDQUFDLEVBVGdCLCtCQUErQixLQUEvQiwrQkFBK0IsUUFTL0M7QUFFRCxNQUFNLE9BQU8seUJBQWlDLFNBQVEsZ0JBQXVCO0lBTXpFLFlBQVksTUFBNEIsRUFBRSxRQUFnQixFQUFFLG1CQUEyQztRQUNuRyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBTHBCLGVBQVUsR0FBdUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNqRyxrQkFBYSxHQUFnRCxFQUFFLENBQUM7UUFDaEUsYUFBUSxHQUErQixFQUFFLENBQUM7UUFJOUMsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDbkIseUJBQXlCLENBQUMsVUFBVSxDQUFDLElBQUksRUFDekMseUJBQXlCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFDeEMseUJBQXlCLENBQUMsVUFBVSxDQUFDLElBQUksRUFDekMseUJBQXlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDOUMsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDO0lBQ2hELENBQUM7SUFFTSxlQUFlLENBQUMsTUFBNEM7UUFDL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQStDO1FBQ25FLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxVQUFVLENBQUMsTUFBMkI7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxLQUFLLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBRUQsV0FBaUIseUJBQXlCO0lBQ3RDLElBQVksUUFFWDtJQUZELFdBQVksUUFBUTtRQUNoQix1REFBWSxDQUFBO0lBQ2hCLENBQUMsRUFGVyxRQUFRLEdBQVIsa0NBQVEsS0FBUixrQ0FBUSxRQUVuQjtJQUVELElBQVksVUFLWDtJQUxELFdBQVksVUFBVTtRQUNsQiwyQ0FBSSxDQUFBO1FBQ0oseUNBQUcsQ0FBQTtRQUNILDJDQUFJLENBQUE7UUFDSiwrQ0FBTSxDQUFBO0lBQ1YsQ0FBQyxFQUxXLFVBQVUsR0FBVixvQ0FBVSxLQUFWLG9DQUFVLFFBS3JCO0FBQ0wsQ0FBQyxFQVhnQix5QkFBeUIsS0FBekIseUJBQXlCLFFBV3pDO0FBRUQsTUFBTSxPQUFnQixxQkFBMEIsU0FBUSx1QkFBMkI7SUFPL0UsWUFBc0IsTUFBNEIsRUFBRSxJQUFZO1FBQzVELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUpSLFlBQU8sR0FBa0MsRUFBRSxDQUFDO1FBQzVDLGlCQUFZLEdBQXFDLEVBQUUsQ0FBQztRQUkxRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFJRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFRTSxTQUFTLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sY0FBYyxDQUFDLElBQVksRUFBRSxTQUE2QixFQUFFLE9BQW1DO1FBQ2xHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUkseUJBQXlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyx1QkFBNEIsU0FBUSxxQkFBeUI7SUFDdEUsWUFBWSxNQUE0QixFQUFFLElBQVk7UUFDbEQsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBMEMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sU0FBUztRQUNaLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBK0I7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDUCxNQUFNLEdBQUcsR0FBRyxJQUFJLHVCQUF1QixDQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QixHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQXlCLFNBQVEscUJBQXlCO0lBR25FLFlBQVksTUFBNEIsRUFBRSxJQUFZO1FBQ2xELEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFIaEIsVUFBSyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFJbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBMkMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sU0FBUztRQUNaLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBZ0M7UUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFNBQVM7UUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFvQixDQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQUVELFdBQWlCLG9CQUFvQjtJQUNqQyxJQUFZLFFBR1g7SUFIRCxXQUFZLFFBQVE7UUFDaEIsK0NBQVEsQ0FBQTtRQUNSLDZDQUFPLENBQUE7SUFDWCxDQUFDLEVBSFcsUUFBUSxHQUFSLDZCQUFRLEtBQVIsNkJBQVEsUUFHbkI7QUFDTCxDQUFDLEVBTGdCLG9CQUFvQixLQUFwQixvQkFBb0IsUUFLcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3QsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge01uZ0Zvcm1GaWVsZEV2ZW50LCBNbmdGb3JtRmllbGRFdmVudERhdGEsIE1uZ0Zvcm1GaWVsZEV2ZW50VHlwZUVudW19IGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyLCBJVGFibGVEYXRhUHJvdmlkZXIsIExvb2t1cERhdGFQcm92aWRlciwgVGFibGV2aWV3RGF0YVByb3ZpZGVyfSBmcm9tICcuLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0VudW1WYWx1ZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7Q2xhc3NUeXBlLCBFbnVtQ29uc3RhbnRUeXBlLCBFbnVtVHlwZSwgTW5nRmllbGRWYWxpZGF0aW9uTWVzc2FnZSwgTW5nRmllbGRWYWxpZGF0b3J9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7RW51bVV0aWwsIEkxOG5VdGlscywgTW9kZWxVdGlsLCBUeXBlVXRpbH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtBY3Rpb25EZXNjcmlwdG9yLCBFZGl0b3JEZXNjcmlwdG9yLCBGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBJTG9va3VwRGVzY3JpcHRvciwgVGFibGVEZXNjcmlwdG9yLCBUYWJsZXZpZXdEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5pbXBvcnQge0ZpZWxkQ29uZmlnLCBGaWVsZExvb2t1cENvbmZpZ30gZnJvbSAnLi9maWVsZC5kZXNjcmlwdG9yLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2NvbmZpZzogRmllbGRDb25maWcgPSB7fTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+KSB7XG4gICAgICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENvbmZpZyhjb25maWc6IEZpZWxkQ29uZmlnKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcHJvcGVydHk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2dyb3VwPzogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2xhYmVsPzogc3RyaW5nIHwgbnVsbDtcblxuICAgIHByb3RlY3RlZCBfcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9oZWxwVGV4dD86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfcmVxdWlyZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VmFsdWU/OiBUO1xuICAgIHByb3RlY3RlZCBfZ2V0dGVyPzogKGl0ZW06IEVUKSA9PiBUO1xuICAgIHByb3RlY3RlZCBfc2V0dGVyPzogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRpb25zOiBBcnJheTxGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yPiA9IFtdO1xuICAgIHByb3RlY3RlZCBfcmVxdWlyZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgobW9kZWw6IGFueSwgZm9ybVN0YXRlPzogYW55LCBmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9oaWRkZW5FeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByb3RlY3RlZCBfY2xhc3NOYW1lID0gJyc7XG4gICAgcHJvdGVjdGVkIF9maWVsZENsYXNzTmFtZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2xhYmVsQ2xhc3NOYW1lID0gJyc7XG4gICAgcHJvdGVjdGVkIF9pbnB1dENsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2l6ZTogRmllbGREZXNjcmlwdG9yLlNpemVFbnVtID0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLk5vcm1hbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1uZ0Zvcm1GaWVsZEV2ZW50PFQsIEVUPj4oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX3Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gSTE4blV0aWxzLlR5cGUuZ2V0UHJvcGVydHlLZXkodGhpcy5fZWRpdG9yLm1vZGVsLnR5cGVOYW1lLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVscFRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWxwVGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRkZW5FeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZENsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxhYmVsQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWxDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbnB1dENsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0Q2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1NpemVTbWFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPT09IEZpZWxkRGVzY3JpcHRvci5TaXplRW51bS5TbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZUxhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGREZXNjcmlwdG9yLlNpemVFbnVtLkxhcmdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBjb3B5KCk6IEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+O1xuXG4gICAgcHVibGljIHdpdGhMYWJlbChsYWJlbDogc3RyaW5nIHwgbnVsbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIZWxwVGV4dChoZWxwVGV4dDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hlbHBUZXh0ID0gaGVscFRleHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVxdWlyZWQocmVxdWlyZWQgPSB0cnVlLCByZXF1aXJlZEV4cHJlc3Npb24/OiBzdHJpbmcgfCAoKG1vZGVsOiBhbnksIGZvcm1TdGF0ZT86IGFueSwgZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVkID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmIChyZXF1aXJlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbiA9IHJlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkID0gdHJ1ZSwgZGlzYWJsZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICBpZiAoZGlzYWJsZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZEV4cHJlc3Npb24gPSBkaXNhYmxlZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIaWRkZW4oaGlkZGVuRXhwcmVzc2lvbjogc3RyaW5nIHwgKChtb2RlbDogYW55LCBmb3JtU3RhdGU/OiBhbnksIGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9oaWRkZW5FeHByZXNzaW9uID0gaGlkZGVuRXhwcmVzc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlOiBUKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhHZXR0ZXIoZ2V0dGVyOiAoaXRlbTogRVQpID0+IFQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZ2V0dGVyID0gZ2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNldHRlcihzZXR0ZXI6IChpdGVtOiBFVCwgdmFsdWU6IFQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2V0dGVyID0gc2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3I/OiBNbmdGaWVsZFZhbGlkYXRvciwgbWVzc2FnZT86IE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcsIGxhYmVsQ2xhc3NOYW1lID0gJycsIGlucHV0Q2xhc3NOYW1lID0gJycsIGZpZWxkQ2xhc3NOYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fbGFiZWxDbGFzc05hbWUgPSBsYWJlbENsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5faW5wdXRDbGFzc05hbWUgPSBpbnB1dENsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fZmllbGRDbGFzc05hbWUgPSBmaWVsZENsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IEZpZWxkRGVzY3JpcHRvci5TaXplRW51bSA9IEZpZWxkRGVzY3JpcHRvci5TaXplRW51bS5Ob3JtYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0RXZlbnQodHlwZTogTW5nRm9ybUZpZWxkRXZlbnRUeXBlRW51bSwgY21wVHlwZTogVHlwZTxhbnk+LCBjbXBJbnN0YW5jZTogYW55LCBkYXRhPzogTW5nRm9ybUZpZWxkRXZlbnREYXRhPFQsIEVUPikge1xuICAgICAgICB0aGlzLl9ldmVudHNTdWJqZWN0Lm5leHQobmV3IE1uZ0Zvcm1GaWVsZEV2ZW50KHR5cGUsIGNtcFR5cGUsIGNtcEluc3RhbmNlLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBldmVudHMkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4pIHtcbiAgICAgICAgb2JqLl9sYWJlbCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICBvYmouX3BsYWNlaG9sZGVyID0gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgICAgIG9iai5faGVscFRleHQgPSB0aGlzLl9oZWxwVGV4dDtcbiAgICAgICAgb2JqLl9yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xuICAgICAgICBvYmouX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIG9iai5fZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICBvYmouX3JlcXVpcmVkRXhwcmVzc2lvbiA9IHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9oaWRkZW5FeHByZXNzaW9uID0gdGhpcy5faGlkZGVuRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9kaXNhYmxlZEV4cHJlc3Npb24gPSB0aGlzLl9kaXNhYmxlZEV4cHJlc3Npb247XG4gICAgICAgIG9iai5fY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xuICAgICAgICBvYmouX3NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIG9iai5fZ2V0dGVyID0gdGhpcy5fZ2V0dGVyO1xuICAgICAgICBvYmouX3NldHRlciA9IHRoaXMuX3NldHRlcjtcbiAgICAgICAgb2JqLl92YWxpZGF0aW9ucyA9IHRoaXMuX3ZhbGlkYXRpb25zO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFNpemVFbnVtIHtcbiAgICAgICAgU21hbGwsXG4gICAgICAgIE5vcm1hbCxcbiAgICAgICAgTGFyZ2VcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgRmlsZSB8IEZpbGVbXSwgRVQ+IHtcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dDtcblxuICAgIC8vIHRleHRhcmVhIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9yb3dzPzogbnVtYmVyO1xuXG4gICAgLy8gbnVtYmVyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9udW1iZXJNaW4/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4PzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlclN0ZXA/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyVXNlR3JvdXBpbmcgPSB0cnVlO1xuXG4gICAgLy8gcmFkaW8gc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX3JhZGlvT3B0aW9uczogQXJyYXk8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlPj4gPSBbXTtcblxuICAgIC8vIGRhdGVwaWNrZXIgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJGb3JtYXQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlck1pbj86IERhdGU7XG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlck1heD86IERhdGU7XG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlclNob3dUaW1lID0gZmFsc2U7XG5cbiAgICAvLyBpbnB1dCBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX21pbkxlbmd0aD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9wYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwO1xuXG4gICAgLy8gbWFzayBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfbWFzaz86IHN0cmluZztcbiAgICBwcml2YXRlIF9zbG90Q2hhcj86IHN0cmluZztcblxuICAgIC8vIGZpbGUgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX2ZpbGVNdWx0aXBsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2ZpbGVNYXhGaWxlU2l6ZSA9IDUwMDAwMDtcbiAgICBwcml2YXRlIF9maWxlQWNjZXB0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ZpbGVPblNlbGVjdEhhbmRsZXI/OiAoZmlsZTogRmlsZVtdIHwgbnVsbCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB2b2lkO1xuXG4gICAgLy8gY3VzdG9tIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfY3VzdG9tQ29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlclN0ZXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJTdGVwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heEZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJVc2VHcm91cGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNsb3RDaGFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2xvdENoYXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlTXVsdGlwbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlTXVsdGlwbGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlTWF4RmlsZVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlTWF4RmlsZVNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlQWNjZXB0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZUFjY2VwdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbGVPblNlbGVjdEhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlT25TZWxlY3RIYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VzdG9tQ29tcG9uZW50TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNvbXBvbmVudE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzSGlkZGVuKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5IaWRkZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0xhYmVsKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5MYWJlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dChtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCwgaXNFbWFpbD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dDtcbiAgICAgICAgdGhpcy5fbWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgICAgIHRoaXMuX3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICBpZiAoaXNFbWFpbCkge1xuICAgICAgICAgICAgdGhpcy53aXRoVmFsaWRhdGlvbignZW1haWwnLCBjb250cm9sID0+IFZhbGlkYXRvcnMuZW1haWwoY29udHJvbCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1RleHRhcmVhKHJvd3MgPSAzLCBtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0YXJlYTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHJvd3M7XG4gICAgICAgIHRoaXMuX21pbkxlbmd0aCA9IG1pbkxlbmd0aDtcbiAgICAgICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgICAgICB0aGlzLl9wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTnVtYmVyKHN0ZXA/OiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyLCBtaW5GcmFjdGlvbkRpZ2l0cz86IG51bWJlciwgbWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXIsIG51bWJlclVzZUdyb3VwaW5nID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5OdW1iZXI7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW4gPSBtaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgdGhpcy5fbnVtYmVyVXNlR3JvdXBpbmcgPSBudW1iZXJVc2VHcm91cGluZztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNTd2l0Y2goKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlN3aXRjaDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzUmFkaW8ob3B0aW9uczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5SYWRpbztcbiAgICAgICAgdGhpcy5fcmFkaW9PcHRpb25zID0gb3B0aW9ucy5tYXAobyA9PiA8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4+e3ZhbHVlOiBvLCB0aXRsZTogYCR7b3B0aW9uc1RpdGxlUGF0aCA/IGAke29wdGlvbnNUaXRsZVBhdGh9LmAgOiAnJ30ke299YH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNSYWRpb0Zyb21FbnVtKGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyB8IG51bGwsIHZhbHVlcz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlJhZGlvO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnNUaXRsZVBhdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zVGl0bGVQYXRoID0gVHlwZVV0aWwuZmluZEVudW1OYW1lKGVudW1UeXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yYWRpb09wdGlvbnMgPSBBcnJheS5pc0FycmF5KHZhbHVlcylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIHZhbHVlcywgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGggPz8gdW5kZWZpbmVkKVxuICAgICAgICAgICAgOiBFbnVtVXRpbC5mcm9tQ29uc3RhbnRzQXNFbnVtVmFsdWVBcnJheShlbnVtVHlwZSwgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGggPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzRGF0ZVBpY2tlcihmb3JtYXQ/OiBzdHJpbmcsIG1pbj86IERhdGUsIG1heD86IERhdGUsIHNob3dUaW1lPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5EYXRlcGlja2VyO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyRm9ybWF0ID0gZm9ybWF0O1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyTWluID0gbWluO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyTWF4ID0gbWF4O1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWUgPSBzaG93VGltZSA/PyBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTWFzayhtYXNrOiBzdHJpbmcsIHNsb3RDaGFyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uTWFzaztcbiAgICAgICAgdGhpcy5fbWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuX3Nsb3RDaGFyID0gc2xvdENoYXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0ZpbGUobXVsdGlwbGUgPSBmYWxzZSwgbWF4RmlsZVNpemUgPSA1MDAwMDAsIGFjY2VwdD86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5GaWxlO1xuICAgICAgICB0aGlzLl9maWxlTXVsdGlwbGUgPSBtdWx0aXBsZTtcbiAgICAgICAgdGhpcy5fZmlsZU1heEZpbGVTaXplID0gbWF4RmlsZVNpemU7XG4gICAgICAgIHRoaXMuX2ZpbGVBY2NlcHQgPSBhY2NlcHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0N1c3RvbUNvbXBvbmVudChjdXN0b21Db21wb25lbnROYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uQ3VzdG9tO1xuICAgICAgICB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lID0gY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWxlT25TZWxlY3RIYW5kbGVyKGZuOiAoZmlsZTogRmlsZVtdIHwgbnVsbCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuX2ZpbGVPblNlbGVjdEhhbmRsZXIgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX3Jvd3MgPSB0aGlzLl9yb3dzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluID0gdGhpcy5fbnVtYmVyTWluO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4ID0gdGhpcy5fbnVtYmVyTWF4O1xuICAgICAgICBmaWVsZC5fbnVtYmVyU3RlcCA9IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX251bWJlclVzZUdyb3VwaW5nID0gdGhpcy5fbnVtYmVyVXNlR3JvdXBpbmc7XG4gICAgICAgIGZpZWxkLl9yYWRpb09wdGlvbnMgPSBbLi4udGhpcy5fcmFkaW9PcHRpb25zXTtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJGb3JtYXQgPSB0aGlzLl9kYXRlUGlja2VyRm9ybWF0O1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1pbiA9IHRoaXMuX2RhdGVQaWNrZXJNaW47XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyTWF4ID0gdGhpcy5fZGF0ZVBpY2tlck1heDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJTaG93VGltZSA9IHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZTtcbiAgICAgICAgZmllbGQuX21heExlbmd0aCA9IHRoaXMuX21heExlbmd0aDtcbiAgICAgICAgZmllbGQuX21pbkxlbmd0aCA9IHRoaXMuX21pbkxlbmd0aDtcbiAgICAgICAgZmllbGQuX3BhdHRlcm4gPSB0aGlzLl9wYXR0ZXJuO1xuICAgICAgICBmaWVsZC5fbWFzayA9IHRoaXMuX21hc2s7XG4gICAgICAgIGZpZWxkLl9zbG90Q2hhciA9IHRoaXMuX3Nsb3RDaGFyO1xuICAgICAgICBmaWVsZC5fZmlsZU11bHRpcGxlID0gdGhpcy5fZmlsZU11bHRpcGxlO1xuICAgICAgICBmaWVsZC5fZmlsZU1heEZpbGVTaXplID0gdGhpcy5fZmlsZU1heEZpbGVTaXplO1xuICAgICAgICBmaWVsZC5fZmlsZUFjY2VwdCA9IHRoaXMuX2ZpbGVBY2NlcHQ7XG4gICAgICAgIGZpZWxkLl9maWxlT25TZWxlY3RIYW5kbGVyID0gdGhpcy5fZmlsZU9uU2VsZWN0SGFuZGxlcjtcbiAgICAgICAgZmllbGQuX2N1c3RvbUNvbXBvbmVudE5hbWUgPSB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkSW5wdXREZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIEhpZGRlbixcbiAgICAgICAgTGFiZWwsXG4gICAgICAgIFRleHQsXG4gICAgICAgIFRleHRhcmVhLFxuICAgICAgICBOdW1iZXIsXG4gICAgICAgIFN3aXRjaCxcbiAgICAgICAgUmFkaW8sXG4gICAgICAgIERhdGVwaWNrZXIsXG4gICAgICAgIE1hc2ssXG4gICAgICAgIEZpbGUsXG4gICAgICAgIEN1c3RvbVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBpbXBsZW1lbnRzIElMb29rdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX21vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2xvb2t1cFR5cGU6IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bSA9IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bS5Ecm9wZG93bjtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFLZXlQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFQcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55PjtcblxuICAgIHByb3RlY3RlZCBfZHJvcGRvd25DbGFzc05hbWUgPSAnbW5nLWZpbHRlci1sb29rdXAtZHJvcGRvd24nO1xuXG4gICAgcHJvdGVjdGVkIF9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcj86IFRhYmxlRGVzY3JpcHRvcjxUPjtcbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyPzogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IG1vZGVsVHlwZTtcbiAgICAgICAgTW9kZWxVdGlsLnRyeVNldExvb2t1cEl0ZW1zUHJvcGVydGllcyh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvb2t1cFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNMYWJlbFByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNMYWJlbFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0Rpc2FibGVkUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvY29tcGxldGVPcGVuT25Gb2N1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZHJvcGRvd25DbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcm9wZG93bkNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcsIHRyYW5zbGF0ZSA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IGl0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc1ZhbHVlUHJvcGVydHkoaXRlbXNWYWx1ZVByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5ID0gaXRlbXNWYWx1ZVByb3BlcnR5O1xuICAgICAgICB0aGlzLl9kYXRhS2V5UHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eSA9IGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEYXRhS2V5UHJvcGVydHkocHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhS2V5UHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cDxTPihsb29rdXA6IChxdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMsIHNlYXJjaD86IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxBcnJheTxUPj4sIHNlcnZpY2VUeXBlPzogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPFQsIFM+KHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhMb29rdXAobG9va3VwKTtcbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoQ29uZmlnKGNvbmZpZzogRmllbGRMb29rdXBDb25maWcpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLndpdGhDb25maWcoY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNBdXRvY29tcGxldGUob3Blbk9uRm9jdXMgPSBmYWxzZSwgaW5saW5lU2VhcmNoID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVHlwZSA9IEZpbHRlckxvb2t1cERlc2NyaXB0b3IuTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IG9wZW5PbkZvY3VzO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPSBpbmxpbmVTZWFyY2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RpYWxvZyhsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPiwgdGFibGVEYXRhUHJvdmlkZXI/OiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkRpYWxvZztcbiAgICAgICAgdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yID0gbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9kaWFsb2dUYWJsZURhdGFQcm92aWRlciA9IHRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFR5cGUgPSB0aGlzLl9sb29rdXBUeXBlO1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9kcm9wZG93bkNsYXNzTmFtZSA9IHRoaXMuX2Ryb3Bkb3duQ2xhc3NOYW1lO1xuICAgICAgICBmaWVsZC5fYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXMgPSB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cztcbiAgICAgICAgZmllbGQuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaDtcbiAgICAgICAgZmllbGQuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvciA9IHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZSxcbiAgICAgICAgRGlhbG9nXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBGaWVsZExvb2t1cERlc2NyaXB0b3I8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bVR5cGU6IEVudW1UeXBlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbkVudW1WYWx1ZXM6IEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+W107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZUFzVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9ucz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcbiAgICAgICAgdGhpcy5fZW51bVR5cGUgPSBlbnVtVHlwZTtcbiAgICAgICAgdGhpcy5fbmFtZUFzVmFsdWUgPSBuYW1lQXNWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0aW9uRW51bVZhbHVlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG9wdGlvbnMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIGFueT4obnVsbCkud2l0aExvb2t1cCgoKSA9PiBvZih0aGlzLl9vcHRpb25FbnVtVmFsdWVzKSk7XG4gICAgICAgIHRoaXMud2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXIpO1xuICAgICAgICB0aGlzLndpdGhJdGVtc0xhYmVsUHJvcGVydHkoJ3RpdGxlJywgb3B0aW9uc1RpdGxlUGF0aCAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMud2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICAgICAgdGhpcy53aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW51bVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbnVtVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkT3B0aW9ucyguLi5kaXNhYmxlZE9wdGlvbnM6IEFycmF5PEVudW1Db25zdGFudFR5cGU+KTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgZGlzYWJsZWRPcHRpb24gb2YgZGlzYWJsZWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlZE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRpc2FibGVkT3B0aW9uKSA6IGRpc2FibGVkT3B0aW9uO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkT3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25FbnVtVmFsdWVzLmZpbmQobyA9PiBvLnZhbHVlID09PSBkaXNhYmxlZE9wdGlvblZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFZhbHVlRW51bShkZWZhdWx0VmFsdWU6IEVudW1Db25zdGFudFR5cGUpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRlZmF1bHRWYWx1ZSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGlmIChkZWZhdWx0T3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX29wdGlvbkVudW1WYWx1ZXMuZmluZChvID0+IG8udmFsdWUgPT09IGRlZmF1bHRPcHRpb25WYWx1ZSk7XG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aXRoRGVmYXVsdFZhbHVlKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGFzQXV0b2NvbXBsZXRlKG9wZW5PbkZvY3VzID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBzdXBlci5hc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb3B5KCk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fZW51bVR5cGUsIFtdKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVHlwZSA9IHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc0xhYmVsUHJvcGVydHkgPSB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIG1haW4gdGFibGUgY29tcG9uZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHdoZXJlIHNlbGVjdCB3aWxsIGJlIGFwcGxpZWRcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtLkRpYWxvZ1RhYmxlTXVsdGlzZWxlY3Q7XG4gICAgcHJpdmF0ZSBfbG9va3VwVGFibGVEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQXJyYXk8RmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtPiA9IFtdO1xuICAgIHByaXZhdGUgX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSAnJztcbiAgICBwcml2YXRlIF9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvciA9IG1haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvciA9IGxvb2t1cFRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fYWN0aW9ucy5wdXNoKEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5BZGQsIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWFpblRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb29rdXBUYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXA8Uz4oZ2V0QWxsOiAocXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+LCBzZXJ2aWNlVHlwZT86IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IFRhYmxldmlld0RhdGFQcm92aWRlcjxULCBTPih0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yLm1vZGVsLnR5cGUpO1xuICAgICAgICBpZiAoc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoU2VydmljZVR5cGUoc2VydmljZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFQcm92aWRlci53aXRoR2V0QWxsKGdldEFsbCk7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEFjdGlvbnMoYWN0aW9uczogQXJyYXk8RmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtPiA9IFtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWN0aW9ucy5wdXNoKC4uLmFjdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cEV4Y2x1ZGUoZmlsdGVyUHJvcGVydHk6IHN0cmluZywgdmFsdWVQcm9wZXJ0eTogc3RyaW5nLCBoYXNMb29rdXBFeGNsdWRlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gaGFzTG9va3VwRXhjbHVkZTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gZmlsdGVyUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5ID0gdmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IuY29weSgpLCB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMubWFwKGEgPT4gYSk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICBmaWVsZC5faGFzTG9va3VwRXhjbHVkZVZhbHVlcyA9IHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgICAgIGZpZWxkLl9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFR5cGVFbnVtIHtcbiAgICAgICAgRGlhbG9nVGFibGVNdWx0aXNlbGVjdFxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBBZGQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bS5EaWFsb2dFZGl0b3I7XG4gICAgcHJpdmF0ZSBfZmllbGRBY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0+ID0gW107XG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjxUPj4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIC8vIHRoaXMuX21vZGVsVHlwZSA9IG1vZGVsVHlwZTtcbiAgICAgICAgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvciA9IHRhYmxldmlld0Rlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLlZpZXcsXG4gICAgICAgICAgICBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uQWRkLFxuICAgICAgICAgICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkVkaXQsXG4gICAgICAgICAgICBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uRGVsZXRlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZEFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZEFjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxldmlld0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci50YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvckNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuYWRkRWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yUmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3Iudmlld0VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvclVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuZWRpdEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpZWxkQWN0aW9uKGFjdGlvbjogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmllbGRBY3Rpb25zKGFjdGlvbnM6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bVtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9uKGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fZmllbGRBY3Rpb25zID0gdGhpcy5fZmllbGRBY3Rpb25zLm1hcChhID0+IGEpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFR5cGVFbnVtIHtcbiAgICAgICAgRGlhbG9nRWRpdG9yXG4gICAgfVxuXG4gICAgZXhwb3J0IGVudW0gQWN0aW9uRW51bSB7XG4gICAgICAgIFZpZXcsXG4gICAgICAgIEFkZCxcbiAgICAgICAgRWRpdCxcbiAgICAgICAgRGVsZXRlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF92YWxpZGF0aW9uczogQXJyYXk8RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGAke3RoaXMuYmFzZU5hbWV9JHtuYW1lfWA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHQgPSBuYW1lID09PSBFZGl0b3JEZXNjcmlwdG9yLmRlZmF1bHRHcm91cE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdldCBmaWVsZHMoKTogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+W107XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiYXNlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ3JvdXBOYW1lKCl9X2A7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0O1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdyb3VwTmFtZSgpOiBzdHJpbmc7XG5cbiAgICBhYnN0cmFjdCBhZGRGaWVsZChmaWVsZDogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+KTogdGhpcztcblxuICAgIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcblxuICAgIHB1YmxpYyB3aXRoVGl0bGUodGl0bGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3I/OiBNbmdGaWVsZFZhbGlkYXRvciwgbWVzc2FnZT86IE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFiJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IG5ldyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIHRhYi5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgdGFiLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IEZpZWxkR3JvdXBEZXNjcmlwdG9yLlR5cGVFbnVtLkZpZWxkc2V0O1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFzTG9naWNhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNMb2dpY2FsKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90eXBlID0gRmllbGRHcm91cERlc2NyaXB0b3IuVHlwZUVudW0uTG9naWNhbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5uYW1lLnN1YnN0cmluZyh0aGlzLmJhc2VOYW1lLmxlbmd0aCkpO1xuICAgICAgICBncm91cC5fdHlwZSA9IHRoaXMuX3R5cGU7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpZWxkR3JvdXBEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIEZpZWxkc2V0LFxuICAgICAgICBMb2dpY2FsXG4gICAgfVxufVxuIl19