taon 18.0.33 → 19.0.0

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 (335) hide show
  1. package/assets/shared/shared_folder_info.txt +1 -1
  2. package/browser/fesm2022/taon.mjs +67 -84
  3. package/browser/fesm2022/taon.mjs.map +1 -1
  4. package/browser/lib/base-classes/base-context.d.ts +6 -6
  5. package/browser/lib/base-classes/base.d.ts +6 -6
  6. package/browser/lib/index.d.ts +6 -32
  7. package/browser/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
  8. package/browser/lib/ui/taon-progress-bar/taon-progress-bar.module.d.ts +1 -2
  9. package/client/fesm2022/taon.mjs +67 -84
  10. package/client/fesm2022/taon.mjs.map +1 -1
  11. package/client/lib/base-classes/base-context.d.ts +6 -6
  12. package/client/lib/base-classes/base.d.ts +6 -6
  13. package/client/lib/index.d.ts +6 -32
  14. package/client/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
  15. package/client/lib/ui/taon-progress-bar/taon-progress-bar.module.d.ts +1 -2
  16. package/lib/base-classes/base-context.d.ts +6 -6
  17. package/lib/base-classes/base-subscriber.d.ts +4 -0
  18. package/lib/base-classes/base-subscriber.js +25 -0
  19. package/lib/base-classes/base-subscriber.js.map +1 -0
  20. package/lib/base-classes/base.d.ts +6 -6
  21. package/lib/formly/formly-group-wrapper-component.js +1 -0
  22. package/lib/formly/formly-group-wrapper-component.js.map +1 -1
  23. package/lib/formly/formly-repeat-component.js +1 -0
  24. package/lib/formly/formly-repeat-component.js.map +1 -1
  25. package/lib/helpers/class-helpers.js +2 -2
  26. package/lib/helpers/class-helpers.js.map +1 -1
  27. package/lib/index.d.ts +6 -32
  28. package/lib/realtime/realtime-strategy/realtime-abstract-mock.d.ts +10 -0
  29. package/lib/realtime/realtime-strategy/realtime-abstract-mock.js +214 -0
  30. package/lib/realtime/realtime-strategy/realtime-abstract-mock.js.map +1 -0
  31. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/index.d.ts +0 -0
  32. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/index.js +5 -0
  33. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/index.js.map +1 -0
  34. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-namespace.d.ts +22 -0
  35. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-namespace.js +139 -0
  36. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-namespace.js.map +1 -0
  37. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-wrapper.d.ts +16 -0
  38. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-wrapper.js +68 -0
  39. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-wrapper.js.map +1 -0
  40. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-namespace.d.ts +10 -0
  41. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-namespace.js +56 -0
  42. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-namespace.js.map +1 -0
  43. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-wrapper.d.ts +10 -0
  44. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-wrapper.js +50 -0
  45. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-wrapper.js.map +1 -0
  46. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc.models.d.ts +13 -0
  47. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc.models.js +3 -0
  48. package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc.models.js.map +1 -0
  49. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/index.d.ts +2 -0
  50. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/index.js +6 -0
  51. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/index.js.map +1 -0
  52. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-client.d.ts +16 -0
  53. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-client.js +54 -0
  54. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-client.js.map +1 -0
  55. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-namespaces.d.ts +17 -0
  56. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-namespaces.js +52 -0
  57. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-namespaces.js.map +1 -0
  58. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-server.d.ts +11 -0
  59. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-server.js +39 -0
  60. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-server.js.map +1 -0
  61. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-socket.d.ts +13 -0
  62. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-socket.js +46 -0
  63. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-socket.js.map +1 -0
  64. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock.models.d.ts +11 -0
  65. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock.models.js +3 -0
  66. package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock.models.js.map +1 -0
  67. package/lib/ui/directives/firedev-inject-html.directive.d.ts +6 -0
  68. package/lib/ui/directives/firedev-long-press.directive.d.ts +22 -0
  69. package/lib/ui/directives/index.js +2 -2
  70. package/lib/ui/index.js +2 -2
  71. package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/index.d.ts +2 -0
  72. package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/index.js +5 -0
  73. package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/index.js.map +1 -0
  74. package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/taon-admin-edit-mode.component.d.ts +29 -0
  75. package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/taon-admin-edit-mode.module.d.ts +2 -0
  76. package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/index.d.ts +1 -0
  77. package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/index.js +5 -0
  78. package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/index.js.map +1 -0
  79. package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/taon-db-admin.component.d.ts +8 -0
  80. package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/index.d.ts +2 -0
  81. package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/index.js +5 -0
  82. package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/index.js.map +1 -0
  83. package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/taon-file-general-opt.component.d.ts +13 -0
  84. package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/taon-file-general-opt.module.d.ts +2 -0
  85. package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
  86. package/lib/ui/taon-admin-mode-configuration/models/taon-admin-mode-tabs.d.ts +5 -0
  87. package/lib/ui/taon-admin-mode-configuration/models/taon-admin-mode-tabs.js +3 -0
  88. package/lib/ui/taon-admin-mode-configuration/models/taon-admin-mode-tabs.js.map +1 -0
  89. package/lib/ui/taon-admin-mode-configuration/taon-admin-control.service.d.ts +14 -0
  90. package/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.module.d.ts +2 -0
  91. package/lib/ui/taon-github-fork-me-corner/index.js +2 -2
  92. package/lib/ui/taon-github-fork-me-ribbon/index.js +2 -2
  93. package/lib/ui/taon-notifications/taon-notifications.models.js +2 -2
  94. package/lib/ui/taon-progress-bar/index.js +2 -2
  95. package/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
  96. package/lib/ui/taon-session-passcode/index.js +2 -2
  97. package/lib/ui/taon-table/index.js +2 -2
  98. package/lib/ui/toan-full-material.module.d.ts +2 -0
  99. package/old-app .js +1 -0
  100. package/old-app .js.map +1 -1
  101. package/package.json +3 -3
  102. package/taon.jsonc +0 -5
  103. package/tmp-environment.json +24 -3
  104. package/websql/fesm2022/taon.mjs +67 -84
  105. package/websql/fesm2022/taon.mjs.map +1 -1
  106. package/websql/lib/base-classes/base-context.d.ts +6 -6
  107. package/websql/lib/base-classes/base.d.ts +6 -6
  108. package/websql/lib/index.d.ts +6 -32
  109. package/websql/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
  110. package/websql/lib/ui/taon-progress-bar/taon-progress-bar.module.d.ts +1 -2
  111. package/browser/esm2022/lib/base-classes/base-abstract-entity.mjs +0 -18
  112. package/browser/esm2022/lib/base-classes/base-class.mjs +0 -17
  113. package/browser/esm2022/lib/base-classes/base-context.mjs +0 -14
  114. package/browser/esm2022/lib/base-classes/base-controller.mjs +0 -19
  115. package/browser/esm2022/lib/base-classes/base-crud-controller.mjs +0 -279
  116. package/browser/esm2022/lib/base-classes/base-entity.mjs +0 -18
  117. package/browser/esm2022/lib/base-classes/base-injector.mjs +0 -167
  118. package/browser/esm2022/lib/base-classes/base-migration.mjs +0 -23
  119. package/browser/esm2022/lib/base-classes/base-provider.mjs +0 -6
  120. package/browser/esm2022/lib/base-classes/base-repository.mjs +0 -514
  121. package/browser/esm2022/lib/base-classes/base-subscriber-for-entity.mjs +0 -156
  122. package/browser/esm2022/lib/base-classes/base.mjs +0 -26
  123. package/browser/esm2022/lib/constants.mjs +0 -4
  124. package/browser/esm2022/lib/context-db-migrations.mjs +0 -425
  125. package/browser/esm2022/lib/create-context.mjs +0 -127
  126. package/browser/esm2022/lib/decorators/classes/controller-decorator.mjs +0 -18
  127. package/browser/esm2022/lib/decorators/classes/entity-decorator.mjs +0 -30
  128. package/browser/esm2022/lib/decorators/classes/migration-decorator.mjs +0 -18
  129. package/browser/esm2022/lib/decorators/classes/provider-decorator.mjs +0 -18
  130. package/browser/esm2022/lib/decorators/classes/repository-decorator.mjs +0 -18
  131. package/browser/esm2022/lib/decorators/classes/subscriber-decorator.mjs +0 -18
  132. package/browser/esm2022/lib/decorators/http/http-decorators.mjs +0 -24
  133. package/browser/esm2022/lib/decorators/http/http-methods-decorators.mjs +0 -78
  134. package/browser/esm2022/lib/decorators/http/http-params-decorators.mjs +0 -47
  135. package/browser/esm2022/lib/dependency-injection/di-container.mjs +0 -32
  136. package/browser/esm2022/lib/endpoint-context.mjs +0 -1705
  137. package/browser/esm2022/lib/entity-process.mjs +0 -198
  138. package/browser/esm2022/lib/env.mjs +0 -6
  139. package/browser/esm2022/lib/get-response-value.mjs +0 -27
  140. package/browser/esm2022/lib/helpers/class-helpers.mjs +0 -183
  141. package/browser/esm2022/lib/helpers/taon-helpers.mjs +0 -120
  142. package/browser/esm2022/lib/index.mjs +0 -70
  143. package/browser/esm2022/lib/inject.mjs +0 -36
  144. package/browser/esm2022/lib/models.mjs +0 -106
  145. package/browser/esm2022/lib/orm.mjs +0 -6
  146. package/browser/esm2022/lib/realtime/realtime-client.mjs +0 -141
  147. package/browser/esm2022/lib/realtime/realtime-core.mjs +0 -62
  148. package/browser/esm2022/lib/realtime/realtime-server.mjs +0 -292
  149. package/browser/esm2022/lib/realtime/realtime-strategy/index.mjs +0 -7
  150. package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy-ipc.mjs +0 -218
  151. package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy-mock.mjs +0 -224
  152. package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy-socket-io.mjs +0 -29
  153. package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy.mjs +0 -14
  154. package/browser/esm2022/lib/realtime/realtime-subs-manager.mjs +0 -81
  155. package/browser/esm2022/lib/realtime/realtime.models.mjs +0 -4
  156. package/browser/esm2022/lib/storage.mjs +0 -5
  157. package/browser/esm2022/lib/symbols.mjs +0 -97
  158. package/browser/esm2022/lib/ui/directives/index.mjs +0 -6
  159. package/browser/esm2022/lib/ui/directives/safe.pipe.mjs +0 -43
  160. package/browser/esm2022/lib/ui/directives/taon-inject-html.directive.mjs +0 -24
  161. package/browser/esm2022/lib/ui/directives/taon-long-press.directive.mjs +0 -120
  162. package/browser/esm2022/lib/ui/index.mjs +0 -12
  163. package/browser/esm2022/lib/ui/taon-admin-mode-configuration/index.mjs +0 -4
  164. package/browser/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.component.mjs +0 -194
  165. package/browser/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin.service.mjs +0 -55
  166. package/browser/esm2022/lib/ui/taon-full-material.module.mjs +0 -179
  167. package/browser/esm2022/lib/ui/taon-github-fork-me-corner/index.mjs +0 -5
  168. package/browser/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.component.mjs +0 -18
  169. package/browser/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.module.mjs +0 -21
  170. package/browser/esm2022/lib/ui/taon-notifications/index.mjs +0 -7
  171. package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.component.mjs +0 -25
  172. package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.models.mjs +0 -5
  173. package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.module.mjs +0 -21
  174. package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.service.mjs +0 -48
  175. package/browser/esm2022/lib/ui/taon-progress-bar/index.mjs +0 -5
  176. package/browser/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.component.mjs +0 -98
  177. package/browser/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.module.mjs +0 -22
  178. package/browser/esm2022/lib/ui/taon-session-passcode/index.mjs +0 -4
  179. package/browser/esm2022/lib/ui/taon-session-passcode/taon-session-passcode.component.mjs +0 -120
  180. package/browser/esm2022/lib/ui/taon-table/index.mjs +0 -5
  181. package/browser/esm2022/lib/ui/taon-table/taon-table.component.mjs +0 -160
  182. package/browser/esm2022/lib/ui/taon-table/taon-table.module.mjs +0 -57
  183. package/browser/esm2022/lib/validators.mjs +0 -76
  184. package/browser/esm2022/public-api.mjs +0 -2
  185. package/browser/esm2022/taon.mjs +0 -5
  186. package/client/esm2022/lib/base-classes/base-abstract-entity.mjs +0 -18
  187. package/client/esm2022/lib/base-classes/base-class.mjs +0 -17
  188. package/client/esm2022/lib/base-classes/base-context.mjs +0 -14
  189. package/client/esm2022/lib/base-classes/base-controller.mjs +0 -19
  190. package/client/esm2022/lib/base-classes/base-crud-controller.mjs +0 -279
  191. package/client/esm2022/lib/base-classes/base-entity.mjs +0 -18
  192. package/client/esm2022/lib/base-classes/base-injector.mjs +0 -167
  193. package/client/esm2022/lib/base-classes/base-migration.mjs +0 -23
  194. package/client/esm2022/lib/base-classes/base-provider.mjs +0 -6
  195. package/client/esm2022/lib/base-classes/base-repository.mjs +0 -514
  196. package/client/esm2022/lib/base-classes/base-subscriber-for-entity.mjs +0 -156
  197. package/client/esm2022/lib/base-classes/base.mjs +0 -26
  198. package/client/esm2022/lib/constants.mjs +0 -4
  199. package/client/esm2022/lib/context-db-migrations.mjs +0 -425
  200. package/client/esm2022/lib/create-context.mjs +0 -127
  201. package/client/esm2022/lib/decorators/classes/controller-decorator.mjs +0 -18
  202. package/client/esm2022/lib/decorators/classes/entity-decorator.mjs +0 -30
  203. package/client/esm2022/lib/decorators/classes/migration-decorator.mjs +0 -18
  204. package/client/esm2022/lib/decorators/classes/provider-decorator.mjs +0 -18
  205. package/client/esm2022/lib/decorators/classes/repository-decorator.mjs +0 -18
  206. package/client/esm2022/lib/decorators/classes/subscriber-decorator.mjs +0 -18
  207. package/client/esm2022/lib/decorators/http/http-decorators.mjs +0 -24
  208. package/client/esm2022/lib/decorators/http/http-methods-decorators.mjs +0 -78
  209. package/client/esm2022/lib/decorators/http/http-params-decorators.mjs +0 -47
  210. package/client/esm2022/lib/dependency-injection/di-container.mjs +0 -32
  211. package/client/esm2022/lib/endpoint-context.mjs +0 -1705
  212. package/client/esm2022/lib/entity-process.mjs +0 -198
  213. package/client/esm2022/lib/env.mjs +0 -6
  214. package/client/esm2022/lib/get-response-value.mjs +0 -27
  215. package/client/esm2022/lib/helpers/class-helpers.mjs +0 -183
  216. package/client/esm2022/lib/helpers/taon-helpers.mjs +0 -120
  217. package/client/esm2022/lib/index.mjs +0 -70
  218. package/client/esm2022/lib/inject.mjs +0 -36
  219. package/client/esm2022/lib/models.mjs +0 -106
  220. package/client/esm2022/lib/orm.mjs +0 -6
  221. package/client/esm2022/lib/realtime/realtime-client.mjs +0 -141
  222. package/client/esm2022/lib/realtime/realtime-core.mjs +0 -62
  223. package/client/esm2022/lib/realtime/realtime-server.mjs +0 -292
  224. package/client/esm2022/lib/realtime/realtime-strategy/index.mjs +0 -7
  225. package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy-ipc.mjs +0 -218
  226. package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy-mock.mjs +0 -224
  227. package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy-socket-io.mjs +0 -29
  228. package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy.mjs +0 -14
  229. package/client/esm2022/lib/realtime/realtime-subs-manager.mjs +0 -81
  230. package/client/esm2022/lib/realtime/realtime.models.mjs +0 -4
  231. package/client/esm2022/lib/storage.mjs +0 -5
  232. package/client/esm2022/lib/symbols.mjs +0 -97
  233. package/client/esm2022/lib/ui/directives/index.mjs +0 -6
  234. package/client/esm2022/lib/ui/directives/safe.pipe.mjs +0 -43
  235. package/client/esm2022/lib/ui/directives/taon-inject-html.directive.mjs +0 -24
  236. package/client/esm2022/lib/ui/directives/taon-long-press.directive.mjs +0 -120
  237. package/client/esm2022/lib/ui/index.mjs +0 -12
  238. package/client/esm2022/lib/ui/taon-admin-mode-configuration/index.mjs +0 -4
  239. package/client/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.component.mjs +0 -194
  240. package/client/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin.service.mjs +0 -55
  241. package/client/esm2022/lib/ui/taon-full-material.module.mjs +0 -179
  242. package/client/esm2022/lib/ui/taon-github-fork-me-corner/index.mjs +0 -5
  243. package/client/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.component.mjs +0 -18
  244. package/client/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.module.mjs +0 -21
  245. package/client/esm2022/lib/ui/taon-notifications/index.mjs +0 -7
  246. package/client/esm2022/lib/ui/taon-notifications/taon-notifications.component.mjs +0 -25
  247. package/client/esm2022/lib/ui/taon-notifications/taon-notifications.models.mjs +0 -5
  248. package/client/esm2022/lib/ui/taon-notifications/taon-notifications.module.mjs +0 -21
  249. package/client/esm2022/lib/ui/taon-notifications/taon-notifications.service.mjs +0 -48
  250. package/client/esm2022/lib/ui/taon-progress-bar/index.mjs +0 -5
  251. package/client/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.component.mjs +0 -98
  252. package/client/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.module.mjs +0 -22
  253. package/client/esm2022/lib/ui/taon-session-passcode/index.mjs +0 -4
  254. package/client/esm2022/lib/ui/taon-session-passcode/taon-session-passcode.component.mjs +0 -120
  255. package/client/esm2022/lib/ui/taon-table/index.mjs +0 -5
  256. package/client/esm2022/lib/ui/taon-table/taon-table.component.mjs +0 -160
  257. package/client/esm2022/lib/ui/taon-table/taon-table.module.mjs +0 -57
  258. package/client/esm2022/lib/validators.mjs +0 -76
  259. package/client/esm2022/public-api.mjs +0 -2
  260. package/client/esm2022/taon.mjs +0 -5
  261. package/websql/esm2022/lib/base-classes/base-abstract-entity.mjs +0 -25
  262. package/websql/esm2022/lib/base-classes/base-class.mjs +0 -17
  263. package/websql/esm2022/lib/base-classes/base-context.mjs +0 -14
  264. package/websql/esm2022/lib/base-classes/base-controller.mjs +0 -19
  265. package/websql/esm2022/lib/base-classes/base-crud-controller.mjs +0 -238
  266. package/websql/esm2022/lib/base-classes/base-entity.mjs +0 -16
  267. package/websql/esm2022/lib/base-classes/base-injector.mjs +0 -167
  268. package/websql/esm2022/lib/base-classes/base-migration.mjs +0 -23
  269. package/websql/esm2022/lib/base-classes/base-provider.mjs +0 -6
  270. package/websql/esm2022/lib/base-classes/base-repository.mjs +0 -431
  271. package/websql/esm2022/lib/base-classes/base-subscriber-for-entity.mjs +0 -156
  272. package/websql/esm2022/lib/base-classes/base.mjs +0 -26
  273. package/websql/esm2022/lib/constants.mjs +0 -4
  274. package/websql/esm2022/lib/context-db-migrations.mjs +0 -274
  275. package/websql/esm2022/lib/create-context.mjs +0 -126
  276. package/websql/esm2022/lib/decorators/classes/controller-decorator.mjs +0 -18
  277. package/websql/esm2022/lib/decorators/classes/entity-decorator.mjs +0 -28
  278. package/websql/esm2022/lib/decorators/classes/migration-decorator.mjs +0 -18
  279. package/websql/esm2022/lib/decorators/classes/provider-decorator.mjs +0 -18
  280. package/websql/esm2022/lib/decorators/classes/repository-decorator.mjs +0 -18
  281. package/websql/esm2022/lib/decorators/classes/subscriber-decorator.mjs +0 -18
  282. package/websql/esm2022/lib/decorators/http/http-decorators.mjs +0 -24
  283. package/websql/esm2022/lib/decorators/http/http-methods-decorators.mjs +0 -78
  284. package/websql/esm2022/lib/decorators/http/http-params-decorators.mjs +0 -47
  285. package/websql/esm2022/lib/dependency-injection/di-container.mjs +0 -32
  286. package/websql/esm2022/lib/endpoint-context.mjs +0 -1586
  287. package/websql/esm2022/lib/entity-process.mjs +0 -198
  288. package/websql/esm2022/lib/env.mjs +0 -6
  289. package/websql/esm2022/lib/get-response-value.mjs +0 -25
  290. package/websql/esm2022/lib/helpers/class-helpers.mjs +0 -183
  291. package/websql/esm2022/lib/helpers/taon-helpers.mjs +0 -120
  292. package/websql/esm2022/lib/index.mjs +0 -72
  293. package/websql/esm2022/lib/inject.mjs +0 -36
  294. package/websql/esm2022/lib/models.mjs +0 -97
  295. package/websql/esm2022/lib/orm.mjs +0 -65
  296. package/websql/esm2022/lib/realtime/realtime-client.mjs +0 -141
  297. package/websql/esm2022/lib/realtime/realtime-core.mjs +0 -62
  298. package/websql/esm2022/lib/realtime/realtime-server.mjs +0 -176
  299. package/websql/esm2022/lib/realtime/realtime-strategy/index.mjs +0 -7
  300. package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy-ipc.mjs +0 -218
  301. package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy-mock.mjs +0 -224
  302. package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy-socket-io.mjs +0 -29
  303. package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy.mjs +0 -14
  304. package/websql/esm2022/lib/realtime/realtime-subs-manager.mjs +0 -81
  305. package/websql/esm2022/lib/realtime/realtime.models.mjs +0 -4
  306. package/websql/esm2022/lib/storage.mjs +0 -5
  307. package/websql/esm2022/lib/symbols.mjs +0 -97
  308. package/websql/esm2022/lib/ui/directives/index.mjs +0 -6
  309. package/websql/esm2022/lib/ui/directives/safe.pipe.mjs +0 -43
  310. package/websql/esm2022/lib/ui/directives/taon-inject-html.directive.mjs +0 -24
  311. package/websql/esm2022/lib/ui/directives/taon-long-press.directive.mjs +0 -120
  312. package/websql/esm2022/lib/ui/index.mjs +0 -12
  313. package/websql/esm2022/lib/ui/taon-admin-mode-configuration/index.mjs +0 -4
  314. package/websql/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.component.mjs +0 -194
  315. package/websql/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin.service.mjs +0 -55
  316. package/websql/esm2022/lib/ui/taon-full-material.module.mjs +0 -179
  317. package/websql/esm2022/lib/ui/taon-github-fork-me-corner/index.mjs +0 -5
  318. package/websql/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.component.mjs +0 -18
  319. package/websql/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.module.mjs +0 -21
  320. package/websql/esm2022/lib/ui/taon-notifications/index.mjs +0 -7
  321. package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.component.mjs +0 -25
  322. package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.models.mjs +0 -5
  323. package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.module.mjs +0 -21
  324. package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.service.mjs +0 -48
  325. package/websql/esm2022/lib/ui/taon-progress-bar/index.mjs +0 -5
  326. package/websql/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.component.mjs +0 -50
  327. package/websql/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.module.mjs +0 -22
  328. package/websql/esm2022/lib/ui/taon-session-passcode/index.mjs +0 -4
  329. package/websql/esm2022/lib/ui/taon-session-passcode/taon-session-passcode.component.mjs +0 -120
  330. package/websql/esm2022/lib/ui/taon-table/index.mjs +0 -5
  331. package/websql/esm2022/lib/ui/taon-table/taon-table.component.mjs +0 -160
  332. package/websql/esm2022/lib/ui/taon-table/taon-table.module.mjs +0 -57
  333. package/websql/esm2022/lib/validators.mjs +0 -76
  334. package/websql/esm2022/public-api.mjs +0 -2
  335. package/websql/esm2022/taon.mjs +0 -5
@@ -1,1705 +0,0 @@
1
- /* eslint-disable @typescript-eslint/typedef */
2
- import { Models } from './models';
3
- import { ClassHelpers } from './helpers/class-helpers';
4
- import { Symbols } from './symbols';
5
- import { _, Helpers } from 'tnp-core/browser';
6
- import { DITaonContainer } from './dependency-injection/di-container';
7
- import { TaonHelpers } from './helpers/taon-helpers';
8
- import { Mapping, Models as ModelsNg2Rest, Resource, RestHeaders, } from 'ng2-rest/browser'; /* */
9
- /* */
10
- /* */
11
- /* */
12
- /* */
13
- import { JSON10 } from 'json10/browser';
14
- import { from } from 'rxjs';
15
- import { getResponseValue } from './get-response-value';
16
- import axios from 'axios';
17
- import { ENV } from './env';
18
- import { RealtimeCore } from './realtime/realtime-core';
19
- import { ContextDbMigrations } from './context-db-migrations';
20
- export class EndpointContext {
21
- static initNgZone(ngZone) {
22
- this.ngZone = ngZone;
23
- }
24
- get isRunOrRevertOnlyMigrationAppStart() {
25
- return !!(this.onlyMigrationRun || this.onlyMigrationRevertToTimestamp);
26
- }
27
- get realtimeClient() {
28
- return this.realtime.client;
29
- }
30
- get realtimeServer() {
31
- return this.realtime.server;
32
- }
33
- get logHttp() {
34
- if (_.isObject(this.config?.logs)) {
35
- return !!this.config.logs.http;
36
- }
37
- return this.config?.logs === true;
38
- }
39
- get logRealtime() {
40
- if (_.isObject(this.config?.logs)) {
41
- return !!this.config.logs.realtime;
42
- }
43
- return this.config?.logs === true;
44
- }
45
- get logFramework() {
46
- if (_.isObject(this.config?.logs)) {
47
- return !!this.config.logs.framework;
48
- }
49
- return this.config?.logs === true;
50
- }
51
- get logDb() {
52
- if (_.isObject(this.config?.logs)) {
53
- return !!this.config.logs.db;
54
- }
55
- return this.config?.logs === true;
56
- }
57
- get logMigrations() {
58
- if (_.isObject(this.config?.logs)) {
59
- return !!this.config.logs.migrations;
60
- }
61
- return this.config?.logs === true;
62
- }
63
- constructor(originalConfig, configFn) {
64
- this.originalConfig = originalConfig;
65
- this.configFn = configFn;
66
- this.disabledRealtime = false;
67
- /**
68
- * check whether context is inited
69
- * (with init() function )
70
- */
71
- this.inited = false;
72
- this.dbMigrations = new ContextDbMigrations(this);
73
- this.localInstaceObjSymbol = Symbol('localInstaceObjSymbol');
74
- /**
75
- * all instances of classes from context
76
- * key is class name
77
- */
78
- this.allClassesInstances = {};
79
- this.classInstancesByNameObj = {};
80
- this.objWithClassesInstancesArr = {};
81
- this.activeRoutes = [];
82
- this.skipWritingServerRoutes = false;
83
- this.injectableTypesfromContexts = [
84
- Models.ClassType.CONTROLLER,
85
- Models.ClassType.PROVIDER,
86
- Models.ClassType.REPOSITORY,
87
- Models.ClassType.SUBSCRIBER,
88
- Models.ClassType.MIGRATION,
89
- ];
90
- this.allTypesfromContexts = [
91
- ...this.injectableTypesfromContexts,
92
- Models.ClassType.ENTITY,
93
- ];
94
- this.expressApp = {};
95
- this.onlyMigrationRun = false;
96
- this.onlyMigrationRevertToTimestamp = undefined;
97
- this.entitiesTriggers = {};
98
- this.cloneClassWithNewMetadata = ({ BaseClass, className, config, ctx, classType, }) => {
99
- const cloneClass = () => {
100
- var _a, _b, _c, _d, _e;
101
- if (BaseClass[Symbols.fullClassNameStaticProperty] ===
102
- `${ctx.contextName}.${className}`) {
103
- return BaseClass;
104
- }
105
- return class extends BaseClass {
106
- constructor() {
107
- super(...arguments);
108
- this[_e] = ctx;
109
- }
110
- static { _a = Symbols.orignalClass, _b = Symbols.fullClassNameStaticProperty, _c = Symbols.classNameStaticProperty, _d = Symbols.ctxInClassOrClassObj, _e = Symbols.ctxInClassOrClassObj; }
111
- // @ts-ignore
112
- static { this[_a] = BaseClass; }
113
- // @ts-ignore
114
- static { this[_b] = `${ctx.contextName}.${className}`; }
115
- // @ts-ignore
116
- static { this[_c] = className; }
117
- static { this[_d] = ctx; }
118
- static __getFullPathForClass__(arr = []) {
119
- const name = this[Symbols.fullClassNameStaticProperty];
120
- arr.push(name);
121
- // @ts-ignore
122
- if (this[Symbols.orignalClass] && // @ts-ignore
123
- this[Symbols.orignalClass].__getFullPathForClass__) {
124
- // @ts-ignore
125
- this[Symbols.orignalClass].__getFullPathForClass__(arr);
126
- }
127
- return arr.join('/');
128
- }
129
- static get fullPathForClass() {
130
- return this.__getFullPathForClass__();
131
- }
132
- };
133
- };
134
- const cloneClassFunction = cloneClass();
135
- return cloneClassFunction;
136
- };
137
- this.cloneClassesObjWithNewMetadata = ({ classesInput, config, ctx, classType, }) => {
138
- const classes = {};
139
- for (const key of Object.keys(classesInput || {})) {
140
- const BaseClass = classesInput[key];
141
- if (!BaseClass) {
142
- Helpers.error(`Class ${key} is not defined in context ${ctx.contextName}
143
-
144
- Please check if you have correct import in context file
145
-
146
- `);
147
- }
148
- var className = Reflect.getMetadata(Symbols.metadata.className, BaseClass);
149
- className = className || key;
150
- BaseClass[Symbols.classNameStaticProperty] = className;
151
- const clonedClass = this.cloneClassWithNewMetadata({
152
- BaseClass,
153
- className,
154
- config,
155
- ctx,
156
- classType,
157
- });
158
- classes[className] = clonedClass;
159
- }
160
- return classes;
161
- };
162
- }
163
- async init(options) {
164
- const { initFromRecrusiveContextResovle, overrideHost, overrideRemoteHost, onlyMigrationRun, onlyMigrationRevertToTimestamp, } = options || {}; // TODO use it ?
165
- this.inited = true;
166
- // @ts-ignore
167
- this.onlyMigrationRun = onlyMigrationRun;
168
- // @ts-ignore
169
- this.onlyMigrationRevertToTimestamp = onlyMigrationRevertToTimestamp;
170
- this.config = this.configFn(ENV);
171
- if (_.isObject(this.config.database)) {
172
- this.config.database = Models.DatabaseConfig.from(this.config.database).databaseConfigTypeORM;
173
- }
174
- if (overrideHost && overrideRemoteHost) {
175
- Helpers.throw(`[taon-config] You can't have overrideHost and overrideRemoteHost at the same time`);
176
- }
177
- this.config.host = !_.isUndefined(overrideHost)
178
- ? overrideHost
179
- : this.config.host;
180
- this.config.remoteHost = !_.isUndefined(overrideRemoteHost)
181
- ? overrideRemoteHost
182
- : this.config.remoteHost;
183
- this.config.host = this.host === null ? void 0 : this.host;
184
- this.config.remoteHost =
185
- this.remoteHost === null ? void 0 : this.remoteHost;
186
- if (this.config.host &&
187
- !this.config.host.startsWith('http://') &&
188
- !this.config.host.startsWith('https://')) {
189
- Helpers.throw(`[taon-config] Your 'host' must start with http:// or https://`);
190
- }
191
- if (_.isUndefined(this.config.useIpcWhenElectron)) {
192
- this.config.useIpcWhenElectron = true;
193
- }
194
- if (this.config.remoteHost &&
195
- !this.config.remoteHost.startsWith('http://') &&
196
- !this.config.remoteHost.startsWith('https://')) {
197
- Helpers.throw(`[taon-config] Your 'remoteHost' must start with http:// or https://`);
198
- }
199
- //@ts-expect-error overriding readonly
200
- this.skipWritingServerRoutes = _.isBoolean(this.config.skipWritingServerRoutes)
201
- ? this.config.skipWritingServerRoutes
202
- : false;
203
- if (this.config.host) {
204
- this.mode = 'backend-frontend(tcp+udp)';
205
- /* */
206
- /* */
207
- }
208
- if (this.config.remoteHost) {
209
- if (this.config.host) {
210
- Helpers.throw(`[taon] You can't have remoteHost and host at the same time`);
211
- }
212
- this.mode = 'remote-backend(tcp+udp)';
213
- }
214
- if (this.config.useIpcWhenElectron && Helpers.isElectron) {
215
- if (Helpers.isWebSQL) {
216
- this.mode = 'backend-frontend(websql-electron)';
217
- }
218
- else {
219
- this.mode = 'backend-frontend(ipc-electron)';
220
- }
221
- }
222
- if (!this.mode && !this.config.abstract) {
223
- Helpers.error(`[taon] Context "${this.contextName}": You need to provide host or remoteHost or useIpcWhenElectron`, false, true);
224
- /* */
225
- /* */
226
- }
227
- if (this.config.database === true) {
228
- this.databaseConfig = this.getAutoGeneratedConfig();
229
- }
230
- else if (_.isObject(this.config.database)) {
231
- this.databaseConfig = _.merge(this.getAutoGeneratedConfig(), _.cloneDeep(this.config.database));
232
- }
233
- if (this.config.session) {
234
- this.session = _.cloneDeep(this.config.session);
235
- const oneHour = 1000 * 60 * 60 * 1; // 24;
236
- if (!this.session.cookieMaxAge) {
237
- this.session.cookieMaxAge = oneHour;
238
- }
239
- axios.defaults.withCredentials = true;
240
- }
241
- this.config.contexts = this.config.contexts || {};
242
- this.config.entities = this.config.entities || {};
243
- this.config.controllers = this.config.controllers || {};
244
- this.config.repositories = this.config.repositories || {};
245
- this.config.providers = this.config.providers || {};
246
- this.config.subscribers = this.config.subscribers || {};
247
- this.config.migrations = this.config.migrations || {};
248
- this.config.entities = {
249
- ...(await this.getRecrusiveClassesfromContextsObj(Models.ClassType.ENTITY)),
250
- ...this.config.entities,
251
- };
252
- this.config.controllers = {
253
- ...(await this.getRecrusiveClassesfromContextsObj(Models.ClassType.CONTROLLER)),
254
- ...this.config.controllers,
255
- };
256
- this.config.providers = {
257
- ...(await this.getRecrusiveClassesfromContextsObj(Models.ClassType.PROVIDER)),
258
- ...this.config.providers,
259
- };
260
- this.config.subscribers = {
261
- ...(await this.getRecrusiveClassesfromContextsObj(Models.ClassType.SUBSCRIBER)),
262
- ...this.config.subscribers,
263
- };
264
- this.config.repositories = {
265
- ...(await this.getRecrusiveClassesfromContextsObj(Models.ClassType.REPOSITORY)),
266
- ...this.config.repositories,
267
- };
268
- this.config.migrations = {
269
- ...(await this.getRecrusiveClassesfromContextsObj(Models.ClassType.MIGRATION)),
270
- ...this.config.migrations,
271
- };
272
- this.config.controllers = this.cloneClassesObjWithNewMetadata({
273
- classesInput: this.config.controllers,
274
- config: this.config,
275
- ctx: this,
276
- classType: Models.ClassType.CONTROLLER,
277
- });
278
- this.config.repositories = this.cloneClassesObjWithNewMetadata({
279
- classesInput: this.config.repositories,
280
- config: this.config,
281
- ctx: this,
282
- classType: Models.ClassType.REPOSITORY,
283
- });
284
- this.config.providers = this.cloneClassesObjWithNewMetadata({
285
- classesInput: this.config.providers,
286
- config: this.config,
287
- ctx: this,
288
- classType: Models.ClassType.PROVIDER,
289
- });
290
- this.config.subscribers = this.cloneClassesObjWithNewMetadata({
291
- classesInput: this.config.subscribers,
292
- config: this.config,
293
- ctx: this,
294
- classType: Models.ClassType.SUBSCRIBER,
295
- });
296
- this.config.migrations = this.cloneClassesObjWithNewMetadata({
297
- classesInput: this.config.migrations,
298
- config: this.config,
299
- ctx: this,
300
- classType: Models.ClassType.MIGRATION,
301
- });
302
- for (const classTypeName of this.injectableTypesfromContexts) {
303
- this.classInstancesByNameObj[classTypeName] = {};
304
- this.objWithClassesInstancesArr[classTypeName] = [];
305
- }
306
- for (const classTypeName of this.injectableTypesfromContexts) {
307
- await this.createInstances(this.config[Models.ClassTypeKey[classTypeName]], classTypeName);
308
- }
309
- if (!this.isRunOrRevertOnlyMigrationAppStart) {
310
- if (this.mode === 'backend-frontend(tcp+udp)' && !this.config.abstract) {
311
- /* */
312
- /* */
313
- /* */
314
- /* */
315
- /* */
316
- /* */
317
- /* */
318
- /* */
319
- /* */
320
- /* */
321
- /* */
322
- /* */
323
- /* */
324
- /* */
325
- /* */
326
- /* */
327
- /* */
328
- /* */
329
- /* */
330
- }
331
- if (!this.config.abstract) {
332
- this.disabledRealtime = !!this.config.disabledRealtime;
333
- /* */
334
- /* */
335
- /* */
336
- /* */
337
- /* */
338
- this.realtime = new RealtimeCore(this);
339
- }
340
- }
341
- if (this.config.abstract) {
342
- this.logFramework &&
343
- Helpers.info(`[taon] Create abstract context: ${this.config.contextName}`);
344
- }
345
- else {
346
- if (this.config.remoteHost) {
347
- this.logFramework &&
348
- Helpers.info(`[taon] Create context for remote host: ${this.config.remoteHost}`);
349
- }
350
- else {
351
- this.logFramework &&
352
- Helpers.info(`[taon] Create context for host: ${this.config.host}`);
353
- }
354
- }
355
- Object.keys(this.config).forEach(key => {
356
- this.originalConfig[key] = this.config[key];
357
- });
358
- }
359
- getAutoGeneratedConfig() {
360
- /* */
361
- /* */
362
- /* */
363
- /* */
364
- /* */
365
- /* */
366
- /* */
367
- /* */
368
- /* */
369
- /* */
370
- /* */
371
- /* */
372
- /* */
373
- /* */
374
- /* */
375
- /* */
376
- /* */
377
- /* */
378
- /* */
379
- /* */
380
- /* */
381
- /* */
382
- /* */
383
- /* */
384
- /* */
385
- /* */
386
- /* */
387
- /* */
388
- /* */
389
- /* */
390
- /* */
391
- /* */
392
- /* */
393
- /* */
394
- /* */
395
- /* */
396
- /* */
397
- /* */
398
- /* */
399
- /* */
400
- /* */
401
- /* */
402
- /* */
403
- /* */
404
- /* */
405
- /* */
406
- /* */
407
- /* */
408
- /* */
409
- /* */
410
- /* */
411
- /* */
412
- /* */
413
- /* */
414
- /* */
415
- /* */
416
- /* */
417
- /* */
418
- /* */
419
- /* */
420
- /* */
421
- /* */
422
- /* */
423
- /* */
424
- /* */
425
- /* */
426
- /* */
427
- return (void 0);
428
- }
429
- get ngZone() {
430
- return EndpointContext.ngZone;
431
- return;
432
- }
433
- startServer() {
434
- /* */
435
- /* */
436
- /* */
437
- /* */
438
- /* */
439
- /* */
440
- /* */
441
- /* */
442
- /* */
443
- /* */
444
- /* */
445
- /* */
446
- /* */
447
- /* */
448
- /* */
449
- /* */
450
- return (void 0);
451
- }
452
- displayRoutes(app) {
453
- /* */
454
- /* */
455
- /* */
456
- /* */
457
- /* */
458
- /* */
459
- /* */
460
- /* */
461
- /* */
462
- /* */
463
- /* */
464
- /* */
465
- /* */
466
- /* */
467
- /* */
468
- /* */
469
- /* */
470
- /* */
471
- /* */
472
- /* */
473
- /* */
474
- /* */
475
- /* */
476
- /* */
477
- /* */
478
- /* */
479
- /* */
480
- /* */
481
- }
482
- get modeAllowsDatabaseCreation() {
483
- return (this.mode === 'backend-frontend(tcp+udp)' ||
484
- this.mode === 'backend-frontend(websql)' ||
485
- this.mode === 'backend-frontend(ipc-electron)');
486
- }
487
- async getRecrusiveClassesfromContextsObj(classType) {
488
- const arr = await this.getRecrusiveClassesfromContexts(classType);
489
- return arr.reduce((acc, c) => {
490
- acc[ClassHelpers.getName(c)] = c;
491
- return acc;
492
- }, {});
493
- }
494
- async getRecrusiveClassesfromContexts(classType, arr = []) {
495
- const contexts = Object.values(this.config.contexts || {});
496
- for (const ctx of contexts) {
497
- const ref = await ctx.__ref();
498
- const classesInput = ref.getClassFunBy(classType);
499
- const clonedClasses = Object.values(this.cloneClassesObjWithNewMetadata({
500
- classesInput,
501
- config: this.config,
502
- ctx: this,
503
- classType,
504
- }));
505
- clonedClasses.forEach(c => arr.push(c));
506
- await ref.getRecrusiveClassesfromContexts(classType, arr);
507
- }
508
- return arr;
509
- }
510
- getClassInstanceObjBy(classType) {
511
- return this.classInstancesByNameObj[classType];
512
- }
513
- getClassesInstancesArrBy(classType) {
514
- return this.objWithClassesInstancesArr[classType];
515
- }
516
- inject(ctor, options) {
517
- if (!options) {
518
- options = {};
519
- }
520
- const className = ClassHelpers.getName(ctor);
521
- const locaInstanceConstructorArgs = options.locaInstanceConstructorArgs || [];
522
- if (this.isCLassType(Models.ClassType.REPOSITORY, ctor)) {
523
- options.localInstance = true;
524
- }
525
- if (options?.localInstance) {
526
- const ctxClassFn = this.getClassFunByClassName(className);
527
- let entityName = '';
528
- if (className === 'BaseRepository') {
529
- const entityFn = locaInstanceConstructorArgs[0];
530
- const entity = entityFn && entityFn();
531
- entityName = entity && ClassHelpers.getName(entity);
532
- }
533
- if (!options.contextClassInstance[this.localInstaceObjSymbol]) {
534
- options.contextClassInstance[this.localInstaceObjSymbol] = {};
535
- }
536
- const instanceKey = className + (entityName ? `.${entityName}` : '');
537
- const existed = options.contextClassInstance[this.localInstaceObjSymbol][instanceKey];
538
- if (existed) {
539
- return existed;
540
- }
541
- if (!ctxClassFn) {
542
- throw new Error(`Not able to inject "${className}" inside context "${this.contextName}"
543
-
544
- Make sure they share the same context or import context where "${className}" is defined.
545
-
546
- `);
547
- }
548
- const injectedInstance = new ctxClassFn(...locaInstanceConstructorArgs);
549
- options.contextClassInstance[this.localInstaceObjSymbol][instanceKey] =
550
- injectedInstance;
551
- return injectedInstance;
552
- }
553
- const contextScopeInstance = this.allClassesInstances[className];
554
- return contextScopeInstance;
555
- }
556
- /**
557
- * alias for inject
558
- */
559
- getInstanceBy(ctor) {
560
- return this.inject(ctor, { localInstance: false });
561
- }
562
- checkIfContextInitialized() {
563
- if (_.isUndefined(this.config)) {
564
- throw new Error(`Please check if your context has been initialized.
565
-
566
-
567
- await Context.initialize();
568
-
569
-
570
-
571
- `);
572
- }
573
- }
574
- getClassFunBy(classType) {
575
- this.checkIfContextInitialized();
576
- switch (classType) {
577
- case Models.ClassType.CONTROLLER:
578
- return this.config.controllers;
579
- case Models.ClassType.ENTITY:
580
- return this.config.entities;
581
- case Models.ClassType.PROVIDER:
582
- return this.config.providers;
583
- case Models.ClassType.REPOSITORY:
584
- return this.config.repositories;
585
- case Models.ClassType.SUBSCRIBER:
586
- return this.config.subscribers;
587
- case Models.ClassType.MIGRATION:
588
- return this.config.migrations;
589
- }
590
- }
591
- isCLassType(classType, classFn) {
592
- return !!this.getClassFunBy(classType)[ClassHelpers.getName(classFn)];
593
- }
594
- /**
595
- * Only for injectable types
596
- * Only for classType: CONTROLLER, REPOSITORY, PROVIDER
597
- */
598
- getClassFunByClassName(className) {
599
- for (const classTypeName of this.allTypesfromContexts) {
600
- const classesForInjectableType = this.config[Models.ClassTypeKey[classTypeName]];
601
- if (classesForInjectableType[className]) {
602
- return classesForInjectableType[className];
603
- }
604
- }
605
- }
606
- getClassFunByClass(classFunction) {
607
- const className = ClassHelpers.getName(classFunction);
608
- return this.getClassFunByClassName(className);
609
- }
610
- getClassFunByArr(classType) {
611
- return Object.values(this.getClassFunBy(classType) || {});
612
- }
613
- async createInstances(classes, classType) {
614
- for (const classFn of [
615
- ...Object.values(classes),
616
- ]) {
617
- const instance = DITaonContainer.resolve(classFn);
618
- const classInstancesByNameObj = this.classInstancesByNameObj[classType];
619
- const className = ClassHelpers.getName(classFn);
620
- classInstancesByNameObj[className] = instance;
621
- this.config[Models.ClassTypeKey[classType]][className] = classFn;
622
- this.objWithClassesInstancesArr[classType].push(instance);
623
- this.allClassesInstances[className] = instance;
624
- }
625
- }
626
- async reinitControllers() {
627
- if (this.remoteHost || Object.keys(this.config.migrations).length > 0) {
628
- return;
629
- }
630
- const controllers = this.getClassesInstancesArrBy(Models.ClassType.CONTROLLER);
631
- for (const ctrl of controllers) {
632
- if (_.isFunction(ctrl.initExampleDbData)) {
633
- await Helpers.runSyncOrAsync({
634
- functionFn: ctrl.initExampleDbData,
635
- context: ctrl,
636
- });
637
- }
638
- }
639
- }
640
- async initClasses() {
641
- if (this.remoteHost) {
642
- return;
643
- }
644
- for (const classTypeName of [
645
- Models.ClassType.PROVIDER,
646
- Models.ClassType.REPOSITORY,
647
- Models.ClassType.CONTROLLER,
648
- Models.ClassType.ENTITY,
649
- Models.ClassType.MIGRATION,
650
- ]) {
651
- for (const classFun of this.getClassFunByArr(classTypeName)) {
652
- if (_.isFunction(classFun._)) {
653
- await Helpers.runSyncOrAsync({
654
- functionFn: classFun._,
655
- context: classFun,
656
- });
657
- }
658
- }
659
- }
660
- for (const classTypeName of [
661
- Models.ClassType.PROVIDER,
662
- Models.ClassType.REPOSITORY,
663
- Models.ClassType.CONTROLLER,
664
- Models.ClassType.MIGRATION,
665
- ]) {
666
- for (const ctrl of this.getClassesInstancesArrBy(classTypeName)) {
667
- if (_.isFunction(ctrl._)) {
668
- await Helpers.runSyncOrAsync({
669
- functionFn: ctrl._,
670
- context: ctrl,
671
- });
672
- }
673
- }
674
- }
675
- }
676
- isActiveOn(classInstance) {
677
- let contextRef = classInstance[Symbols.ctxInClassOrClassObj];
678
- return this === contextRef;
679
- }
680
- get uri() {
681
- const url = this.host
682
- ? new URL(this.host)
683
- : this.remoteHost
684
- ? new URL(this.remoteHost)
685
- : void 0;
686
- return url;
687
- }
688
- get isHttpServer() {
689
- return this.uri.protocol === 'https:';
690
- }
691
- /**
692
- * ipc/udp needs this
693
- */
694
- get contextName() {
695
- return this.config.contextName;
696
- }
697
- get publicAssets() {
698
- return this.config?.publicAssets || [];
699
- }
700
- get isProductionMode() {
701
- return this.config.productionMode;
702
- }
703
- get remoteHost() {
704
- return this.config.remoteHost;
705
- }
706
- get host() {
707
- return this.config.host;
708
- }
709
- get orgin() {
710
- return this.uri?.origin;
711
- }
712
- async initSubscribers() {
713
- /* */
714
- /* */
715
- /* */
716
- /* */
717
- /* */
718
- /* */
719
- /* */
720
- /* */
721
- /* */
722
- /* */
723
- /* */
724
- /* */
725
- /* */
726
- /* */
727
- /* */
728
- /* */
729
- return (void 0);
730
- }
731
- async initEntities() {
732
- /* */
733
- /* */
734
- /* */
735
- /* */
736
- /* */
737
- /* */
738
- /* */
739
- /* */
740
- /* */
741
- /* */
742
- /* */
743
- /* */
744
- /* */
745
- /* */
746
- /* */
747
- /* */
748
- /* */
749
- /* */
750
- /* */
751
- /* */
752
- /* */
753
- /* */
754
- /* */
755
- /* */
756
- /* */
757
- /* */
758
- /* */
759
- /* */
760
- /* */
761
- }
762
- async initDatabaseConnection() {
763
- /* */
764
- /* */
765
- /* */
766
- /* */
767
- /* */
768
- /* */
769
- /* */
770
- /* */
771
- /* */
772
- /* */
773
- /* */
774
- /* */
775
- /* */
776
- /* */
777
- /* */
778
- /* */
779
- /* */
780
- /* */
781
- /* */
782
- /* */
783
- /* */
784
- /* */
785
- /* */
786
- /* */
787
- /* */
788
- /* */
789
- /* */
790
- /* */
791
- /* */
792
- /* */
793
- /* */
794
- /* */
795
- /* */
796
- /* */
797
- /* */
798
- /* */
799
- /* */
800
- /* */
801
- /* */
802
- /* */
803
- /* */
804
- /* */
805
- /* */
806
- /* */
807
- /* */
808
- /* */
809
- /* */
810
- /* */
811
- /* */
812
- /* */
813
- /* */
814
- /* */
815
- /* */
816
- /* */
817
- /* */
818
- /* */
819
- /* */
820
- /* */
821
- /* */
822
- /* */
823
- /* */
824
- /* */
825
- /* */
826
- /* */
827
- /* */
828
- /* */
829
- /* */
830
- /* */
831
- /* */
832
- /* */
833
- /* */
834
- /* */
835
- /* */
836
- /* */
837
- /* */
838
- /* */
839
- /* */
840
- /* */
841
- /* */
842
- /* */
843
- /* */
844
- /* */
845
- /* */
846
- /* */
847
- /* */
848
- /* */
849
- /* */
850
- /* */
851
- /* */
852
- /* */
853
- /* */
854
- /* */
855
- /* */
856
- /* */
857
- /* */
858
- return (void 0);
859
- }
860
- initControllers() {
861
- if (this.isRunOrRevertOnlyMigrationAppStart) {
862
- return;
863
- }
864
- const allControllers = this.getClassFunByArr(Models.ClassType.CONTROLLER);
865
- for (const controllerClassFn of allControllers) {
866
- controllerClassFn[Symbols.classMethodsNames] =
867
- ClassHelpers.getMethodsNames(controllerClassFn);
868
- const configs = ClassHelpers.getControllerConfigs(controllerClassFn);
869
- const classConfig = configs[0];
870
- const parentscalculatedPath = _.slice(configs, 1)
871
- .reverse()
872
- .map(bc => {
873
- if (TaonHelpers.isGoodPath(bc.path)) {
874
- return bc.path;
875
- }
876
- return bc.className;
877
- })
878
- .join('/');
879
- if (TaonHelpers.isGoodPath(classConfig.path)) {
880
- classConfig.calculatedPath = classConfig.path;
881
- }
882
- else {
883
- classConfig.calculatedPath =
884
- `${parentscalculatedPath}/${ClassHelpers.getName(controllerClassFn)}`
885
- .replace(/\/\//g, '/')
886
- .split('/')
887
- .reduce((acc, bc) => {
888
- return _.last(acc) === bc ? acc : [...acc, bc];
889
- }, [])
890
- .join('/');
891
- }
892
- _.slice(configs, 1).forEach(bc => {
893
- const alreadyIs = classConfig.methods;
894
- const toMerge = _.cloneDeep(bc.methods);
895
- for (const key in toMerge) {
896
- if (toMerge.hasOwnProperty(key) && !alreadyIs[key]) {
897
- const element = toMerge[key];
898
- alreadyIs[key] = element;
899
- }
900
- }
901
- });
902
- /* */
903
- /* */
904
- this.logHttp &&
905
- console.groupCollapsed(`[taon][express-server] routes [${classConfig.className}]`);
906
- /* */
907
- /* */
908
- Object.keys(classConfig.methods).forEach(methodName => {
909
- const methodConfig = classConfig.methods[methodName];
910
- const type = methodConfig.type;
911
- const expressPath = methodConfig.global
912
- ? `/${methodConfig.path?.replace(/\//, '')}`
913
- : TaonHelpers.getExpressPath(classConfig, methodConfig);
914
- if (Helpers.isNode || Helpers.isWebSQL) {
915
- /* */
916
- /* */
917
- /* */
918
- /* */
919
- /* */
920
- /* */
921
- /* */
922
- /* */
923
- /* */
924
- /* */
925
- /* */
926
- /* */
927
- /* */
928
- /* */
929
- }
930
- const shouldInitClient = Helpers.isBrowser || this.remoteHost || Helpers.isWebSQL;
931
- if (shouldInitClient) {
932
- this.initClient(controllerClassFn, type, methodConfig, expressPath);
933
- }
934
- });
935
- /* */
936
- /* */
937
- this.logHttp && console.groupEnd();
938
- /* */
939
- /* */
940
- }
941
- }
942
- writeActiveRoutes() {
943
- if (this.remoteHost ||
944
- this.isRunOrRevertOnlyMigrationAppStart ||
945
- this.skipWritingServerRoutes) {
946
- return;
947
- }
948
- const contexts = [this];
949
- /* */
950
- /* */
951
- /* */
952
- /* */
953
- /* */
954
- /* */
955
- /* */
956
- /* */
957
- /* */
958
- /* */
959
- /* */
960
- /* */
961
- /* */
962
- /* */
963
- /* */
964
- /* */
965
- /* */
966
- /* */
967
- /* */
968
- /* */
969
- /* */
970
- /* */
971
- /* */
972
- /* */
973
- /* */
974
- /* */
975
- /* */
976
- /* */
977
- /* */
978
- /* */
979
- /* */
980
- /* */
981
- /* */
982
- /* */
983
- }
984
- get middlewares() {
985
- /* */
986
- /* */
987
- return (void 0);
988
- }
989
- initMiddlewares() {
990
- /* */
991
- /* */
992
- /* */
993
- /* */
994
- /* */
995
- /* */
996
- /* */
997
- /* */
998
- /* */
999
- /* */
1000
- /* */
1001
- /* */
1002
- /* */
1003
- /* */
1004
- /* */
1005
- /* */
1006
- /* */
1007
- /* */
1008
- /* */
1009
- /* */
1010
- /* */
1011
- /* */
1012
- /* */
1013
- /* */
1014
- /* */
1015
- /* */
1016
- /* */
1017
- /* */
1018
- /* */
1019
- /* */
1020
- /* */
1021
- /* */
1022
- /* */
1023
- /* */
1024
- /* */
1025
- /* */
1026
- /* */
1027
- /* */
1028
- /* */
1029
- /* */
1030
- /* */
1031
- /* */
1032
- /* */
1033
- /* */
1034
- /* */
1035
- /* */
1036
- /* */
1037
- /* */
1038
- /* */
1039
- /* */
1040
- /* */
1041
- /* */
1042
- /* */
1043
- /* */
1044
- /* */
1045
- /* */
1046
- /* */
1047
- /* */
1048
- /* */
1049
- /* */
1050
- /* */
1051
- /* */
1052
- /* */
1053
- /* */
1054
- /* */
1055
- /* */
1056
- /* */
1057
- /* */
1058
- /* */
1059
- /* */
1060
- /* */
1061
- /* */
1062
- /* */
1063
- /* */
1064
- /* */
1065
- /* */
1066
- /* */
1067
- /* */
1068
- /* */
1069
- /* */
1070
- /* */
1071
- /* */
1072
- /* */
1073
- /* */
1074
- /* */
1075
- /* */
1076
- /* */
1077
- /* */
1078
- /* */
1079
- /* */
1080
- /* */
1081
- /* */
1082
- /* */
1083
- /* */
1084
- /* */
1085
- /* */
1086
- /* */
1087
- /* */
1088
- /* */
1089
- /* */
1090
- /* */
1091
- /* */
1092
- }
1093
- initServer(type, methodConfig, classConfig, expressPath, target) {
1094
- /* */
1095
- /* */
1096
- /* */
1097
- /* */
1098
- /* */
1099
- /* */
1100
- /* */
1101
- /* */
1102
- const url = this.uri;
1103
- const getResult = async (resolvedParams, req, res) => {
1104
- const response = methodConfig.descriptor.value.apply(
1105
- /**
1106
- * Context for method @GET,@PUT etc.
1107
- */
1108
- this.getInstanceBy(target),
1109
- /**
1110
- * Params for metjod @GET, @PUT etc.
1111
- */
1112
- resolvedParams);
1113
- let result = await getResponseValue(response, { req, res });
1114
- return result;
1115
- };
1116
- url.pathname = url.pathname.replace(/\/$/, '');
1117
- expressPath = url.pathname.startsWith('/')
1118
- ? `${url.pathname}${expressPath}`
1119
- : expressPath;
1120
- expressPath = expressPath.replace(/\/\//g, '/');
1121
- if (Helpers.isElectron) {
1122
- /* */
1123
- /* */
1124
- /* */
1125
- /* */
1126
- /* */
1127
- /* */
1128
- /* */
1129
- /* */
1130
- /* */
1131
- /* */
1132
- /* */
1133
- /* */
1134
- /* */
1135
- /* */
1136
- /* */
1137
- /* */
1138
- /* */
1139
- /* */
1140
- /* */
1141
- /* */
1142
- /* */
1143
- }
1144
- if (!this.remoteHost) {
1145
- /* */
1146
- /* */
1147
- /* */
1148
- /* */
1149
- /* */
1150
- /* */
1151
- /* */
1152
- /* */
1153
- /* */
1154
- /* */
1155
- /* */
1156
- /* */
1157
- /* */
1158
- /* */
1159
- /* */
1160
- /* */
1161
- /* */
1162
- /* */
1163
- /* */
1164
- /* */
1165
- /* */
1166
- /* */
1167
- /* */
1168
- /* */
1169
- /* */
1170
- /* */
1171
- /* */
1172
- /* */
1173
- /* */
1174
- /* */
1175
- /* */
1176
- /* */
1177
- /* */
1178
- /* */
1179
- /* */
1180
- /* */
1181
- /* */
1182
- /* */
1183
- /* */
1184
- /* */
1185
- /* */
1186
- /* */
1187
- /* */
1188
- /* */
1189
- /* */
1190
- /* */
1191
- /* */
1192
- /* */
1193
- /* */
1194
- /* */
1195
- /* */
1196
- /* */
1197
- /* */
1198
- /* */
1199
- /* */
1200
- /* */
1201
- /* */
1202
- /* */
1203
- /* */
1204
- /* */
1205
- /* */
1206
- /* */
1207
- /* */
1208
- /* */
1209
- /* */
1210
- /* */
1211
- /* */
1212
- /* */
1213
- /* */
1214
- /* */
1215
- /* */
1216
- /* */
1217
- /* */
1218
- /* */
1219
- /* */
1220
- /* */
1221
- /* */
1222
- /* */
1223
- /* */
1224
- /* */
1225
- /* */
1226
- /* */
1227
- /* */
1228
- /* */
1229
- /* */
1230
- /* */
1231
- /* */
1232
- /* */
1233
- /* */
1234
- /* */
1235
- /* */
1236
- /* */
1237
- /* */
1238
- /* */
1239
- /* */
1240
- /* */
1241
- /* */
1242
- /* */
1243
- /* */
1244
- /* */
1245
- /* */
1246
- /* */
1247
- /* */
1248
- /* */
1249
- /* */
1250
- /* */
1251
- /* */
1252
- /* */
1253
- /* */
1254
- /* */
1255
- /* */
1256
- /* */
1257
- /* */
1258
- /* */
1259
- /* */
1260
- /* */
1261
- /* */
1262
- /* */
1263
- /* */
1264
- /* */
1265
- /* */
1266
- /* */
1267
- /* */
1268
- /* */
1269
- /* */
1270
- /* */
1271
- /* */
1272
- /* */
1273
- /* */
1274
- /* */
1275
- /* */
1276
- /* */
1277
- /* */
1278
- /* */
1279
- /* */
1280
- /* */
1281
- /* */
1282
- /* */
1283
- /* */
1284
- /* */
1285
- /* */
1286
- /* */
1287
- /* */
1288
- /* */
1289
- /* */
1290
- /* */
1291
- /* */
1292
- /* */
1293
- /* */
1294
- /* */
1295
- /* */
1296
- /* */
1297
- /* */
1298
- /* */
1299
- /* */
1300
- /* */
1301
- /* */
1302
- /* */
1303
- /* */
1304
- /* */
1305
- /* */
1306
- /* */
1307
- /* */
1308
- /* */
1309
- /* */
1310
- /* */
1311
- /* */
1312
- /* */
1313
- /* */
1314
- /* */
1315
- /* */
1316
- /* */
1317
- /* */
1318
- /* */
1319
- /* */
1320
- /* */
1321
- /* */
1322
- /* */
1323
- /* */
1324
- /* */
1325
- /* */
1326
- /* */
1327
- /* */
1328
- /* */
1329
- /* */
1330
- /* */
1331
- /* */
1332
- /* */
1333
- /* */
1334
- /* */
1335
- /* */
1336
- /* */
1337
- /* */
1338
- /* */
1339
- /* */
1340
- /* */
1341
- /* */
1342
- /* */
1343
- /* */
1344
- /* */
1345
- /* */
1346
- /* */
1347
- /* */
1348
- /* */
1349
- /* */
1350
- /* */
1351
- /* */
1352
- /* */
1353
- /* */
1354
- /* */
1355
- /* */
1356
- /* */
1357
- /* */
1358
- /* */
1359
- /* */
1360
- /* */
1361
- /* */
1362
- /* */
1363
- /* */
1364
- /* */
1365
- }
1366
- return {
1367
- routePath: expressPath,
1368
- method: methodConfig.type,
1369
- };
1370
- }
1371
- /**
1372
- * client can be browser or nodejs (when remote host)
1373
- */
1374
- initClient(target, type, methodConfig, expressPath) {
1375
- const ctx = this;
1376
- this.logHttp && console.log(`${type?.toUpperCase()} ${expressPath} `);
1377
- let storage;
1378
- if (Helpers.isBrowser) {
1379
- storage = window;
1380
- }
1381
- /* */
1382
- /* */
1383
- /* */
1384
- /* */
1385
- const orgMethods = target.prototype[methodConfig.methodName];
1386
- if (Helpers.isElectron) {
1387
- target.prototype[methodConfig.methodName] = function (...args) {
1388
- const received = new Promise(async (resolve, reject) => {
1389
- const headers = {};
1390
- const { request, response } = TaonHelpers.websqlMocks(headers);
1391
- Helpers.ipcRenderer.once(TaonHelpers.ipcKeyNameResponse(target, methodConfig, expressPath), (event, responseData) => {
1392
- let res = responseData;
1393
- console.log({ responseData });
1394
- try {
1395
- const body = res;
1396
- res = new ModelsNg2Rest.HttpResponse({
1397
- body: void 0,
1398
- isArray: void 0,
1399
- method: methodConfig.type,
1400
- url: `${ctx.uri.origin}${'' // TODO express path
1401
- }${methodConfig.path} `,
1402
- }, Helpers.isBlob(body) || _.isString(body)
1403
- ? body
1404
- : JSON.stringify(body), RestHeaders.from(headers), void 0, () => body);
1405
- resolve(res);
1406
- }
1407
- catch (error) {
1408
- console.error(error);
1409
- reject(error);
1410
- }
1411
- });
1412
- Helpers.ipcRenderer.send(TaonHelpers.ipcKeyNameRequest(target, methodConfig, expressPath), args);
1413
- });
1414
- received['observable'] = from(received);
1415
- return {
1416
- received,
1417
- };
1418
- };
1419
- return;
1420
- }
1421
- /* */
1422
- /* */
1423
- /* */
1424
- /* */
1425
- /* */
1426
- /* */
1427
- /* */
1428
- /* */
1429
- /* */
1430
- /* */
1431
- /* */
1432
- /* */
1433
- /* */
1434
- /* */
1435
- /* */
1436
- /* */
1437
- /* */
1438
- /* */
1439
- /* */
1440
- /* */
1441
- /* */
1442
- /* */
1443
- /* */
1444
- /* */
1445
- /* */
1446
- /* */
1447
- /* */
1448
- /* */
1449
- /* */
1450
- /* */
1451
- /* */
1452
- /* */
1453
- /* */
1454
- /* */
1455
- /* */
1456
- /* */
1457
- /* */
1458
- /* */
1459
- /* */
1460
- /* */
1461
- /* */
1462
- /* */
1463
- /* */
1464
- /* */
1465
- /* */
1466
- /* */
1467
- /* */
1468
- /* */
1469
- /* */
1470
- /* */
1471
- /* */
1472
- /* */
1473
- /* */
1474
- /* */
1475
- /* */
1476
- /* */
1477
- /* */
1478
- /* */
1479
- /* */
1480
- /* */
1481
- /* */
1482
- /* */
1483
- /* */
1484
- /* */
1485
- /* */
1486
- /* */
1487
- /* */
1488
- /* */
1489
- /* */
1490
- /* */
1491
- /* */
1492
- /* */
1493
- /* */
1494
- /* */
1495
- /* */
1496
- /* */
1497
- /* */
1498
- /* */
1499
- /* */
1500
- /* */
1501
- /* */
1502
- /* */
1503
- /* */
1504
- /* */
1505
- /* */
1506
- /* */
1507
- /* */
1508
- /* */
1509
- /* */
1510
- /* */
1511
- /* */
1512
- /* */
1513
- /* */
1514
- /* */
1515
- /* */
1516
- /* */
1517
- /* */
1518
- /* */
1519
- /* */
1520
- /* */
1521
- /* */
1522
- /* */
1523
- /* */
1524
- /* */
1525
- /* */
1526
- /* */
1527
- /* */
1528
- /* */
1529
- /* */
1530
- /* */
1531
- /* */
1532
- /* */
1533
- /* */
1534
- /* */
1535
- /* */
1536
- /* */
1537
- /* */
1538
- /* */
1539
- /* */
1540
- /* */
1541
- /* */
1542
- /* */
1543
- /* */
1544
- /* */
1545
- /* */
1546
- /* */
1547
- /* */
1548
- /* */
1549
- /* */
1550
- /* */
1551
- /* */
1552
- /* */
1553
- /* */
1554
- /* */
1555
- /* */
1556
- /* */
1557
- /* */
1558
- /* */
1559
- /* */
1560
- /* */
1561
- /* */
1562
- /* */
1563
- target.prototype[methodConfig.methodName] = function (...args) {
1564
- if (!storage[Symbols.old.ENDPOINT_META_CONFIG])
1565
- storage[Symbols.old.ENDPOINT_META_CONFIG] = {};
1566
- if (!storage[Symbols.old.ENDPOINT_META_CONFIG][ctx.uri.href])
1567
- storage[Symbols.old.ENDPOINT_META_CONFIG][ctx.uri.href] = {};
1568
- const endpoints = storage[Symbols.old.ENDPOINT_META_CONFIG];
1569
- let rest;
1570
- if (!endpoints[ctx.uri.href][expressPath]) {
1571
- let headers = {};
1572
- if (methodConfig.contentType && !methodConfig.responseType) {
1573
- rest = Resource.create(ctx.uri.href, expressPath, Symbols.old.MAPPING_CONFIG_HEADER, Symbols.old.CIRCURAL_OBJECTS_MAP_BODY, RestHeaders.from({
1574
- 'Content-Type': methodConfig.contentType,
1575
- Accept: methodConfig.contentType,
1576
- }));
1577
- }
1578
- else if (methodConfig.contentType && methodConfig.responseType) {
1579
- rest = Resource.create(ctx.uri.href, expressPath, Symbols.old.MAPPING_CONFIG_HEADER, Symbols.old.CIRCURAL_OBJECTS_MAP_BODY, RestHeaders.from({
1580
- 'Content-Type': methodConfig.contentType,
1581
- Accept: methodConfig.contentType,
1582
- responsetypeaxios: methodConfig.responseType,
1583
- }));
1584
- }
1585
- else if (!methodConfig.contentType && methodConfig.responseType) {
1586
- rest = Resource.create(ctx.uri.href, expressPath, Symbols.old.MAPPING_CONFIG_HEADER, Symbols.old.CIRCURAL_OBJECTS_MAP_BODY, RestHeaders.from({
1587
- responsetypeaxios: methodConfig.responseType,
1588
- }));
1589
- }
1590
- else {
1591
- rest = Resource.create(ctx.uri.href, expressPath, Symbols.old.MAPPING_CONFIG_HEADER, Symbols.old.CIRCURAL_OBJECTS_MAP_BODY);
1592
- }
1593
- endpoints[ctx.uri.href][expressPath] = rest;
1594
- }
1595
- else {
1596
- rest = endpoints[ctx.uri.href][expressPath];
1597
- }
1598
- const method = type.toLowerCase();
1599
- const isWithBody = method === 'put' || method === 'post';
1600
- const pathPrams = {};
1601
- let queryParams = {};
1602
- let bodyObject = {};
1603
- args.forEach((param, i) => {
1604
- let currentParam = void 0;
1605
- for (let pp in methodConfig.parameters) {
1606
- let v = methodConfig.parameters[pp];
1607
- if (v.index === i) {
1608
- currentParam = v;
1609
- break;
1610
- }
1611
- }
1612
- if (currentParam.paramType === 'Path') {
1613
- pathPrams[currentParam.paramName] = param;
1614
- }
1615
- if (currentParam.paramType === 'Query') {
1616
- if (currentParam.paramName) {
1617
- const mapping = Mapping.decode(param, !ctx.isProductionMode);
1618
- if (mapping) {
1619
- rest.headers.set(`${Symbols.old.MAPPING_CONFIG_HEADER_QUERY_PARAMS}${currentParam.paramName} `, JSON.stringify(mapping));
1620
- }
1621
- queryParams[currentParam.paramName] = param;
1622
- }
1623
- else {
1624
- const mapping = Mapping.decode(param, !ctx.isProductionMode);
1625
- if (mapping) {
1626
- rest.headers.set(Symbols.old.MAPPING_CONFIG_HEADER_QUERY_PARAMS, JSON.stringify(mapping));
1627
- }
1628
- queryParams = _.cloneDeep(param);
1629
- }
1630
- }
1631
- if (currentParam.paramType === 'Header') {
1632
- if (currentParam.paramName) {
1633
- if (currentParam.paramName === Symbols.old.MDC_KEY) {
1634
- rest.headers.set(currentParam.paramName, encodeURIComponent(JSON.stringify(param)));
1635
- }
1636
- else {
1637
- rest.headers.set(currentParam.paramName, param);
1638
- }
1639
- }
1640
- else {
1641
- for (let header in param) {
1642
- rest.headers.set(header, param[header]);
1643
- }
1644
- }
1645
- }
1646
- if (currentParam.paramType === 'Cookie') {
1647
- Resource.Cookies.write(currentParam.paramName, param, currentParam.expireInSeconds);
1648
- }
1649
- if (currentParam.paramType === 'Body') {
1650
- if (currentParam.paramName) {
1651
- if (ClassHelpers.getName(bodyObject) === 'FormData') {
1652
- throw new Error(`[taon - framework] Don use param names when posting / putting FormData.
1653
- Use this:
1654
-
1655
- (@Taon.Http.Param.Body() formData: FormData) ...
1656
-
1657
-
1658
- instead
1659
-
1660
- (@Taon.Http.Param.Body('${currentParam.paramName}') formData: FormData) ...
1661
-
1662
- `);
1663
- }
1664
- const mapping = Mapping.decode(param, !ctx.isProductionMode);
1665
- if (mapping) {
1666
- rest.headers.set(`${Symbols.old.MAPPING_CONFIG_HEADER_BODY_PARAMS}${currentParam.paramName} `, JSON.stringify(mapping));
1667
- }
1668
- bodyObject[currentParam.paramName] = param;
1669
- }
1670
- else {
1671
- const mapping = Mapping.decode(param, !ctx.isProductionMode);
1672
- if (mapping) {
1673
- rest.headers.set(Symbols.old.MAPPING_CONFIG_HEADER_BODY_PARAMS, JSON.stringify(mapping));
1674
- }
1675
- bodyObject = param;
1676
- }
1677
- }
1678
- });
1679
- if (typeof bodyObject === 'object' &&
1680
- ClassHelpers.getName(bodyObject) !== 'FormData') {
1681
- let circuralFromItem = [];
1682
- bodyObject = JSON10.parse(JSON10.stringify(bodyObject, void 0, void 0, circs => {
1683
- circuralFromItem = circs;
1684
- }));
1685
- rest.headers.set(Symbols.old.CIRCURAL_OBJECTS_MAP_BODY, JSON10.stringify(circuralFromItem));
1686
- }
1687
- if (typeof queryParams === 'object') {
1688
- let circuralFromQueryParams = [];
1689
- queryParams = JSON10.parse(JSON10.stringify(queryParams, void 0, void 0, circs => {
1690
- circuralFromQueryParams = circs;
1691
- }));
1692
- rest.headers.set(Symbols.old.CIRCURAL_OBJECTS_MAP_QUERY_PARAM, JSON10.stringify(circuralFromQueryParams));
1693
- }
1694
- const httpResultObj = {
1695
- received: isWithBody
1696
- ? rest.model(pathPrams)[method](bodyObject, [queryParams])
1697
- : rest.model(pathPrams)[method]([queryParams]),
1698
- };
1699
- return httpResultObj;
1700
- };
1701
- }
1702
- }
1703
- ;
1704
- ({}); // @--end-of-file-for-module=taon lib/endpoint-context.ts
1705
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1kaXN0L3Rhb24vcHJvamVjdHMvdGFvbi9zcmMvbGliL2VuZHBvaW50LWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsK0NBQStDO0FBaUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUksT0FBTyxFQUFJLE1BQU0sSUFBSSxhQUFhLEVBQUksUUFBUSxFQUFJLFdBQVcsR0FBRyxNQUFNLGtCQUFrQixDQUFDLENBQUEsS0FBSztBQUN6RyxLQUFLO0FBQ0wsS0FBSztBQUNMLEtBQUs7QUFDTCxLQUFLO0FBRUwsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxJQUFJLEVBQVcsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBUzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzlELE1BQU0sT0FBTyxlQUFlO0lBTTFCLE1B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O1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBSUQsSUFBSSxNQUFNO1FBRVIsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBRTlCLE9BQU87SUFDVCxDQUFDO0lBSUQsV0FBVztRQUNiLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBSUQsYUFBYSxDQUFDLEdBQUc7UUFDbkIsS0FBSztRQUNMLEtBQUs7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O0lBQ2hDLENBQUM7SUFJRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFJRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFJRCxLQUFLLENBQUMsZUFBZTtRQUN2QixLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUlELEtBQUssQ0FBQyxZQUFZO1FBQ3BCLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO0lBRUgsQ0FBQztJQUtELEtBQUssQ0FBQyxzQkFBc0I7UUFDOUIsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBS0QsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7WUFDNUMsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxJ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LENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztJQUVILENBQUM7SUFJRCxJQUFXLFdBQVc7UUFDeEIsS0FBSztRQUNMLEtBQUs7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBSU8sZUFBZTtRQUN6QixLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0ws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Q0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lB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TCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFD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LEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ3BELHVCQUF1QixHQUFHLEtBQUssQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztnQkFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxFQUM1QyxNQUFNLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQzFDLENBQUM7WUFDSixDQUFDO1lBR0QsTUFBTSxhQUFhLEdBQUc7Z0JBQ3BCLFFBQVEsRUFBRSxVQUFVO29CQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNqRCxDQUFDO1lBQ0YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQyxDQUFDO0lBRUosQ0FBQztDQUVGO0FBRUEsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx5REFBeUQiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVkZWYgKi9cblxuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG5cbmltcG9ydCB7IFRhb25BZG1pblNlcnZpY2UgfSBmcm9tICcuL3VpL3Rhb24tYWRtaW4tbW9kZS1jb25maWd1cmF0aW9uL3Rhb24tYWRtaW4uc2VydmljZSc7XG5cbmltcG9ydCB7IFV0aWxzT3MsIFV0aWxzIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5pbXBvcnQgeyBjcm9zc1BsYXRmb3JtUGF0aCB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ2xhc3NIZWxwZXJzIH0gZnJvbSAnLi9oZWxwZXJzL2NsYXNzLWhlbHBlcnMnO1xuaW1wb3J0IHsgU3ltYm9scyB9IGZyb20gJy4vc3ltYm9scyc7XG5pbXBvcnQgeyBfLCBIZWxwZXJzIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5pbXBvcnQgdHlwZSB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL2NyZWF0ZS1jb250ZXh0JztcbmltcG9ydCB7IERJVGFvbkNvbnRhaW5lciB9IGZyb20gJy4vZGVwZW5kZW5jeS1pbmplY3Rpb24vZGktY29udGFpbmVyJztcbmltcG9ydCB7IFRhb25Db250cm9sbGVyT3B0aW9ucyB9IGZyb20gJy4vZGVjb3JhdG9ycy9jbGFzc2VzL2NvbnRyb2xsZXItZGVjb3JhdG9yJztcbmltcG9ydCB7IFRhb25IZWxwZXJzIH0gZnJvbSAnLi9oZWxwZXJzL3Rhb24taGVscGVycyc7XG5pbXBvcnQgeyAgIE1hcHBpbmcsICAgTW9kZWxzIGFzIE1vZGVsc05nMlJlc3QsICAgUmVzb3VyY2UsICAgUmVzdEhlYWRlcnMsIH0gZnJvbSAnbmcyLXJlc3QvYnJvd3Nlcic7LyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG5cbmltcG9ydCB7IEpTT04xMCB9IGZyb20gJ2pzb24xMC9icm93c2VyJztcbmltcG9ydCB7IHBhdGggfSBmcm9tICd0bnAtY29yZS9icm93c2VyJztcbmltcG9ydCB7IGZyb20sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVudGl0eVByb2Nlc3MgfSBmcm9tICcuL2VudGl0eS1wcm9jZXNzJztcbmltcG9ydCB7IGdldFJlc3BvbnNlVmFsdWUgfSBmcm9tICcuL2dldC1yZXNwb25zZS12YWx1ZSc7XG5pbXBvcnQgdHlwZSB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHR5cGUgeyBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ICAgRGF0YVNvdXJjZSwgICBEYXRhU291cmNlT3B0aW9ucywgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCB9IGZyb20gJ3Rhb24tdHlwZW9ybS9icm93c2VyJzsvKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuXG5pbXBvcnQgeyBUYW9uRW50aXR5T3B0aW9ucyB9IGZyb20gJy4vZGVjb3JhdG9ycy9jbGFzc2VzL2VudGl0eS1kZWNvcmF0b3InO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXIgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IEVOViB9IGZyb20gJy4vZW52JztcbmltcG9ydCB0eXBlIHsgQmFzZUNsYXNzIH0gZnJvbSAnLi9iYXNlLWNsYXNzZXMvYmFzZS1jbGFzcyc7XG5pbXBvcnQgeyBSZWFsdGltZUNvcmUgfSBmcm9tICcuL3JlYWx0aW1lL3JlYWx0aW1lLWNvcmUnO1xuaW1wb3J0IHsgVGFvblN1YnNjcmliZXJPcHRpb25zIH0gZnJvbSAnLi9kZWNvcmF0b3JzL2NsYXNzZXMvc3Vic2NyaWJlci1kZWNvcmF0b3InO1xuaW1wb3J0IHsgQmFzZVN1YnNjcmliZXJGb3JFbnRpdHkgfSBmcm9tICcuL2Jhc2UtY2xhc3Nlcy9iYXNlLXN1YnNjcmliZXItZm9yLWVudGl0eSc7XG5pbXBvcnQgdHlwZSB7IEJhc2VNaWdyYXRpb24gfSBmcm9tICcuL2Jhc2UtY2xhc3Nlcy9iYXNlLW1pZ3JhdGlvbic7XG5pbXBvcnQgeyBDb250ZXh0RGJNaWdyYXRpb25zIH0gZnJvbSAnLi9jb250ZXh0LWRiLW1pZ3JhdGlvbnMnO1xuXG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludENvbnRleHQge1xuXG5cblxuICBwcml2YXRlIHN0YXRpYyBuZ1pvbmU6IE5nWm9uZTtcblxuICBzdGF0aWMgaW5pdE5nWm9uZShuZ1pvbmU6IE5nWm9uZSkge1xuXG4gICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG5cbiAgfVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBkaXNhYmxlZFJlYWx0aW1lOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBjaGVjayB3aGV0aGVyIGNvbnRleHQgaXMgaW5pdGVkXG4gICAqICh3aXRoIGluaXQoKSBmdW5jdGlvbiApXG4gICAqL1xuICBwdWJsaWMgaW5pdGVkOiBib29sZWFuID0gZmFsc2U7XG5cblxuICByZWFkb25seSBkYk1pZ3JhdGlvbnMgPSBuZXcgQ29udGV4dERiTWlncmF0aW9ucyh0aGlzKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsSW5zdGFjZU9ialN5bWJvbCA9IFN5bWJvbCgnbG9jYWxJbnN0YWNlT2JqU3ltYm9sJyk7XG5cblxuICAvKipcbiAgICogYWxsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGZyb20gY29udGV4dFxuICAgKiBrZXkgaXMgY2xhc3MgbmFtZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsbENsYXNzZXNJbnN0YW5jZXMgPSB7fTtcblxuXG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbGFzc0luc3RhbmNlc0J5TmFtZU9iaiA9IHt9O1xuXG5cblxuICBwcml2YXRlIHJlYWRvbmx5IG9ialdpdGhDbGFzc2VzSW5zdGFuY2VzQXJyID0ge307XG5cblxuXG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmVSb3V0ZXM6IHtcbiAgICByb3V0ZVBhdGg6IHN0cmluZztcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwLlJlc3QuSHR0cE1ldGhvZDtcbiAgfVtdID0gW107XG5cblxuICBwdWJsaWMgcmVhZG9ubHkgc2tpcFdyaXRpbmdTZXJ2ZXJSb3V0ZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIHByaXZhdGUgaW5qZWN0YWJsZVR5cGVzZnJvbUNvbnRleHRzID0gW1xuICAgIE1vZGVscy5DbGFzc1R5cGUuQ09OVFJPTExFUixcbiAgICBNb2RlbHMuQ2xhc3NUeXBlLlBST1ZJREVSLFxuICAgIE1vZGVscy5DbGFzc1R5cGUuUkVQT1NJVE9SWSxcbiAgICBNb2RlbHMuQ2xhc3NUeXBlLlNVQlNDUklCRVIsXG4gICAgTW9kZWxzLkNsYXNzVHlwZS5NSUdSQVRJT04sXG4gIF07XG5cblxuICBwcml2YXRlIGFsbFR5cGVzZnJvbUNvbnRleHRzID0gW1xuICAgIC4uLnRoaXMuaW5qZWN0YWJsZVR5cGVzZnJvbUNvbnRleHRzLFxuICAgIE1vZGVscy5DbGFzc1R5cGUuRU5USVRZLFxuICBdO1xuXG5cblxuXG4gIHB1YmxpYyBleHByZXNzQXBwOiBBcHBsaWNhdGlvbiA9IHt9IGFzIGFueTtcblxuXG5cbiAgcHVibGljIHNlcnZlclRjcFVkcDogU2VydmVyO1xuXG5cblxuICBkYXRhYmFzZUNvbmZpZz86IE1vZGVscy5EYXRhYmFzZUNvbmZpZ1R5cGVPcm07XG5cblxuXG4gIG1vZGU6IE1vZGVscy5GcmFtZXdvcmtNb2RlO1xuXG5cblxuICByZWFkb25seSBvbmx5TWlncmF0aW9uUnVuPzogYm9vbGVhbiA9IGZhbHNlO1xuICByZWFkb25seSBvbmx5TWlncmF0aW9uUmV2ZXJ0VG9UaW1lc3RhbXA/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG5cbiAgZ2V0IGlzUnVuT3JSZXZlcnRPbmx5TWlncmF0aW9uQXBwU3RhcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMub25seU1pZ3JhdGlvblJ1biB8fCB0aGlzLm9ubHlNaWdyYXRpb25SZXZlcnRUb1RpbWVzdGFtcCk7XG4gIH1cblxuXG5cbiAgc2Vzc2lvbj86IE1vZGVscy5JU2Vzc2lvbjtcblxuXG5cbiAgcHVibGljIGNvbm5lY3Rpb246IERhdGFTb3VyY2U7XG5cblxuXG4gIHByaXZhdGUgZW50aXRpZXNUcmlnZ2VycyA9IHt9O1xuXG5cblxuICBwcml2YXRlIHJlYWx0aW1lOiBSZWFsdGltZUNvcmU7XG4gIGdldCByZWFsdGltZUNsaWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFsdGltZS5jbGllbnQ7XG4gIH1cbiAgZ2V0IHJlYWx0aW1lU2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWx0aW1lLnNlcnZlcjtcbiAgfVxuXG5cblxuICAvKipcbiAgICogYXZhaWxhYmxlIGFmdGVyIGluaXQoKVxuICAgKi9cbiAgcHVibGljIGNvbmZpZzogTW9kZWxzLkNvbnRleHRPcHRpb25zPGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueT47XG5cblxuXG4gIGdldCBsb2dIdHRwKCk6IGJvb2xlYW4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHRoaXMuY29uZmlnPy5sb2dzKSkge1xuICAgICAgcmV0dXJuICEhKHRoaXMuY29uZmlnLmxvZ3MgYXMgTW9kZWxzLkNvbm5lY3Rpb25PcHRpb25zTG9ncykuaHR0cDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5sb2dzID09PSB0cnVlO1xuICB9XG5cbiAgZ2V0IGxvZ1JlYWx0aW1lKCk6IGJvb2xlYW4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHRoaXMuY29uZmlnPy5sb2dzKSkge1xuICAgICAgcmV0dXJuICEhKHRoaXMuY29uZmlnLmxvZ3MgYXMgTW9kZWxzLkNvbm5lY3Rpb25PcHRpb25zTG9ncykucmVhbHRpbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZz8ubG9ncyA9PT0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBsb2dGcmFtZXdvcmsoKTogYm9vbGVhbiB7XG4gICAgaWYgKF8uaXNPYmplY3QodGhpcy5jb25maWc/LmxvZ3MpKSB7XG4gICAgICByZXR1cm4gISEodGhpcy5jb25maWcubG9ncyBhcyBNb2RlbHMuQ29ubmVjdGlvbk9wdGlvbnNMb2dzKS5mcmFtZXdvcms7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZz8ubG9ncyA9PT0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBsb2dEYigpOiBib29sZWFuIHtcbiAgICBpZiAoXy5pc09iamVjdCh0aGlzLmNvbmZpZz8ubG9ncykpIHtcbiAgICAgIHJldHVybiAhISh0aGlzLmNvbmZpZy5sb2dzIGFzIE1vZGVscy5Db25uZWN0aW9uT3B0aW9uc0xvZ3MpLmRiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmxvZ3MgPT09IHRydWU7XG4gIH1cblxuICBnZXQgbG9nTWlncmF0aW9ucygpOiBib29sZWFuIHtcbiAgICBpZiAoXy5pc09iamVjdCh0aGlzLmNvbmZpZz8ubG9ncykpIHtcbiAgICAgIHJldHVybiAhISh0aGlzLmNvbmZpZy5sb2dzIGFzIE1vZGVscy5Db25uZWN0aW9uT3B0aW9uc0xvZ3MpLm1pZ3JhdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZz8ubG9ncyA9PT0gdHJ1ZTtcbiAgfVxuXG5cblxuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvcmlnaW5hbENvbmZpZzogTW9kZWxzLkNvbnRleHRPcHRpb25zPFxuICAgICAgYW55LFxuICAgICAgYW55LFxuICAgICAgYW55LFxuICAgICAgYW55LFxuICAgICAgYW55LFxuICAgICAgYW55LFxuICAgICAgYW55XG4gICAgPixcbiAgICBwcml2YXRlIGNvbmZpZ0ZuOiAoXG4gICAgICBlbnY6IGFueSxcbiAgICApID0+IE1vZGVscy5Db250ZXh0T3B0aW9uczxhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICApIHt9XG5cblxuXG4gIHB1YmxpYyBhc3luYyBpbml0KG9wdGlvbnM/OiB7XG4gICAgaW5pdEZyb21SZWNydXNpdmVDb250ZXh0UmVzb3ZsZT86IGJvb2xlYW47XG4gICAgb3ZlcnJpZGVIb3N0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBvdmVycmlkZVJlbW90ZUhvc3Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIG9ubHlNaWdyYXRpb25SdW4/OiBib29sZWFuO1xuICAgIG9ubHlNaWdyYXRpb25SZXZlcnRUb1RpbWVzdGFtcD86IG51bWJlcjtcbiAgfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGluaXRGcm9tUmVjcnVzaXZlQ29udGV4dFJlc292bGUsXG4gICAgICBvdmVycmlkZUhvc3QsXG4gICAgICBvdmVycmlkZVJlbW90ZUhvc3QsXG4gICAgICBvbmx5TWlncmF0aW9uUnVuLFxuICAgICAgb25seU1pZ3JhdGlvblJldmVydFRvVGltZXN0YW1wLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9OyAvLyBUT0RPIHVzZSBpdCA/XG5cbiAgICB0aGlzLmluaXRlZCA9IHRydWU7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMub25seU1pZ3JhdGlvblJ1biA9IG9ubHlNaWdyYXRpb25SdW47XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMub25seU1pZ3JhdGlvblJldmVydFRvVGltZXN0YW1wID0gb25seU1pZ3JhdGlvblJldmVydFRvVGltZXN0YW1wO1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5jb25maWdGbihFTlYpO1xuICAgIGlmIChfLmlzT2JqZWN0KHRoaXMuY29uZmlnLmRhdGFiYXNlKSkge1xuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UgPSBNb2RlbHMuRGF0YWJhc2VDb25maWcuZnJvbShcbiAgICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UgYXMgTW9kZWxzLkRhdGFiYXNlQ29uZmlnLFxuICAgICAgKS5kYXRhYmFzZUNvbmZpZ1R5cGVPUk07XG4gICAgfVxuICAgIGlmIChvdmVycmlkZUhvc3QgJiYgb3ZlcnJpZGVSZW1vdGVIb3N0KSB7XG4gICAgICBIZWxwZXJzLnRocm93KFxuICAgICAgICBgW3Rhb24tY29uZmlnXSBZb3UgY2FuJ3QgaGF2ZSBvdmVycmlkZUhvc3QgYW5kIG92ZXJyaWRlUmVtb3RlSG9zdCBhdCB0aGUgc2FtZSB0aW1lYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcuaG9zdCA9ICFfLmlzVW5kZWZpbmVkKG92ZXJyaWRlSG9zdClcbiAgICAgID8gb3ZlcnJpZGVIb3N0XG4gICAgICA6IHRoaXMuY29uZmlnLmhvc3Q7XG4gICAgdGhpcy5jb25maWcucmVtb3RlSG9zdCA9ICFfLmlzVW5kZWZpbmVkKG92ZXJyaWRlUmVtb3RlSG9zdClcbiAgICAgID8gb3ZlcnJpZGVSZW1vdGVIb3N0XG4gICAgICA6IHRoaXMuY29uZmlnLnJlbW90ZUhvc3Q7XG5cbiAgICB0aGlzLmNvbmZpZy5ob3N0ID0gdGhpcy5ob3N0ID09PSBudWxsID8gdm9pZCAwIDogdGhpcy5ob3N0O1xuICAgIHRoaXMuY29uZmlnLnJlbW90ZUhvc3QgPVxuICAgICAgdGhpcy5yZW1vdGVIb3N0ID09PSBudWxsID8gdm9pZCAwIDogdGhpcy5yZW1vdGVIb3N0O1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWcuaG9zdCAmJlxuICAgICAgIXRoaXMuY29uZmlnLmhvc3Quc3RhcnRzV2l0aCgnaHR0cDovLycpICYmXG4gICAgICAhdGhpcy5jb25maWcuaG9zdC5zdGFydHNXaXRoKCdodHRwczovLycpXG4gICAgKSB7XG4gICAgICBIZWxwZXJzLnRocm93KFxuICAgICAgICBgW3Rhb24tY29uZmlnXSBZb3VyICdob3N0JyBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovL2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuY29uZmlnLnVzZUlwY1doZW5FbGVjdHJvbikpIHtcbiAgICAgIHRoaXMuY29uZmlnLnVzZUlwY1doZW5FbGVjdHJvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWcucmVtb3RlSG9zdCAmJlxuICAgICAgIXRoaXMuY29uZmlnLnJlbW90ZUhvc3Quc3RhcnRzV2l0aCgnaHR0cDovLycpICYmXG4gICAgICAhdGhpcy5jb25maWcucmVtb3RlSG9zdC5zdGFydHNXaXRoKCdodHRwczovLycpXG4gICAgKSB7XG4gICAgICBIZWxwZXJzLnRocm93KFxuICAgICAgICBgW3Rhb24tY29uZmlnXSBZb3VyICdyZW1vdGVIb3N0JyBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovL2AsXG4gICAgICApO1xuICAgIH1cblxuXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yIG92ZXJyaWRpbmcgcmVhZG9ubHlcbiAgICB0aGlzLnNraXBXcml0aW5nU2VydmVyUm91dGVzID0gXy5pc0Jvb2xlYW4oXG4gICAgICB0aGlzLmNvbmZpZy5za2lwV3JpdGluZ1NlcnZlclJvdXRlcyxcbiAgICApXG4gICAgICA/IHRoaXMuY29uZmlnLnNraXBXcml0aW5nU2VydmVyUm91dGVzXG4gICAgICA6IGZhbHNlO1xuXG5cblxuICAgIGlmICh0aGlzLmNvbmZpZy5ob3N0KSB7XG4gICAgICB0aGlzLm1vZGUgPSAnYmFja2VuZC1mcm9udGVuZCh0Y3ArdWRwKSc7XG4vKiAqL1xuLyogKi9cbiAgXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnJlbW90ZUhvc3QpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5ob3N0KSB7XG4gICAgICAgIEhlbHBlcnMudGhyb3coXG4gICAgICAgICAgYFt0YW9uXSBZb3UgY2FuJ3QgaGF2ZSByZW1vdGVIb3N0IGFuZCBob3N0IGF0IHRoZSBzYW1lIHRpbWVgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5tb2RlID0gJ3JlbW90ZS1iYWNrZW5kKHRjcCt1ZHApJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcudXNlSXBjV2hlbkVsZWN0cm9uICYmIEhlbHBlcnMuaXNFbGVjdHJvbikge1xuICAgICAgaWYgKEhlbHBlcnMuaXNXZWJTUUwpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gJ2JhY2tlbmQtZnJvbnRlbmQod2Vic3FsLWVsZWN0cm9uKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1vZGUgPSAnYmFja2VuZC1mcm9udGVuZChpcGMtZWxlY3Ryb24pJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubW9kZSAmJiAhdGhpcy5jb25maWcuYWJzdHJhY3QpIHtcbiAgICAgIEhlbHBlcnMuZXJyb3IoXG4gICAgICAgIGBbdGFvbl0gQ29udGV4dCBcIiR7dGhpcy5jb250ZXh0TmFtZX1cIjogWW91IG5lZWQgdG8gcHJvdmlkZSBob3N0IG9yIHJlbW90ZUhvc3Qgb3IgdXNlSXBjV2hlbkVsZWN0cm9uYCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuLyogKi9cbi8qICovXG4gIFxuICAgIH1cblxuXG5cbiAgICBpZiAodGhpcy5jb25maWcuZGF0YWJhc2UgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldEF1dG9HZW5lcmF0ZWRDb25maWcoKTtcbiAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QodGhpcy5jb25maWcuZGF0YWJhc2UpKSB7XG4gICAgICB0aGlzLmRhdGFiYXNlQ29uZmlnID0gXy5tZXJnZShcbiAgICAgICAgdGhpcy5nZXRBdXRvR2VuZXJhdGVkQ29uZmlnKCksXG4gICAgICAgIF8uY2xvbmVEZWVwKHRoaXMuY29uZmlnLmRhdGFiYXNlKSxcbiAgICAgICkgYXMgTW9kZWxzLkRhdGFiYXNlQ29uZmlnVHlwZU9ybTtcbiAgICB9XG5cblxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlc3Npb24pIHtcbiAgICAgIHRoaXMuc2Vzc2lvbiA9IF8uY2xvbmVEZWVwKHRoaXMuY29uZmlnLnNlc3Npb24pO1xuICAgICAgY29uc3Qgb25lSG91ciA9IDEwMDAgKiA2MCAqIDYwICogMTsgLy8gMjQ7XG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5jb29raWVNYXhBZ2UpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmNvb2tpZU1heEFnZSA9IG9uZUhvdXI7XG4gICAgICB9XG5cbiAgICAgIGF4aW9zLmRlZmF1bHRzLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgfVxuXG5cblxuICAgIHRoaXMuY29uZmlnLmNvbnRleHRzID0gdGhpcy5jb25maWcuY29udGV4dHMgfHwge307XG4gICAgdGhpcy5jb25maWcuZW50aXRpZXMgPSB0aGlzLmNvbmZpZy5lbnRpdGllcyB8fCB7fTtcbiAgICB0aGlzLmNvbmZpZy5jb250cm9sbGVycyA9IHRoaXMuY29uZmlnLmNvbnRyb2xsZXJzIHx8IHt9O1xuICAgIHRoaXMuY29uZmlnLnJlcG9zaXRvcmllcyA9IHRoaXMuY29uZmlnLnJlcG9zaXRvcmllcyB8fCB7fTtcbiAgICB0aGlzLmNvbmZpZy5wcm92aWRlcnMgPSB0aGlzLmNvbmZpZy5wcm92aWRlcnMgfHwge307XG4gICAgdGhpcy5jb25maWcuc3Vic2NyaWJlcnMgPSB0aGlzLmNvbmZpZy5zdWJzY3JpYmVycyB8fCB7fTtcbiAgICB0aGlzLmNvbmZpZy5taWdyYXRpb25zID0gdGhpcy5jb25maWcubWlncmF0aW9ucyB8fCB7fTtcblxuICAgIHRoaXMuY29uZmlnLmVudGl0aWVzID0ge1xuICAgICAgLi4uKGF3YWl0IHRoaXMuZ2V0UmVjcnVzaXZlQ2xhc3Nlc2Zyb21Db250ZXh0c09iaihcbiAgICAgICAgTW9kZWxzLkNsYXNzVHlwZS5FTlRJVFksXG4gICAgICApKSxcbiAgICAgIC4uLnRoaXMuY29uZmlnLmVudGl0aWVzLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbmZpZy5jb250cm9sbGVycyA9IHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLmdldFJlY3J1c2l2ZUNsYXNzZXNmcm9tQ29udGV4dHNPYmooXG4gICAgICAgIE1vZGVscy5DbGFzc1R5cGUuQ09OVFJPTExFUixcbiAgICAgICkpLFxuICAgICAgLi4udGhpcy5jb25maWcuY29udHJvbGxlcnMsXG4gICAgfTtcblxuICAgIHRoaXMuY29uZmlnLnByb3ZpZGVycyA9IHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLmdldFJlY3J1c2l2ZUNsYXNzZXNmcm9tQ29udGV4dHNPYmooXG4gICAgICAgIE1vZGVscy5DbGFzc1R5cGUuUFJPVklERVIsXG4gICAgICApKSxcbiAgICAgIC4uLnRoaXMuY29uZmlnLnByb3ZpZGVycyxcbiAgICB9O1xuXG4gICAgdGhpcy5jb25maWcuc3Vic2NyaWJlcnMgPSB7XG4gICAgICAuLi4oYXdhaXQgdGhpcy5nZXRSZWNydXNpdmVDbGFzc2VzZnJvbUNvbnRleHRzT2JqKFxuICAgICAgICBNb2RlbHMuQ2xhc3NUeXBlLlNVQlNDUklCRVIsXG4gICAgICApKSxcbiAgICAgIC4uLnRoaXMuY29uZmlnLnN1YnNjcmliZXJzLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbmZpZy5yZXBvc2l0b3JpZXMgPSB7XG4gICAgICAuLi4oYXdhaXQgdGhpcy5nZXRSZWNydXNpdmVDbGFzc2VzZnJvbUNvbnRleHRzT2JqKFxuICAgICAgICBNb2RlbHMuQ2xhc3NUeXBlLlJFUE9TSVRPUlksXG4gICAgICApKSxcbiAgICAgIC4uLnRoaXMuY29uZmlnLnJlcG9zaXRvcmllcyxcbiAgICB9O1xuXG4gICAgdGhpcy5jb25maWcubWlncmF0aW9ucyA9IHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLmdldFJlY3J1c2l2ZUNsYXNzZXNmcm9tQ29udGV4dHNPYmooXG4gICAgICAgIE1vZGVscy5DbGFzc1R5cGUuTUlHUkFUSU9OLFxuICAgICAgKSksXG4gICAgICAuLi50aGlzLmNvbmZpZy5taWdyYXRpb25zLFxuICAgIH07XG5cblxuXG5cblxuXG4gICAgdGhpcy5jb25maWcuY29udHJvbGxlcnMgPSB0aGlzLmNsb25lQ2xhc3Nlc09ialdpdGhOZXdNZXRhZGF0YSh7XG4gICAgICBjbGFzc2VzSW5wdXQ6IHRoaXMuY29uZmlnLmNvbnRyb2xsZXJzLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGN0eDogdGhpcyxcbiAgICAgIGNsYXNzVHlwZTogTW9kZWxzLkNsYXNzVHlwZS5DT05UUk9MTEVSLFxuICAgIH0pO1xuICAgIHRoaXMuY29uZmlnLnJlcG9zaXRvcmllcyA9IHRoaXMuY2xvbmVDbGFzc2VzT2JqV2l0aE5ld01ldGFkYXRhKHtcbiAgICAgIGNsYXNzZXNJbnB1dDogdGhpcy5jb25maWcucmVwb3NpdG9yaWVzLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGN0eDogdGhpcyxcbiAgICAgIGNsYXNzVHlwZTogTW9kZWxzLkNsYXNzVHlwZS5SRVBPU0lUT1JZLFxuICAgIH0pO1xuICAgIHRoaXMuY29uZmlnLnByb3ZpZGVycyA9IHRoaXMuY2xvbmVDbGFzc2VzT2JqV2l0aE5ld01ldGFkYXRhKHtcbiAgICAgIGNsYXNzZXNJbnB1dDogdGhpcy5jb25maWcucHJvdmlkZXJzLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGN0eDogdGhpcyxcbiAgICAgIGNsYXNzVHlwZTogTW9kZWxzLkNsYXNzVHlwZS5QUk9WSURFUixcbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZy5zdWJzY3JpYmVycyA9IHRoaXMuY2xvbmVDbGFzc2VzT2JqV2l0aE5ld01ldGFkYXRhKHtcbiAgICAgIGNsYXNzZXNJbnB1dDogdGhpcy5jb25maWcuc3Vic2NyaWJlcnMsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY3R4OiB0aGlzLFxuICAgICAgY2xhc3NUeXBlOiBNb2RlbHMuQ2xhc3NUeXBlLlNVQlNDUklCRVIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmZpZy5taWdyYXRpb25zID0gdGhpcy5jbG9uZUNsYXNzZXNPYmpXaXRoTmV3TWV0YWRhdGEoe1xuICAgICAgY2xhc3Nlc0lucHV0OiB0aGlzLmNvbmZpZy5taWdyYXRpb25zLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGN0eDogdGhpcyxcbiAgICAgIGNsYXNzVHlwZTogTW9kZWxzLkNsYXNzVHlwZS5NSUdSQVRJT04sXG4gICAgfSk7XG5cblxuXG4gICAgZm9yIChjb25zdCBjbGFzc1R5cGVOYW1lIG9mIHRoaXMuaW5qZWN0YWJsZVR5cGVzZnJvbUNvbnRleHRzKSB7XG4gICAgICB0aGlzLmNsYXNzSW5zdGFuY2VzQnlOYW1lT2JqW2NsYXNzVHlwZU5hbWVdID0ge307XG4gICAgICB0aGlzLm9ialdpdGhDbGFzc2VzSW5zdGFuY2VzQXJyW2NsYXNzVHlwZU5hbWVdID0gW107XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjbGFzc1R5cGVOYW1lIG9mIHRoaXMuaW5qZWN0YWJsZVR5cGVzZnJvbUNvbnRleHRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5jb25maWdbTW9kZWxzLkNsYXNzVHlwZUtleVtjbGFzc1R5cGVOYW1lXV0sXG4gICAgICAgIGNsYXNzVHlwZU5hbWUsXG4gICAgICApO1xuICAgIH1cblxuXG4gICAgaWYgKCF0aGlzLmlzUnVuT3JSZXZlcnRPbmx5TWlncmF0aW9uQXBwU3RhcnQpIHtcblxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2JhY2tlbmQtZnJvbnRlbmQodGNwK3VkcCknICYmICF0aGlzLmNvbmZpZy5hYnN0cmFjdCkge1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gICAgICB9XG5cblxuXG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmFic3RyYWN0KSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWRSZWFsdGltZSA9ICEhdGhpcy5jb25maWcuZGlzYWJsZWRSZWFsdGltZTtcbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcbiAgICAgICAgdGhpcy5yZWFsdGltZSA9IG5ldyBSZWFsdGltZUNvcmUodGhpcyk7XG4gICAgICB9XG5cbiAgICB9XG5cblxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmxvZ0ZyYW1ld29yayAmJlxuICAgICAgICBIZWxwZXJzLmluZm8oXG4gICAgICAgICAgYFt0YW9uXSBDcmVhdGUgYWJzdHJhY3QgY29udGV4dDogJHt0aGlzLmNvbmZpZy5jb250ZXh0TmFtZX1gLFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jb25maWcucmVtb3RlSG9zdCkge1xuICAgICAgICB0aGlzLmxvZ0ZyYW1ld29yayAmJlxuICAgICAgICAgIEhlbHBlcnMuaW5mbyhcbiAgICAgICAgICAgIGBbdGFvbl0gQ3JlYXRlIGNvbnRleHQgZm9yIHJlbW90ZSBob3N0OiAke3RoaXMuY29uZmlnLnJlbW90ZUhvc3R9YCxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dGcmFtZXdvcmsgJiZcbiAgICAgICAgICBIZWxwZXJzLmluZm8oYFt0YW9uXSBDcmVhdGUgY29udGV4dCBmb3IgaG9zdDogJHt0aGlzLmNvbmZpZy5ob3N0fWApO1xuICAgICAgfVxuICAgIH1cblxuXG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy5vcmlnaW5hbENvbmZpZ1trZXldID0gdGhpcy5jb25maWdba2V5XTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICBwcml2YXRlIGdldEF1dG9HZW5lcmF0ZWRDb25maWcoKTogTW9kZWxzLkRhdGFiYXNlQ29uZmlnVHlwZU9ybSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICAgIHJldHVybiAodm9pZCAwKTtcbiAgfVxuXG5cblxuICBnZXQgbmdab25lKCk6IGFueSB7XG5cbiAgICByZXR1cm4gRW5kcG9pbnRDb250ZXh0Lm5nWm9uZTtcblxuICAgIHJldHVybjtcbiAgfVxuXG5cblxuICBzdGFydFNlcnZlcigpIHtcbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gICAgcmV0dXJuICh2b2lkIDApO1xuICB9XG5cblxuXG4gIGRpc3BsYXlSb3V0ZXMoYXBwKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcbiAgfVxuXG5cblxuICBnZXQgbW9kZUFsbG93c0RhdGFiYXNlQ3JlYXRpb24oKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2JhY2tlbmQtZnJvbnRlbmQodGNwK3VkcCknIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdiYWNrZW5kLWZyb250ZW5kKHdlYnNxbCknIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdiYWNrZW5kLWZyb250ZW5kKGlwYy1lbGVjdHJvbiknXG4gICAgKTtcbiAgfVxuXG5cblxuXG4gIHByaXZhdGUgY2xvbmVDbGFzc1dpdGhOZXdNZXRhZGF0YSA9IDxcbiAgICBUIGV4dGVuZHMgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH0sXG4gID4oe1xuICAgIEJhc2VDbGFzcyxcbiAgICBjbGFzc05hbWUsXG4gICAgY29uZmlnLFxuICAgIGN0eCxcbiAgICBjbGFzc1R5cGUsXG4gIH06IHtcbiAgICBCYXNlQ2xhc3M6IFQ7XG4gICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgY29uZmlnOiBNb2RlbHMuQ29udGV4dE9wdGlvbnM8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcbiAgICBjdHg6IEVuZHBvaW50Q29udGV4dDtcbiAgICBjbGFzc1R5cGU6IE1vZGVscy5DbGFzc1R5cGU7XG4gIH0pOiBUID0+IHtcblxuICAgIGNvbnN0IGNsb25lQ2xhc3MgPSAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIEJhc2VDbGFzc1tTeW1ib2xzLmZ1bGxDbGFzc05hbWVTdGF0aWNQcm9wZXJ0eV0gPT09XG4gICAgICAgIGAke2N0eC5jb250ZXh0TmFtZX0uJHtjbGFzc05hbWV9YFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBCYXNlQ2xhc3M7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3Mge1xuXG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGF0aWMgW1N5bWJvbHMub3JpZ25hbENsYXNzXSA9IEJhc2VDbGFzcztcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXRpYyBbU3ltYm9scy5mdWxsQ2xhc3NOYW1lU3RhdGljUHJvcGVydHldID0gYCR7Y3R4LmNvbnRleHROYW1lfS4ke2NsYXNzTmFtZX1gO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhdGljIFtTeW1ib2xzLmNsYXNzTmFtZVN0YXRpY1Byb3BlcnR5XSA9IGNsYXNzTmFtZTtcblxuICAgICAgICBzdGF0aWMgW1N5bWJvbHMuY3R4SW5DbGFzc09yQ2xhc3NPYmpdID0gY3R4O1xuXG4gICAgICAgIHN0YXRpYyBfX2dldEZ1bGxQYXRoRm9yQ2xhc3NfXyhhcnIgPSBbXSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzW1N5bWJvbHMuZnVsbENsYXNzTmFtZVN0YXRpY1Byb3BlcnR5XTtcbiAgICAgICAgICBhcnIucHVzaChuYW1lKTtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpc1tTeW1ib2xzLm9yaWduYWxDbGFzc10gJiYgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpc1tTeW1ib2xzLm9yaWduYWxDbGFzc10uX19nZXRGdWxsUGF0aEZvckNsYXNzX19cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXNbU3ltYm9scy5vcmlnbmFsQ2xhc3NdLl9fZ2V0RnVsbFBhdGhGb3JDbGFzc19fKGFycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhcnIuam9pbignLycpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgZnVsbFBhdGhGb3JDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fZ2V0RnVsbFBhdGhGb3JDbGFzc19fKCk7XG4gICAgICAgIH1cbiAgICAgICAgW1N5bWJvbHMuY3R4SW5DbGFzc09yQ2xhc3NPYmpdID0gY3R4O1xuXG5cbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGNsb25lQ2xhc3NGdW5jdGlvbiA9IGNsb25lQ2xhc3MoKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgIHJldHVybiBjbG9uZUNsYXNzRnVuY3Rpb247XG4gIH07XG5cblxuXG5cblxuICBwcml2YXRlIGNsb25lQ2xhc3Nlc09ialdpdGhOZXdNZXRhZGF0YSA9ICh7XG4gICAgY2xhc3Nlc0lucHV0LFxuICAgIGNvbmZpZyxcbiAgICBjdHgsXG4gICAgY2xhc3NUeXBlLFxuICB9OiB7XG4gICAgY2xhc3Nlc0lucHV0OiBhbnk7XG4gICAgY29uZmlnOiBNb2RlbHMuQ29udGV4dE9wdGlvbnM8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcbiAgICBjdHg6IEVuZHBvaW50Q29udGV4dDtcbiAgICBjbGFzc1R5cGU6IE1vZGVscy5DbGFzc1R5cGU7XG4gIH0pID0+IHtcbiAgICBjb25zdCBjbGFzc2VzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjbGFzc2VzSW5wdXQgfHwge30pKSB7XG4gICAgICBjb25zdCBCYXNlQ2xhc3MgPSBjbGFzc2VzSW5wdXRba2V5XTtcblxuICAgICAgaWYgKCFCYXNlQ2xhc3MpIHtcbiAgICAgICAgSGVscGVycy5lcnJvcihgQ2xhc3MgJHtrZXl9IGlzIG5vdCBkZWZpbmVkIGluIGNvbnRleHQgJHtjdHguY29udGV4dE5hbWV9XG5cbiAgICAgICAgUGxlYXNlIGNoZWNrIGlmIHlvdSBoYXZlIGNvcnJlY3QgaW1wb3J0IGluIGNvbnRleHQgZmlsZVxuXG4gICAgICAgIGApO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2xhc3NOYW1lID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgU3ltYm9scy5tZXRhZGF0YS5jbGFzc05hbWUsXG4gICAgICAgIEJhc2VDbGFzcyxcbiAgICAgICk7XG5cblxuXG5cblxuICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lIHx8IGtleTtcbiAgICAgIEJhc2VDbGFzc1tTeW1ib2xzLmNsYXNzTmFtZVN0YXRpY1Byb3BlcnR5XSA9IGNsYXNzTmFtZTtcblxuICAgICAgY29uc3QgY2xvbmVkQ2xhc3MgPSB0aGlzLmNsb25lQ2xhc3NXaXRoTmV3TWV0YWRhdGEoe1xuICAgICAgICBCYXNlQ2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBjdHgsXG4gICAgICAgIGNsYXNzVHlwZSxcbiAgICAgIH0pO1xuICAgICAgY2xhc3Nlc1tjbGFzc05hbWVdID0gY2xvbmVkQ2xhc3M7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9O1xuXG5cblxuICBwcml2YXRlIGFzeW5jIGdldFJlY3J1c2l2ZUNsYXNzZXNmcm9tQ29udGV4dHNPYmooXG4gICAgY2xhc3NUeXBlOiBNb2RlbHMuQ2xhc3NUeXBlLFxuICApIHtcbiAgICBjb25zdCBhcnIgPSBhd2FpdCB0aGlzLmdldFJlY3J1c2l2ZUNsYXNzZXNmcm9tQ29udGV4dHMoY2xhc3NUeXBlKTtcbiAgICByZXR1cm4gYXJyLnJlZHVjZSgoYWNjLCBjKSA9PiB7XG4gICAgICBhY2NbQ2xhc3NIZWxwZXJzLmdldE5hbWUoYyldID0gYztcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZWNydXNpdmVDbGFzc2VzZnJvbUNvbnRleHRzKFxuICAgIGNsYXNzVHlwZTogTW9kZWxzLkNsYXNzVHlwZSxcbiAgICBhcnIgPSBbXSxcbiAgKSB7XG4gICAgY29uc3QgY29udGV4dHMgPSBPYmplY3QudmFsdWVzKHRoaXMuY29uZmlnLmNvbnRleHRzIHx8IHt9KSBhcyBSZXR1cm5UeXBlPFxuICAgICAgdHlwZW9mIGNyZWF0ZUNvbnRleHRcbiAgICA+W107XG5cblxuXG4gICAgZm9yIChjb25zdCBjdHggb2YgY29udGV4dHMpIHtcblxuICAgICAgY29uc3QgcmVmID0gYXdhaXQgY3R4Ll9fcmVmKCk7XG5cbiAgICAgIGNvbnN0IGNsYXNzZXNJbnB1dCA9IHJlZi5nZXRDbGFzc0Z1bkJ5KGNsYXNzVHlwZSk7XG5cblxuICAgICAgY29uc3QgY2xvbmVkQ2xhc3NlcyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIHRoaXMuY2xvbmVDbGFzc2VzT2JqV2l0aE5ld01ldGFkYXRhKHtcbiAgICAgICAgICBjbGFzc2VzSW5wdXQsXG4gICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBjdHg6IHRoaXMsXG4gICAgICAgICAgY2xhc3NUeXBlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNsb25lZENsYXNzZXMuZm9yRWFjaChjID0+IGFyci5wdXNoKGMpKTtcblxuICAgICAgYXdhaXQgcmVmLmdldFJlY3J1c2l2ZUNsYXNzZXNmcm9tQ29udGV4dHMoY2xhc3NUeXBlLCBhcnIpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyIGFzIEZ1bmN0aW9uW107XG4gIH1cblxuXG5cbiAgZ2V0Q2xhc3NJbnN0YW5jZU9iakJ5KGNsYXNzVHlwZTogTW9kZWxzLkNsYXNzVHlwZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NJbnN0YW5jZXNCeU5hbWVPYmpbY2xhc3NUeXBlXTtcbiAgfVxuXG5cblxuICBwcml2YXRlIGdldENsYXNzZXNJbnN0YW5jZXNBcnJCeShjbGFzc1R5cGU6IE1vZGVscy5DbGFzc1R5cGUpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMub2JqV2l0aENsYXNzZXNJbnN0YW5jZXNBcnJbY2xhc3NUeXBlXTtcbiAgfVxuXG5cblxuICBpbmplY3Q8VD4oXG4gICAgY3RvcjogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgbG9jYWxJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgICBjb250ZXh0Q2xhc3NJbnN0YW5jZT86IEJhc2VDbGFzcztcbiAgICAgIGxvY2FJbnN0YW5jZUNvbnN0cnVjdG9yQXJncz86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgY3Rvcj47XG4gICAgfSxcbiAgKTogVCB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge30gYXMgYW55O1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBDbGFzc0hlbHBlcnMuZ2V0TmFtZShjdG9yKTtcblxuICAgIGNvbnN0IGxvY2FJbnN0YW5jZUNvbnN0cnVjdG9yQXJncyA9XG4gICAgICBvcHRpb25zLmxvY2FJbnN0YW5jZUNvbnN0cnVjdG9yQXJncyB8fCBbXTtcblxuICAgIGlmICh0aGlzLmlzQ0xhc3NUeXBlKE1vZGVscy5DbGFzc1R5cGUuUkVQT1NJVE9SWSwgY3RvcikpIHtcbiAgICAgIG9wdGlvbnMubG9jYWxJbnN0YW5jZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmxvY2FsSW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGN0eENsYXNzRm4gPSB0aGlzLmdldENsYXNzRnVuQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICAgIGxldCBlbnRpdHlOYW1lOiBzdHJpbmcgPSAnJztcblxuICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gJ0Jhc2VSZXBvc2l0b3J5Jykge1xuICAgICAgICBjb25zdCBlbnRpdHlGbiA9IGxvY2FJbnN0YW5jZUNvbnN0cnVjdG9yQXJnc1swXTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gZW50aXR5Rm4gJiYgZW50aXR5Rm4oKTtcbiAgICAgICAgZW50aXR5TmFtZSA9IGVudGl0eSAmJiBDbGFzc0hlbHBlcnMuZ2V0TmFtZShlbnRpdHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMuY29udGV4dENsYXNzSW5zdGFuY2VbdGhpcy5sb2NhbEluc3RhY2VPYmpTeW1ib2xdKSB7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dENsYXNzSW5zdGFuY2VbdGhpcy5sb2NhbEluc3RhY2VPYmpTeW1ib2xdID0ge307XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YW5jZUtleSA9IGNsYXNzTmFtZSArIChlbnRpdHlOYW1lID8gYC4ke2VudGl0eU5hbWV9YCA6ICcnKTtcbiAgICAgIGNvbnN0IGV4aXN0ZWQgPVxuICAgICAgICBvcHRpb25zLmNvbnRleHRDbGFzc0luc3RhbmNlW3RoaXMubG9jYWxJbnN0YWNlT2JqU3ltYm9sXVtpbnN0YW5jZUtleV07XG4gICAgICBpZiAoZXhpc3RlZCkge1xuXG4gICAgICAgIHJldHVybiBleGlzdGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWN0eENsYXNzRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgYWJsZSB0byBpbmplY3QgXCIke2NsYXNzTmFtZX1cIiBpbnNpZGUgY29udGV4dCBcIiR7dGhpcy5jb250ZXh0TmFtZX1cIlxuXG4gICAgICAgIE1ha2Ugc3VyZSB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQgb3IgaW1wb3J0IGNvbnRleHQgd2hlcmUgXCIke2NsYXNzTmFtZX1cIiBpcyBkZWZpbmVkLlxuXG4gICAgICAgIGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RlZEluc3RhbmNlID0gbmV3IChjdHhDbGFzc0ZuIGFzIGFueSkoXG4gICAgICAgIC4uLmxvY2FJbnN0YW5jZUNvbnN0cnVjdG9yQXJncyxcbiAgICAgICk7XG4gICAgICBvcHRpb25zLmNvbnRleHRDbGFzc0luc3RhbmNlW3RoaXMubG9jYWxJbnN0YWNlT2JqU3ltYm9sXVtpbnN0YW5jZUtleV0gPVxuICAgICAgICBpbmplY3RlZEluc3RhbmNlO1xuXG4gICAgICByZXR1cm4gaW5qZWN0ZWRJbnN0YW5jZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0U2NvcGVJbnN0YW5jZSA9IHRoaXMuYWxsQ2xhc3Nlc0luc3RhbmNlc1tjbGFzc05hbWVdO1xuXG5cblxuICAgIHJldHVybiBjb250ZXh0U2NvcGVJbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhbGlhcyBmb3IgaW5qZWN0XG4gICAqL1xuICBnZXRJbnN0YW5jZUJ5PFQ+KGN0b3I6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpOiBUIHtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICByZXR1cm4gdGhpcy5pbmplY3QoY3RvciwgeyBsb2NhbEluc3RhbmNlOiBmYWxzZSB9KTtcbiAgfVxuXG5cblxuICBjaGVja0lmQ29udGV4dEluaXRpYWxpemVkKCkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuY29uZmlnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGVhc2UgY2hlY2sgaWYgeW91ciBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuXG5cbiAgICAgIGF3YWl0IENvbnRleHQuaW5pdGlhbGl6ZSgpO1xuXG5cblxuICAgICAgYCk7XG4gICAgfVxuICB9XG5cblxuXG4gIGdldENsYXNzRnVuQnkoY2xhc3NUeXBlOiBNb2RlbHMuQ2xhc3NUeXBlKSB7XG4gICAgdGhpcy5jaGVja0lmQ29udGV4dEluaXRpYWxpemVkKCk7XG4gICAgc3dpdGNoIChjbGFzc1R5cGUpIHtcbiAgICAgIGNhc2UgTW9kZWxzLkNsYXNzVHlwZS5DT05UUk9MTEVSOlxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuY29udHJvbGxlcnM7XG4gICAgICBjYXNlIE1vZGVscy5DbGFzc1R5cGUuRU5USVRZOlxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZW50aXRpZXM7XG4gICAgICBjYXNlIE1vZGVscy5DbGFzc1R5cGUuUFJPVklERVI6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcnM7XG4gICAgICBjYXNlIE1vZGVscy5DbGFzc1R5cGUuUkVQT1NJVE9SWTpcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcG9zaXRvcmllcztcbiAgICAgIGNhc2UgTW9kZWxzLkNsYXNzVHlwZS5TVUJTQ1JJQkVSOlxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuc3Vic2NyaWJlcnM7XG4gICAgICBjYXNlIE1vZGVscy5DbGFzc1R5cGUuTUlHUkFUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWlncmF0aW9ucztcbiAgICB9XG4gIH1cblxuICBpc0NMYXNzVHlwZShjbGFzc1R5cGU6IE1vZGVscy5DbGFzc1R5cGUsIGNsYXNzRm46IEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRDbGFzc0Z1bkJ5KGNsYXNzVHlwZSlbQ2xhc3NIZWxwZXJzLmdldE5hbWUoY2xhc3NGbildO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgZm9yIGluamVjdGFibGUgdHlwZXNcbiAgICogT25seSBmb3IgY2xhc3NUeXBlOiBDT05UUk9MTEVSLCBSRVBPU0lUT1JZLCBQUk9WSURFUlxuICAgKi9cbiAgZ2V0Q2xhc3NGdW5CeUNsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IEZ1bmN0aW9uIHtcbiAgICBmb3IgKGNvbnN0IGNsYXNzVHlwZU5hbWUgb2YgdGhpcy5hbGxUeXBlc2Zyb21Db250ZXh0cykge1xuICAgICAgY29uc3QgY2xhc3Nlc0ZvckluamVjdGFibGVUeXBlID1cbiAgICAgICAgdGhpcy5jb25maWdbTW9kZWxzLkNsYXNzVHlwZUtleVtjbGFzc1R5cGVOYW1lXV07XG5cbiAgICAgIGlmIChjbGFzc2VzRm9ySW5qZWN0YWJsZVR5cGVbY2xhc3NOYW1lXSkge1xuICAgICAgICByZXR1cm4gY2xhc3Nlc0ZvckluamVjdGFibGVUeXBlW2NsYXNzTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NGdW5CeUNsYXNzKGNsYXNzRnVuY3Rpb246IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IENsYXNzSGVscGVycy5nZXROYW1lKGNsYXNzRnVuY3Rpb24pO1xuICAgIHJldHVybiB0aGlzLmdldENsYXNzRnVuQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgfVxuXG4gIGdldENsYXNzRnVuQnlBcnIoY2xhc3NUeXBlOiBNb2RlbHMuQ2xhc3NUeXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5nZXRDbGFzc0Z1bkJ5KGNsYXNzVHlwZSkgfHwge30pIGFzIEZ1bmN0aW9uW107XG4gIH1cblxuXG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVJbnN0YW5jZXMoY2xhc3NlczogYW55LCBjbGFzc1R5cGU6IE1vZGVscy5DbGFzc1R5cGUpIHtcblxuXG5cblxuXG4gICAgZm9yIChjb25zdCBjbGFzc0ZuIG9mIFtcblxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhjbGFzc2VzKSxcbiAgICBdKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IERJVGFvbkNvbnRhaW5lci5yZXNvbHZlKGNsYXNzRm4gYXMgYW55KSBhcyBhbnk7XG4gICAgICBjb25zdCBjbGFzc0luc3RhbmNlc0J5TmFtZU9iaiA9IHRoaXMuY2xhc3NJbnN0YW5jZXNCeU5hbWVPYmpbY2xhc3NUeXBlXTtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IENsYXNzSGVscGVycy5nZXROYW1lKGNsYXNzRm4pO1xuXG4gICAgICBjbGFzc0luc3RhbmNlc0J5TmFtZU9ialtjbGFzc05hbWVdID0gaW5zdGFuY2U7XG5cbiAgICAgIHRoaXMuY29uZmlnW01vZGVscy5DbGFzc1R5cGVLZXlbY2xhc3NUeXBlXV1bY2xhc3NOYW1lXSA9IGNsYXNzRm47XG4gICAgICB0aGlzLm9ialdpdGhDbGFzc2VzSW5zdGFuY2VzQXJyW2NsYXNzVHlwZV0ucHVzaChpbnN0YW5jZSk7XG4gICAgICB0aGlzLmFsbENsYXNzZXNJbnN0YW5jZXNbY2xhc3NOYW1lXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfVxuXG5cblxuICBhc3luYyByZWluaXRDb250cm9sbGVycygpIHtcbiAgICBpZiAodGhpcy5yZW1vdGVIb3N0IHx8IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLm1pZ3JhdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuXG4gICAgY29uc3QgY29udHJvbGxlcnMgPSB0aGlzLmdldENsYXNzZXNJbnN0YW5jZXNBcnJCeShcbiAgICAgIE1vZGVscy5DbGFzc1R5cGUuQ09OVFJPTExFUixcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBjdHJsIG9mIGNvbnRyb2xsZXJzKSB7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKGN0cmwuaW5pdEV4YW1wbGVEYkRhdGEpKSB7XG4gICAgICAgIGF3YWl0IEhlbHBlcnMucnVuU3luY09yQXN5bmMoe1xuICAgICAgICAgIGZ1bmN0aW9uRm46IGN0cmwuaW5pdEV4YW1wbGVEYkRhdGEsXG4gICAgICAgICAgY29udGV4dDogY3RybCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG5cblxuICB9XG4gIGFzeW5jIGluaXRDbGFzc2VzKCkge1xuICAgIGlmICh0aGlzLnJlbW90ZUhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjbGFzc1R5cGVOYW1lIG9mIFtcbiAgICAgIE1vZGVscy5DbGFzc1R5cGUuUFJPVklERVIsXG4gICAgICBNb2RlbHMuQ2xhc3NUeXBlLlJFUE9TSVRPUlksXG4gICAgICBNb2RlbHMuQ2xhc3NUeXBlLkNPTlRST0xMRVIsXG4gICAgICBNb2RlbHMuQ2xhc3NUeXBlLkVOVElUWSxcbiAgICAgIE1vZGVscy5DbGFzc1R5cGUuTUlHUkFUSU9OLFxuICAgIF0pIHtcblxuXG5cblxuICAgICAgZm9yIChjb25zdCBjbGFzc0Z1biBvZiB0aGlzLmdldENsYXNzRnVuQnlBcnIoY2xhc3NUeXBlTmFtZSkgYXMgYW55W10pIHtcbiAgICAgICAgaWYgKF8uaXNGdW5jdGlvbihjbGFzc0Z1bi5fKSkge1xuICAgICAgICAgIGF3YWl0IEhlbHBlcnMucnVuU3luY09yQXN5bmMoe1xuICAgICAgICAgICAgZnVuY3Rpb25GbjogY2xhc3NGdW4uXyxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNsYXNzRnVuLFxuICAgICAgICAgIH0pO1xuXG5cblxuXG5cblxuICAgICAgICB9XG4gICAgICB9XG5cblxuXG5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNsYXNzVHlwZU5hbWUgb2YgW1xuICAgICAgTW9kZWxzLkNsYXNzVHlwZS5QUk9WSURFUixcbiAgICAgIE1vZGVscy5DbGFzc1R5cGUuUkVQT1NJVE9SWSxcbiAgICAgIE1vZGVscy5DbGFzc1R5cGUuQ09OVFJPTExFUixcbiAgICAgIE1vZGVscy5DbGFzc1R5cGUuTUlHUkFUSU9OLFxuICAgIF0pIHtcblxuXG5cblxuICAgICAgZm9yIChjb25zdCBjdHJsIG9mIHRoaXMuZ2V0Q2xhc3Nlc0luc3RhbmNlc0FyckJ5KGNsYXNzVHlwZU5hbWUpKSB7XG4gICAgICAgIGlmIChfLmlzRnVuY3Rpb24oY3RybC5fKSkge1xuICAgICAgICAgIGF3YWl0IEhlbHBlcnMucnVuU3luY09yQXN5bmMoe1xuICAgICAgICAgICAgZnVuY3Rpb25GbjogY3RybC5fLFxuICAgICAgICAgICAgY29udGV4dDogY3RybCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG5cblxuXG4gICAgfVxuICB9XG5cblxuXG4gIGlzQWN0aXZlT24oY2xhc3NJbnN0YW5jZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgbGV0IGNvbnRleHRSZWY6IEVuZHBvaW50Q29udGV4dCA9XG4gICAgICBjbGFzc0luc3RhbmNlW1N5bWJvbHMuY3R4SW5DbGFzc09yQ2xhc3NPYmpdO1xuICAgIHJldHVybiB0aGlzID09PSBjb250ZXh0UmVmO1xuICB9XG5cblxuXG4gIGdldCB1cmkoKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5ob3N0XG4gICAgICA/IG5ldyBVUkwodGhpcy5ob3N0KVxuICAgICAgOiB0aGlzLnJlbW90ZUhvc3RcbiAgICAgICAgPyBuZXcgVVJMKHRoaXMucmVtb3RlSG9zdClcbiAgICAgICAgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG5cblxuICBnZXQgaXNIdHRwU2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLnVyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIGlwYy91ZHAgbmVlZHMgdGhpc1xuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY29udGV4dE5hbWU7XG4gIH1cblxuXG5cbiAgcHVibGljIGdldCBwdWJsaWNBc3NldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5wdWJsaWNBc3NldHMgfHwgW107XG4gIH1cblxuXG5cbiAgZ2V0IGlzUHJvZHVjdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb2R1Y3Rpb25Nb2RlO1xuICB9XG5cblxuXG4gIGdldCByZW1vdGVIb3N0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZW1vdGVIb3N0O1xuICB9XG5cblxuXG4gIGdldCBob3N0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ob3N0O1xuICB9XG5cblxuXG4gIGdldCBvcmdpbigpIHtcbiAgICByZXR1cm4gdGhpcy51cmk/Lm9yaWdpbjtcbiAgfVxuXG5cblxuICBhc3luYyBpbml0U3Vic2NyaWJlcnMoKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICAgIHJldHVybiAodm9pZCAwKTtcbiAgfVxuXG5cblxuICBhc3luYyBpbml0RW50aXRpZXMoKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gIH1cblxuXG5cblxuICBhc3luYyBpbml0RGF0YWJhc2VDb25uZWN0aW9uKCkge1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gICAgcmV0dXJuICh2b2lkIDApO1xuICB9XG5cblxuXG5cbiAgaW5pdENvbnRyb2xsZXJzKCkge1xuICAgIGlmICh0aGlzLmlzUnVuT3JSZXZlcnRPbmx5TWlncmF0aW9uQXBwU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWxsQ29udHJvbGxlcnMgPSB0aGlzLmdldENsYXNzRnVuQnlBcnIoTW9kZWxzLkNsYXNzVHlwZS5DT05UUk9MTEVSKTtcblxuICAgIGZvciAoY29uc3QgY29udHJvbGxlckNsYXNzRm4gb2YgYWxsQ29udHJvbGxlcnMpIHtcbiAgICAgIGNvbnRyb2xsZXJDbGFzc0ZuW1N5bWJvbHMuY2xhc3NNZXRob2RzTmFtZXNdID1cbiAgICAgICAgQ2xhc3NIZWxwZXJzLmdldE1ldGhvZHNOYW1lcyhjb250cm9sbGVyQ2xhc3NGbik7XG4gICAgICBjb25zdCBjb25maWdzID0gQ2xhc3NIZWxwZXJzLmdldENvbnRyb2xsZXJDb25maWdzKGNvbnRyb2xsZXJDbGFzc0ZuKTtcblxuICAgICAgY29uc3QgY2xhc3NDb25maWc6IE1vZGVscy5SdW50aW1lQ29udHJvbGxlckNvbmZpZyA9IGNvbmZpZ3NbMF07XG5cbiAgICAgIGNvbnN0IHBhcmVudHNjYWxjdWxhdGVkUGF0aCA9IF8uc2xpY2UoY29uZmlncywgMSlcbiAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAubWFwKGJjID0+IHtcbiAgICAgICAgICBpZiAoVGFvbkhlbHBlcnMuaXNHb29kUGF0aChiYy5wYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGJjLnBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBiYy5jbGFzc05hbWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcvJyk7XG5cbiAgICAgIGlmIChUYW9uSGVscGVycy5pc0dvb2RQYXRoKGNsYXNzQ29uZmlnLnBhdGgpKSB7XG4gICAgICAgIGNsYXNzQ29uZmlnLmNhbGN1bGF0ZWRQYXRoID0gY2xhc3NDb25maWcucGF0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ29uZmlnLmNhbGN1bGF0ZWRQYXRoID1cbiAgICAgICAgICBgJHtwYXJlbnRzY2FsY3VsYXRlZFBhdGh9LyR7Q2xhc3NIZWxwZXJzLmdldE5hbWUoY29udHJvbGxlckNsYXNzRm4pfWBcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgYmMpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIF8ubGFzdChhY2MpID09PSBiYyA/IGFjYyA6IFsuLi5hY2MsIGJjXTtcbiAgICAgICAgICAgIH0sIFtdKVxuICAgICAgICAgICAgLmpvaW4oJy8nKTtcbiAgICAgIH1cblxuICAgICAgXy5zbGljZShjb25maWdzLCAxKS5mb3JFYWNoKGJjID0+IHtcbiAgICAgICAgY29uc3QgYWxyZWFkeUlzID0gY2xhc3NDb25maWcubWV0aG9kcztcbiAgICAgICAgY29uc3QgdG9NZXJnZSA9IF8uY2xvbmVEZWVwKGJjLm1ldGhvZHMpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0b01lcmdlKSB7XG4gICAgICAgICAgaWYgKHRvTWVyZ2UuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhYWxyZWFkeUlzW2tleV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0b01lcmdlW2tleV07XG4gICAgICAgICAgICBhbHJlYWR5SXNba2V5XSA9IGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuLyogKi9cbi8qICovXG4gIFxuICAgICAgICB0aGlzLmxvZ0h0dHAgJiZcbiAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAgICAgYFt0YW9uXVtleHByZXNzLXNlcnZlcl0gcm91dGVzIFske2NsYXNzQ29uZmlnLmNsYXNzTmFtZX1dYCxcbiAgICAgICAgICApO1xuLyogKi9cbi8qICovXG4gIFxuXG5cbiAgICAgIE9iamVjdC5rZXlzKGNsYXNzQ29uZmlnLm1ldGhvZHMpLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZENvbmZpZzogTW9kZWxzLk1ldGhvZENvbmZpZyA9XG4gICAgICAgICAgY2xhc3NDb25maWcubWV0aG9kc1ttZXRob2ROYW1lXTtcblxuICAgICAgICBjb25zdCB0eXBlOiBNb2RlbHMuSHR0cC5SZXN0Lkh0dHBNZXRob2QgPSBtZXRob2RDb25maWcudHlwZTtcbiAgICAgICAgY29uc3QgZXhwcmVzc1BhdGggPSBtZXRob2RDb25maWcuZ2xvYmFsXG4gICAgICAgICAgPyBgLyR7bWV0aG9kQ29uZmlnLnBhdGg/LnJlcGxhY2UoL1xcLy8sICcnKX1gXG4gICAgICAgICAgOiBUYW9uSGVscGVycy5nZXRFeHByZXNzUGF0aChjbGFzc0NvbmZpZywgbWV0aG9kQ29uZmlnKTtcblxuXG4gICAgICAgIGlmIChIZWxwZXJzLmlzTm9kZSB8fCBIZWxwZXJzLmlzV2ViU1FMKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRJbml0Q2xpZW50ID1cbiAgICAgICAgICBIZWxwZXJzLmlzQnJvd3NlciB8fCB0aGlzLnJlbW90ZUhvc3QgfHwgSGVscGVycy5pc1dlYlNRTDtcblxuICAgICAgICBpZiAoc2hvdWxkSW5pdENsaWVudCkge1xuXG5cblxuXG5cblxuXG4gICAgICAgICAgdGhpcy5pbml0Q2xpZW50KGNvbnRyb2xsZXJDbGFzc0ZuLCB0eXBlLCBtZXRob2RDb25maWcsIGV4cHJlc3NQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbi8qICovXG4vKiAqL1xuICBcbiAgICAgICAgdGhpcy5sb2dIdHRwICYmIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbi8qICovXG4vKiAqL1xuICBcbiAgICB9XG4gIH1cblxuXG5cbiAgcHVibGljIHdyaXRlQWN0aXZlUm91dGVzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVtb3RlSG9zdCB8fFxuICAgICAgdGhpcy5pc1J1bk9yUmV2ZXJ0T25seU1pZ3JhdGlvbkFwcFN0YXJ0IHx8XG4gICAgICB0aGlzLnNraXBXcml0aW5nU2VydmVyUm91dGVzXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHRzOiBFbmRwb2ludENvbnRleHRbXSA9IFt0aGlzXTtcbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gIFxuICB9XG5cblxuXG4gIHB1YmxpYyBnZXQgbWlkZGxld2FyZXMoKTogTW9kZWxzLk1pZGRsZXdhcmVUeXBlW10ge1xuLyogKi9cbi8qICovXG4gICAgcmV0dXJuICh2b2lkIDApO1xuICB9XG5cblxuXG4gIHByaXZhdGUgaW5pdE1pZGRsZXdhcmVzKCkge1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcbiAgfVxuXG5cblxuICBwcml2YXRlIGluaXRTZXJ2ZXIoXG5cbiAgICB0eXBlOiBNb2RlbHMuSHR0cC5SZXN0Lkh0dHBNZXRob2QsXG4gICAgbWV0aG9kQ29uZmlnOiBNb2RlbHMuTWV0aG9kQ29uZmlnLFxuICAgIGNsYXNzQ29uZmlnOiBNb2RlbHMuUnVudGltZUNvbnRyb2xsZXJDb25maWcsXG4gICAgZXhwcmVzc1BhdGg6IHN0cmluZyxcbiAgICB0YXJnZXQ6IEZ1bmN0aW9uLFxuXG4gICk6IGFueSB7XG5cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcblxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJpO1xuXG5cbiAgICBjb25zdCBnZXRSZXN1bHQgPSBhc3luYyAocmVzb2x2ZWRQYXJhbXMsIHJlcSwgcmVzKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZTogTW9kZWxzLkh0dHAuUmVzcG9uc2U8YW55PiA9XG4gICAgICAgIG1ldGhvZENvbmZpZy5kZXNjcmlwdG9yLnZhbHVlLmFwcGx5KFxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENvbnRleHQgZm9yIG1ldGhvZCBAR0VULEBQVVQgZXRjLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuZ2V0SW5zdGFuY2VCeSh0YXJnZXQgYXMgYW55KSxcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBQYXJhbXMgZm9yIG1ldGpvZCBAR0VULCBAUFVUIGV0Yy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICByZXNvbHZlZFBhcmFtcyxcbiAgICAgICAgKTtcbiAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRSZXNwb25zZVZhbHVlKHJlc3BvbnNlLCB7IHJlcSwgcmVzIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG5cbiAgICB1cmwucGF0aG5hbWUgPSB1cmwucGF0aG5hbWUucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICBleHByZXNzUGF0aCA9IHVybC5wYXRobmFtZS5zdGFydHNXaXRoKCcvJylcbiAgICAgID8gYCR7dXJsLnBhdGhuYW1lfSR7ZXhwcmVzc1BhdGh9YFxuICAgICAgOiBleHByZXNzUGF0aDtcbiAgICBleHByZXNzUGF0aCA9IGV4cHJlc3NQYXRoLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpO1xuXG5cblxuICAgIGlmIChIZWxwZXJzLmlzRWxlY3Ryb24pIHtcbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnJlbW90ZUhvc3QpIHtcblxuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcblxuXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVQYXRoOiBleHByZXNzUGF0aCxcbiAgICAgIG1ldGhvZDogbWV0aG9kQ29uZmlnLnR5cGUsXG4gICAgfTtcbiAgfVxuXG5cblxuICAvKipcbiAgICogY2xpZW50IGNhbiBiZSBicm93c2VyIG9yIG5vZGVqcyAod2hlbiByZW1vdGUgaG9zdClcbiAgICovXG4gIHByaXZhdGUgaW5pdENsaWVudChcblxuICAgIHRhcmdldDogRnVuY3Rpb24sXG4gICAgdHlwZTogTW9kZWxzLkh0dHAuUmVzdC5IdHRwTWV0aG9kLFxuICAgIG1ldGhvZENvbmZpZzogTW9kZWxzLkh0dHAuUmVzdC5NZXRob2RDb25maWcsXG4gICAgZXhwcmVzc1BhdGg6IHN0cmluZyxcblxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSB0aGlzO1xuXG4gICAgdGhpcy5sb2dIdHRwICYmIGNvbnNvbGUubG9nKGAke3R5cGU/LnRvVXBwZXJDYXNlKCl9ICR7ZXhwcmVzc1BhdGh9IGApO1xuXG5cbiAgICBsZXQgc3RvcmFnZTogYW55O1xuICAgIGlmIChIZWxwZXJzLmlzQnJvd3Nlcikge1xuICAgICAgc3RvcmFnZSA9IHdpbmRvdztcbiAgICB9XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcblxuXG4gICAgY29uc3Qgb3JnTWV0aG9kcyA9IHRhcmdldC5wcm90b3R5cGVbbWV0aG9kQ29uZmlnLm1ldGhvZE5hbWVdO1xuXG5cblxuICAgIGlmIChIZWxwZXJzLmlzRWxlY3Ryb24pIHtcbiAgICAgIHRhcmdldC5wcm90b3R5cGVbbWV0aG9kQ29uZmlnLm1ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWQgPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICAgIGNvbnN0IHsgcmVxdWVzdCwgcmVzcG9uc2UgfSA9IFRhb25IZWxwZXJzLndlYnNxbE1vY2tzKGhlYWRlcnMpO1xuXG4gICAgICAgICAgSGVscGVycy5pcGNSZW5kZXJlci5vbmNlKFxuICAgICAgICAgICAgVGFvbkhlbHBlcnMuaXBjS2V5TmFtZVJlc3BvbnNlKHRhcmdldCwgbWV0aG9kQ29uZmlnLCBleHByZXNzUGF0aCksXG4gICAgICAgICAgICAoZXZlbnQsIHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgcmVzOiBhbnkgPSByZXNwb25zZURhdGE7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgcmVzcG9uc2VEYXRhIH0pO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSByZXM7XG4gICAgICAgICAgICAgICAgcmVzID0gbmV3IE1vZGVsc05nMlJlc3QuSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBib2R5OiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgIGlzQXJyYXk6IHZvaWQgMCBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kQ29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHVybDogYCR7Y3R4LnVyaS5vcmlnaW59JHtcbiAgICAgICAgICAgICAgICAgICAgICAnJyAvLyBUT0RPIGV4cHJlc3MgcGF0aFxuICAgICAgICAgICAgICAgICAgICB9JHttZXRob2RDb25maWcucGF0aH0gYCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBIZWxwZXJzLmlzQmxvYihib2R5KSB8fCBfLmlzU3RyaW5nKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgID8gYm9keVxuICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICAgICAgICAgICAgUmVzdEhlYWRlcnMuZnJvbShoZWFkZXJzKSxcbiAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICgpID0+IGJvZHksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgSGVscGVycy5pcGNSZW5kZXJlci5zZW5kKFxuICAgICAgICAgICAgVGFvbkhlbHBlcnMuaXBjS2V5TmFtZVJlcXVlc3QodGFyZ2V0LCBtZXRob2RDb25maWcsIGV4cHJlc3NQYXRoKSxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY2VpdmVkWydvYnNlcnZhYmxlJ10gPSBmcm9tKHJlY2VpdmVkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZWNlaXZlZCxcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cblxuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG5cblxuXG5cbiAgICB0YXJnZXQucHJvdG90eXBlW21ldGhvZENvbmZpZy5tZXRob2ROYW1lXSA9IGZ1bmN0aW9uICh0aGlzOiB7fSwgLi4uYXJncykge1xuXG5cblxuXG5cbiAgICAgIGlmICghc3RvcmFnZVtTeW1ib2xzLm9sZC5FTkRQT0lOVF9NRVRBX0NPTkZJR10pXG4gICAgICAgIHN0b3JhZ2VbU3ltYm9scy5vbGQuRU5EUE9JTlRfTUVUQV9DT05GSUddID0ge307XG4gICAgICBpZiAoIXN0b3JhZ2VbU3ltYm9scy5vbGQuRU5EUE9JTlRfTUVUQV9DT05GSUddW2N0eC51cmkuaHJlZl0pXG4gICAgICAgIHN0b3JhZ2VbU3ltYm9scy5vbGQuRU5EUE9JTlRfTUVUQV9DT05GSUddW2N0eC51cmkuaHJlZl0gPSB7fTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IHN0b3JhZ2VbU3ltYm9scy5vbGQuRU5EUE9JTlRfTUVUQV9DT05GSUddO1xuICAgICAgbGV0IHJlc3Q6IE1vZGVsc05nMlJlc3QuUmVzb3VyY2VNb2RlbDxhbnksIGFueT47XG4gICAgICBpZiAoIWVuZHBvaW50c1tjdHgudXJpLmhyZWZdW2V4cHJlc3NQYXRoXSkge1xuICAgICAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAobWV0aG9kQ29uZmlnLmNvbnRlbnRUeXBlICYmICFtZXRob2RDb25maWcucmVzcG9uc2VUeXBlKSB7XG4gICAgICAgICAgcmVzdCA9IFJlc291cmNlLmNyZWF0ZShcbiAgICAgICAgICAgIGN0eC51cmkuaHJlZixcbiAgICAgICAgICAgIGV4cHJlc3NQYXRoLFxuICAgICAgICAgICAgU3ltYm9scy5vbGQuTUFQUElOR19DT05GSUdfSEVBREVSIGFzIGFueSxcbiAgICAgICAgICAgIFN5bWJvbHMub2xkLkNJUkNVUkFMX09CSkVDVFNfTUFQX0JPRFkgYXMgYW55LFxuICAgICAgICAgICAgUmVzdEhlYWRlcnMuZnJvbSh7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBtZXRob2RDb25maWcuY29udGVudFR5cGUsXG4gICAgICAgICAgICAgIEFjY2VwdDogbWV0aG9kQ29uZmlnLmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2RDb25maWcuY29udGVudFR5cGUgJiYgbWV0aG9kQ29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgIHJlc3QgPSBSZXNvdXJjZS5jcmVhdGUoXG4gICAgICAgICAgICBjdHgudXJpLmhyZWYsXG4gICAgICAgICAgICBleHByZXNzUGF0aCxcbiAgICAgICAgICAgIFN5bWJvbHMub2xkLk1BUFBJTkdfQ09ORklHX0hFQURFUiBhcyBhbnksXG4gICAgICAgICAgICBTeW1ib2xzLm9sZC5DSVJDVVJBTF9PQkpFQ1RTX01BUF9CT0RZIGFzIGFueSxcbiAgICAgICAgICAgIFJlc3RIZWFkZXJzLmZyb20oe1xuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogbWV0aG9kQ29uZmlnLmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICBBY2NlcHQ6IG1ldGhvZENvbmZpZy5jb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgcmVzcG9uc2V0eXBlYXhpb3M6IG1ldGhvZENvbmZpZy5yZXNwb25zZVR5cGUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFtZXRob2RDb25maWcuY29udGVudFR5cGUgJiYgbWV0aG9kQ29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgIHJlc3QgPSBSZXNvdXJjZS5jcmVhdGUoXG4gICAgICAgICAgICBjdHgudXJpLmhyZWYsXG4gICAgICAgICAgICBleHByZXNzUGF0aCxcbiAgICAgICAgICAgIFN5bWJvbHMub2xkLk1BUFBJTkdfQ09ORklHX0hFQURFUiBhcyBhbnksXG4gICAgICAgICAgICBTeW1ib2xzLm9sZC5DSVJDVVJBTF9PQkpFQ1RTX01BUF9CT0RZIGFzIGFueSxcbiAgICAgICAgICAgIFJlc3RIZWFkZXJzLmZyb20oe1xuICAgICAgICAgICAgICByZXNwb25zZXR5cGVheGlvczogbWV0aG9kQ29uZmlnLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdCA9IFJlc291cmNlLmNyZWF0ZShcbiAgICAgICAgICAgIGN0eC51cmkuaHJlZixcbiAgICAgICAgICAgIGV4cHJlc3NQYXRoLFxuICAgICAgICAgICAgU3ltYm9scy5vbGQuTUFQUElOR19DT05GSUdfSEVBREVSIGFzIGFueSxcbiAgICAgICAgICAgIFN5bWJvbHMub2xkLkNJUkNVUkFMX09CSkVDVFNfTUFQX0JPRFkgYXMgYW55LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBlbmRwb2ludHNbY3R4LnVyaS5ocmVmXVtleHByZXNzUGF0aF0gPSByZXN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdCA9IGVuZHBvaW50c1tjdHgudXJpLmhyZWZdW2V4cHJlc3NQYXRoXSBhcyBhbnk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGhvZCA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGlzV2l0aEJvZHkgPSBtZXRob2QgPT09ICdwdXQnIHx8IG1ldGhvZCA9PT0gJ3Bvc3QnO1xuICAgICAgY29uc3QgcGF0aFByYW1zID0ge307XG4gICAgICBsZXQgcXVlcnlQYXJhbXMgPSB7fTtcbiAgICAgIGxldCBib2R5T2JqZWN0ID0ge307XG4gICAgICBhcmdzLmZvckVhY2goKHBhcmFtLCBpKSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50UGFyYW06IE1vZGVscy5IdHRwLlJlc3QuUGFyYW1Db25maWcgPSB2b2lkIDAgYXMgYW55O1xuXG4gICAgICAgIGZvciAobGV0IHBwIGluIG1ldGhvZENvbmZpZy5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgbGV0IHYgPSBtZXRob2RDb25maWcucGFyYW1ldGVyc1twcF07XG4gICAgICAgICAgaWYgKHYuaW5kZXggPT09IGkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbSA9IHY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudFBhcmFtLnBhcmFtVHlwZSA9PT0gJ1BhdGgnKSB7XG4gICAgICAgICAgcGF0aFByYW1zW2N1cnJlbnRQYXJhbS5wYXJhbU5hbWVdID0gcGFyYW07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRQYXJhbS5wYXJhbVR5cGUgPT09ICdRdWVyeScpIHtcbiAgICAgICAgICBpZiAoY3VycmVudFBhcmFtLnBhcmFtTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgbWFwcGluZyA9IE1hcHBpbmcuZGVjb2RlKHBhcmFtLCAhY3R4LmlzUHJvZHVjdGlvbk1vZGUpO1xuICAgICAgICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgICAgICAgcmVzdC5oZWFkZXJzLnNldChcbiAgICAgICAgICAgICAgICBgJHtTeW1ib2xzLm9sZC5NQVBQSU5HX0NPTkZJR19IRUFERVJfUVVFUllfUEFSQU1TfSR7Y3VycmVudFBhcmFtLnBhcmFtTmFtZX0gYCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtYXBwaW5nKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2N1cnJlbnRQYXJhbS5wYXJhbU5hbWVdID0gcGFyYW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBpbmcgPSBNYXBwaW5nLmRlY29kZShwYXJhbSwgIWN0eC5pc1Byb2R1Y3Rpb25Nb2RlKTtcbiAgICAgICAgICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICAgICAgICAgIHJlc3QuaGVhZGVycy5zZXQoXG4gICAgICAgICAgICAgICAgU3ltYm9scy5vbGQuTUFQUElOR19DT05GSUdfSEVBREVSX1FVRVJZX1BBUkFNUyxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtYXBwaW5nKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gXy5jbG9uZURlZXAocGFyYW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFBhcmFtLnBhcmFtVHlwZSA9PT0gJ0hlYWRlcicpIHtcbiAgICAgICAgICBpZiAoY3VycmVudFBhcmFtLnBhcmFtTmFtZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbS5wYXJhbU5hbWUgPT09IFN5bWJvbHMub2xkLk1EQ19LRVkpIHtcblxuICAgICAgICAgICAgICByZXN0LmhlYWRlcnMuc2V0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbS5wYXJhbU5hbWUsXG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHBhcmFtKSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN0LmhlYWRlcnMuc2V0KGN1cnJlbnRQYXJhbS5wYXJhbU5hbWUsIHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaGVhZGVyIGluIHBhcmFtKSB7XG4gICAgICAgICAgICAgIHJlc3QuaGVhZGVycy5zZXQoaGVhZGVyLCBwYXJhbVtoZWFkZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRQYXJhbS5wYXJhbVR5cGUgPT09ICdDb29raWUnKSB7XG4gICAgICAgICAgUmVzb3VyY2UuQ29va2llcy53cml0ZShcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbS5wYXJhbU5hbWUsXG4gICAgICAgICAgICBwYXJhbSxcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbS5leHBpcmVJblNlY29uZHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFBhcmFtLnBhcmFtVHlwZSA9PT0gJ0JvZHknKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbS5wYXJhbU5hbWUpIHtcbiAgICAgICAgICAgIGlmIChDbGFzc0hlbHBlcnMuZ2V0TmFtZShib2R5T2JqZWN0KSA9PT0gJ0Zvcm1EYXRhJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFt0YW9uIC0gZnJhbWV3b3JrXSBEb24gdXNlIHBhcmFtIG5hbWVzIHdoZW4gcG9zdGluZyAvIHB1dHRpbmcgRm9ybURhdGEuXG4gICAgICAgICAgICAgIFVzZSB0aGlzOlxuXG4oQFRhb24uSHR0cC5QYXJhbS5Cb2R5KCkgZm9ybURhdGE6IEZvcm1EYXRhKSAuLi5cblxuXG5pbnN0ZWFkXG5cbiAgKEBUYW9uLkh0dHAuUGFyYW0uQm9keSgnJHtjdXJyZW50UGFyYW0ucGFyYW1OYW1lfScpIGZvcm1EYXRhOiBGb3JtRGF0YSkgLi4uXG5cbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWFwcGluZyA9IE1hcHBpbmcuZGVjb2RlKHBhcmFtLCAhY3R4LmlzUHJvZHVjdGlvbk1vZGUpO1xuICAgICAgICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgICAgICAgcmVzdC5oZWFkZXJzLnNldChcbiAgICAgICAgICAgICAgICBgJHtTeW1ib2xzLm9sZC5NQVBQSU5HX0NPTkZJR19IRUFERVJfQk9EWV9QQVJBTVN9JHtjdXJyZW50UGFyYW0ucGFyYW1OYW1lfSBgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1hcHBpbmcpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYm9keU9iamVjdFtjdXJyZW50UGFyYW0ucGFyYW1OYW1lXSA9IHBhcmFtO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXBwaW5nID0gTWFwcGluZy5kZWNvZGUocGFyYW0sICFjdHguaXNQcm9kdWN0aW9uTW9kZSk7XG4gICAgICAgICAgICBpZiAobWFwcGluZykge1xuICAgICAgICAgICAgICByZXN0LmhlYWRlcnMuc2V0KFxuICAgICAgICAgICAgICAgIFN5bWJvbHMub2xkLk1BUFBJTkdfQ09ORklHX0hFQURFUl9CT0RZX1BBUkFNUyxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtYXBwaW5nKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHlPYmplY3QgPSBwYXJhbTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBib2R5T2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBDbGFzc0hlbHBlcnMuZ2V0TmFtZShib2R5T2JqZWN0KSAhPT0gJ0Zvcm1EYXRhJ1xuICAgICAgKSB7XG4gICAgICAgIGxldCBjaXJjdXJhbEZyb21JdGVtID0gW107XG4gICAgICAgIGJvZHlPYmplY3QgPSBKU09OMTAucGFyc2UoXG4gICAgICAgICAgSlNPTjEwLnN0cmluZ2lmeShib2R5T2JqZWN0LCB2b2lkIDAsIHZvaWQgMCwgY2lyY3MgPT4ge1xuICAgICAgICAgICAgY2lyY3VyYWxGcm9tSXRlbSA9IGNpcmNzO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXN0LmhlYWRlcnMuc2V0KFxuICAgICAgICAgIFN5bWJvbHMub2xkLkNJUkNVUkFMX09CSkVDVFNfTUFQX0JPRFksXG4gICAgICAgICAgSlNPTjEwLnN0cmluZ2lmeShjaXJjdXJhbEZyb21JdGVtKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBxdWVyeVBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbGV0IGNpcmN1cmFsRnJvbVF1ZXJ5UGFyYW1zID0gW107XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gSlNPTjEwLnBhcnNlKFxuICAgICAgICAgIEpTT04xMC5zdHJpbmdpZnkocXVlcnlQYXJhbXMsIHZvaWQgMCwgdm9pZCAwLCBjaXJjcyA9PiB7XG4gICAgICAgICAgICBjaXJjdXJhbEZyb21RdWVyeVBhcmFtcyA9IGNpcmNzO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3QuaGVhZGVycy5zZXQoXG4gICAgICAgICAgU3ltYm9scy5vbGQuQ0lSQ1VSQUxfT0JKRUNUU19NQVBfUVVFUllfUEFSQU0sXG4gICAgICAgICAgSlNPTjEwLnN0cmluZ2lmeShjaXJjdXJhbEZyb21RdWVyeVBhcmFtcyksXG4gICAgICAgICk7XG4gICAgICB9XG5cblxuICAgICAgY29uc3QgaHR0cFJlc3VsdE9iaiA9IHtcbiAgICAgICAgcmVjZWl2ZWQ6IGlzV2l0aEJvZHlcbiAgICAgICAgICA/IHJlc3QubW9kZWwocGF0aFByYW1zKVttZXRob2RdKGJvZHlPYmplY3QsIFtxdWVyeVBhcmFtc10pXG4gICAgICAgICAgOiByZXN0Lm1vZGVsKHBhdGhQcmFtcylbbWV0aG9kXShbcXVlcnlQYXJhbXNdKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gaHR0cFJlc3VsdE9iajtcbiAgICB9O1xuXG4gIH1cblxufVxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9dGFvbiBsaWIvZW5kcG9pbnQtY29udGV4dC50cyJdfQ==