@sunbird-cb/utils-v2 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/README.md +24 -0
  2. package/bundles/sunbird-cb-utils-v2.umd.js +6940 -0
  3. package/bundles/sunbird-cb-utils-v2.umd.js.map +1 -0
  4. package/bundles/sunbird-cb-utils-v2.umd.min.js +16 -0
  5. package/bundles/sunbird-cb-utils-v2.umd.min.js.map +1 -0
  6. package/esm2015/lib/components/image-crop/image-crop.component.js +195 -0
  7. package/esm2015/lib/components/image-crop/image-crop.module.js +27 -0
  8. package/esm2015/lib/constants/features.enum.js +555 -0
  9. package/esm2015/lib/constants/instances.enum.js +5 -0
  10. package/esm2015/lib/constants/misc.constants.js +1 -0
  11. package/esm2015/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.js +87 -0
  12. package/esm2015/lib/directives/class-change-on-scroll/class-change-on-scroll.module.js +15 -0
  13. package/esm2015/lib/directives/default-thumbnail/default-thumbnail.directive.js +38 -0
  14. package/esm2015/lib/directives/default-thumbnail/default-thumbnail.module.js +15 -0
  15. package/esm2015/lib/directives/image-responsive/image-responsive.directive.js +92 -0
  16. package/esm2015/lib/directives/image-responsive/image-responsive.module.js +15 -0
  17. package/esm2015/lib/directives/in-view-port/in-view-port.directive.js +68 -0
  18. package/esm2015/lib/directives/in-view-port/in-view-port.module.js +15 -0
  19. package/esm2015/lib/directives/navigation/navigation.directive.js +39 -0
  20. package/esm2015/lib/directives/navigation/navigation.module.js +15 -0
  21. package/esm2015/lib/directives/permission/permission.directive.js +11 -0
  22. package/esm2015/lib/directives/permission/permission.module.js +15 -0
  23. package/esm2015/lib/helpers/functions/getStringifiedQueryParams.js +9 -0
  24. package/esm2015/lib/helpers/horizontal-scroller/horizontal-scroller.component.js +99 -0
  25. package/esm2015/lib/helpers/horizontal-scroller/horizontal-scroller.module.js +19 -0
  26. package/esm2015/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.js +172 -0
  27. package/esm2015/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.js +19 -0
  28. package/esm2015/lib/helpers/logout/logout.component.js +90 -0
  29. package/esm2015/lib/helpers/logout/logout.module.js +20 -0
  30. package/esm2015/lib/models/profile-v3.models.js +104 -0
  31. package/esm2015/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.js +15 -0
  32. package/esm2015/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.js +94 -0
  33. package/esm2015/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.js +13 -0
  34. package/esm2015/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.js +59 -0
  35. package/esm2015/lib/pipes/pipe-count-transform/pipe-count-transform.module.js +15 -0
  36. package/esm2015/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.js +33 -0
  37. package/esm2015/lib/pipes/pipe-date-concat/pipe-date-concat.module.js +15 -0
  38. package/esm2015/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.js +43 -0
  39. package/esm2015/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.js +15 -0
  40. package/esm2015/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +79 -0
  41. package/esm2015/lib/pipes/pipe-email/pipe-email.module.js +15 -0
  42. package/esm2015/lib/pipes/pipe-email/pipe-email.pipe.js +12 -0
  43. package/esm2015/lib/pipes/pipe-filter/pipe-filter.module.js +15 -0
  44. package/esm2015/lib/pipes/pipe-filter/pipe-filter.pipe.js +16 -0
  45. package/esm2015/lib/pipes/pipe-filter-search/pipe-filter-search.module.js +15 -0
  46. package/esm2015/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.js +38 -0
  47. package/esm2015/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.js +15 -0
  48. package/esm2015/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.js +21 -0
  49. package/esm2015/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.js +15 -0
  50. package/esm2015/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.js +23 -0
  51. package/esm2015/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.js +15 -0
  52. package/esm2015/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.js +12 -0
  53. package/esm2015/lib/pipes/pipe-limit-to/pipe-limit-to.module.js +15 -0
  54. package/esm2015/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.js +25 -0
  55. package/esm2015/lib/pipes/pipe-list-filter/pipe-list-filter.module.js +15 -0
  56. package/esm2015/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.js +17 -0
  57. package/esm2015/lib/pipes/pipe-name-transform/pipe-name-transform.module.js +15 -0
  58. package/esm2015/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.js +27 -0
  59. package/esm2015/lib/pipes/pipe-order-by/pipe-order-by.module.js +15 -0
  60. package/esm2015/lib/pipes/pipe-order-by/pipe-order-by.pipe.js +16 -0
  61. package/esm2015/lib/pipes/pipe-partial-content/pipe-partial-content.module.js +15 -0
  62. package/esm2015/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.js +18 -0
  63. package/esm2015/lib/pipes/pipe-public-URL/pipe-public-URL.module.js +15 -0
  64. package/esm2015/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.js +23 -0
  65. package/esm2015/lib/pipes/pipe-relative-time/pipe-relative-time.module.js +15 -0
  66. package/esm2015/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.js +16 -0
  67. package/esm2015/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.js +15 -0
  68. package/esm2015/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.js +35 -0
  69. package/esm2015/lib/resolvers/explore-detail.resolver.js +89 -0
  70. package/esm2015/lib/resolvers/marketing-offering.resolve.js +40 -0
  71. package/esm2015/lib/resolvers/module-name.resolver.js +38 -0
  72. package/esm2015/lib/resolvers/page-name.resolver.js +32 -0
  73. package/esm2015/lib/resolvers/page.constant.js +4 -0
  74. package/esm2015/lib/resolvers/page.model.js +48 -0
  75. package/esm2015/lib/resolvers/page.resolver.js +90 -0
  76. package/esm2015/lib/resolvers/resolver.model.js +6 -0
  77. package/esm2015/lib/services/auth-keycloak.service.js +266 -0
  78. package/esm2015/lib/services/auth-microsoft.service.js +196 -0
  79. package/esm2015/lib/services/card-content.model.js +31 -0
  80. package/esm2015/lib/services/configurations.model.js +548 -0
  81. package/esm2015/lib/services/configurations.service.js +140 -0
  82. package/esm2015/lib/services/content-strip-multiple.model.js +75 -0
  83. package/esm2015/lib/services/event.model.js +242 -0
  84. package/esm2015/lib/services/event.service.js +211 -0
  85. package/esm2015/lib/services/logger.service.js +55 -0
  86. package/esm2015/lib/services/ms-office.model.js +8 -0
  87. package/esm2015/lib/services/multilingual-translations.service.js +136 -0
  88. package/esm2015/lib/services/nps-grid.service.js +45 -0
  89. package/esm2015/lib/services/subapplication-respond.service.js +214 -0
  90. package/esm2015/lib/services/telemetry.service.js +621 -0
  91. package/esm2015/lib/services/user-preference.model.js +38 -0
  92. package/esm2015/lib/services/user-preference.service.js +90 -0
  93. package/esm2015/lib/services/utility.service.js +145 -0
  94. package/esm2015/lib/services/value.service.js +31 -0
  95. package/esm2015/lib/services/widget-content.model.js +373 -0
  96. package/esm2015/lib/services/widget-content.service.js +192 -0
  97. package/esm2015/lib/services/widget-resolver.model.js +57 -0
  98. package/esm2015/lib/services/widget-search.model.js +126 -0
  99. package/esm2015/public-api.js +80 -0
  100. package/esm2015/sunbird-cb-utils-v2.js +11 -0
  101. package/esm5/lib/components/image-crop/image-crop.component.js +200 -0
  102. package/esm5/lib/components/image-crop/image-crop.module.js +31 -0
  103. package/esm5/lib/constants/features.enum.js +555 -0
  104. package/esm5/lib/constants/instances.enum.js +5 -0
  105. package/esm5/lib/constants/misc.constants.js +1 -0
  106. package/esm5/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.js +105 -0
  107. package/esm5/lib/directives/class-change-on-scroll/class-change-on-scroll.module.js +19 -0
  108. package/esm5/lib/directives/default-thumbnail/default-thumbnail.directive.js +40 -0
  109. package/esm5/lib/directives/default-thumbnail/default-thumbnail.module.js +19 -0
  110. package/esm5/lib/directives/image-responsive/image-responsive.directive.js +95 -0
  111. package/esm5/lib/directives/image-responsive/image-responsive.module.js +19 -0
  112. package/esm5/lib/directives/in-view-port/in-view-port.directive.js +73 -0
  113. package/esm5/lib/directives/in-view-port/in-view-port.module.js +19 -0
  114. package/esm5/lib/directives/navigation/navigation.directive.js +41 -0
  115. package/esm5/lib/directives/navigation/navigation.module.js +19 -0
  116. package/esm5/lib/directives/permission/permission.directive.js +14 -0
  117. package/esm5/lib/directives/permission/permission.module.js +19 -0
  118. package/esm5/lib/helpers/functions/getStringifiedQueryParams.js +9 -0
  119. package/esm5/lib/helpers/horizontal-scroller/horizontal-scroller.component.js +103 -0
  120. package/esm5/lib/helpers/horizontal-scroller/horizontal-scroller.module.js +23 -0
  121. package/esm5/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.js +177 -0
  122. package/esm5/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.js +23 -0
  123. package/esm5/lib/helpers/logout/logout.component.js +96 -0
  124. package/esm5/lib/helpers/logout/logout.module.js +24 -0
  125. package/esm5/lib/models/profile-v3.models.js +104 -0
  126. package/esm5/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.js +19 -0
  127. package/esm5/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.js +96 -0
  128. package/esm5/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.js +17 -0
  129. package/esm5/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.js +63 -0
  130. package/esm5/lib/pipes/pipe-count-transform/pipe-count-transform.module.js +19 -0
  131. package/esm5/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.js +37 -0
  132. package/esm5/lib/pipes/pipe-date-concat/pipe-date-concat.module.js +19 -0
  133. package/esm5/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.js +45 -0
  134. package/esm5/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.js +19 -0
  135. package/esm5/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +83 -0
  136. package/esm5/lib/pipes/pipe-email/pipe-email.module.js +19 -0
  137. package/esm5/lib/pipes/pipe-email/pipe-email.pipe.js +16 -0
  138. package/esm5/lib/pipes/pipe-filter/pipe-filter.module.js +19 -0
  139. package/esm5/lib/pipes/pipe-filter/pipe-filter.pipe.js +20 -0
  140. package/esm5/lib/pipes/pipe-filter-search/pipe-filter-search.module.js +19 -0
  141. package/esm5/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.js +46 -0
  142. package/esm5/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.js +19 -0
  143. package/esm5/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.js +25 -0
  144. package/esm5/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.js +19 -0
  145. package/esm5/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.js +31 -0
  146. package/esm5/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.js +19 -0
  147. package/esm5/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.js +16 -0
  148. package/esm5/lib/pipes/pipe-limit-to/pipe-limit-to.module.js +19 -0
  149. package/esm5/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.js +30 -0
  150. package/esm5/lib/pipes/pipe-list-filter/pipe-list-filter.module.js +19 -0
  151. package/esm5/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.js +21 -0
  152. package/esm5/lib/pipes/pipe-name-transform/pipe-name-transform.module.js +19 -0
  153. package/esm5/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.js +31 -0
  154. package/esm5/lib/pipes/pipe-order-by/pipe-order-by.module.js +19 -0
  155. package/esm5/lib/pipes/pipe-order-by/pipe-order-by.pipe.js +18 -0
  156. package/esm5/lib/pipes/pipe-partial-content/pipe-partial-content.module.js +19 -0
  157. package/esm5/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.js +34 -0
  158. package/esm5/lib/pipes/pipe-public-URL/pipe-public-URL.module.js +19 -0
  159. package/esm5/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.js +25 -0
  160. package/esm5/lib/pipes/pipe-relative-time/pipe-relative-time.module.js +19 -0
  161. package/esm5/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.js +20 -0
  162. package/esm5/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.js +19 -0
  163. package/esm5/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.js +38 -0
  164. package/esm5/lib/resolvers/explore-detail.resolver.js +93 -0
  165. package/esm5/lib/resolvers/marketing-offering.resolve.js +43 -0
  166. package/esm5/lib/resolvers/module-name.resolver.js +40 -0
  167. package/esm5/lib/resolvers/page-name.resolver.js +35 -0
  168. package/esm5/lib/resolvers/page.constant.js +4 -0
  169. package/esm5/lib/resolvers/page.model.js +48 -0
  170. package/esm5/lib/resolvers/page.resolver.js +98 -0
  171. package/esm5/lib/resolvers/resolver.model.js +6 -0
  172. package/esm5/lib/services/auth-keycloak.service.js +347 -0
  173. package/esm5/lib/services/auth-microsoft.service.js +251 -0
  174. package/esm5/lib/services/card-content.model.js +31 -0
  175. package/esm5/lib/services/configurations.model.js +548 -0
  176. package/esm5/lib/services/configurations.service.js +142 -0
  177. package/esm5/lib/services/content-strip-multiple.model.js +75 -0
  178. package/esm5/lib/services/event.model.js +242 -0
  179. package/esm5/lib/services/event.service.js +215 -0
  180. package/esm5/lib/services/logger.service.js +73 -0
  181. package/esm5/lib/services/ms-office.model.js +8 -0
  182. package/esm5/lib/services/multilingual-translations.service.js +138 -0
  183. package/esm5/lib/services/nps-grid.service.js +47 -0
  184. package/esm5/lib/services/subapplication-respond.service.js +219 -0
  185. package/esm5/lib/services/telemetry.service.js +670 -0
  186. package/esm5/lib/services/user-preference.model.js +38 -0
  187. package/esm5/lib/services/user-preference.service.js +109 -0
  188. package/esm5/lib/services/utility.service.js +178 -0
  189. package/esm5/lib/services/value.service.js +33 -0
  190. package/esm5/lib/services/widget-content.model.js +373 -0
  191. package/esm5/lib/services/widget-content.service.js +214 -0
  192. package/esm5/lib/services/widget-resolver.model.js +57 -0
  193. package/esm5/lib/services/widget-search.model.js +126 -0
  194. package/esm5/public-api.js +80 -0
  195. package/esm5/sunbird-cb-utils-v2.js +11 -0
  196. package/fesm2015/sunbird-cb-utils-v2.js +6160 -0
  197. package/fesm2015/sunbird-cb-utils-v2.js.map +1 -0
  198. package/fesm5/sunbird-cb-utils-v2.js +6649 -0
  199. package/fesm5/sunbird-cb-utils-v2.js.map +1 -0
  200. package/lib/components/image-crop/image-crop.component.d.ts +56 -0
  201. package/lib/components/image-crop/image-crop.module.d.ts +2 -0
  202. package/lib/constants/features.enum.d.ts +553 -0
  203. package/lib/constants/instances.enum.d.ts +3 -0
  204. package/lib/constants/misc.constants.d.ts +2 -0
  205. package/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.d.ts +18 -0
  206. package/lib/directives/class-change-on-scroll/class-change-on-scroll.module.d.ts +2 -0
  207. package/lib/directives/default-thumbnail/default-thumbnail.directive.d.ts +9 -0
  208. package/lib/directives/default-thumbnail/default-thumbnail.module.d.ts +2 -0
  209. package/lib/directives/image-responsive/image-responsive.directive.d.ts +17 -0
  210. package/lib/directives/image-responsive/image-responsive.module.d.ts +2 -0
  211. package/lib/directives/in-view-port/in-view-port.directive.d.ts +11 -0
  212. package/lib/directives/in-view-port/in-view-port.module.d.ts +2 -0
  213. package/lib/directives/navigation/navigation.directive.d.ts +9 -0
  214. package/lib/directives/navigation/navigation.module.d.ts +2 -0
  215. package/lib/directives/permission/permission.directive.d.ts +3 -0
  216. package/lib/directives/permission/permission.module.d.ts +2 -0
  217. package/lib/helpers/functions/getStringifiedQueryParams.d.ts +3 -0
  218. package/lib/helpers/horizontal-scroller/horizontal-scroller.component.d.ts +18 -0
  219. package/lib/helpers/horizontal-scroller/horizontal-scroller.module.d.ts +2 -0
  220. package/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +31 -0
  221. package/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.d.ts +2 -0
  222. package/lib/helpers/logout/logout.component.d.ts +20 -0
  223. package/lib/helpers/logout/logout.module.d.ts +2 -0
  224. package/lib/models/profile-v3.models.d.ts +91 -0
  225. package/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.d.ts +2 -0
  226. package/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.d.ts +6 -0
  227. package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.d.ts +2 -0
  228. package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.d.ts +10 -0
  229. package/lib/pipes/pipe-count-transform/pipe-count-transform.module.d.ts +2 -0
  230. package/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.d.ts +4 -0
  231. package/lib/pipes/pipe-date-concat/pipe-date-concat.module.d.ts +2 -0
  232. package/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.d.ts +13 -0
  233. package/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.d.ts +2 -0
  234. package/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +6 -0
  235. package/lib/pipes/pipe-email/pipe-email.module.d.ts +2 -0
  236. package/lib/pipes/pipe-email/pipe-email.pipe.d.ts +4 -0
  237. package/lib/pipes/pipe-filter/pipe-filter.module.d.ts +2 -0
  238. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +4 -0
  239. package/lib/pipes/pipe-filter-search/pipe-filter-search.module.d.ts +2 -0
  240. package/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.d.ts +4 -0
  241. package/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.d.ts +2 -0
  242. package/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.d.ts +4 -0
  243. package/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.d.ts +2 -0
  244. package/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.d.ts +4 -0
  245. package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.d.ts +2 -0
  246. package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.d.ts +4 -0
  247. package/lib/pipes/pipe-limit-to/pipe-limit-to.module.d.ts +2 -0
  248. package/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.d.ts +4 -0
  249. package/lib/pipes/pipe-list-filter/pipe-list-filter.module.d.ts +2 -0
  250. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +4 -0
  251. package/lib/pipes/pipe-name-transform/pipe-name-transform.module.d.ts +2 -0
  252. package/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.d.ts +9 -0
  253. package/lib/pipes/pipe-order-by/pipe-order-by.module.d.ts +2 -0
  254. package/lib/pipes/pipe-order-by/pipe-order-by.pipe.d.ts +9 -0
  255. package/lib/pipes/pipe-partial-content/pipe-partial-content.module.d.ts +2 -0
  256. package/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.d.ts +4 -0
  257. package/lib/pipes/pipe-public-URL/pipe-public-URL.module.d.ts +2 -0
  258. package/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.d.ts +6 -0
  259. package/lib/pipes/pipe-relative-time/pipe-relative-time.module.d.ts +2 -0
  260. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +4 -0
  261. package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.d.ts +2 -0
  262. package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.d.ts +7 -0
  263. package/lib/resolvers/explore-detail.resolver.d.ts +16 -0
  264. package/lib/resolvers/marketing-offering.resolve.d.ts +10 -0
  265. package/lib/resolvers/module-name.resolver.d.ts +6 -0
  266. package/lib/resolvers/page-name.resolver.d.ts +5 -0
  267. package/lib/resolvers/page.constant.d.ts +1 -0
  268. package/lib/resolvers/page.model.d.ts +41 -0
  269. package/lib/resolvers/page.resolver.d.ts +17 -0
  270. package/lib/resolvers/resolver.model.d.ts +4 -0
  271. package/lib/services/auth-keycloak.service.d.ts +31 -0
  272. package/lib/services/auth-microsoft.service.d.ts +30 -0
  273. package/lib/services/card-content.model.d.ts +29 -0
  274. package/lib/services/configurations.model.d.ts +521 -0
  275. package/lib/services/configurations.service.d.ts +73 -0
  276. package/lib/services/content-strip-multiple.model.d.ts +79 -0
  277. package/lib/services/event.model.d.ts +205 -0
  278. package/lib/services/event.service.d.ts +30 -0
  279. package/lib/services/logger.service.d.ts +15 -0
  280. package/lib/services/ms-office.model.d.ts +6 -0
  281. package/lib/services/multilingual-translations.service.d.ts +20 -0
  282. package/lib/services/nps-grid.service.d.ts +12 -0
  283. package/lib/services/subapplication-respond.service.d.ts +23 -0
  284. package/lib/services/telemetry.service.d.ts +56 -0
  285. package/lib/services/user-preference.model.d.ts +34 -0
  286. package/lib/services/user-preference.service.d.ts +11 -0
  287. package/lib/services/utility.service.d.ts +31 -0
  288. package/lib/services/value.service.d.ts +8 -0
  289. package/lib/services/widget-content.model.d.ts +344 -0
  290. package/lib/services/widget-content.service.d.ts +47 -0
  291. package/lib/services/widget-resolver.model.d.ts +48 -0
  292. package/lib/services/widget-search.model.d.ts +114 -0
  293. package/package.json +35 -0
  294. package/public-api.d.ts +79 -0
  295. package/sunbird-cb-utils-v2.d.ts +10 -0
  296. package/sunbird-cb-utils-v2.metadata.json +1 -0
@@ -0,0 +1,670 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Inject, Injectable } from '@angular/core';
3
+ import { filter } from 'rxjs/operators';
4
+ import { ConfigurationsService } from './configurations.service';
5
+ import { WsEvents } from './event.model';
6
+ import { EventService } from './event.service';
7
+ import { LoggerService } from './logger.service';
8
+ import { Router, NavigationStart } from '@angular/router';
9
+ import { NPSGridService } from './nps-grid.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./configurations.service";
12
+ import * as i2 from "./event.service";
13
+ import * as i3 from "./logger.service";
14
+ import * as i4 from "@angular/router";
15
+ import * as i5 from "./nps-grid.service";
16
+ var TelemetryService = (function () {
17
+ function TelemetryService(configSvc, eventsSvc, environment, logger, router, npsSvc) {
18
+ this.configSvc = configSvc;
19
+ this.eventsSvc = eventsSvc;
20
+ this.logger = logger;
21
+ this.router = router;
22
+ this.npsSvc = npsSvc;
23
+ this.previousUrl = null;
24
+ this.telemetryConfig = null;
25
+ this.pData = null;
26
+ this.contextCdata = [];
27
+ this.isAnonymousTelemetry = true;
28
+ this.telArray = [];
29
+ this.externalApps = {
30
+ RBCP: 'rbcp-web-ui',
31
+ };
32
+ this.environment = environment;
33
+ var instanceConfig = this.configSvc.instanceConfig;
34
+ this.navigationStart();
35
+ this.initializeConfig(instanceConfig);
36
+ this.addPlayerListener();
37
+ this.addCustomEventListener();
38
+ this.addInteractListener();
39
+ this.addFeedbackListener();
40
+ this.addTimeSpentListener();
41
+ this.addSearchListener();
42
+ this.addHearbeatListener();
43
+ this.addCustomImpressionListener();
44
+ this.addCustomListener();
45
+ this.addCustomListenerForGetStart();
46
+ this.addCustomListenerForPlatformRating();
47
+ }
48
+ TelemetryService.prototype.navigationStart = function () {
49
+ var _this = this;
50
+ this.router.events.subscribe((function (event) {
51
+ if (event instanceof NavigationStart) {
52
+ if (event.url.includes('/public/') || event.url.includes('&preview=true') || event.url.includes('/certs')) {
53
+ _this.isAnonymousTelemetry = true;
54
+ _this.updateTelemetryConfig();
55
+ var instanceConfig = _this.configSvc.instanceConfig;
56
+ _this.initializeConfig(instanceConfig);
57
+ }
58
+ }
59
+ }));
60
+ };
61
+ Object.defineProperty(TelemetryService.prototype, "isAnonymousTelemetryRequired", {
62
+ get: function () {
63
+ return this.isAnonymousTelemetry;
64
+ },
65
+ enumerable: true,
66
+ configurable: true
67
+ });
68
+ TelemetryService.prototype.updateTelemetryConfig = function () {
69
+ if (this.configSvc.instanceConfig && this.configSvc.instanceConfig.telemetryConfig) {
70
+ if (this.isAnonymousTelemetryRequired) {
71
+ this.configSvc.instanceConfig.telemetryConfig.endpoint = this.configSvc.instanceConfig.telemetryConfig.publicEndpoint;
72
+ }
73
+ else {
74
+ this.configSvc.instanceConfig.telemetryConfig.endpoint = this.configSvc.instanceConfig.telemetryConfig.protectedEndpoint;
75
+ }
76
+ }
77
+ };
78
+ TelemetryService.prototype.initializeConfig = function (instanceConfig) {
79
+ if (instanceConfig) {
80
+ this.telemetryConfig = instanceConfig.telemetryConfig;
81
+ this.telemetryConfig = tslib_1.__assign({}, this.telemetryConfig, { pdata: tslib_1.__assign({}, this.telemetryConfig.pdata, { id: this.environment.name + "." + this.telemetryConfig.pdata.id }), uid: (this.configSvc.userProfile && this.configSvc.userProfile.userId) ?
82
+ this.configSvc.userProfile.userId : '', channel: this.rootOrgId || this.telemetryConfig.channel, sid: this.getTelemetrySessionId });
83
+ this.pData = this.telemetryConfig.pdata;
84
+ }
85
+ };
86
+ Object.defineProperty(TelemetryService.prototype, "getTelemetrySessionId", {
87
+ get: function () {
88
+ return localStorage.getItem('telemetrySessionId') || '';
89
+ },
90
+ enumerable: true,
91
+ configurable: true
92
+ });
93
+ Object.defineProperty(TelemetryService.prototype, "rootOrgId", {
94
+ get: function () {
95
+ if (this.configSvc && this.configSvc.userProfile && this.configSvc.userProfile.rootOrgId) {
96
+ return this.configSvc.userProfile.rootOrgId;
97
+ }
98
+ return '';
99
+ },
100
+ enumerable: true,
101
+ configurable: true
102
+ });
103
+ TelemetryService.prototype.triggerNPSUpdate = function (data) {
104
+ this.telArray.push(data);
105
+ if (this.telArray && this.telArray.length === 4) {
106
+ if (localStorage.getItem('ratingformID')) {
107
+ this.telArray = [];
108
+ this.npsSvc.updateTelemetryData(true);
109
+ }
110
+ }
111
+ };
112
+ TelemetryService.prototype.start = function (edata, data, pageContext) {
113
+ try {
114
+ if (this.telemetryConfig) {
115
+ $t.start(this.telemetryConfig, (pageContext && pageContext.pageId) ?
116
+ pageContext.pageId
117
+ : '', '1.0', {
118
+ type: edata.type,
119
+ mode: edata.mode,
120
+ pageid: (pageContext && pageContext.pageId) ?
121
+ pageContext.pageId
122
+ : '',
123
+ duration: 1,
124
+ }, {
125
+ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }) }, (pageContext && pageContext.module ? { env: pageContext.module } : null)),
126
+ object: tslib_1.__assign({}, (data) && data),
127
+ });
128
+ }
129
+ else {
130
+ this.logger.error('Error Initializing Telemetry. Config missing.');
131
+ }
132
+ }
133
+ catch (e) {
134
+ console.log('Error in telemetry start', e);
135
+ }
136
+ };
137
+ TelemetryService.prototype.end = function (edata, data, pageContext) {
138
+ try {
139
+ $t.end({
140
+ type: edata.type,
141
+ mode: edata.mode,
142
+ pageid: (pageContext && pageContext.pageId) ?
143
+ pageContext.pageId
144
+ : '',
145
+ }, {
146
+ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }) }, (pageContext && pageContext.module ? { env: pageContext.module } : null)),
147
+ object: tslib_1.__assign({}, (data) && data),
148
+ });
149
+ }
150
+ catch (e) {
151
+ console.log('Error in telemetry end', e);
152
+ }
153
+ };
154
+ TelemetryService.prototype.audit = function (type, props, data) {
155
+ try {
156
+ $t.audit({
157
+ type: type,
158
+ props: props,
159
+ state: data,
160
+ prevstate: '',
161
+ duration: '',
162
+ }, {
163
+ context: {
164
+ pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }),
165
+ },
166
+ });
167
+ }
168
+ catch (e) {
169
+ console.log('Error in telemetry audit', e);
170
+ }
171
+ };
172
+ TelemetryService.prototype.heartbeat = function (type, id) {
173
+ try {
174
+ $t.heartbeat({
175
+ id: id,
176
+ type: type,
177
+ });
178
+ }
179
+ catch (e) {
180
+ console.log('Error in telemetry heartbeat', e);
181
+ }
182
+ };
183
+ TelemetryService.prototype.impression = function (data, objectType) {
184
+ this.triggerNPSUpdate(data);
185
+ try {
186
+ var page = this.getPageDetails();
187
+ if (data && data.pageContext) {
188
+ page.pageid = data.pageContext.pageId;
189
+ page.module = data.pageContext.module;
190
+ }
191
+ var edata = {
192
+ pageid: page.pageid,
193
+ type: page.pageUrlParts[0],
194
+ uri: page.pageUrl,
195
+ };
196
+ if (page.objectId) {
197
+ var config = {
198
+ context: {
199
+ pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }),
200
+ env: page.module || (this.telemetryConfig && this.telemetryConfig.env),
201
+ },
202
+ object: tslib_1.__assign({ id: page.objectId, type: objectType }, (data && data.object)),
203
+ };
204
+ if (!page.objectId || !objectType) {
205
+ config.object = {};
206
+ }
207
+ $t.impression(edata, config);
208
+ }
209
+ else {
210
+ $t.impression(edata, {
211
+ context: {
212
+ pdata: tslib_1.__assign({}, this.pData, { id: this.pData && this.pData.id }),
213
+ env: page.module || '',
214
+ },
215
+ object: tslib_1.__assign({}, (data && data.object)),
216
+ });
217
+ }
218
+ this.previousUrl = page.pageUrl;
219
+ }
220
+ catch (e) {
221
+ console.log('Error in telemetry impression', e);
222
+ }
223
+ };
224
+ TelemetryService.prototype.externalImpression = function (impressionData) {
225
+ try {
226
+ var page = this.getPageDetails();
227
+ if (this.externalApps[impressionData.subApplicationName]) {
228
+ var externalConfig = page.objectId ? {
229
+ context: {
230
+ pdata: tslib_1.__assign({}, this.pData, { id: this.externalApps[impressionData.subApplicationName] }),
231
+ },
232
+ object: {
233
+ id: page.objectId,
234
+ },
235
+ } : {
236
+ context: {
237
+ pdata: tslib_1.__assign({}, this.pData, { id: this.externalApps[impressionData.subApplicationName] }),
238
+ },
239
+ };
240
+ $t.impression(impressionData.data, externalConfig);
241
+ }
242
+ }
243
+ catch (e) {
244
+ console.log('Error in telemetry externalImpression', e);
245
+ }
246
+ };
247
+ TelemetryService.prototype.addCustomListenerForPlatformRating = function () {
248
+ var _this = this;
249
+ this.eventsSvc.getPREvents$
250
+ .pipe(filter((function (event) {
251
+ return event &&
252
+ event.eventType === WsEvents.WsEventType.Telemetry &&
253
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.PlatformRating &&
254
+ event.data.mode &&
255
+ event.data;
256
+ })))
257
+ .subscribe((function (event) {
258
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
259
+ _this.start({
260
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
261
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
262
+ }, {}, event.pageContext);
263
+ }
264
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
265
+ _this.end({
266
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
267
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
268
+ }, event.data.object, event.pageContext);
269
+ }
270
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
271
+ $t.interact({
272
+ type: event.data.edata.type,
273
+ subtype: event.data.edata.subType,
274
+ id: (event.data.edata && event.data.edata.id) ?
275
+ event.data.edata.id
276
+ : '',
277
+ pageid: event.pageContext && event.pageContext.pageId || '',
278
+ }, {
279
+ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
280
+ object: tslib_1.__assign({}, event.data.object),
281
+ });
282
+ }
283
+ }));
284
+ };
285
+ TelemetryService.prototype.addCustomListenerForGetStart = function () {
286
+ var _this = this;
287
+ this.eventsSvc.getStartEvents$
288
+ .pipe(filter((function (event) {
289
+ return event &&
290
+ event.eventType === WsEvents.WsEventType.Telemetry &&
291
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.GetStarted &&
292
+ event.data.mode &&
293
+ event.data;
294
+ })))
295
+ .subscribe((function (event) {
296
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
297
+ _this.start({
298
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
299
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
300
+ }, {}, event.pageContext);
301
+ }
302
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
303
+ _this.end({
304
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
305
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
306
+ }, event.data.object, event.pageContext);
307
+ }
308
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
309
+ $t.interact({
310
+ type: event.data.edata.type,
311
+ subtype: event.data.edata.subType,
312
+ id: (event.data.edata && event.data.edata.id) ?
313
+ event.data.edata.id
314
+ : '',
315
+ pageid: event.pageContext && event.pageContext.pageId || '',
316
+ }, {
317
+ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
318
+ object: tslib_1.__assign({}, event.data.object),
319
+ });
320
+ }
321
+ }));
322
+ };
323
+ TelemetryService.prototype.addCustomListener = function () {
324
+ var _this = this;
325
+ this.eventsSvc.chatbotEvents$
326
+ .pipe(filter((function (event) {
327
+ return event &&
328
+ event.eventType === WsEvents.WsEventType.Telemetry &&
329
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.Chatbot &&
330
+ event.data.mode &&
331
+ event.data;
332
+ })))
333
+ .subscribe((function (event) {
334
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
335
+ _this.start({
336
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
337
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
338
+ }, {}, event.pageContext);
339
+ }
340
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
341
+ _this.end({
342
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
343
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
344
+ }, {}, event.pageContext);
345
+ }
346
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
347
+ $t.interact({
348
+ type: event.data.edata.type,
349
+ subtype: event.data.edata.subType,
350
+ id: (event.data.edata && event.data.edata.id) ?
351
+ event.data.edata.id
352
+ : '',
353
+ pageid: event.pageContext && event.pageContext.pageId || '',
354
+ }, {
355
+ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
356
+ object: tslib_1.__assign({}, event.data.object),
357
+ });
358
+ }
359
+ }));
360
+ };
361
+ TelemetryService.prototype.addCustomImpressionListener = function () {
362
+ var _this = this;
363
+ this.eventsSvc.events$
364
+ .pipe(filter((function (event) {
365
+ return event &&
366
+ event.data &&
367
+ event.eventType === WsEvents.WsEventType.Telemetry &&
368
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.Impression;
369
+ })))
370
+ .subscribe((function (event) {
371
+ try {
372
+ _this.impression(event.data);
373
+ }
374
+ catch (e) {
375
+ console.log('Error in telemetry impression', e);
376
+ }
377
+ }));
378
+ };
379
+ TelemetryService.prototype.addTimeSpentListener = function () {
380
+ var _this = this;
381
+ this.eventsSvc.events$
382
+ .pipe(filter((function (event) {
383
+ return event &&
384
+ event.eventType === WsEvents.WsEventType.Telemetry &&
385
+ event.data.type === WsEvents.WsTimeSpentType.Page &&
386
+ event.data.mode &&
387
+ event.data;
388
+ })))
389
+ .subscribe((function (event) {
390
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
391
+ _this.start({
392
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
393
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
394
+ }, {}, event.pageContext);
395
+ }
396
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
397
+ _this.end({
398
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
399
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
400
+ }, {}, event.pageContext);
401
+ }
402
+ }));
403
+ };
404
+ TelemetryService.prototype.addCustomEventListener = function () {
405
+ var _this = this;
406
+ this.eventsSvc.events$
407
+ .pipe(filter((function (event) {
408
+ return event &&
409
+ event.eventType === WsEvents.WsEventType.Telemetry;
410
+ })))
411
+ .subscribe((function (event) {
412
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
413
+ event.data.type !== WsEvents.WsTimeSpentType.Player) {
414
+ _this.start({
415
+ type: event.data.type,
416
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
417
+ }, event.data.object, event.pageContext);
418
+ }
419
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
420
+ event.data.type !== WsEvents.WsTimeSpentType.Player) {
421
+ _this.end({
422
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
423
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
424
+ }, event.data.object, event.pageContext);
425
+ }
426
+ }));
427
+ };
428
+ TelemetryService.prototype.addPlayerListener = function () {
429
+ var _this = this;
430
+ this.eventsSvc.events$
431
+ .pipe(filter((function (event) {
432
+ return event &&
433
+ event.eventType === WsEvents.WsEventType.Telemetry &&
434
+ event.data.type === WsEvents.WsTimeSpentType.Player &&
435
+ event.data.mode &&
436
+ event.data;
437
+ })))
438
+ .subscribe((function (event) {
439
+ var content = event.data.content;
440
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
441
+ (!content ||
442
+ (content.isIframeSupported || '').toLowerCase() === 'maybe' ||
443
+ (content.isIframeSupported || '').toLowerCase() === 'yes' ||
444
+ (content.mimeType === 'application/pdf' || 'application/json'))) {
445
+ _this.start({
446
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
447
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
448
+ }, event.data.object, event.pageContext);
449
+ }
450
+ if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
451
+ (!content ||
452
+ (content.isIframeSupported || '').toLowerCase() === 'maybe' ||
453
+ (content.isIframeSupported || '').toLowerCase() === 'yes' ||
454
+ (content.mimeType === 'application/pdf' || 'application/json'))) {
455
+ _this.end({
456
+ type: event.data.type || WsEvents.WsTimeSpentType.Player,
457
+ mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
458
+ }, event.data.object, event.pageContext);
459
+ }
460
+ }));
461
+ };
462
+ TelemetryService.prototype.addInteractListener = function () {
463
+ var _this = this;
464
+ var data = this.getPageDetails();
465
+ this.triggerNPSUpdate(data.pageid);
466
+ this.eventsSvc.events$
467
+ .pipe(filter((function (event) {
468
+ return event &&
469
+ event.data &&
470
+ event.eventType === WsEvents.WsEventType.Telemetry &&
471
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.Interact;
472
+ })))
473
+ .subscribe((function (event) {
474
+ var page = _this.getPageDetails();
475
+ if (typeof event.from === 'string' && _this.externalApps[event.from]) {
476
+ var externalConfig = {
477
+ context: {
478
+ pdata: tslib_1.__assign({}, _this.pData, { id: _this.externalApps[event.from] }),
479
+ },
480
+ };
481
+ try {
482
+ $t.interact(event.data, externalConfig);
483
+ }
484
+ catch (e) {
485
+ console.log('Error in telemetry interact', e);
486
+ }
487
+ }
488
+ else {
489
+ try {
490
+ $t.interact({
491
+ type: event.data.edata.type,
492
+ subtype: event.data.edata.subType,
493
+ id: (event.data.edata && event.data.edata.id) ?
494
+ event.data.edata.id
495
+ : '',
496
+ pageid: event.data.pageContext && event.data.pageContext.pageId || page.pageid,
497
+ }, {
498
+ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
499
+ object: tslib_1.__assign({}, event.data.object),
500
+ });
501
+ }
502
+ catch (e) {
503
+ console.log('Error in telemetry interact', e);
504
+ }
505
+ }
506
+ }));
507
+ };
508
+ TelemetryService.prototype.addFeedbackListener = function () {
509
+ var _this = this;
510
+ this.eventsSvc.events$
511
+ .pipe(filter((function (event) {
512
+ return event &&
513
+ event.data &&
514
+ event.eventType === WsEvents.WsEventType.Telemetry &&
515
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.Feedback;
516
+ })))
517
+ .subscribe((function (event) {
518
+ var page = _this.getPageDetails();
519
+ try {
520
+ $t.feedback({
521
+ rating: event.data.object.rating || 0,
522
+ commentid: event.data.object.commentid || '',
523
+ commenttxt: event.data.object.commenttxt || '',
524
+ pageid: page.pageid,
525
+ }, {
526
+ context: {
527
+ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }),
528
+ },
529
+ object: {
530
+ id: event.data.object.contentId || event.data.object.id || '',
531
+ type: event.data.edata.type || '',
532
+ ver: "" + (event.data.object.version || '1') + '',
533
+ rollup: {},
534
+ },
535
+ });
536
+ }
537
+ catch (e) {
538
+ console.log('Error in telemetry interact', e);
539
+ }
540
+ }));
541
+ };
542
+ TelemetryService.prototype.addHearbeatListener = function () {
543
+ var _this = this;
544
+ this.eventsSvc.events$
545
+ .pipe(filter((function (event) {
546
+ return event &&
547
+ event.data &&
548
+ event.eventType === WsEvents.WsEventType.Telemetry &&
549
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.HeartBeat;
550
+ })))
551
+ .subscribe((function (event) {
552
+ if (typeof event.from === 'string' && _this.externalApps[event.from]) {
553
+ var externalConfig = {
554
+ context: {
555
+ pdata: tslib_1.__assign({}, _this.pData, { id: _this.externalApps[event.from] }),
556
+ },
557
+ };
558
+ try {
559
+ $t.heartbeat(event.data, externalConfig);
560
+ }
561
+ catch (e) {
562
+ console.log('Error in telemetry heartbeat', e);
563
+ }
564
+ }
565
+ else {
566
+ try {
567
+ $t.heartbeat({
568
+ type: event.data.type,
569
+ id: event.data.id,
570
+ }, {
571
+ context: {
572
+ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }),
573
+ },
574
+ });
575
+ }
576
+ catch (e) {
577
+ console.log('Error in telemetry heartbeat', e);
578
+ }
579
+ }
580
+ }));
581
+ };
582
+ TelemetryService.prototype.addSearchListener = function () {
583
+ var _this = this;
584
+ this.eventsSvc.events$
585
+ .pipe(filter((function (event) {
586
+ return event &&
587
+ event.data &&
588
+ event.eventType === WsEvents.WsEventType.Telemetry &&
589
+ event.data.eventSubType === WsEvents.EnumTelemetrySubType.Search;
590
+ })))
591
+ .subscribe((function (event) {
592
+ try {
593
+ $t.search({
594
+ query: event.data.query,
595
+ filters: event.data.filters,
596
+ size: event.data.size,
597
+ }, {
598
+ context: {
599
+ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }),
600
+ },
601
+ });
602
+ }
603
+ catch (e) {
604
+ console.log('Error in telemetry search', e);
605
+ }
606
+ }));
607
+ };
608
+ TelemetryService.prototype.getPageDetails = function () {
609
+ var path = window.location.pathname.replace('/', '');
610
+ var url = path + window.location.search;
611
+ var moduleValue = '';
612
+ if (path.includes('discussion-forum')) {
613
+ moduleValue = 'Discuss';
614
+ }
615
+ return {
616
+ pageid: path,
617
+ pageUrl: url,
618
+ pageUrlParts: path.split('/'),
619
+ refferUrl: this.previousUrl,
620
+ objectId: this.extractContentIdFromUrlParts(path.split('/')),
621
+ module: moduleValue,
622
+ };
623
+ };
624
+ TelemetryService.prototype.extractContentIdFromUrlParts = function (urlParts) {
625
+ var tocIdx = urlParts.indexOf('toc');
626
+ var viewerIdx = urlParts.indexOf('viewer');
627
+ if (tocIdx === -1 && viewerIdx === -1) {
628
+ return null;
629
+ }
630
+ if (tocIdx !== -1 && tocIdx < urlParts.length - 1) {
631
+ return urlParts[tocIdx + 1];
632
+ }
633
+ if (viewerIdx !== -1 && viewerIdx < urlParts.length - 2) {
634
+ return urlParts[viewerIdx + 2];
635
+ }
636
+ return null;
637
+ };
638
+ TelemetryService.decorators = [
639
+ { type: Injectable, args: [{
640
+ providedIn: 'root',
641
+ },] }
642
+ ];
643
+ TelemetryService.ctorParameters = function () { return [
644
+ { type: ConfigurationsService },
645
+ { type: EventService },
646
+ { type: undefined, decorators: [{ type: Inject, args: ['environment',] }] },
647
+ { type: LoggerService },
648
+ { type: Router },
649
+ { type: NPSGridService }
650
+ ]; };
651
+ /** @nocollapse */ TelemetryService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function TelemetryService_Factory() { return new TelemetryService(i0.ɵɵinject(i1.ConfigurationsService), i0.ɵɵinject(i2.EventService), i0.ɵɵinject("environment"), i0.ɵɵinject(i3.LoggerService), i0.ɵɵinject(i4.Router), i0.ɵɵinject(i5.NPSGridService)); }, token: TelemetryService, providedIn: "root" });
652
+ return TelemetryService;
653
+ }());
654
+ export { TelemetryService };
655
+ if (false) {
656
+ TelemetryService.prototype.previousUrl;
657
+ TelemetryService.prototype.telemetryConfig;
658
+ TelemetryService.prototype.pData;
659
+ TelemetryService.prototype.contextCdata;
660
+ TelemetryService.prototype.isAnonymousTelemetry;
661
+ TelemetryService.prototype.telArray;
662
+ TelemetryService.prototype.externalApps;
663
+ TelemetryService.prototype.environment;
664
+ TelemetryService.prototype.configSvc;
665
+ TelemetryService.prototype.eventsSvc;
666
+ TelemetryService.prototype.logger;
667
+ TelemetryService.prototype.router;
668
+ TelemetryService.prototype.npsSvc;
669
+ }
670
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VuYmlyZC1jYi91dGlscy12Mi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy90ZWxlbWV0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBR3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTs7Ozs7OztBQUluRDtJQWNFLDBCQUNVLFNBQWdDLEVBQ2hDLFNBQXVCLEVBQ1IsV0FBZ0IsRUFFL0IsTUFBcUIsRUFDckIsTUFBYyxFQUNkLE1BQXNCO1FBTnRCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFHdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFqQmhDLGdCQUFXLEdBQWtCLElBQUksQ0FBQTtRQUNqQyxvQkFBZSxHQUE2QyxJQUFJLENBQUE7UUFDaEUsVUFBSyxHQUFRLElBQUksQ0FBQTtRQUNqQixpQkFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNqQix5QkFBb0IsR0FBRyxJQUFJLENBQUE7UUFDM0IsYUFBUSxHQUFRLEVBQUUsQ0FBQTtRQUNsQixpQkFBWSxHQUFRO1lBQ2xCLElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUE7UUFXQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtZQUN4QixjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjO1FBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUE7UUFDbkMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUE7SUFDM0MsQ0FBQztJQUVPLDBDQUFlLEdBQXZCO1FBQUEsaUJBV0M7UUFWQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUMsVUFBQyxLQUFVO1lBQ3RDLElBQUksS0FBSyxZQUFZLGVBQWUsRUFBRTtnQkFDcEMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDekcsS0FBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQTtvQkFDaEMsS0FBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7d0JBQ3RCLGNBQWMsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLGNBQWM7b0JBQ3BELEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtpQkFDdEM7YUFDRjtRQUNILENBQUMsRUFBQyxDQUFBO0lBQ0osQ0FBQztJQUVELHNCQUFJLDBEQUE0QjthQUFoQztZQUNFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFBO1FBQ2xDLENBQUM7OztPQUFBO0lBRU8sZ0RBQXFCLEdBQTdCO1FBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUU7WUFDbEYsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQTthQUN0SDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQTthQUN6SDtTQUNGO0lBQ0gsQ0FBQztJQUVPLDJDQUFnQixHQUF4QixVQUF5QixjQUErQztRQUN0RSxJQUFJLGNBQWMsRUFBRTtZQUNsQixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUE7WUFDckQsSUFBSSxDQUFDLGVBQWUsd0JBQ2YsSUFBSSxDQUFDLGVBQWUsSUFDdkIsS0FBSyx1QkFDQSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssSUFFN0IsRUFBRSxFQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxTQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUksS0FFakUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBRzVDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUN2RCxHQUFHLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixHQUNoQyxDQUFBO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQTtTQUN4QztJQUNILENBQUM7SUFFRCxzQkFBSSxtREFBcUI7YUFBekI7WUFDRSxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDekQsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSx1Q0FBUzthQUFiO1lBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtnQkFDeEYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUE7YUFDNUM7WUFDRCxPQUFPLEVBQUUsQ0FBQTtRQUNYLENBQUM7OztPQUFBO0lBRUQsMkNBQWdCLEdBQWhCLFVBQWlCLElBQVM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMvQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFBO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ3RDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsZ0NBQUssR0FBTCxVQUFNLEtBQVUsRUFBRSxJQUFTLEVBQUUsV0FBNEM7UUFDdkUsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDeEIsRUFBRSxDQUFDLEtBQUssQ0FDTixJQUFJLENBQUMsZUFBZSxFQUNwQixDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDbkMsV0FBVyxDQUFDLE1BQU07b0JBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQ04sS0FBSyxFQUNMO29CQUVFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNoQixNQUFNLEVBQUUsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7d0JBQzNDLFdBQVcsQ0FBQyxNQUFNO3dCQUNsQixDQUFDLENBQUMsRUFBRTtvQkFDTixRQUFRLEVBQUUsQ0FBQztpQkFDWixFQUNEO29CQUNFLE9BQU8scUJBQ0wsS0FBSyx1QkFDQSxJQUFJLENBQUMsS0FBSyxJQUNiLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FFaEIsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDNUU7b0JBQ0QsTUFBTSx1QkFDRCxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FDbEI7aUJBQ0YsQ0FDRixDQUFBO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQTthQUNuRTtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFFVixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQzNDO0lBQ0gsQ0FBQztJQUVELDhCQUFHLEdBQUgsVUFBSSxLQUFVLEVBQUUsSUFBUyxFQUFFLFdBQTRDO1FBQ3JFLElBQUk7WUFDRixFQUFFLENBQUMsR0FBRyxDQUNKO2dCQUNFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixNQUFNLEVBQUUsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLFdBQVcsQ0FBQyxNQUFNO29CQUNsQixDQUFDLENBQUMsRUFBRTthQUNQLEVBQ0Q7Z0JBQ0UsT0FBTyxxQkFDTCxLQUFLLHVCQUNBLElBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUVoQixDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM1RTtnQkFDRCxNQUFNLHVCQUNELENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUNsQjthQUNGLENBQ0YsQ0FBQTtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFFVixPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQ3pDO0lBQ0gsQ0FBQztJQUVELGdDQUFLLEdBQUwsVUFBTSxJQUFZLEVBQUUsS0FBYSxFQUFFLElBQVM7UUFDMUMsSUFBSTtZQUNGLEVBQUUsQ0FBQyxLQUFLLENBQ047Z0JBQ0UsSUFBSSxNQUFBO2dCQUNKLEtBQUssT0FBQTtnQkFFTCxLQUFLLEVBQUUsSUFBSTtnQkFDWCxTQUFTLEVBQUUsRUFBRTtnQkFDYixRQUFRLEVBQUUsRUFBRTthQUNiLEVBQ0Q7Z0JBQ0UsT0FBTyxFQUFFO29CQUNQLEtBQUssdUJBQ0EsSUFBSSxDQUFDLEtBQUssSUFDYixFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQ2xCO2lCQUNGO2FBQ0YsQ0FDRixDQUFBO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUVWLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDM0M7SUFDSCxDQUFDO0lBRUQsb0NBQVMsR0FBVCxVQUFVLElBQVksRUFBRSxFQUFVO1FBQ2hDLElBQUk7WUFDRixFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUNYLEVBQUUsSUFBQTtnQkFFRixJQUFJLE1BQUE7YUFDTCxDQUFDLENBQUE7U0FDSDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBRVYsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUMvQztJQUNILENBQUM7SUFFRCxxQ0FBVSxHQUFWLFVBQVcsSUFBVSxFQUFFLFVBQWdCO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQixJQUFJO2dCQUNJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2xDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUE7Z0JBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUE7YUFDdEM7Z0JBQ0ssS0FBSyxHQUFHO2dCQUNaLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDbEI7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ1gsTUFBTSxHQUFHO29CQUNiLE9BQU8sRUFBRTt3QkFDUCxLQUFLLHVCQUNBLElBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUNsQjt3QkFDRCxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7cUJBQ3ZFO29CQUNELE1BQU0scUJBQ0osRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQ2pCLElBQUksRUFBRSxVQUFVLElBRWIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUN6QjtpQkFDRjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDakMsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7aUJBQ25CO2dCQUNELEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2FBQzdCO2lCQUFNO2dCQUNMLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO29CQUNuQixPQUFPLEVBQUU7d0JBQ1AsS0FBSyx1QkFDQSxJQUFJLENBQUMsS0FBSyxJQUNiLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUNoQzt3QkFDRCxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFO3FCQUN2QjtvQkFDRCxNQUFNLHVCQUNELENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDekI7aUJBQ0YsQ0FBQyxDQUFBO2FBQ0g7WUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7U0FDaEM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUVWLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDaEQ7SUFDSCxDQUFDO0lBRUQsNkNBQWtCLEdBQWxCLFVBQW1CLGNBQW1CO1FBRXBDLElBQUk7Z0JBQ0ksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO29CQUNsRCxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLE9BQU8sRUFBRTt3QkFDUCxLQUFLLHVCQUNBLElBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEdBQ3pEO3FCQUNGO29CQUNELE1BQU0sRUFBRTt3QkFDTixFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVE7cUJBQ2xCO2lCQUNGLENBQUMsQ0FBQyxDQUFDO29CQUNGLE9BQU8sRUFBRTt3QkFDUCxLQUFLLHVCQUNBLElBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEdBQ3pEO3FCQUNGO2lCQUNGO2dCQUNELEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQTthQUNuRDtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFFVixPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQ3hEO0lBQ0gsQ0FBQztJQUdELDZEQUFrQyxHQUFsQztRQUFBLGlCQTZEQztRQTVEQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7YUFDeEIsSUFBSSxDQUNILE1BQU0sRUFDSixVQUFBLEtBQUs7WUFDSCxPQUFBLEtBQUs7Z0JBQ0wsS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjO2dCQUN4RSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsS0FBSyxDQUFDLElBQUk7UUFKVixDQUlVLEVBQ2IsQ0FDRjthQUNBLFNBQVMsRUFBQyxVQUFBLEtBQUs7WUFDZCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdELEtBQUksQ0FBQyxLQUFLLENBQ1I7b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDeEQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtpQkFDdkQsRUFDRCxFQUFFLEVBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQTthQUNGO1lBQ0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUMzRDtnQkFDQSxLQUFJLENBQUMsR0FBRyxDQUFDO29CQUNQLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU07b0JBQ3hELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7aUJBQ3ZELEVBQ1EsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ2pCLEtBQUssQ0FBQyxXQUFXLENBQ3pCLENBQUE7YUFDRjtZQUNELElBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFDM0Q7Z0JBQ0EsRUFBRSxDQUFDLFFBQVEsQ0FDVDtvQkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQkFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ2pDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ25CLENBQUMsQ0FBQyxFQUFFO29CQUNOLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUU7aUJBQzVELEVBQ0Q7b0JBQ0UsT0FBTyxxQkFDTCxLQUFLLHVCQUNBLEtBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUVoQixDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM5RjtvQkFDRCxNQUFNLHVCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQjtpQkFDRixDQUFDLENBQUE7YUFDTDtRQUVILENBQUMsRUFBQyxDQUFBO0lBQ04sQ0FBQztJQUVELHVEQUE0QixHQUE1QjtRQUFBLGlCQTZEQztRQTVEQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWU7YUFDM0IsSUFBSSxDQUNILE1BQU0sRUFDSixVQUFBLEtBQUs7WUFDSCxPQUFBLEtBQUs7Z0JBQ0wsS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVO2dCQUNwRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsS0FBSyxDQUFDLElBQUk7UUFKVixDQUlVLEVBQ2IsQ0FDRjthQUNBLFNBQVMsRUFBQyxVQUFBLEtBQUs7WUFDZCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdELEtBQUksQ0FBQyxLQUFLLENBQ1I7b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDeEQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtpQkFDdkQsRUFDRCxFQUFFLEVBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQTthQUNGO1lBQ0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUMzRDtnQkFDQSxLQUFJLENBQUMsR0FBRyxDQUFDO29CQUNQLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU07b0JBQ3hELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7aUJBQ3ZELEVBQ1EsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ2pCLEtBQUssQ0FBQyxXQUFXLENBQ3pCLENBQUE7YUFDRjtZQUNELElBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFDM0Q7Z0JBQ0EsRUFBRSxDQUFDLFFBQVEsQ0FDVDtvQkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQkFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ2pDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ25CLENBQUMsQ0FBQyxFQUFFO29CQUNOLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUU7aUJBQzVELEVBQ0Q7b0JBQ0UsT0FBTyxxQkFDTCxLQUFLLHVCQUNBLEtBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUVoQixDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM5RjtvQkFDRCxNQUFNLHVCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQjtpQkFDRixDQUFDLENBQUE7YUFDTDtRQUVILENBQUMsRUFBQyxDQUFBO0lBQ04sQ0FBQztJQUVELDRDQUFpQixHQUFqQjtRQUFBLGlCQTZEQztRQTVEQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWM7YUFDMUIsSUFBSSxDQUNILE1BQU0sRUFDSixVQUFBLEtBQUs7WUFDSCxPQUFBLEtBQUs7Z0JBQ0wsS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPO2dCQUNqRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsS0FBSyxDQUFDLElBQUk7UUFKVixDQUlVLEVBQ2IsQ0FDRjthQUNBLFNBQVMsRUFBQyxVQUFBLEtBQUs7WUFDZCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdELEtBQUksQ0FBQyxLQUFLLENBQ1I7b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDeEQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtpQkFDdkQsRUFDRCxFQUFFLEVBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQTthQUNGO1lBQ0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUMzRDtnQkFDQSxLQUFJLENBQUMsR0FBRyxDQUFDO29CQUNQLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU07b0JBQ3hELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7aUJBQ3ZELEVBQ1EsRUFBRSxFQUNGLEtBQUssQ0FBQyxXQUFXLENBQ3pCLENBQUE7YUFDRjtZQUNELElBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFDM0Q7Z0JBQ0EsRUFBRSxDQUFDLFFBQVEsQ0FDVDtvQkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQkFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ2pDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ25CLENBQUMsQ0FBQyxFQUFFO29CQUNOLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUU7aUJBQzVELEVBQ0Q7b0JBQ0UsT0FBTyxxQkFDTCxLQUFLLHVCQUNBLEtBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUVoQixDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM5RjtvQkFDRCxNQUFNLHVCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQjtpQkFDRixDQUFDLENBQUE7YUFDTDtRQUVILENBQUMsRUFBQyxDQUFBO0lBQ04sQ0FBQztJQUVELHNEQUEyQixHQUEzQjtRQUFBLGlCQW9CQztRQW5CQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87YUFDbkIsSUFBSSxDQUNILE1BQU0sRUFDSixVQUFDLEtBQTBDO1lBQ3pDLE9BQUEsS0FBSztnQkFDTCxLQUFLLENBQUMsSUFBSTtnQkFDVixLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztnQkFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxDQUFDLG9CQUFvQixDQUFDLFVBQVU7UUFIcEUsQ0FHb0UsRUFDdkUsQ0FDRjthQUNBLFNBQVMsRUFBQyxVQUFBLEtBQUs7WUFDZCxJQUFJO2dCQUVGLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQzVCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBRVYsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUMsQ0FBQTthQUNoRDtRQUNILENBQUMsRUFBQyxDQUFBO0lBQ04sQ0FBQztJQUVELCtDQUFvQixHQUFwQjtRQUFBLGlCQWlDQztRQWhDQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87YUFDbkIsSUFBSSxDQUNILE1BQU0sRUFDSixVQUFBLEtBQUs7WUFDSCxPQUFBLEtBQUs7Z0JBQ0wsS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtnQkFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUNmLEtBQUssQ0FBQyxJQUFJO1FBSlYsQ0FJVSxFQUNiLENBQ0Y7YUFDQSxTQUFTLEVBQUMsVUFBQSxLQUFLO1lBQ2QsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFO2dCQUM3RCxLQUFJLENBQUMsS0FBSyxDQUNSO29CQUNFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU07b0JBQ3hELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7aUJBQ3ZELEVBQ0QsRUFBRSxFQUNGLEtBQUssQ0FBQyxXQUFXLENBQ2xCLENBQUE7YUFDRjtZQUNELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtnQkFDL0QsS0FBSSxDQUFDLEdBQUcsQ0FBQztvQkFDUCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNO29CQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO2lCQUN2RCxFQUNRLEVBQUUsRUFDRixLQUFLLENBQUMsV0FBVyxDQUN6QixDQUFBO2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxpREFBc0IsR0FBdEI7UUFBQSxpQkFzQ0M7UUFwQ0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2FBQ25CLElBQUksQ0FDSCxNQUFNLEVBQ0osVUFBQSxLQUFLO1lBQ0gsT0FBQSxLQUFLO2dCQUNMLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO1FBRGxELENBQ2tELEVBQ3JELENBQ0Y7YUFDQSxTQUFTLEVBQUMsVUFBQSxLQUFLO1lBQ2QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTTtnQkFDekQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQ25EO2dCQUNBLEtBQUksQ0FBQyxLQUFLLENBQ1I7b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDckIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtpQkFDdkQsRUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDakIsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQTthQUNGO1lBQ0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUTtnQkFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQ25EO2dCQUNBLEtBQUksQ0FBQyxHQUFHLENBQ047b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDeEQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtpQkFDdkQsRUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDakIsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQTthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUE7SUFDTixDQUFDO0lBQ0QsNENBQWlCLEdBQWpCO1FBQUEsaUJBZ0RDO1FBL0NDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzthQUNuQixJQUFJLENBQ0gsTUFBTSxFQUNKLFVBQUEsS0FBSztZQUNILE9BQUEsS0FBSztnQkFDTCxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztnQkFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNO2dCQUNuRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsS0FBSyxDQUFDLElBQUk7UUFKVixDQUlVLEVBQ2IsQ0FDRjthQUNBLFNBQVMsRUFBQyxVQUFBLEtBQUs7Z0JBQ1IsT0FBTyxHQUE4QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDN0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTTtnQkFDekQsQ0FBQyxDQUFDLE9BQU87b0JBQ1AsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTztvQkFDM0QsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSztvQkFDekQsQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLGlCQUFpQixJQUFJLGtCQUFrQixDQUFDLENBQUMsRUFDakU7Z0JBQ0EsS0FBSSxDQUFDLEtBQUssQ0FDUjtvQkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNO29CQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO2lCQUN2RCxFQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUNqQixLQUFLLENBQUMsV0FBVyxDQUVsQixDQUFBO2FBQ0Y7WUFDRCxJQUNFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRO2dCQUMzRCxDQUFDLENBQUMsT0FBTztvQkFDUCxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPO29CQUMzRCxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLO29CQUN6RCxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssaUJBQWlCLElBQUksa0JBQWtCLENBQUMsQ0FBQyxFQUNqRTtnQkFDQSxLQUFJLENBQUMsR0FBRyxDQUNOO29CQUNFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU07b0JBQ3hELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7aUJBQ3ZELEVBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ2pCLEtBQUssQ0FBQyxXQUFXLENBQ2xCLENBQUE7YUFDRjtRQUNILENBQUMsRUFBQyxDQUFBO0lBQ04sQ0FBQztJQUVELDhDQUFtQixHQUFuQjtRQUFBLGlCQWlFQztZQWhFTyxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRTtRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzthQUNuQixJQUFJLENBQ0gsTUFBTSxFQUNKLFVBQUMsS0FBd0M7WUFDdkMsT0FBQSxLQUFLO2dCQUNMLEtBQUssQ0FBQyxJQUFJO2dCQUNWLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2dCQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUTtRQUhsRSxDQUdrRSxFQUNyRSxDQUNGO2FBQ0EsU0FBUyxFQUFDLFVBQUEsS0FBSztnQkFDUixJQUFJLEdBQUcsS0FBSSxDQUFDLGNBQWMsRUFBRTtZQUNsQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzdELGNBQWMsR0FBRztvQkFDckIsT0FBTyxFQUFFO3dCQUNQLEtBQUssdUJBQ0EsS0FBSSxDQUFDLEtBQUssSUFDYixFQUFFLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQ2xDO3FCQUNGO2lCQUNGO2dCQUNELElBQUk7b0JBQ0YsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFBO2lCQUN4QztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFFVixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQyxDQUFBO2lCQUM5QzthQUNGO2lCQUFNO2dCQUtMLElBQUk7b0JBQ0YsRUFBRSxDQUFDLFFBQVEsQ0FDVDt3QkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTt3QkFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87d0JBRWpDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQ25CLENBQUMsQ0FBQyxFQUFFO3dCQUNOLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU07cUJBRS9FLEVBQ0Q7d0JBQ0UsT0FBTyxxQkFDTCxLQUFLLHVCQUNBLEtBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUVoQixDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM5Rjt3QkFDRCxNQUFNLHVCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQjtxQkFDRixDQUFDLENBQUE7aUJBQ0w7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBRVYsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsQ0FBQTtpQkFDOUM7YUFDRjtRQUNILENBQUMsRUFBQyxDQUFBO0lBQ04sQ0FBQztJQUVELDhDQUFtQixHQUFuQjtRQUFBLGlCQXdDQztRQXZDQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87YUFDbkIsSUFBSSxDQUNILE1BQU0sRUFDSixVQUFDLEtBQXdDO1lBQ3ZDLE9BQUEsS0FBSztnQkFDTCxLQUFLLENBQUMsSUFBSTtnQkFDVixLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztnQkFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVE7UUFIbEUsQ0FHa0UsRUFDckUsQ0FDRjthQUNBLFNBQVMsRUFBQyxVQUFBLEtBQUs7Z0JBQ1IsSUFBSSxHQUFHLEtBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbEMsSUFBSTtnQkFDRixFQUFFLENBQUMsUUFBUSxDQUNUO29CQUNFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQztvQkFDckMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFO29CQUM1QyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7b0JBQzlDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtpQkFDcEIsRUFDRDtvQkFDRSxPQUFPLEVBQUU7d0JBQ1AsS0FBSyx1QkFDQSxLQUFJLENBQUMsS0FBSyxJQUNiLEVBQUUsRUFBRSxLQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FDbEI7cUJBQ0Y7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUU7d0JBQzdELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRTt3QkFDakMsR0FBRyxFQUFFLEtBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBSTt3QkFDakQsTUFBTSxFQUFFLEVBQUU7cUJBQ1g7aUJBQ0YsQ0FBQyxDQUFBO2FBQ0w7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFFVixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQzlDO1FBQ0gsQ0FBQyxFQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsOENBQW1CLEdBQW5CO1FBQUEsaUJBbURDO1FBbERDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzthQUNuQixJQUFJLENBQ0gsTUFBTSxFQUNKLFVBQUMsS0FBeUM7WUFDeEMsT0FBQSxLQUFLO2dCQUNMLEtBQUssQ0FBQyxJQUFJO2dCQUNWLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2dCQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsU0FBUztRQUhuRSxDQUdtRSxFQUN0RSxDQUNGO2FBQ0EsU0FBUyxFQUFDLFVBQUEsS0FBSztZQUNkLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDN0QsY0FBYyxHQUFHO29CQUNyQixPQUFPLEVBQUU7d0JBQ1AsS0FBSyx1QkFDQSxLQUFJLENBQUMsS0FBSyxJQUNiLEVBQUUsRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FDbEM7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsSUFBSTtvQkFDRixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUE7aUJBQ3pDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUVWLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEVBQUUsQ0FBQyxDQUFDLENBQUE7aUJBQy9DO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSTtvQkFDRixFQUFFLENBQUMsU0FBUyxDQUNWO3dCQUNFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUk7d0JBRXJCLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7cUJBR2xCLEVBQ0Q7d0JBQ0UsT0FBTyxFQUFFOzRCQUNQLEtBQUssdUJBQ0EsS0FBSSxDQUFDLEtBQUssSUFDYixFQUFFLEVBQUUsS0FBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQ2xCO3lCQUNGO3FCQUNGLENBQUMsQ0FBQTtpQkFDTDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFFVixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLENBQUMsQ0FBQyxDQUFBO2lCQUMvQzthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsNENBQWlCLEdBQWpCO1FBQUEsaUJBaUNDO1FBaENDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzthQUNuQixJQUFJLENBQ0gsTUFBTSxFQUNKLFVBQUMsS0FBc0M7WUFDckMsT0FBQSxLQUFLO2dCQUNMLEtBQUssQ0FBQyxJQUFJO2dCQUNWLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2dCQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTTtRQUhoRSxDQUdnRSxFQUNuRSxDQUNGO2FBQ0EsU0FBUyxFQUFDLFVBQUEsS0FBSztZQUNkLElBQUk7Z0JBQ0YsRUFBRSxDQUFDLE1BQU0sQ0FDUDtvQkFDRSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUN2QixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPO29CQUMzQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJO2lCQUN0QixFQUNEO29CQUNFLE9BQU8sRUFBRTt3QkFDUCxLQUFLLHVCQUNBLEtBQUksQ0FBQyxLQUFLLElBQ2IsRUFBRSxFQUFFLEtBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUNsQjtxQkFDRjtpQkFDRixDQUNGLENBQUE7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUVWLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUE7YUFDNUM7UUFDSCxDQUFDLEVBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCx5Q0FBYyxHQUFkO1lBQ1EsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2hELEdBQUcsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQ3JDLFdBQVcsR0FBRyxFQUFFO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1lBQ3JDLFdBQVcsR0FBRyxTQUFTLENBQUE7U0FDeEI7UUFDRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUk7WUFDWixPQUFPLEVBQUUsR0FBRztZQUNaLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVELE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsdURBQTRCLEdBQTVCLFVBQTZCLFFBQWtCO1lBRXZDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNoQyxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFNUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakQsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1NBQzVCO1FBRUQsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZELE9BQU8sUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUMvQjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQzs7Z0JBdDJCRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7Z0JBWlEscUJBQXFCO2dCQUVyQixZQUFZO2dEQXlCaEIsTUFBTSxTQUFDLGFBQWE7Z0JBeEJoQixhQUFhO2dCQUViLE1BQU07Z0JBQ04sY0FBYzs7OzJCQVZ2QjtDQXEzQkMsQUF2MkJELElBdTJCQztTQXAyQlksZ0JBQWdCOztJQUMzQix1Q0FBaUM7SUFDakMsMkNBQWdFO0lBQ2hFLGlDQUFpQjtJQUNqQix3Q0FBaUI7SUFDakIsZ0RBQTJCO0lBQzNCLG9DQUFrQjtJQUNsQix3Q0FFQztJQUNELHVDQUFnQjtJQUVkLHFDQUF3QztJQUN4QyxxQ0FBK0I7SUFHL0Isa0NBQTZCO0lBQzdCLGtDQUFzQjtJQUN0QixrQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuLy8gaW1wb3J0IHsgQXV0aEtleWNsb2FrU2VydmljZSB9IGZyb20gJy4vYXV0aC1rZXljbG9hay5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBOc0luc3RhbmNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWd1cmF0aW9ucy5tb2RlbCdcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9ucy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBXc0V2ZW50cyB9IGZyb20gJy4vZXZlbnQubW9kZWwnXHJcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4vZXZlbnQuc2VydmljZSdcclxuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJy4vbG9nZ2VyLnNlcnZpY2UnXHJcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4vd2lkZ2V0LWNvbnRlbnQubW9kZWwnXHJcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvblN0YXJ0IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xyXG5pbXBvcnQgeyBOUFNHcmlkU2VydmljZSB9IGZyb20gJy4vbnBzLWdyaWQuc2VydmljZSdcclxuXHJcbmRlY2xhcmUgdmFyICR0OiBhbnlcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZWxlbWV0cnlTZXJ2aWNlIHtcclxuICBwcmV2aW91c1VybDogc3RyaW5nIHwgbnVsbCA9IG51bGxcclxuICB0ZWxlbWV0cnlDb25maWc6IE5zSW5zdGFuY2VDb25maWcuSVRlbGVtZXRyeUNvbmZpZyB8IG51bGwgPSBudWxsXHJcbiAgcERhdGE6IGFueSA9IG51bGxcclxuICBjb250ZXh0Q2RhdGEgPSBbXVxyXG4gIGlzQW5vbnltb3VzVGVsZW1ldHJ5ID0gdHJ1ZVxyXG4gIHRlbEFycmF5OiBhbnkgPSBbXVxyXG4gIGV4dGVybmFsQXBwczogYW55ID0ge1xyXG4gICAgUkJDUDogJ3JiY3Atd2ViLXVpJyxcclxuICB9XHJcbiAgZW52aXJvbm1lbnQ6IGFueVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgZXZlbnRzU3ZjOiBFdmVudFNlcnZpY2UsXHJcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIGVudmlyb25tZW50OiBhbnksXHJcbiAgICAvLyBwcml2YXRlIGF1dGhTdmM6IEF1dGhLZXljbG9ha1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG5wc1N2YzogTlBTR3JpZFNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnRcclxuICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcclxuICAgIHRoaXMubmF2aWdhdGlvblN0YXJ0KClcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbmZpZyhpbnN0YW5jZUNvbmZpZylcclxuICAgIHRoaXMuYWRkUGxheWVyTGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRDdXN0b21FdmVudExpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkSW50ZXJhY3RMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEZlZWRiYWNrTGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRUaW1lU3BlbnRMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZFNlYXJjaExpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkSGVhcmJlYXRMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEN1c3RvbUltcHJlc3Npb25MaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEN1c3RvbUxpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkQ3VzdG9tTGlzdGVuZXJGb3JHZXRTdGFydCgpXHJcbiAgICB0aGlzLmFkZEN1c3RvbUxpc3RlbmVyRm9yUGxhdGZvcm1SYXRpbmcoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnQoKSB7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIGlmIChldmVudC51cmwuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgZXZlbnQudXJsLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJykgfHwgZXZlbnQudXJsLmluY2x1ZGVzKCcvY2VydHMnKSkge1xyXG4gICAgICAgICAgdGhpcy5pc0Fub255bW91c1RlbGVtZXRyeSA9IHRydWVcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGVsZW1ldHJ5Q29uZmlnKClcclxuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcclxuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbmZpZyhpbnN0YW5jZUNvbmZpZylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbm9ueW1vdXNUZWxlbWV0cnlSZXF1aXJlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzQW5vbnltb3VzVGVsZW1ldHJ5XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRlbGVtZXRyeUNvbmZpZygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy50ZWxlbWV0cnlDb25maWcpIHtcclxuICAgICAgaWYgKHRoaXMuaXNBbm9ueW1vdXNUZWxlbWV0cnlSZXF1aXJlZCkge1xyXG4gICAgICAgIHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLnRlbGVtZXRyeUNvbmZpZy5lbmRwb2ludCA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLnRlbGVtZXRyeUNvbmZpZy5wdWJsaWNFbmRwb2ludFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLnRlbGVtZXRyeUNvbmZpZy5lbmRwb2ludCA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLnRlbGVtZXRyeUNvbmZpZy5wcm90ZWN0ZWRFbmRwb2ludFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVDb25maWcoaW5zdGFuY2VDb25maWc6IE5zSW5zdGFuY2VDb25maWcuSUNvbmZpZyB8IG51bGwpIHtcclxuICAgIGlmIChpbnN0YW5jZUNvbmZpZykge1xyXG4gICAgICB0aGlzLnRlbGVtZXRyeUNvbmZpZyA9IGluc3RhbmNlQ29uZmlnLnRlbGVtZXRyeUNvbmZpZ1xyXG4gICAgICB0aGlzLnRlbGVtZXRyeUNvbmZpZyA9IHtcclxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUNvbmZpZyxcclxuICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlDb25maWcucGRhdGEsXHJcbiAgICAgICAgICAvLyBwaWQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXHJcbiAgICAgICAgICBpZDogYCR7dGhpcy5lbnZpcm9ubWVudC5uYW1lfS4ke3RoaXMudGVsZW1ldHJ5Q29uZmlnLnBkYXRhLmlkfWAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB1aWQ6ICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQpID9cclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgOiAnJyxcclxuICAgICAgICAvLyBhdXRodG9rZW46IHRoaXMuYXV0aFN2Yy50b2tlbixcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgIGNoYW5uZWw6IHRoaXMucm9vdE9yZ0lkIHx8IHRoaXMudGVsZW1ldHJ5Q29uZmlnLmNoYW5uZWwsXHJcbiAgICAgICAgc2lkOiB0aGlzLmdldFRlbGVtZXRyeVNlc3Npb25JZCxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBEYXRhID0gdGhpcy50ZWxlbWV0cnlDb25maWcucGRhdGFcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBnZXRUZWxlbWV0cnlTZXNzaW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGVsZW1ldHJ5U2Vzc2lvbklkJykgfHwgJydcclxuICB9XHJcblxyXG4gIGdldCByb290T3JnSWQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5yb290T3JnSWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZFxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnXHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyTlBTVXBkYXRlKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy50ZWxBcnJheS5wdXNoKGRhdGEpXHJcbiAgICBpZiAodGhpcy50ZWxBcnJheSAmJiB0aGlzLnRlbEFycmF5Lmxlbmd0aCA9PT0gNCkge1xyXG4gICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JhdGluZ2Zvcm1JRCcpKSB7XHJcbiAgICAgICAgdGhpcy50ZWxBcnJheSA9IFtdXHJcbiAgICAgICAgdGhpcy5ucHNTdmMudXBkYXRlVGVsZW1ldHJ5RGF0YSh0cnVlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydChlZGF0YTogYW55LCBkYXRhOiBhbnksIHBhZ2VDb250ZXh0PzogV3NFdmVudHMuSVRlbGVtZXRyeVBhZ2VDb250ZXh0KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy50ZWxlbWV0cnlDb25maWcpIHtcclxuICAgICAgICAkdC5zdGFydChcclxuICAgICAgICAgIHRoaXMudGVsZW1ldHJ5Q29uZmlnLFxyXG4gICAgICAgICAgKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0LnBhZ2VJZCkgP1xyXG4gICAgICAgICAgICBwYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICcxLjAnLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBpZCxcclxuICAgICAgICAgICAgdHlwZTogZWRhdGEudHlwZSxcclxuICAgICAgICAgICAgbW9kZTogZWRhdGEubW9kZSxcclxuICAgICAgICAgICAgcGFnZWlkOiAocGFnZUNvbnRleHQgJiYgcGFnZUNvbnRleHQucGFnZUlkKSA/XHJcbiAgICAgICAgICAgICAgcGFnZUNvbnRleHQucGFnZUlkXHJcbiAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICAgZHVyYXRpb246IDEsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIC4uLihwYWdlQ29udGV4dCAmJiBwYWdlQ29udGV4dC5tb2R1bGUgPyB7IGVudjogcGFnZUNvbnRleHQubW9kdWxlIH0gOiBudWxsKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgLi4uKGRhdGEpICYmIGRhdGEsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBJbml0aWFsaXppbmcgVGVsZW1ldHJ5LiBDb25maWcgbWlzc2luZy4nKVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IHN0YXJ0JywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZChlZGF0YTogYW55LCBkYXRhOiBhbnksIHBhZ2VDb250ZXh0PzogV3NFdmVudHMuSVRlbGVtZXRyeVBhZ2VDb250ZXh0KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAkdC5lbmQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdHlwZTogZWRhdGEudHlwZSxcclxuICAgICAgICAgIG1vZGU6IGVkYXRhLm1vZGUsXHJcbiAgICAgICAgICBwYWdlaWQ6IChwYWdlQ29udGV4dCAmJiBwYWdlQ29udGV4dC5wYWdlSWQpID9cclxuICAgICAgICAgICAgcGFnZUNvbnRleHQucGFnZUlkXHJcbiAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4uKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBwYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAuLi4oZGF0YSkgJiYgZGF0YSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgKVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBlbmQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXVkaXQodHlwZTogc3RyaW5nLCBwcm9wczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICR0LmF1ZGl0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICBwcm9wcyxcclxuICAgICAgICAgIC8vIGRhdGEsXHJcbiAgICAgICAgICBzdGF0ZTogZGF0YSwgLy8gT3B0aW9uYWwuIEN1cnJlbnQgU3RhdGVcclxuICAgICAgICAgIHByZXZzdGF0ZTogJycsIC8vIE9wdGlvbmFsLiBQcmV2aW91cyBTdGF0ZVxyXG4gICAgICAgICAgZHVyYXRpb246ICcnLCAvLyBPcHRpb25hbC5cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICApXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGF1ZGl0JywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhlYXJ0YmVhdCh0eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICR0LmhlYXJ0YmVhdCh7XHJcbiAgICAgICAgaWQsXHJcbiAgICAgICAgLy8gbW9kZSxcclxuICAgICAgICB0eXBlLFxyXG4gICAgICB9KVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBoZWFydGJlYXQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW1wcmVzc2lvbihkYXRhPzogYW55LCBvYmplY3RUeXBlPzogYW55KSB7XHJcbiAgICB0aGlzLnRyaWdnZXJOUFNVcGRhdGUoZGF0YSlcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5wYWdlQ29udGV4dCkge1xyXG4gICAgICAgIHBhZ2UucGFnZWlkID0gZGF0YS5wYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICBwYWdlLm1vZHVsZSA9IGRhdGEucGFnZUNvbnRleHQubW9kdWxlXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZWRhdGEgPSB7XHJcbiAgICAgICAgcGFnZWlkOiBwYWdlLnBhZ2VpZCwgLy8gUmVxdWlyZWQuIFVuaXF1ZSBwYWdlIGlkXHJcbiAgICAgICAgdHlwZTogcGFnZS5wYWdlVXJsUGFydHNbMF0sIC8vIFJlcXVpcmVkLiBJbXByZXNzaW9uIHR5cGUgKGxpc3QsIGRldGFpbCwgdmlldywgZWRpdCwgd29ya2Zsb3csIHNlYXJjaClcclxuICAgICAgICB1cmk6IHBhZ2UucGFnZVVybCxcclxuICAgICAgfVxyXG4gICAgICBpZiAocGFnZS5vYmplY3RJZCkge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnY6IHBhZ2UubW9kdWxlIHx8ICh0aGlzLnRlbGVtZXRyeUNvbmZpZyAmJiB0aGlzLnRlbGVtZXRyeUNvbmZpZy5lbnYpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICBpZDogcGFnZS5vYmplY3RJZCxcclxuICAgICAgICAgICAgdHlwZTogb2JqZWN0VHlwZSxcclxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGFib3ZlIGlkIGlmIHRoZSBkYXRhIGhhcyBvYmplY3QgaW4gaXQuXHJcbiAgICAgICAgICAgIC4uLihkYXRhICYmIGRhdGEub2JqZWN0KSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcGFnZS5vYmplY3RJZCB8fCAhb2JqZWN0VHlwZSkge1xyXG4gICAgICAgICAgY29uZmlnLm9iamVjdCA9IHt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICR0LmltcHJlc3Npb24oZWRhdGEsIGNvbmZpZylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkdC5pbXByZXNzaW9uKGVkYXRhLCB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YSAmJiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnY6IHBhZ2UubW9kdWxlIHx8ICcnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAuLi4oZGF0YSAmJiBkYXRhLm9iamVjdCksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wcmV2aW91c1VybCA9IHBhZ2UucGFnZVVybFxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBpbXByZXNzaW9uJywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4dGVybmFsSW1wcmVzc2lvbihpbXByZXNzaW9uRGF0YTogYW55KSB7XHJcbiAgICAvLyB0aGlzLnRyaWdnZXJOUFNVcGRhdGUoaW1wcmVzc2lvbkRhdGEpXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYWdlID0gdGhpcy5nZXRQYWdlRGV0YWlscygpXHJcbiAgICAgIGlmICh0aGlzLmV4dGVybmFsQXBwc1tpbXByZXNzaW9uRGF0YS5zdWJBcHBsaWNhdGlvbk5hbWVdKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBwYWdlLm9iamVjdElkID8ge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2ltcHJlc3Npb25EYXRhLnN1YkFwcGxpY2F0aW9uTmFtZV0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgIGlkOiBwYWdlLm9iamVjdElkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9IDoge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2ltcHJlc3Npb25EYXRhLnN1YkFwcGxpY2F0aW9uTmFtZV0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgICAkdC5pbXByZXNzaW9uKGltcHJlc3Npb25EYXRhLmRhdGEsIGV4dGVybmFsQ29uZmlnKVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGV4dGVybmFsSW1wcmVzc2lvbicsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmb3IgUGxhcnRmb3JtIHJhdGluZ1xyXG4gIGFkZEN1c3RvbUxpc3RlbmVyRm9yUGxhdGZvcm1SYXRpbmcoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5nZXRQUkV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgZXZlbnQgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlBsYXRmb3JtUmF0aW5nICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVkYXRhLmlkXHJcbiAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQucGFnZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21MaXN0ZW5lckZvckdldFN0YXJ0KCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZ2V0U3RhcnRFdmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5HZXRTdGFydGVkICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVkYXRhLmlkXHJcbiAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQucGFnZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21MaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmNoYXRib3RFdmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVkYXRhLmlkXHJcbiAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQucGFnZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21JbXByZXNzaW9uTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUltcHJlc3Npb24pID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkltcHJlc3Npb24sXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2V2ZW50LmRhdGE6OicsIGV2ZW50LmRhdGEpXHJcbiAgICAgICAgICB0aGlzLmltcHJlc3Npb24oZXZlbnQuZGF0YSlcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW1wcmVzc2lvbicsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkVGltZVNwZW50TGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBhZ2UgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5tb2RlICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEN1c3RvbUV2ZW50TGlzdGVuZXIoKSB7XHJcblxyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICBldmVudCA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeVxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkICYmXHJcbiAgICAgICAgICBldmVudC5kYXRhLnR5cGUgIT09IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQgJiZcclxuICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSAhPT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllclxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcbiAgYWRkUGxheWVyTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllciAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm1vZGUgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YSxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBldmVudC5kYXRhLmNvbnRlbnRcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQgJiZcclxuICAgICAgICAgICghY29udGVudCB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ21heWJlJyB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3llcycgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnIHx8ICdhcHBsaWNhdGlvbi9qc29uJykpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkICYmXHJcbiAgICAgICAgICAoIWNvbnRlbnQgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQuaXNJZnJhbWVTdXBwb3J0ZWQgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdtYXliZScgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQuaXNJZnJhbWVTdXBwb3J0ZWQgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd5ZXMnIHx8XHJcbiAgICAgICAgICAgIChjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyB8fCAnYXBwbGljYXRpb24vanNvbicpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEludGVyYWN0TGlzdGVuZXIoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYWdlRGV0YWlscygpXHJcbiAgICB0aGlzLnRyaWdnZXJOUFNVcGRhdGUoZGF0YS5wYWdlaWQpXHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUludGVyYWN0KSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmZyb20gPT09ICdzdHJpbmcnICYmIHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dKSB7XHJcbiAgICAgICAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IHtcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAkdC5pbnRlcmFjdChldmVudC5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW50ZXJhY3QnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBsZXQgaW50ZXJhY3RpZFxyXG4gICAgICAgICAgLy8gaWYgKGV2ZW50LmRhdGEuZWRhdGEudHlwZSA9PT0gJ2dvYWwnKSB7XHJcbiAgICAgICAgICAvLyAgIGludGVyYWN0aWQgPSBwYWdlLnBhZ2VVcmxQYXJ0c1s0XVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS5lZGF0YS50eXBlLFxyXG4gICAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0OiBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuZWRhdGEuaWRcclxuICAgICAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQuZGF0YS5wYWdlQ29udGV4dCAmJiBldmVudC5kYXRhLnBhZ2VDb250ZXh0LnBhZ2VJZCB8fCBwYWdlLnBhZ2VpZCxcclxuICAgICAgICAgICAgICAgIC8vIHRhcmdldDogeyBwYWdlIH0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW50ZXJhY3QnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEZlZWRiYWNrTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUZlZWRiYWNrKSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5GZWVkYmFjayxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgJHQuZmVlZGJhY2soXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICByYXRpbmc6IGV2ZW50LmRhdGEub2JqZWN0LnJhdGluZyB8fCAwLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnRpZDogZXZlbnQuZGF0YS5vYmplY3QuY29tbWVudGlkIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnR0eHQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbW1lbnR0eHQgfHwgJycsXHJcbiAgICAgICAgICAgICAgcGFnZWlkOiBwYWdlLnBhZ2VpZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbnRlbnRJZCB8fCBldmVudC5kYXRhLm9iamVjdC5pZCB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEuZWRhdGEudHlwZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHZlcjogYCR7KGV2ZW50LmRhdGEub2JqZWN0LnZlcnNpb24gfHwgJzEnKX0keycnfWAsXHJcbiAgICAgICAgICAgICAgICByb2xsdXA6IHt9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGludGVyYWN0JywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRIZWFyYmVhdExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlIZWFydEJlYXQpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkhlYXJ0QmVhdCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZnJvbSA9PT0gJ3N0cmluZycgJiYgdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0pIHtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICR0LmhlYXJ0YmVhdChldmVudC5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaGVhcnRiZWF0JywgZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgJHQuaGVhcnRiZWF0KFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSxcclxuICAgICAgICAgICAgICAgIC8vIHN1YnR5cGU6IGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlLFxyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmRhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICAvLyBtaW1lVHlwZTogZXZlbnQuZGF0YS5taW1lVHlwZSxcclxuICAgICAgICAgICAgICAgIC8vIG1vZGU6IGV2ZW50LmRhdGEubW9kZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBoZWFydGJlYXQnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZFNlYXJjaExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlTZWFyY2gpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlNlYXJjaCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAkdC5zZWFyY2goXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBxdWVyeTogZXZlbnQuZGF0YS5xdWVyeSxcclxuICAgICAgICAgICAgICBmaWx0ZXJzOiBldmVudC5kYXRhLmZpbHRlcnMsXHJcbiAgICAgICAgICAgICAgc2l6ZTogZXZlbnQuZGF0YS5zaXplLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IHNlYXJjaCcsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZURldGFpbHMoKSB7XHJcbiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoJy8nLCAnJylcclxuICAgIGNvbnN0IHVybCA9IHBhdGggKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoXHJcbiAgICBsZXQgbW9kdWxlVmFsdWUgPSAnJ1xyXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoJ2Rpc2N1c3Npb24tZm9ydW0nKSkge1xyXG4gICAgICBtb2R1bGVWYWx1ZSA9ICdEaXNjdXNzJ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFnZWlkOiBwYXRoLFxyXG4gICAgICBwYWdlVXJsOiB1cmwsXHJcbiAgICAgIHBhZ2VVcmxQYXJ0czogcGF0aC5zcGxpdCgnLycpLFxyXG4gICAgICByZWZmZXJVcmw6IHRoaXMucHJldmlvdXNVcmwsXHJcbiAgICAgIG9iamVjdElkOiB0aGlzLmV4dHJhY3RDb250ZW50SWRGcm9tVXJsUGFydHMocGF0aC5zcGxpdCgnLycpKSxcclxuICAgICAgbW9kdWxlOiBtb2R1bGVWYWx1ZSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4dHJhY3RDb250ZW50SWRGcm9tVXJsUGFydHModXJsUGFydHM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBUT0RPOiBwaWNrIHRvYyBhbmQgdmlld2VyIHVybCBmcm9tIHNvbWUgY29uZmlndXJhdGlvblxyXG4gICAgY29uc3QgdG9jSWR4ID0gdXJsUGFydHMuaW5kZXhPZigndG9jJylcclxuICAgIGNvbnN0IHZpZXdlcklkeCA9IHVybFBhcnRzLmluZGV4T2YoJ3ZpZXdlcicpXHJcblxyXG4gICAgaWYgKHRvY0lkeCA9PT0gLTEgJiYgdmlld2VySWR4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0b2NJZHggIT09IC0xICYmIHRvY0lkeCA8IHVybFBhcnRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgcmV0dXJuIHVybFBhcnRzW3RvY0lkeCArIDFdIC8vIGUuZy4gdXJsIC9hcHAvdG9jLzxjb250ZW50X2lkPlxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2aWV3ZXJJZHggIT09IC0xICYmIHZpZXdlcklkeCA8IHVybFBhcnRzLmxlbmd0aCAtIDIpIHtcclxuICAgICAgcmV0dXJuIHVybFBhcnRzW3ZpZXdlcklkeCArIDJdIC8vIGUuZy4gdXJsIC9hcHAvdmlld2VyLzxjb250ZW50X3R5cGU+Lzxjb250ZW50X2lkPlxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG59XHJcbiJdfQ==