breeze-client 2.2.1-cjs → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
  2. package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
  3. package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
  4. package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
  5. package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
  6. package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
  7. package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
  8. package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
  9. package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
  10. package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
  11. package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
  12. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
  13. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +49 -0
  14. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
  15. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
  16. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +49 -0
  17. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
  18. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
  19. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +49 -0
  20. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
  21. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
  22. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
  23. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
  24. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
  25. package/esm2022/adapter-data-service-odata/adapter-core.mjs +49 -0
  26. package/{esm5/adapter-data-service-odata/adapter-data-service-odata.js → esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs} +138 -147
  27. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
  28. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
  29. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
  30. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
  31. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
  32. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
  33. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
  34. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +49 -0
  35. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
  36. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
  37. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +49 -0
  38. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
  39. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
  40. package/esm2022/breeze-client.mjs +5 -0
  41. package/esm2022/index.mjs +2 -0
  42. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
  43. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
  44. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
  45. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
  46. package/esm2022/src/abstract-data-service-adapter.mjs +325 -0
  47. package/esm2022/src/array.mjs +4 -0
  48. package/esm2022/src/assert-param.mjs +330 -0
  49. package/esm2022/src/breeze.mjs +85 -0
  50. package/esm2022/src/complex-array.mjs +117 -0
  51. package/esm2022/src/config.mjs +232 -0
  52. package/esm2022/src/core.mjs +712 -0
  53. package/esm2022/src/csdl-metadata-parser.mjs +385 -0
  54. package/esm2022/src/data-service.mjs +221 -0
  55. package/esm2022/src/data-type.mjs +510 -0
  56. package/esm2022/src/default-property-interceptor.mjs +460 -0
  57. package/{esm2015/src/entity-action.js → esm2022/src/entity-action.mjs} +25 -25
  58. package/esm2022/src/entity-aspect.mjs +897 -0
  59. package/esm2022/src/entity-group.mjs +192 -0
  60. package/esm2022/src/entity-key.mjs +125 -0
  61. package/esm2022/src/entity-manager.mjs +2163 -0
  62. package/esm2022/src/entity-metadata.mjs +2242 -0
  63. package/esm2022/src/entity-query.mjs +1024 -0
  64. package/esm2022/src/entity-state.mjs +107 -0
  65. package/esm2022/src/enum.mjs +143 -0
  66. package/esm2022/src/event.mjs +264 -0
  67. package/esm2022/src/interface-registry.mjs +39 -0
  68. package/esm2022/src/key-generator.mjs +110 -0
  69. package/esm2022/src/local-query-comparison-options.mjs +65 -0
  70. package/esm2022/src/mapping-context.mjs +411 -0
  71. package/esm2022/src/naming-convention.mjs +92 -0
  72. package/esm2022/src/observable-array.mjs +183 -0
  73. package/esm2022/src/predicate.mjs +1259 -0
  74. package/esm2022/src/primitive-array.mjs +85 -0
  75. package/esm2022/src/query-options.mjs +152 -0
  76. package/esm2022/src/relation-array.mjs +173 -0
  77. package/esm2022/src/save-options.mjs +41 -0
  78. package/esm2022/src/unattached-children-map.mjs +56 -0
  79. package/esm2022/src/validate.mjs +995 -0
  80. package/esm2022/src/validation-options.mjs +64 -0
  81. package/{fesm2015/breeze-client-adapter-ajax-angularjs.js → fesm2022/breeze-client-adapter-ajax-angularjs.mjs} +6 -1
  82. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  83. package/{fesm2015/breeze-client-adapter-ajax-fetch.js → fesm2022/breeze-client-adapter-ajax-fetch.mjs} +9 -4
  84. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  85. package/{fesm2015/breeze-client-adapter-ajax-httpclient.js → fesm2022/breeze-client-adapter-ajax-httpclient.mjs} +6 -4
  86. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  87. package/{fesm2015/breeze-client-adapter-ajax-jquery.js → fesm2022/breeze-client-adapter-ajax-jquery.mjs} +6 -2
  88. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  89. package/{fesm2015/breeze-client-adapter-ajax-post.js → fesm2022/breeze-client-adapter-ajax-post.mjs} +1 -1
  90. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +1 -0
  91. package/{fesm2015/breeze-client-adapter-data-service-odata.js → fesm2022/breeze-client-adapter-data-service-odata.mjs} +68 -69
  92. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  93. package/{fesm2015/breeze-client-adapter-data-service-webapi.js → fesm2022/breeze-client-adapter-data-service-webapi.mjs} +30 -30
  94. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  95. package/{fesm2015/breeze-client-adapter-model-library-backing-store.js → fesm2022/breeze-client-adapter-model-library-backing-store.mjs} +14 -13
  96. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  97. package/{fesm2015/breeze-client-adapter-model-library-ko.js → fesm2022/breeze-client-adapter-model-library-ko.mjs} +14 -13
  98. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  99. package/{fesm2015/breeze-client-adapter-uri-builder-json.js → fesm2022/breeze-client-adapter-uri-builder-json.mjs} +9 -8
  100. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  101. package/{fesm2015/breeze-client-adapter-uri-builder-odata.js → fesm2022/breeze-client-adapter-uri-builder-odata.mjs} +86 -86
  102. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  103. package/{fesm2015/breeze-client-mixin-get-entity-graph.js → fesm2022/breeze-client-mixin-get-entity-graph.mjs} +1 -1
  104. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  105. package/{fesm2015/breeze-client-mixin-save-queuing.js → fesm2022/breeze-client-mixin-save-queuing.mjs} +23 -2
  106. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +1 -0
  107. package/{fesm2015/breeze-client.js → fesm2022/breeze-client.mjs} +1933 -1538
  108. package/fesm2022/breeze-client.mjs.map +1 -0
  109. package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
  110. package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
  111. package/package.json +94 -12
  112. package/src/config.d.ts +1 -1
  113. package/src/core.d.ts +1 -1
  114. package/src/entity-aspect.d.ts +1 -1
  115. package/src/entity-metadata.d.ts +8 -6
  116. package/src/entity-query.d.ts +1 -1
  117. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
  118. package/adapter-ajax-angularjs/package.json +0 -13
  119. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
  120. package/adapter-ajax-fetch/package.json +0 -13
  121. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
  122. package/adapter-ajax-httpclient/package.json +0 -13
  123. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
  124. package/adapter-ajax-jquery/package.json +0 -13
  125. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
  126. package/adapter-ajax-post/package.json +0 -13
  127. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
  128. package/adapter-data-service-odata/package.json +0 -13
  129. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
  130. package/adapter-data-service-webapi/package.json +0 -13
  131. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
  132. package/adapter-model-library-backing-store/package.json +0 -13
  133. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
  134. package/adapter-model-library-ko/package.json +0 -13
  135. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
  136. package/adapter-uri-builder-json/package.json +0 -13
  137. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
  138. package/adapter-uri-builder-odata/package.json +0 -13
  139. package/breeze-client.d.ts +0 -8
  140. package/breeze-client.metadata.json +0 -1
  141. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
  142. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
  143. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
  144. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
  145. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
  146. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
  147. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
  148. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
  149. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
  150. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
  151. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
  152. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
  153. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
  154. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
  155. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
  156. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
  157. package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
  158. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
  159. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
  160. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
  161. package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -747
  162. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
  163. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
  164. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
  165. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -333
  166. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
  167. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
  168. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
  169. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
  170. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
  171. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
  172. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
  173. package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
  174. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
  175. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
  176. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
  177. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
  178. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
  179. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
  180. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
  181. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
  182. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
  183. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
  184. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
  185. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
  186. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
  187. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
  188. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
  189. package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
  190. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
  191. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
  192. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
  193. package/bundles/breeze-client.umd.js +0 -14234
  194. package/bundles/breeze-client.umd.js.map +0 -1
  195. package/bundles/breeze-client.umd.min.js +0 -16
  196. package/bundles/breeze-client.umd.min.js.map +0 -1
  197. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
  198. package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
  199. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  200. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
  201. package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
  202. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  203. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
  204. package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
  205. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  206. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
  207. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  208. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
  209. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  210. package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
  211. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -463
  212. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  213. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -100
  214. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  215. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
  216. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  217. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
  218. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  219. package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
  220. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
  221. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  222. package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
  223. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
  224. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  225. package/esm2015/breeze-client.js +0 -9
  226. package/esm2015/index.js +0 -2
  227. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  228. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  229. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  230. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
  231. package/esm2015/src/abstract-data-service-adapter.js +0 -327
  232. package/esm2015/src/array.js +0 -4
  233. package/esm2015/src/assert-param.js +0 -312
  234. package/esm2015/src/breeze.js +0 -85
  235. package/esm2015/src/complex-array.js +0 -119
  236. package/esm2015/src/config.js +0 -223
  237. package/esm2015/src/core.js +0 -714
  238. package/esm2015/src/csdl-metadata-parser.js +0 -385
  239. package/esm2015/src/data-service.js +0 -203
  240. package/esm2015/src/data-type.js +0 -506
  241. package/esm2015/src/default-property-interceptor.js +0 -460
  242. package/esm2015/src/entity-aspect.js +0 -804
  243. package/esm2015/src/entity-group.js +0 -187
  244. package/esm2015/src/entity-key.js +0 -116
  245. package/esm2015/src/entity-manager.js +0 -2094
  246. package/esm2015/src/entity-metadata.js +0 -2109
  247. package/esm2015/src/entity-query.js +0 -1015
  248. package/esm2015/src/entity-state.js +0 -107
  249. package/esm2015/src/enum.js +0 -141
  250. package/esm2015/src/event.js +0 -256
  251. package/esm2015/src/interface-registry.js +0 -41
  252. package/esm2015/src/key-generator.js +0 -108
  253. package/esm2015/src/local-query-comparison-options.js +0 -65
  254. package/esm2015/src/mapping-context.js +0 -411
  255. package/esm2015/src/naming-convention.js +0 -88
  256. package/esm2015/src/observable-array.js +0 -185
  257. package/esm2015/src/predicate.js +0 -1242
  258. package/esm2015/src/primitive-array.js +0 -87
  259. package/esm2015/src/query-options.js +0 -152
  260. package/esm2015/src/relation-array.js +0 -175
  261. package/esm2015/src/save-options.js +0 -41
  262. package/esm2015/src/unattached-children-map.js +0 -58
  263. package/esm2015/src/validate.js +0 -991
  264. package/esm2015/src/validation-options.js +0 -64
  265. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
  266. package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
  267. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  268. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
  269. package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
  270. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  271. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
  272. package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
  273. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  274. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
  275. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  276. package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
  277. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  278. package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
  279. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  280. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -105
  281. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  282. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
  283. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  284. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
  285. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  286. package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
  287. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
  288. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  289. package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
  290. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
  291. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  292. package/esm5/breeze-client.js +0 -9
  293. package/esm5/index.js +0 -2
  294. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  295. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  296. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  297. package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
  298. package/esm5/src/abstract-data-service-adapter.js +0 -333
  299. package/esm5/src/array.js +0 -4
  300. package/esm5/src/assert-param.js +0 -317
  301. package/esm5/src/breeze.js +0 -85
  302. package/esm5/src/complex-array.js +0 -119
  303. package/esm5/src/config.js +0 -228
  304. package/esm5/src/core.js +0 -722
  305. package/esm5/src/csdl-metadata-parser.js +0 -385
  306. package/esm5/src/data-service.js +0 -207
  307. package/esm5/src/data-type.js +0 -513
  308. package/esm5/src/default-property-interceptor.js +0 -460
  309. package/esm5/src/entity-action.js +0 -52
  310. package/esm5/src/entity-aspect.js +0 -810
  311. package/esm5/src/entity-group.js +0 -189
  312. package/esm5/src/entity-key.js +0 -118
  313. package/esm5/src/entity-manager.js +0 -2112
  314. package/esm5/src/entity-metadata.js +0 -2144
  315. package/esm5/src/entity-query.js +0 -1042
  316. package/esm5/src/entity-state.js +0 -114
  317. package/esm5/src/enum.js +0 -144
  318. package/esm5/src/event.js +0 -259
  319. package/esm5/src/interface-registry.js +0 -43
  320. package/esm5/src/key-generator.js +0 -111
  321. package/esm5/src/local-query-comparison-options.js +0 -67
  322. package/esm5/src/mapping-context.js +0 -413
  323. package/esm5/src/naming-convention.js +0 -90
  324. package/esm5/src/observable-array.js +0 -201
  325. package/esm5/src/predicate.js +0 -1307
  326. package/esm5/src/primitive-array.js +0 -87
  327. package/esm5/src/query-options.js +0 -167
  328. package/esm5/src/relation-array.js +0 -175
  329. package/esm5/src/save-options.js +0 -43
  330. package/esm5/src/unattached-children-map.js +0 -60
  331. package/esm5/src/validate.js +0 -996
  332. package/esm5/src/validation-options.js +0 -66
  333. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  334. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
  335. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  336. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
  337. package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
  338. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
  339. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
  340. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  341. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
  342. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
  343. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  344. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
  345. package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
  346. package/fesm2015/breeze-client.js.map +0 -1
  347. package/fesm5/breeze-client-adapter-ajax-angularjs.js +0 -186
  348. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  349. package/fesm5/breeze-client-adapter-ajax-fetch.js +0 -186
  350. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
  351. package/fesm5/breeze-client-adapter-ajax-httpclient.js +0 -193
  352. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  353. package/fesm5/breeze-client-adapter-ajax-jquery.js +0 -111
  354. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
  355. package/fesm5/breeze-client-adapter-ajax-post.js +0 -86
  356. package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
  357. package/fesm5/breeze-client-adapter-data-service-odata.js +0 -523
  358. package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
  359. package/fesm5/breeze-client-adapter-data-service-webapi.js +0 -111
  360. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
  361. package/fesm5/breeze-client-adapter-model-library-backing-store.js +0 -276
  362. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  363. package/fesm5/breeze-client-adapter-model-library-ko.js +0 -248
  364. package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
  365. package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
  366. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
  367. package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
  368. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  369. package/fesm5/breeze-client-mixin-get-entity-graph.js +0 -254
  370. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
  371. package/fesm5/breeze-client-mixin-save-queuing.js +0 -356
  372. package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
  373. package/fesm5/breeze-client.js +0 -13956
  374. package/fesm5/breeze-client.js.map +0 -1
  375. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
  376. package/mixin-get-entity-graph/package.json +0 -13
  377. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
  378. package/mixin-save-queuing/package.json +0 -13
@@ -1,714 +0,0 @@
1
- /** See if this comment will make it into .d.ts */
2
- import { BreezeEnum } from './enum';
3
- let hasOwnProperty = uncurry(Object.prototype.hasOwnProperty);
4
- let arraySlice = uncurry(Array.prototype.slice);
5
- const ɵ0 = function () {
6
- try {
7
- return !!(Object.getPrototypeOf && Object.defineProperty({}, 'x', {}));
8
- }
9
- catch (e) {
10
- return false;
11
- }
12
- };
13
- let isES5Supported = ɵ0();
14
- // iterate over object
15
- function objectForEach(obj, kvFn) {
16
- for (let key in obj) {
17
- if (hasOwnProperty(obj, key)) {
18
- kvFn(key, obj[key]);
19
- }
20
- }
21
- }
22
- function objectMap(obj, kvFn) {
23
- let results = [];
24
- for (let key in obj) {
25
- if (hasOwnProperty(obj, key)) {
26
- let result = kvFn ? kvFn(key, obj[key]) : obj[key];
27
- if (result !== undefined) {
28
- results.push(result);
29
- }
30
- }
31
- }
32
- return results;
33
- }
34
- function objectFirst(obj, kvPredicate) {
35
- for (let key in obj) {
36
- if (hasOwnProperty(obj, key)) {
37
- let value = obj[key];
38
- if (kvPredicate(key, value)) {
39
- return { key: key, value: value };
40
- }
41
- }
42
- }
43
- return null;
44
- }
45
- function arrayFlatMap(arr, mapFn) {
46
- return Array.prototype.concat.apply([], arr.map(mapFn));
47
- }
48
- function isSettable(obj, propertyName) {
49
- let pd = getPropDescriptor(obj, propertyName);
50
- if (pd == null)
51
- return true;
52
- return !!(pd.writable || pd.set);
53
- }
54
- function getPropDescriptor(obj, propertyName) {
55
- if (!isES5Supported)
56
- return undefined;
57
- if (obj.hasOwnProperty(propertyName)) {
58
- return Object.getOwnPropertyDescriptor(obj, propertyName);
59
- }
60
- else {
61
- let nextObj = Object.getPrototypeOf(obj);
62
- if (nextObj == null)
63
- return undefined;
64
- return getPropDescriptor(nextObj, propertyName);
65
- }
66
- }
67
- // Functional extensions
68
- /** can be used like: persons.filter(propEq("firstName", "John")) */
69
- function propEq(propertyName, value) {
70
- return function (obj) {
71
- return obj[propertyName] === value;
72
- };
73
- }
74
- /** can be used like: persons.filter(propEq("firstName", "FirstName", "John")) */
75
- function propsEq(property1Name, property2Name, value) {
76
- return function (obj) {
77
- return obj[property1Name] === value || obj[property2Name] === value;
78
- };
79
- }
80
- /** can be used like persons.map(pluck("firstName")) */
81
- function pluck(propertyName) {
82
- return function (obj) {
83
- return obj[propertyName];
84
- };
85
- }
86
- // end functional extensions
87
- /** Return an array of property values from source */
88
- function getOwnPropertyValues(source) {
89
- let result = [];
90
- for (let name in source) {
91
- if (hasOwnProperty(source, name)) {
92
- result.push(source[name]);
93
- }
94
- }
95
- return result;
96
- }
97
- /** Copy properties from source to target. Returns target. */
98
- function extend(target, source, propNames) {
99
- if (!source)
100
- return target;
101
- if (propNames) {
102
- propNames.forEach(function (propName) {
103
- target[propName] = source[propName];
104
- });
105
- }
106
- else {
107
- for (let propName in source) {
108
- if (hasOwnProperty(source, propName)) {
109
- target[propName] = source[propName];
110
- }
111
- }
112
- }
113
- return target;
114
- }
115
- /** Copy properties from defaults iff undefined on target. Returns target. */
116
- function updateWithDefaults(target, defaults) {
117
- for (let name in defaults) {
118
- if (target[name] === undefined) {
119
- target[name] = defaults[name];
120
- }
121
- }
122
- return target;
123
- }
124
- /** Set ctor.defaultInstance to an instance of ctor with properties from target.
125
- We want to insure that the object returned by ctor.defaultInstance is always immutable
126
- Use 'target' as the primary template for the ctor.defaultInstance;
127
- Use current 'ctor.defaultInstance' as the template for any missing properties
128
- creates a new instance for ctor.defaultInstance
129
- returns target unchanged */
130
- function setAsDefault(target, ctor) {
131
- ctor.defaultInstance = updateWithDefaults(new ctor(target), ctor.defaultInstance);
132
- return target;
133
- }
134
- /**
135
- 'source' is an object that will be transformed into another
136
- 'template' is a map where the
137
- keys: are the keys to return
138
- if a key contains ','s then the key is treated as a delimited string with first of the
139
- keys being the key to return and the others all valid aliases for this key
140
- 'values' are either
141
- 1) the 'default' value of the key
142
- 2) a function that takes in the source value and should return the value to set
143
- The value from the source is then set on the target,
144
- after first passing thru the fn, if provided, UNLESS:
145
- 1) it is the default value
146
- 2) it is undefined ( nulls WILL be set)
147
- 'target' is optional
148
- - if it exists then properties of the target will be set ( overwritten if the exist)
149
- - if it does not exist then a new object will be created as filled.
150
- 'target is returned.
151
- */
152
- function toJson(source, template, target = {}) {
153
- for (let key in template) {
154
- let aliases = key.split(",");
155
- let defaultValue = template[key];
156
- // using some as a forEach with a 'break'
157
- aliases.some(function (propName) {
158
- if (!(propName in source))
159
- return false;
160
- let value = source[propName];
161
- // there is a functional property defined with this alias ( not what we want to replace).
162
- if (typeof value === 'function')
163
- return false;
164
- // '==' is deliberate here - idea is that null or undefined values will never get serialized
165
- // if default value is set to null.
166
- // tslint:disable-next-line
167
- if (value == defaultValue)
168
- return true;
169
- if (Array.isArray(value) && value.length === 0)
170
- return true;
171
- if (typeof (defaultValue) === "function") {
172
- value = defaultValue(value);
173
- }
174
- else if (typeof (value) === "object") {
175
- if (value && value instanceof BreezeEnum) {
176
- value = value.name;
177
- }
178
- }
179
- if (value === undefined)
180
- return true;
181
- target[aliases[0]] = value;
182
- return true;
183
- });
184
- }
185
- return target;
186
- }
187
- /** Replacer function for toJSONSafe, when serializing entities. Excludes entityAspect and other internal properties. */
188
- function toJSONSafeReplacer(prop, val) {
189
- if (prop === "entityAspect" || prop === "complexAspect" || prop === "entityType" || prop === "complexType"
190
- || prop === "getProperty" || prop === "setProperty"
191
- || prop === "constructor" || prop.charAt(0) === '_' || prop.charAt(0) === '$')
192
- return;
193
- return val;
194
- }
195
- /** Safely perform toJSON logic on objects with cycles. */
196
- function toJSONSafe(obj, replacer) {
197
- if (obj !== Object(obj))
198
- return obj; // primitive value
199
- if (obj._$visited)
200
- return undefined;
201
- if (obj.toJSON) {
202
- let newObj = obj.toJSON();
203
- if (newObj !== Object(newObj))
204
- return newObj; // primitive value
205
- if (newObj !== obj)
206
- return toJSONSafe(newObj, replacer);
207
- // toJSON returned the object unchanged.
208
- obj = newObj;
209
- }
210
- obj._$visited = true;
211
- let result;
212
- if (obj instanceof Array) {
213
- result = obj.map(function (o) {
214
- return toJSONSafe(o, replacer);
215
- });
216
- }
217
- else if (typeof (obj) === "function") {
218
- result = undefined;
219
- }
220
- else {
221
- result = {};
222
- for (let prop in obj) {
223
- if (prop === "_$visited")
224
- continue;
225
- let val = obj[prop];
226
- if (replacer) {
227
- val = replacer(prop, val);
228
- if (val === undefined)
229
- continue;
230
- }
231
- val = toJSONSafe(val, replacer);
232
- if (val === undefined)
233
- continue;
234
- result[prop] = val;
235
- }
236
- }
237
- delete obj._$visited;
238
- return result;
239
- }
240
- /** Resolves the values of a list of properties by checking each property in multiple sources until a value is found. */
241
- function resolveProperties(sources, propertyNames) {
242
- let r = {};
243
- let length = sources.length;
244
- propertyNames.forEach(function (pn) {
245
- for (let i = 0; i < length; i++) {
246
- let src = sources[i];
247
- if (src) {
248
- let val = src[pn];
249
- if (val !== undefined) {
250
- r[pn] = val;
251
- break;
252
- }
253
- }
254
- }
255
- });
256
- return r;
257
- }
258
- // array functions
259
- function toArray(item) {
260
- if (item == null) {
261
- return [];
262
- }
263
- else if (Array.isArray(item)) {
264
- return item;
265
- }
266
- else {
267
- return [item];
268
- }
269
- }
270
- /** a version of Array.map that doesn't require an array, i.e. works on arrays and scalars. */
271
- // function map<T, U>(items: T | T[], fn: (v: T, ix?: number) => U, includeNull?: boolean): U | U[] {
272
- function map(items, fn, includeNull) {
273
- // whether to return nulls in array of results; default = true;
274
- includeNull = includeNull == null ? true : includeNull;
275
- if (items == null)
276
- return items;
277
- // let result: U[];
278
- if (Array.isArray(items)) {
279
- let result = [];
280
- items.forEach(function (v, ix) {
281
- let r = fn(v, ix);
282
- if (r != null || includeNull) {
283
- result[ix] = r;
284
- }
285
- });
286
- return result;
287
- }
288
- else {
289
- let result = fn(items);
290
- return result;
291
- }
292
- }
293
- function arrayFirst(array, predicate) {
294
- for (let i = 0, j = array.length; i < j; i++) {
295
- if (predicate(array[i])) {
296
- return array[i];
297
- }
298
- }
299
- return null;
300
- }
301
- function arrayIndexOf(array, predicate) {
302
- for (let i = 0, j = array.length; i < j; i++) {
303
- if (predicate(array[i]))
304
- return i;
305
- }
306
- return -1;
307
- }
308
- /** Add item if not already in array */
309
- function arrayAddItemUnique(array, item) {
310
- let ix = array.indexOf(item);
311
- if (ix === -1)
312
- array.push(item);
313
- }
314
- /** Remove items from the array
315
- * @param array
316
- * @param predicateOrItem - item to remove, or function to determine matching item
317
- * @param shouldRemoveMultiple - true to keep removing after first match, false otherwise
318
- */
319
- function arrayRemoveItem(array, predicateOrItem, shouldRemoveMultiple) {
320
- let predicate = (isFunction(predicateOrItem) ? predicateOrItem : undefined);
321
- let lastIx = array.length - 1;
322
- let removed = false;
323
- for (let i = lastIx; i >= 0; i--) {
324
- if (predicate ? predicate(array[i]) : (array[i] === predicateOrItem)) {
325
- array.splice(i, 1);
326
- removed = true;
327
- if (!shouldRemoveMultiple) {
328
- return true;
329
- }
330
- }
331
- }
332
- return removed;
333
- }
334
- /** Combine array elements using the callback. Returns array with length == min(a1.length, a2.length) */
335
- function arrayZip(a1, a2, callback) {
336
- let result = [];
337
- let n = Math.min(a1.length, a2.length);
338
- for (let i = 0; i < n; ++i) {
339
- result.push(callback(a1[i], a2[i]));
340
- }
341
- return result;
342
- }
343
- //function arrayDistinct(array) {
344
- // array = array || [];
345
- // let result = [];
346
- // for (let i = 0, j = array.length; i < j; i++) {
347
- // if (result.indexOf(array[i]) < 0)
348
- // result.push(array[i]);
349
- // }
350
- // return result;
351
- //}
352
- // Not yet needed
353
- //// much faster but only works on array items with a toString method that
354
- //// returns distinct string for distinct objects. So this is safe for arrays with primitive
355
- //// types but not for arrays with object types, unless toString() has been implemented.
356
- //function arrayDistinctUnsafe(array) {
357
- // let o = {}, i, l = array.length, r = [];
358
- // for (i = 0; i < l; i += 1) {
359
- // let v = array[i];
360
- // o[v] = v;
361
- // }
362
- // for (i in o) r.push(o[i]);
363
- // return r;
364
- //}
365
- function arrayEquals(a1, a2, equalsFn) {
366
- //Check if the arrays are undefined/null
367
- if (!a1 || !a2)
368
- return false;
369
- if (a1.length !== a2.length)
370
- return false;
371
- //go thru all the vars
372
- for (let i = 0; i < a1.length; i++) {
373
- //if the let is an array, we need to make a recursive check
374
- //otherwise we'll just compare the values
375
- if (Array.isArray(a1[i])) {
376
- if (!arrayEquals(a1[i], a2[i]))
377
- return false;
378
- }
379
- else {
380
- if (equalsFn) {
381
- if (!equalsFn(a1[i], a2[i]))
382
- return false;
383
- }
384
- else {
385
- if (a1[i] !== a2[i])
386
- return false;
387
- }
388
- }
389
- }
390
- return true;
391
- }
392
- // end of array functions
393
- /** Returns an array for a source and a prop, and creates the prop if needed. */
394
- function getArray(source, propName) {
395
- let arr = source[propName];
396
- if (!arr) {
397
- arr = [];
398
- source[propName] = arr;
399
- }
400
- return arr;
401
- }
402
- /** Calls requireLibCore on semicolon-separated libNames */
403
- function requireLib(libNames, errMessage) {
404
- let arrNames = libNames.split(";");
405
- for (let i = 0, j = arrNames.length; i < j; i++) {
406
- let lib = requireLibCore(arrNames[i]);
407
- if (lib)
408
- return lib;
409
- }
410
- if (errMessage) {
411
- throw new Error("Unable to initialize " + libNames + ". " + errMessage);
412
- }
413
- }
414
- /** Returns the 'libName' module if loaded or else returns undefined */
415
- function requireLibCore(libName) {
416
- let win = window || (global ? global.window : undefined);
417
- if (!win)
418
- return; // Must run in a browser. Todo: add commonjs support
419
- // get library from browser globals if we can
420
- let lib = win[libName];
421
- if (lib)
422
- return lib;
423
- // if require exists, maybe require can get it.
424
- // This method is synchronous so it can't load modules with AMD.
425
- // It can only obtain modules from require that have already been loaded.
426
- // Developer should bootstrap such that the breeze module
427
- // loads after all other libraries that breeze should find with this method
428
- // See documentation
429
- let r = win.require;
430
- if (r) { // if require exists
431
- if (r.defined) { // require.defined is not standard and may not exist
432
- // require.defined returns true if module has been loaded
433
- return r.defined(libName) ? r(libName) : undefined;
434
- }
435
- else {
436
- // require.defined does not exist so we have to call require('libName') directly.
437
- // The require('libName') overload is synchronous and does not load modules.
438
- // It throws an exception if the module isn't already loaded.
439
- try {
440
- return r(libName);
441
- }
442
- catch (e) {
443
- // require('libName') threw because module not loaded
444
- return;
445
- }
446
- }
447
- }
448
- }
449
- /** Execute fn while obj has tempValue for property */
450
- function using(obj, property, tempValue, fn) {
451
- if (!obj) {
452
- return fn();
453
- }
454
- let originalValue = obj[property];
455
- if (tempValue === originalValue) {
456
- return fn();
457
- }
458
- obj[property] = tempValue;
459
- try {
460
- return fn();
461
- }
462
- finally {
463
- if (originalValue === undefined) {
464
- delete obj[property];
465
- }
466
- else {
467
- obj[property] = originalValue;
468
- }
469
- }
470
- }
471
- /** Call state = startFn(), call fn(), call endFn(state) */
472
- function wrapExecution(startFn, endFn, fn) {
473
- let state;
474
- try {
475
- state = startFn();
476
- return fn();
477
- }
478
- catch (e) {
479
- if (typeof (state) === 'object') {
480
- state.error = e;
481
- }
482
- throw e;
483
- }
484
- finally {
485
- endFn(state);
486
- }
487
- }
488
- /** Remember & return the value of fn() when it was called with its current args */
489
- function memoize(fn) {
490
- return function () {
491
- let args = arraySlice(arguments), hash = "", i = args.length, currentArg = null;
492
- while (i--) {
493
- currentArg = args[i];
494
- hash += (currentArg === Object(currentArg)) ? JSON.stringify(currentArg) : currentArg;
495
- fn.memoize || (fn.memoize = {});
496
- }
497
- return (hash in fn.memoize) ?
498
- fn.memoize[hash] :
499
- fn.memoize[hash] = fn.apply(this, args);
500
- };
501
- }
502
- const uuidrex = /[xy]/g;
503
- function getUuid() {
504
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(uuidrex, function (c) {
505
- // tslint:disable-next-line
506
- let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
507
- return v.toString(16);
508
- });
509
- }
510
- const durationrex = /^P((\d+Y)?(\d+M)?(\d+D)?)?(T(\d+H)?(\d+M)?(\d+S)?)?$/;
511
- const lettersrex = /[A-Za-z]+/g;
512
- function durationToSeconds(duration) {
513
- // basic algorithm from https://github.com/nezasa/iso8601-js-period
514
- if (typeof duration !== "string")
515
- throw new Error("Invalid ISO8601 duration '" + duration + "'");
516
- // regex splits as follows - grp0, grp1, y, m, d, grp2, h, m, s
517
- // 0 1 2 3 4 5 6 7 8
518
- let struct = durationrex.exec(duration);
519
- if (!struct)
520
- throw new Error("Invalid ISO8601 duration '" + duration + "'");
521
- let ymdhmsIndexes = [2, 3, 4, 6, 7, 8]; // -> grp1,y,m,d,grp2,h,m,s
522
- let factors = [31104000,
523
- 2592000,
524
- 86400,
525
- 3600,
526
- 60,
527
- 1]; // second (1)
528
- let seconds = 0;
529
- for (let i = 0; i < 6; i++) {
530
- let digit = struct[ymdhmsIndexes[i]];
531
- // remove letters, replace by 0 if not defined
532
- digit = (digit ? +digit.replace(lettersrex, '') : 0);
533
- seconds += digit * factors[i];
534
- }
535
- return seconds;
536
- }
537
- // is functions
538
- function noop() {
539
- // does nothing
540
- }
541
- function identity(x) {
542
- return x;
543
- }
544
- function classof(o) {
545
- if (o === null) {
546
- return "null";
547
- }
548
- if (o === undefined) {
549
- return "undefined";
550
- }
551
- return Object.prototype.toString.call(o).slice(8, -1).toLowerCase();
552
- }
553
- function isDate(o) {
554
- return classof(o) === "date" && !isNaN(o.getTime());
555
- }
556
- const isdaterex = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/;
557
- function isDateString(s) {
558
- // let rx = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/;
559
- return (typeof s === "string") && isdaterex.test(s);
560
- }
561
- function isFunction(o) {
562
- return classof(o) === "function";
563
- }
564
- // function isString(o: any) {
565
- // return (typeof o === "string");
566
- // }
567
- // function isObject(o: any) {
568
- // return (typeof o === "object");
569
- // }
570
- const isguidrex = /^[a-fA-F\d]{8}-(?:[a-fA-F\d]{4}-){3}[a-fA-F\d]{12}$/;
571
- function isGuid(value) {
572
- return (typeof value === "string") && isguidrex.test(value);
573
- }
574
- const isdurationrex = /^(-|)?P[T]?[\d\.,\-]+[YMDTHS]/;
575
- function isDuration(value) {
576
- return (typeof value === "string") && isdurationrex.test(value);
577
- }
578
- function isEmpty(obj) {
579
- if (obj === null || obj === undefined) {
580
- return true;
581
- }
582
- for (let key in obj) {
583
- if (hasOwnProperty(obj, key)) {
584
- return false;
585
- }
586
- }
587
- return true;
588
- }
589
- function isNumeric(n) {
590
- return !isNaN(parseFloat(n)) && isFinite(n);
591
- }
592
- // end of is Functions
593
- // string functions
594
- function stringStartsWith(str, prefix) {
595
- // returns true for empty string or null prefix
596
- if ((!str))
597
- return false;
598
- if (prefix === "" || prefix == null)
599
- return true;
600
- return str.indexOf(prefix, 0) === 0;
601
- }
602
- function stringEndsWith(str, suffix) {
603
- // returns true for empty string or null suffix
604
- if ((!str))
605
- return false;
606
- if (suffix === "" || suffix == null)
607
- return true;
608
- return str.indexOf(suffix, str.length - suffix.length) !== -1;
609
- }
610
- // Based on fragment from Dean Edwards' Base 2 library
611
- /** format("a %1 and a %2", "cat", "dog") -> "a cat and a dog" */
612
- function formatString(str, ...params) {
613
- let args = arguments;
614
- let pattern = RegExp("%([1-" + (arguments.length - 1) + "])", "g");
615
- return str.replace(pattern, function (match, index) {
616
- return args[index];
617
- });
618
- }
619
- // See http://stackoverflow.com/questions/7225407/convert-camelcasetext-to-camel-case-text
620
- /** Change text to title case with spaces, e.g. 'myPropertyName12' to 'My Property Name 12' */
621
- const camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
622
- function titleCaseSpace(text) {
623
- text = text.replace(camelEdges, '$1 ');
624
- text = text.charAt(0).toUpperCase() + text.slice(1);
625
- return text;
626
- }
627
- // end of string functions
628
- // See Mark Miller’s explanation of what this does.
629
- // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
630
- function uncurry(f) {
631
- let call = Function.call;
632
- return function () {
633
- return call.apply(f, arguments);
634
- };
635
- }
636
- // shims
637
- if (!Object.create) {
638
- Object.create = function (parent) {
639
- let F = function () {
640
- };
641
- F.prototype = parent;
642
- return new F();
643
- };
644
- }
645
- // strings for error messages
646
- const strings = {
647
- "TO_TYPE": "Add 'EntityQuery.toType()' to your query, or call 'MetadataStore.setEntityTypeForResourceName()' to register an EntityType for this resourceName."
648
- };
649
- // // not all methods above are exported
650
- export const core = {
651
- isES5Supported: isES5Supported,
652
- hasOwnProperty: hasOwnProperty,
653
- getOwnPropertyValues: getOwnPropertyValues,
654
- getPropertyDescriptor: getPropDescriptor,
655
- objectForEach: objectForEach,
656
- objectFirst: objectFirst,
657
- objectMap: objectMap,
658
- extend: extend,
659
- propEq: propEq,
660
- propsEq: propsEq,
661
- pluck: pluck,
662
- map: map,
663
- resolveProperties: resolveProperties,
664
- setAsDefault: setAsDefault,
665
- updateWithDefaults: updateWithDefaults,
666
- getArray: getArray,
667
- toArray: toArray,
668
- arrayEquals: arrayEquals,
669
- arraySlice: arraySlice,
670
- arrayFirst: arrayFirst,
671
- arrayIndexOf: arrayIndexOf,
672
- arrayRemoveItem: arrayRemoveItem,
673
- arrayZip: arrayZip,
674
- arrayAddItemUnique: arrayAddItemUnique,
675
- arrayFlatMap: arrayFlatMap,
676
- requireLib: requireLib,
677
- using: using,
678
- wrapExecution: wrapExecution,
679
- memoize: memoize,
680
- getUuid: getUuid,
681
- durationToSeconds: durationToSeconds,
682
- isSettable: isSettable,
683
- isDate: isDate,
684
- isDateString: isDateString,
685
- isGuid: isGuid,
686
- isDuration: isDuration,
687
- isFunction: isFunction,
688
- isEmpty: isEmpty,
689
- isNumeric: isNumeric,
690
- identity: identity,
691
- noop: noop,
692
- stringStartsWith: stringStartsWith,
693
- stringEndsWith: stringEndsWith,
694
- formatString: formatString,
695
- titleCase: titleCaseSpace,
696
- toJson: toJson,
697
- toJSONSafe: toJSONSafe,
698
- toJSONSafeReplacer: toJSONSafeReplacer,
699
- strings: strings
700
- };
701
- export { ɵ0 };
702
- // Unused
703
- /*
704
- // returns true for booleans, numbers, strings and dates
705
- // false for null, and non-date objects, functions, and arrays
706
- function isPrimitive(obj: any) {
707
- if (obj == null) return false;
708
- // true for numbers, strings, booleans and null, false for objects
709
- if (obj != Object(obj)) return true;
710
- return isDate(obj);
711
- }
712
-
713
- */
714
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQWVwQyxJQUFJLGNBQWMsR0FBMEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckcsSUFBSSxVQUFVLEdBQXVELE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1dBQ3RFO0lBQzFCLElBQUk7UUFDQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDMUU7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNSLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0wsQ0FBQztBQU5ELElBQUksY0FBYyxHQUFZLElBTTFCLENBQUM7QUFFTCxzQkFBc0I7QUFDdEIsU0FBUyxhQUFhLENBQUMsR0FBVyxFQUFFLElBQW9DO0lBQ3BFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ2pCLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0o7QUFDTCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLElBQXFDO0lBQ2pFLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNqQixJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxD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RSxVQUFVO0lBQ3RCLFlBQVksRUFBRSxZQUFZO0lBQzFCLGVBQWUsRUFBRSxlQUFlO0lBQ2hDLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLGtCQUFrQixFQUFFLGtCQUFrQjtJQUN0QyxZQUFZLEVBQUUsWUFBWTtJQUUxQixVQUFVLEVBQUUsVUFBVTtJQUN0QixLQUFLLEVBQUUsS0FBSztJQUNaLGFBQWEsRUFBRSxhQUFhO0lBRTVCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLGlCQUFpQixFQUFFLGlCQUFpQjtJQUVwQyxVQUFVLEVBQUUsVUFBVTtJQUV0QixNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQVksRUFBRSxZQUFZO0lBQzFCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLFVBQVU7SUFDdEIsVUFBVSxFQUFFLFVBQVU7SUFDdEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsU0FBUyxFQUFFLFNBQVM7SUFFcEIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsSUFBSSxFQUFFLElBQUk7SUFFVixnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsY0FBYyxFQUFFLGNBQWM7SUFDOUIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsU0FBUyxFQUFFLGNBQWM7SUFFekIsTUFBTSxFQUFFLE1BQU07SUFDZCxVQUFVLEVBQUUsVUFBVTtJQUN0QixrQkFBa0IsRUFBRSxrQkFBa0I7SUFFdEMsT0FBTyxFQUFFLE9BQU87Q0FDbkIsQ0FBQzs7QUFPRixTQUFTO0FBQ1Q7Ozs7Ozs7Ozs7RUFVRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTZWUgaWYgdGhpcyBjb21tZW50IHdpbGwgbWFrZSBpdCBpbnRvIC5kLnRzICovXHJcbmltcG9ydCB7IEJyZWV6ZUVudW0gfSBmcm9tICcuL2VudW0nO1xyXG5kZWNsYXJlIHZhciBnbG9iYWw6IGFueTtcclxuZGVjbGFyZSB2YXIgd2luZG93OiBhbnk7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ2FsbGJhY2sge1xyXG4gICAgKGVycm9yOiBFcnJvcik6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGJhY2sge1xyXG4gICAgKGRhdGE6IGFueSk6IHZvaWQ7XHJcbn1cclxuXHJcbi8vIHR5cGUgUHJlZGljYXRlID0gKGk6IGFueSkgPT4gYm9vbGVhbjtcclxudHlwZSBQcmVkaWNhdGU8VD4gPSAoaTogVCkgPT4gYm9vbGVhbjtcclxuXHJcbmxldCBoYXNPd25Qcm9wZXJ0eTogKG9iajogT2JqZWN0LCBrZXk6IHN0cmluZykgPT4gYm9vbGVhbiA9IHVuY3VycnkoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XHJcbmxldCBhcnJheVNsaWNlOiAoYXI6IGFueVtdLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSA9PiBhbnlbXSA9IHVuY3VycnkoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcclxubGV0IGlzRVM1U3VwcG9ydGVkOiBib29sZWFuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gISEoT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7fSkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSAoKTtcclxuXHJcbi8vIGl0ZXJhdGUgb3ZlciBvYmplY3RcclxuZnVuY3Rpb24gb2JqZWN0Rm9yRWFjaChvYmo6IE9iamVjdCwga3ZGbjogKGtleTogc3RyaW5nLCB2YWw6IGFueSkgPT4gYW55KSB7XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICBrdkZuKGtleSwgb2JqW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb2JqZWN0TWFwKG9iajogT2JqZWN0LCBrdkZuPzogKGtleTogc3RyaW5nLCB2YWw6IGFueSkgPT4gYW55KTogYW55W10ge1xyXG4gICAgbGV0IHJlc3VsdHM6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0ga3ZGbiA/IGt2Rm4oa2V5LCBvYmpba2V5XSkgOiBvYmpba2V5XTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvYmplY3RGaXJzdChvYmo6IE9iamVjdCwga3ZQcmVkaWNhdGU6IChrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IGJvb2xlYW4pOiB7IGtleTogc3RyaW5nLCB2YWx1ZTogYW55IH0gfCBudWxsIHtcclxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICAgICAgICBpZiAoa3ZQcmVkaWNhdGUoa2V5LCB2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheUZsYXRNYXA8VCwgVT4oYXJyOiBUW10sIG1hcEZuOiAoYXJnOiBUKSA9PiBVW10pIHtcclxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnIubWFwKG1hcEZuKSkgYXMgVVtdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1NldHRhYmxlKG9iajogT2JqZWN0LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHBkID0gZ2V0UHJvcERlc2NyaXB0b3Iob2JqLCBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgaWYgKHBkID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuICEhKHBkLndyaXRhYmxlIHx8IHBkLnNldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFByb3BEZXNjcmlwdG9yKG9iajogT2JqZWN0LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIWlzRVM1U3VwcG9ydGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcGVydHlOYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG5leHRPYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcclxuICAgICAgICBpZiAobmV4dE9iaiA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHJldHVybiBnZXRQcm9wRGVzY3JpcHRvcihuZXh0T2JqLCBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBGdW5jdGlvbmFsIGV4dGVuc2lvbnNcclxuXHJcbi8qKiBjYW4gYmUgdXNlZCBsaWtlOiBwZXJzb25zLmZpbHRlcihwcm9wRXEoXCJmaXJzdE5hbWVcIiwgXCJKb2huXCIpKSAqL1xyXG5mdW5jdGlvbiBwcm9wRXEocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiAob2JqOiBPYmplY3QpID0+IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBvYmpbcHJvcGVydHlOYW1lXSA9PT0gdmFsdWU7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogY2FuIGJlIHVzZWQgbGlrZTogcGVyc29ucy5maWx0ZXIocHJvcEVxKFwiZmlyc3ROYW1lXCIsIFwiRmlyc3ROYW1lXCIsIFwiSm9oblwiKSkgKi9cclxuZnVuY3Rpb24gcHJvcHNFcShwcm9wZXJ0eTFOYW1lOiBzdHJpbmcsIHByb3BlcnR5Mk5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IChvYmo6IE9iamVjdCkgPT4gYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtwcm9wZXJ0eTFOYW1lXSA9PT0gdmFsdWUgfHwgb2JqW3Byb3BlcnR5Mk5hbWVdID09PSB2YWx1ZTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKiBjYW4gYmUgdXNlZCBsaWtlIHBlcnNvbnMubWFwKHBsdWNrKFwiZmlyc3ROYW1lXCIpKSAqL1xyXG5mdW5jdGlvbiBwbHVjayhwcm9wZXJ0eU5hbWU6IGFueSk6IChvYmo6IE9iamVjdCkgPT4gYW55IHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW3Byb3BlcnR5TmFtZV07XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyBlbmQgZnVuY3Rpb25hbCBleHRlbnNpb25zXHJcblxyXG4vKiogUmV0dXJuIGFuIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcyBmcm9tIHNvdXJjZSAqL1xyXG5mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVZhbHVlcyhzb3VyY2U6IE9iamVjdCk6IGFueVtdIHtcclxuICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBuYW1lIGluIHNvdXJjZSkge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShzb3VyY2UsIG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNvdXJjZVtuYW1lXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqIENvcHkgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuIFJldHVybnMgdGFyZ2V0LiAqL1xyXG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0OiBPYmplY3QsIHNvdXJjZTogT2JqZWN0LCBwcm9wTmFtZXM/OiBzdHJpbmdbXSk6IE9iamVjdCB7XHJcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRhcmdldDtcclxuICAgIGlmIChwcm9wTmFtZXMpIHtcclxuICAgICAgICBwcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IHByb3BOYW1lIGluIHNvdXJjZSkge1xyXG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBwcm9wTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqIENvcHkgcHJvcGVydGllcyBmcm9tIGRlZmF1bHRzIGlmZiB1bmRlZmluZWQgb24gdGFyZ2V0LiAgUmV0dXJucyB0YXJnZXQuICovXHJcbmZ1bmN0aW9uIHVwZGF0ZVdpdGhEZWZhdWx0cyh0YXJnZXQ6IE9iamVjdCwgZGVmYXVsdHM6IE9iamVjdCk6IGFueSB7XHJcbiAgICBmb3IgKGxldCBuYW1lIGluIGRlZmF1bHRzKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldFtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IGRlZmF1bHRzW25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBTZXQgY3Rvci5kZWZhdWx0SW5zdGFuY2UgdG8gYW4gaW5zdGFuY2Ugb2YgY3RvciB3aXRoIHByb3BlcnRpZXMgZnJvbSB0YXJnZXQuXHJcbiAgICBXZSB3YW50IHRvIGluc3VyZSB0aGF0IHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgY3Rvci5kZWZhdWx0SW5zdGFuY2UgaXMgYWx3YXlzIGltbXV0YWJsZVxyXG4gICAgVXNlICd0YXJnZXQnIGFzIHRoZSBwcmltYXJ5IHRlbXBsYXRlIGZvciB0aGUgY3Rvci5kZWZhdWx0SW5zdGFuY2U7XHJcbiAgICBVc2UgY3VycmVudCAnY3Rvci5kZWZhdWx0SW5zdGFuY2UnIGFzIHRoZSB0ZW1wbGF0ZSBmb3IgYW55IG1pc3NpbmcgcHJvcGVydGllc1xyXG4gICAgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmb3IgY3Rvci5kZWZhdWx0SW5zdGFuY2VcclxuICAgIHJldHVybnMgdGFyZ2V0IHVuY2hhbmdlZCAqL1xyXG5mdW5jdGlvbiBzZXRBc0RlZmF1bHQodGFyZ2V0OiBPYmplY3QsIGN0b3I6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSwgZGVmYXVsdEluc3RhbmNlPzogYW55IH0pOiBhbnkge1xyXG4gICAgY3Rvci5kZWZhdWx0SW5zdGFuY2UgPSB1cGRhdGVXaXRoRGVmYXVsdHMobmV3IGN0b3IodGFyZ2V0KSwgY3Rvci5kZWZhdWx0SW5zdGFuY2UpO1xyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqXHJcbiAgICAnc291cmNlJyBpcyBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gYW5vdGhlclxyXG4gICAgJ3RlbXBsYXRlJyBpcyBhIG1hcCB3aGVyZSB0aGVcclxuICAgICAgIGtleXM6IGFyZSB0aGUga2V5cyB0byByZXR1cm5cclxuICAgICAgICAgaWYgYSBrZXkgY29udGFpbnMgJywncyB0aGVuIHRoZSBrZXkgaXMgdHJlYXRlZCBhcyBhIGRlbGltaXRlZCBzdHJpbmcgd2l0aCBmaXJzdCBvZiB0aGVcclxuICAgICAgICAga2V5cyBiZWluZyB0aGUga2V5IHRvIHJldHVybiBhbmQgdGhlIG90aGVycyBhbGwgdmFsaWQgYWxpYXNlcyBmb3IgdGhpcyBrZXlcclxuICAgICAgICd2YWx1ZXMnIGFyZSBlaXRoZXJcclxuICAgICAgICAgICAxKSB0aGUgJ2RlZmF1bHQnIHZhbHVlIG9mIHRoZSBrZXlcclxuICAgICAgICAgICAyKSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaW4gdGhlIHNvdXJjZSB2YWx1ZSBhbmQgc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdG8gc2V0XHJcbiAgICAgICAgIFRoZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgaXMgdGhlbiBzZXQgb24gdGhlIHRhcmdldCxcclxuICAgICAgICAgYWZ0ZXIgZmlyc3QgcGFzc2luZyB0aHJ1IHRoZSBmbiwgaWYgcHJvdmlkZWQsIFVOTEVTUzpcclxuICAgICAgICAgICAxKSBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgICAgIDIpIGl0IGlzIHVuZGVmaW5lZCAoIG51bGxzIFdJTEwgYmUgc2V0KVxyXG4gICAgJ3RhcmdldCcgaXMgb3B0aW9uYWxcclxuICAgICAgIC0gaWYgaXQgZXhpc3RzIHRoZW4gcHJvcGVydGllcyBvZiB0aGUgdGFyZ2V0IHdpbGwgYmUgc2V0ICggb3ZlcndyaXR0ZW4gaWYgdGhlIGV4aXN0KVxyXG4gICAgICAgLSBpZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVuIGEgbmV3IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgYXMgZmlsbGVkLlxyXG4gICAgJ3RhcmdldCBpcyByZXR1cm5lZC5cclxuKi9cclxuZnVuY3Rpb24gdG9Kc29uKHNvdXJjZTogT2JqZWN0LCB0ZW1wbGF0ZTogT2JqZWN0LCB0YXJnZXQ6IE9iamVjdCA9IHt9KTogT2JqZWN0IHtcclxuXHJcbiAgICBmb3IgKGxldCBrZXkgaW4gdGVtcGxhdGUpIHtcclxuICAgICAgICBsZXQgYWxpYXNlcyA9IGtleS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IHRlbXBsYXRlW2tleV07XHJcbiAgICAgICAgLy8gdXNpbmcgc29tZSBhcyBhIGZvckVhY2ggd2l0aCBhICdicmVhaydcclxuICAgICAgICBhbGlhc2VzLnNvbWUoZnVuY3Rpb24gKHByb3BOYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICghKHByb3BOYW1lIGluIHNvdXJjZSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBmdW5jdGlvbmFsIHByb3BlcnR5IGRlZmluZWQgd2l0aCB0aGlzIGFsaWFzICggbm90IHdoYXQgd2Ugd2FudCB0byByZXBsYWNlKS5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAvLyAnPT0nIGlzIGRlbGliZXJhdGUgaGVyZSAtIGlkZWEgaXMgdGhhdCBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCBuZXZlciBnZXQgc2VyaWFsaXplZFxyXG4gICAgICAgICAgICAvLyBpZiBkZWZhdWx0IHZhbHVlIGlzIHNldCB0byBudWxsLlxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09IGRlZmF1bHRWYWx1ZSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChkZWZhdWx0VmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgQnJlZXplRW51bSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIHRhcmdldFthbGlhc2VzWzBdXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBSZXBsYWNlciBmdW5jdGlvbiBmb3IgdG9KU09OU2FmZSwgd2hlbiBzZXJpYWxpemluZyBlbnRpdGllcy4gIEV4Y2x1ZGVzIGVudGl0eUFzcGVjdCBhbmQgb3RoZXIgaW50ZXJuYWwgcHJvcGVydGllcy4gKi9cclxuZnVuY3Rpb24gdG9KU09OU2FmZVJlcGxhY2VyKHByb3A6IHN0cmluZywgdmFsOiBhbnkpIHtcclxuICAgIGlmIChwcm9wID09PSBcImVudGl0eUFzcGVjdFwiIHx8IHByb3AgPT09IFwiY29tcGxleEFzcGVjdFwiIHx8IHByb3AgPT09IFwiZW50aXR5VHlwZVwiIHx8IHByb3AgPT09IFwiY29tcGxleFR5cGVcIlxyXG4gICAgICAgIHx8IHByb3AgPT09IFwiZ2V0UHJvcGVydHlcIiB8fCBwcm9wID09PSBcInNldFByb3BlcnR5XCJcclxuICAgICAgICB8fCBwcm9wID09PSBcImNvbnN0cnVjdG9yXCIgfHwgcHJvcC5jaGFyQXQoMCkgPT09ICdfJyB8fCBwcm9wLmNoYXJBdCgwKSA9PT0gJyQnKSByZXR1cm47XHJcbiAgICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG4vKiogU2FmZWx5IHBlcmZvcm0gdG9KU09OIGxvZ2ljIG9uIG9iamVjdHMgd2l0aCBjeWNsZXMuICovXHJcbmZ1bmN0aW9uIHRvSlNPTlNhZmUob2JqOiBhbnksIHJlcGxhY2VyPzogKHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KTogYW55IHtcclxuICAgIGlmIChvYmogIT09IE9iamVjdChvYmopKSByZXR1cm4gb2JqOyAvLyBwcmltaXRpdmUgdmFsdWVcclxuICAgIGlmIChvYmouXyR2aXNpdGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgaWYgKG9iai50b0pTT04pIHtcclxuICAgICAgICBsZXQgbmV3T2JqID0gb2JqLnRvSlNPTigpO1xyXG4gICAgICAgIGlmIChuZXdPYmogIT09IE9iamVjdChuZXdPYmopKSByZXR1cm4gbmV3T2JqOyAvLyBwcmltaXRpdmUgdmFsdWVcclxuICAgICAgICBpZiAobmV3T2JqICE9PSBvYmopIHJldHVybiB0b0pTT05TYWZlKG5ld09iaiwgcmVwbGFjZXIpO1xyXG4gICAgICAgIC8vIHRvSlNPTiByZXR1cm5lZCB0aGUgb2JqZWN0IHVuY2hhbmdlZC5cclxuICAgICAgICBvYmogPSBuZXdPYmo7XHJcbiAgICB9XHJcbiAgICBvYmouXyR2aXNpdGVkID0gdHJ1ZTtcclxuICAgIGxldCByZXN1bHQ6IGFueTtcclxuICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgIHJlc3VsdCA9IG9iai5tYXAoZnVuY3Rpb24gKG86IGFueSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdG9KU09OU2FmZShvLCByZXBsYWNlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAob2JqKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBwcm9wIGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfJHZpc2l0ZWRcIikgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF07XHJcbiAgICAgICAgICAgIGlmIChyZXBsYWNlcikge1xyXG4gICAgICAgICAgICAgICAgdmFsID0gcmVwbGFjZXIocHJvcCwgdmFsKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFsID0gdG9KU09OU2FmZSh2YWwsIHJlcGxhY2VyKTtcclxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcclxuICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGRlbGV0ZSBvYmouXyR2aXNpdGVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqIFJlc29sdmVzIHRoZSB2YWx1ZXMgb2YgYSBsaXN0IG9mIHByb3BlcnRpZXMgYnkgY2hlY2tpbmcgZWFjaCBwcm9wZXJ0eSBpbiBtdWx0aXBsZSBzb3VyY2VzIHVudGlsIGEgdmFsdWUgaXMgZm91bmQuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVQcm9wZXJ0aWVzKHNvdXJjZXM6IE9iamVjdFtdLCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSk6IGFueSB7XHJcbiAgICBsZXQgciA9IHt9O1xyXG4gICAgbGV0IGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xyXG4gICAgcHJvcGVydHlOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChwbikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHNyYyA9IHNvdXJjZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChzcmMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBzcmNbcG5dO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcltwbl0gPSB2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5cclxuLy8gYXJyYXkgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiB0b0FycmF5KGl0ZW06IGFueSk6IGFueVtdIHtcclxuICAgIGlmIChpdGVtID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFtpdGVtXTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIGEgdmVyc2lvbiBvZiBBcnJheS5tYXAgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYW4gYXJyYXksIGkuZS4gd29ya3Mgb24gYXJyYXlzIGFuZCBzY2FsYXJzLiAqL1xyXG4vLyBmdW5jdGlvbiBtYXA8VCwgVT4oaXRlbXM6IFQgfCBUW10sIGZuOiAodjogVCwgaXg/OiBudW1iZXIpID0+IFUsIGluY2x1ZGVOdWxsPzogYm9vbGVhbik6IFUgfCBVW10ge1xyXG4gZnVuY3Rpb24gbWFwPFQ+KGl0ZW1zOiBUIHwgVFtdLCBmbjogKHY6IFQsIGl4PzogbnVtYmVyKSA9PiBhbnksIGluY2x1ZGVOdWxsPzogYm9vbGVhbik6IGFueSB8IGFueVtdIHtcclxuICAgIC8vIHdoZXRoZXIgdG8gcmV0dXJuIG51bGxzIGluIGFycmF5IG9mIHJlc3VsdHM7IGRlZmF1bHQgPSB0cnVlO1xyXG4gICAgaW5jbHVkZU51bGwgPSBpbmNsdWRlTnVsbCA9PSBudWxsID8gdHJ1ZSA6IGluY2x1ZGVOdWxsO1xyXG4gICAgaWYgKGl0ZW1zID09IG51bGwpIHJldHVybiBpdGVtcztcclxuICAgIC8vIGxldCByZXN1bHQ6IFVbXTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAodjogYW55LCBpeDogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIGxldCByID0gZm4odiwgaXgpO1xyXG4gICAgICAgICAgICBpZiAociAhPSBudWxsIHx8IGluY2x1ZGVOdWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaXhdID0gcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBmbihpdGVtcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBtYXRjaGluZyBwcmVkaWNhdGUgKi9cclxuZnVuY3Rpb24gYXJyYXlGaXJzdDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxhbnk+KTogVDtcclxuZnVuY3Rpb24gYXJyYXlGaXJzdDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPikge1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXlbaV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKiBSZXR1cm4gaW5kZXggb2YgZmlyc3QgZWxlbWVudCBtYXRjaGluZyBwcmVkaWNhdGUgKi9cclxuZnVuY3Rpb24gYXJyYXlJbmRleE9mPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogUHJlZGljYXRlPGFueT4pOiBudW1iZXI7XHJcbmZ1bmN0aW9uIGFycmF5SW5kZXhPZjxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPik6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0pKSByZXR1cm4gaTtcclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxufVxyXG5cclxuLyoqIEFkZCBpdGVtIGlmIG5vdCBhbHJlYWR5IGluIGFycmF5ICovXHJcbmZ1bmN0aW9uIGFycmF5QWRkSXRlbVVuaXF1ZTxUPihhcnJheTogVFtdLCBpdGVtOiBUKSB7XHJcbiAgICBsZXQgaXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGl4ID09PSAtMSkgYXJyYXkucHVzaChpdGVtKTtcclxufVxyXG5cclxuLyoqIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0gYXJyYXlcclxuICogQHBhcmFtIHByZWRpY2F0ZU9ySXRlbSAtIGl0ZW0gdG8gcmVtb3ZlLCBvciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgbWF0Y2hpbmcgaXRlbVxyXG4gKiBAcGFyYW0gc2hvdWxkUmVtb3ZlTXVsdGlwbGUgLSB0cnVlIHRvIGtlZXAgcmVtb3ZpbmcgYWZ0ZXIgZmlyc3QgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZVxyXG4gKi9cclxuZnVuY3Rpb24gYXJyYXlSZW1vdmVJdGVtPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZU9ySXRlbTogVCB8IFByZWRpY2F0ZTxUPiAsIHNob3VsZFJlbW92ZU11bHRpcGxlPzogYm9vbGVhbikge1xyXG4gICAgbGV0IHByZWRpY2F0ZSA9IChpc0Z1bmN0aW9uKHByZWRpY2F0ZU9ySXRlbSkgPyBwcmVkaWNhdGVPckl0ZW0gOiB1bmRlZmluZWQpIGFzIFByZWRpY2F0ZTxUPjtcclxuICAgIGxldCBsYXN0SXggPSBhcnJheS5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSBsYXN0SXg7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZSA/IHByZWRpY2F0ZShhcnJheVtpXSkgOiAoYXJyYXlbaV0gPT09IHByZWRpY2F0ZU9ySXRlbSkpIHtcclxuICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKCFzaG91bGRSZW1vdmVNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVtb3ZlZDtcclxufVxyXG5cclxuLyoqIENvbWJpbmUgYXJyYXkgZWxlbWVudHMgdXNpbmcgdGhlIGNhbGxiYWNrLiAgUmV0dXJucyBhcnJheSB3aXRoIGxlbmd0aCA9PSBtaW4oYTEubGVuZ3RoLCBhMi5sZW5ndGgpICovXHJcbmZ1bmN0aW9uIGFycmF5WmlwKGExOiBhbnlbXSwgYTI6IGFueVtdLCBjYWxsYmFjazogKHgxOiBhbnksIHgyOiBhbnkpID0+IGFueSk6IGFueVtdIHtcclxuICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgICBsZXQgbiA9IE1hdGgubWluKGExLmxlbmd0aCwgYTIubGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2soYTFbaV0sIGEyW2ldKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vL2Z1bmN0aW9uIGFycmF5RGlzdGluY3QoYXJyYXkpIHtcclxuLy8gICAgYXJyYXkgPSBhcnJheSB8fCBbXTtcclxuLy8gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4vLyAgICBmb3IgKGxldCBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4vLyAgICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGFycmF5W2ldKSA8IDApXHJcbi8vICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xyXG4vLyAgICB9XHJcbi8vICAgIHJldHVybiByZXN1bHQ7XHJcbi8vfVxyXG5cclxuLy8gTm90IHlldCBuZWVkZWRcclxuLy8vLyBtdWNoIGZhc3RlciBidXQgb25seSB3b3JrcyBvbiBhcnJheSBpdGVtcyB3aXRoIGEgdG9TdHJpbmcgbWV0aG9kIHRoYXRcclxuLy8vLyByZXR1cm5zIGRpc3RpbmN0IHN0cmluZyBmb3IgZGlzdGluY3Qgb2JqZWN0cy4gIFNvIHRoaXMgaXMgc2FmZSBmb3IgYXJyYXlzIHdpdGggcHJpbWl0aXZlXHJcbi8vLy8gdHlwZXMgYnV0IG5vdCBmb3IgYXJyYXlzIHdpdGggb2JqZWN0IHR5cGVzLCB1bmxlc3MgdG9TdHJpbmcoKSBoYXMgYmVlbiBpbXBsZW1lbnRlZC5cclxuLy9mdW5jdGlvbiBhcnJheURpc3RpbmN0VW5zYWZlKGFycmF5KSB7XHJcbi8vICAgIGxldCBvID0ge30sIGksIGwgPSBhcnJheS5sZW5ndGgsIHIgPSBbXTtcclxuLy8gICAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gMSkge1xyXG4vLyAgICAgICAgbGV0IHYgPSBhcnJheVtpXTtcclxuLy8gICAgICAgIG9bdl0gPSB2O1xyXG4vLyAgICB9XHJcbi8vICAgIGZvciAoaSBpbiBvKSByLnB1c2gob1tpXSk7XHJcbi8vICAgIHJldHVybiByO1xyXG4vL31cclxuXHJcbmZ1bmN0aW9uIGFycmF5RXF1YWxzKGExOiBhbnlbXSwgYTI6IGFueVtdLCBlcXVhbHNGbj86ICh4MTogYW55LCB4MjogYW55KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAvL0NoZWNrIGlmIHRoZSBhcnJheXMgYXJlIHVuZGVmaW5lZC9udWxsXHJcbiAgICBpZiAoIWExIHx8ICFhMikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChhMS5sZW5ndGggIT09IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vZ28gdGhydSBhbGwgdGhlIHZhcnNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvL2lmIHRoZSBsZXQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gbWFrZSBhIHJlY3Vyc2l2ZSBjaGVja1xyXG4gICAgICAgIC8vb3RoZXJ3aXNlIHdlJ2xsIGp1c3QgY29tcGFyZSB0aGUgdmFsdWVzXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYTFbaV0pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXJyYXlFcXVhbHMoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChlcXVhbHNGbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlcXVhbHNGbihhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYTFbaV0gIT09IGEyW2ldKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLy8gZW5kIG9mIGFycmF5IGZ1bmN0aW9uc1xyXG5cclxuLyoqIFJldHVybnMgYW4gYXJyYXkgZm9yIGEgc291cmNlIGFuZCBhIHByb3AsIGFuZCBjcmVhdGVzIHRoZSBwcm9wIGlmIG5lZWRlZC4gKi9cclxuZnVuY3Rpb24gZ2V0QXJyYXkoc291cmNlOiBPYmplY3QsIHByb3BOYW1lOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICBsZXQgYXJyID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgIGlmICghYXJyKSB7XHJcbiAgICAgICAgYXJyID0gW107XHJcbiAgICAgICAgc291cmNlW3Byb3BOYW1lXSA9IGFycjtcclxuICAgIH1cclxuICAgIHJldHVybiBhcnI7XHJcbn1cclxuXHJcbi8qKiBDYWxscyByZXF1aXJlTGliQ29yZSBvbiBzZW1pY29sb24tc2VwYXJhdGVkIGxpYk5hbWVzICovXHJcbmZ1bmN0aW9uIHJlcXVpcmVMaWIobGliTmFtZXM6IHN0cmluZywgZXJyTWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgbGV0IGFyck5hbWVzID0gbGliTmFtZXMuc3BsaXQoXCI7XCIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJOYW1lcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICBsZXQgbGliID0gcmVxdWlyZUxpYkNvcmUoYXJyTmFtZXNbaV0pO1xyXG4gICAgICAgIGlmIChsaWIpIHJldHVybiBsaWI7XHJcbiAgICB9XHJcbiAgICBpZiAoZXJyTWVzc2FnZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBpbml0aWFsaXplIFwiICsgbGliTmFtZXMgKyBcIi4gIFwiICsgZXJyTWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuLyoqIFJldHVybnMgdGhlICdsaWJOYW1lJyBtb2R1bGUgaWYgbG9hZGVkIG9yIGVsc2UgcmV0dXJucyB1bmRlZmluZWQgKi9cclxuZnVuY3Rpb24gcmVxdWlyZUxpYkNvcmUobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgd2luID0gd2luZG93IHx8IChnbG9iYWwgPyBnbG9iYWwud2luZG93IDogdW5kZWZpbmVkKTtcclxuICAgIGlmICghd2luKSByZXR1cm47IC8vIE11c3QgcnVuIGluIGEgYnJvd3Nlci4gVG9kbzogYWRkIGNvbW1vbmpzIHN1cHBvcnRcclxuXHJcbiAgICAvLyBnZXQgbGlicmFyeSBmcm9tIGJyb3dzZXIgZ2xvYmFscyBpZiB3ZSBjYW5cclxuICAgIGxldCBsaWIgPSB3aW5bbGliTmFtZV07XHJcbiAgICBpZiAobGliKSByZXR1cm4gbGliO1xyXG5cclxuICAgIC8vIGlmIHJlcXVpcmUgZXhpc3RzLCBtYXliZSByZXF1aXJlIGNhbiBnZXQgaXQuXHJcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBzeW5jaHJvbm91cyBzbyBpdCBjYW4ndCBsb2FkIG1vZHVsZXMgd2l0aCBBTUQuXHJcbiAgICAvLyBJdCBjYW4gb25seSBvYnRhaW4gbW9kdWxlcyBmcm9tIHJlcXVpcmUgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuXHJcbiAgICAvLyBEZXZlbG9wZXIgc2hvdWxkIGJvb3RzdHJhcCBzdWNoIHRoYXQgdGhlIGJyZWV6ZSBtb2R1bGVcclxuICAgIC8vIGxvYWRzIGFmdGVyIGFsbCBvdGhlciBsaWJyYXJpZXMgdGhhdCBicmVlemUgc2hvdWxkIGZpbmQgd2l0aCB0aGlzIG1ldGhvZFxyXG4gICAgLy8gU2VlIGRvY3VtZW50YXRpb25cclxuICAgIGxldCByID0gd2luLnJlcXVpcmU7XHJcbiAgICBpZiAocikgeyAvLyBpZiByZXF1aXJlIGV4aXN0c1xyXG4gICAgICAgIGlmIChyLmRlZmluZWQpIHsgLy8gcmVxdWlyZS5kZWZpbmVkIGlzIG5vdCBzdGFuZGFyZCBhbmQgbWF5IG5vdCBleGlzdFxyXG4gICAgICAgICAgICAvLyByZXF1aXJlLmRlZmluZWQgcmV0dXJucyB0cnVlIGlmIG1vZHVsZSBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICAgICAgcmV0dXJuIHIuZGVmaW5lZChsaWJOYW1lKSA/IHIobGliTmFtZSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmVxdWlyZS5kZWZpbmVkIGRvZXMgbm90IGV4aXN0IHNvIHdlIGhhdmUgdG8gY2FsbCByZXF1aXJlKCdsaWJOYW1lJykgZGlyZWN0bHkuXHJcbiAgICAgICAgICAgIC8vIFRoZSByZXF1aXJlKCdsaWJOYW1lJykgb3ZlcmxvYWQgaXMgc3luY2hyb25vdXMgYW5kIGRvZXMgbm90IGxvYWQgbW9kdWxlcy5cclxuICAgICAgICAgICAgLy8gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbW9kdWxlIGlzbid0IGFscmVhZHkgbG9hZGVkLlxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHIobGliTmFtZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUoJ2xpYk5hbWUnKSB0aHJldyBiZWNhdXNlIG1vZHVsZSBub3QgbG9hZGVkXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBFeGVjdXRlIGZuIHdoaWxlIG9iaiBoYXMgdGVtcFZhbHVlIGZvciBwcm9wZXJ0eSAqL1xyXG5mdW5jdGlvbiB1c2luZyhvYmo6IE9iamVjdCwgcHJvcGVydHk6IHN0cmluZywgdGVtcFZhbHVlOiBhbnksIGZuOiAoKSA9PiBhbnkpIHtcclxuICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9ialtwcm9wZXJ0eV07XHJcbiAgICBpZiAodGVtcFZhbHVlID09PSBvcmlnaW5hbFZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9XHJcbiAgICBvYmpbcHJvcGVydHldID0gdGVtcFZhbHVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgb2JqW3Byb3BlcnR5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmpbcHJvcGVydHldID0gb3JpZ2luYWxWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBDYWxsIHN0YXRlID0gc3RhcnRGbigpLCBjYWxsIGZuKCksIGNhbGwgZW5kRm4oc3RhdGUpICovXHJcbmZ1bmN0aW9uIHdyYXBFeGVjdXRpb24oc3RhcnRGbjogKCkgPT4gYW55LCBlbmRGbjogKHN0YXRlOiBhbnkpID0+IGFueSwgZm46ICgpID0+IGFueSkge1xyXG4gICAgbGV0IHN0YXRlOiBhbnk7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHN0YXRlID0gc3RhcnRGbigpO1xyXG4gICAgICAgIHJldHVybiBmbigpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHN0YXRlKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBlbmRGbihzdGF0ZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBSZW1lbWJlciAmIHJldHVybiB0aGUgdmFsdWUgb2YgZm4oKSB3aGVuIGl0IHdhcyBjYWxsZWQgd2l0aCBpdHMgY3VycmVudCBhcmdzICovXHJcbmZ1bmN0aW9uIG1lbW9pemUoZm46IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gYXJyYXlTbGljZSg8YW55PmFyZ3VtZW50cyksXHJcbiAgICAgICAgICAgIGhhc2ggPSBcIlwiLFxyXG4gICAgICAgICAgICBpID0gYXJncy5sZW5ndGgsXHJcbiAgICAgICAgICAgIGN1cnJlbnRBcmc6IGFueSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgICBjdXJyZW50QXJnID0gYXJnc1tpXTtcclxuICAgICAgICAgICAgaGFzaCArPSAoY3VycmVudEFyZyA9PT0gT2JqZWN0KGN1cnJlbnRBcmcpKSA/IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRBcmcpIDogY3VycmVudEFyZztcclxuICAgICAgICAgICAgZm4ubWVtb2l6ZSB8fCAoZm4ubWVtb2l6ZSA9IHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChoYXNoIGluIGZuLm1lbW9pemUpID9cclxuICAgICAgICAgICAgZm4ubWVtb2l6ZVtoYXNoXSA6XHJcbiAgICAgICAgICAgIGZuLm1lbW9pemVbaGFzaF0gPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmNvbnN0IHV1aWRyZXggPSAvW3h5XS9nO1xyXG5mdW5jdGlvbiBnZXRVdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSh1dWlkcmV4LCBmdW5jdGlvbiAoYykge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgIGxldCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgZHVyYXRpb25yZXggPSAvXlAoKFxcZCtZKT8oXFxkK00pPyhcXGQrRCk/KT8oVChcXGQrSCk/KFxcZCtNKT8oXFxkK1MpPyk/JC87XHJcbmNvbnN0IGxldHRlcnNyZXggPSAvW0EtWmEtel0rL2c7XHJcbmZ1bmN0aW9uIGR1cmF0aW9uVG9TZWNvbmRzKGR1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIC8vIGJhc2ljIGFsZ29yaXRobSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXphc2EvaXNvODYwMS1qcy1wZXJpb2RcclxuICAgIGlmICh0eXBlb2YgZHVyYXRpb24gIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSVNPODYwMSBkdXJhdGlvbiAnXCIgKyBkdXJhdGlvbiArIFwiJ1wiKTtcclxuXHJcbiAgICAvLyByZWdleCBzcGxpdHMgYXMgZm9sbG93cyAtIGdycDAsIGdycDEsIHksIG0sIGQsIGdycDIsIGgsIG0sIHNcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgMSAgICAgMiAgMyAgNCAgNSAgICAgNiAgNyAgOFxyXG4gICAgbGV0IHN0cnVjdCA9IGR1cmF0aW9ucmV4LmV4ZWMoZHVyYXRpb24pO1xyXG4gICAgaWYgKCFzdHJ1Y3QpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSVNPODYwMSBkdXJhdGlvbiAnXCIgKyBkdXJhdGlvbiArIFwiJ1wiKTtcclxuXHJcbiAgICBsZXQgeW1kaG1zSW5kZXhlcyA9IFsyLCAzLCA0LCA2LCA3LCA4XTsgLy8gLT4gZ3JwMSx5LG0sZCxncnAyLGgsbSxzXHJcbiAgICBsZXQgZmFjdG9ycyA9IFszMTEwNDAwMCwgLy8geWVhciAoMzYwKjI0KjYwKjYwKVxyXG4gICAgICAgIDI1OTIwMDAsICAgICAgICAgICAgIC8vIG1vbnRoICgzMCoyNCo2MCo2MClcclxuICAgICAgICA4NjQwMCwgICAgICAgICAgICAgICAvLyBkYXkgKDI0KjYwKjYwKVxyXG4gICAgICAgIDM2MDAsICAgICAgICAgICAgICAgIC8vIGhvdXIgKDYwKjYwKVxyXG4gICAgICAgIDYwLCAgICAgICAgICAgICAgICAgIC8vIG1pbnV0ZSAoNjApXHJcbiAgICAgICAgMV07ICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kICgxKVxyXG5cclxuICAgIGxldCBzZWNvbmRzID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRpZ2l0ID0gc3RydWN0W3ltZGhtc0luZGV4ZXNbaV1dO1xyXG4gICAgICAgIC8vIHJlbW92ZSBsZXR0ZXJzLCByZXBsYWNlIGJ5IDAgaWYgbm90IGRlZmluZWRcclxuICAgICAgICBkaWdpdCA9IDxhbnk+KGRpZ2l0ID8gK2RpZ2l0LnJlcGxhY2UobGV0dGVyc3JleCwgJycpIDogMCk7XHJcbiAgICAgICAgc2Vjb25kcyArPSA8YW55PmRpZ2l0ICogZmFjdG9yc1tpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZWNvbmRzO1xyXG5cclxufVxyXG5cclxuLy8gaXMgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiBub29wKCkge1xyXG4gICAgLy8gZG9lcyBub3RoaW5nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlkZW50aXR5KHg6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4geDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xhc3NvZihvOiBhbnkpIHtcclxuICAgIGlmIChvID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xyXG4gICAgfVxyXG4gICAgaWYgKG8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEYXRlKG86IGFueSkge1xyXG4gICAgcmV0dXJuIGNsYXNzb2YobykgPT09IFwiZGF0ZVwiICYmICFpc05hTihvLmdldFRpbWUoKSk7XHJcbn1cclxuXHJcbmNvbnN0IGlzZGF0ZXJleCA9IC9eKChcXGR7NH0tWzAxXVxcZC1bMC0zXVxcZFRbMC0yXVxcZDpbMC01XVxcZDpbMC01XVxcZFxcLlxcZCsoWystXVswLTJdXFxkOlswLTVdXFxkfFopKXwoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGQoWystXVswLTJdXFxkOlswLTVdXFxkfFopKXwoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQoWystXVswLTJdXFxkOlswLTVdXFxkfFopKSkkLztcclxuZnVuY3Rpb24gaXNEYXRlU3RyaW5nKHM6IHN0cmluZykge1xyXG4gICAgLy8gbGV0IHJ4ID0gL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLztcclxuICAgIHJldHVybiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIpICYmIGlzZGF0ZXJleC50ZXN0KHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG86IGFueSkge1xyXG4gICAgcmV0dXJuIGNsYXNzb2YobykgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5cclxuLy8gZnVuY3Rpb24gaXNTdHJpbmcobzogYW55KSB7XHJcbi8vICAgICByZXR1cm4gKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKTtcclxuLy8gfVxyXG5cclxuLy8gZnVuY3Rpb24gaXNPYmplY3QobzogYW55KSB7XHJcbi8vICAgICByZXR1cm4gKHR5cGVvZiBvID09PSBcIm9iamVjdFwiKTtcclxuLy8gfVxyXG5cclxuY29uc3QgaXNndWlkcmV4ID0gL15bYS1mQS1GXFxkXXs4fS0oPzpbYS1mQS1GXFxkXXs0fS0pezN9W2EtZkEtRlxcZF17MTJ9JC87XHJcbmZ1bmN0aW9uIGlzR3VpZCh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgJiYgaXNndWlkcmV4LnRlc3QodmFsdWUpO1xyXG59XHJcblxyXG5jb25zdCBpc2R1cmF0aW9ucmV4ID0gL14oLXwpP1BbVF0/W1xcZFxcLixcXC1dK1tZTURUSFNdLztcclxuZnVuY3Rpb24gaXNEdXJhdGlvbih2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgJiYgaXNkdXJhdGlvbnJleC50ZXN0KHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFbXB0eShvYmo6IGFueSkge1xyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc051bWVyaWMobjogYW55KSB7XHJcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xyXG59XHJcblxyXG5cclxuXHJcbi8vIGVuZCBvZiBpcyBGdW5jdGlvbnNcclxuXHJcbi8vIHN0cmluZyBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ1N0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZyBvciBudWxsIHByZWZpeFxyXG4gICAgaWYgKCghc3RyKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHByZWZpeCA9PT0gXCJcIiB8fCBwcmVmaXggPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2YocHJlZml4LCAwKSA9PT0gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RyaW5nRW5kc1dpdGgoc3RyOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZyBvciBudWxsIHN1ZmZpeFxyXG4gICAgaWYgKCghc3RyKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHN1ZmZpeCA9PT0gXCJcIiB8fCBzdWZmaXggPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xyXG59XHJcblxyXG4vLyBCYXNlZCBvbiBmcmFnbWVudCBmcm9tIERlYW4gRWR3YXJkcycgQmFzZSAyIGxpYnJhcnlcclxuLyoqIGZvcm1hdChcImEgJTEgYW5kIGEgJTJcIiwgXCJjYXRcIiwgXCJkb2dcIikgLT4gXCJhIGNhdCBhbmQgYSBkb2dcIiAqL1xyXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoc3RyOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pIHtcclxuICAgIGxldCBhcmdzID0gYXJndW1lbnRzO1xyXG4gICAgbGV0IHBhdHRlcm4gPSBSZWdFeHAoXCIlKFsxLVwiICsgKGFyZ3VtZW50cy5sZW5ndGggLSAxKSArIFwiXSlcIiwgXCJnXCIpO1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCwgaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07XHJcbiAgICB9KTtcclxufVxyXG5cclxuLy8gU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIyNTQwNy9jb252ZXJ0LWNhbWVsY2FzZXRleHQtdG8tY2FtZWwtY2FzZS10ZXh0XHJcbi8qKiBDaGFuZ2UgdGV4dCB0byB0aXRsZSBjYXNlIHdpdGggc3BhY2VzLCBlLmcuICdteVByb3BlcnR5TmFtZTEyJyB0byAnTXkgUHJvcGVydHkgTmFtZSAxMicgKi9cclxuY29uc3QgY2FtZWxFZGdlcyA9IC8oW0EtWl0oPz1bQS1aXVthLXpdKXxbXkEtWl0oPz1bQS1aXSl8W2EtekEtWl0oPz1bXmEtekEtWl0pKS9nO1xyXG5mdW5jdGlvbiB0aXRsZUNhc2VTcGFjZSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoY2FtZWxFZGdlcywgJyQxICcpO1xyXG4gICAgdGV4dCA9IHRleHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXh0LnNsaWNlKDEpO1xyXG4gICAgcmV0dXJuIHRleHQ7XHJcbn1cclxuXHJcbi8vIGVuZCBvZiBzdHJpbmcgZnVuY3Rpb25zXHJcblxyXG4vLyBTZWUgTWFyayBNaWxsZXLigJlzIGV4cGxhbmF0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLlxyXG4vLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1jb252ZW50aW9uczpzYWZlX21ldGFfcHJvZ3JhbW1pbmdcclxuZnVuY3Rpb24gdW5jdXJyeShmOiBhbnkpIHtcclxuICAgIGxldCBjYWxsID0gRnVuY3Rpb24uY2FsbDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhbGwuYXBwbHkoZiwgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIHNoaW1zXHJcblxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAocGFyZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgRiA9IDxhbnk+ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRi5wcm90b3R5cGUgPSBwYXJlbnQ7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGKCk7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyBzdHJpbmdzIGZvciBlcnJvciBtZXNzYWdlc1xyXG5cclxuY29uc3Qgc3RyaW5ncyA9IHtcclxuICAgIFwiVE9fVFlQRVwiOiBcIkFkZCAnRW50aXR5UXVlcnkudG9UeXBlKCknIHRvIHlvdXIgcXVlcnksIG9yIGNhbGwgJ01ldGFkYXRhU3RvcmUuc2V0RW50aXR5VHlwZUZvclJlc291cmNlTmFtZSgpJyB0byByZWdpc3RlciBhbiBFbnRpdHlUeXBlIGZvciB0aGlzIHJlc291cmNlTmFtZS5cIlxyXG59XHJcblxyXG4vLyAvLyBub3QgYWxsIG1ldGhvZHMgYWJvdmUgYXJlIGV4cG9ydGVkXHJcbmV4cG9ydCBjb25zdCBjb3JlID0ge1xyXG4gICAgaXNFUzVTdXBwb3J0ZWQ6IGlzRVM1U3VwcG9ydGVkLFxyXG4gICAgaGFzT3duUHJvcGVydHk6IGhhc093blByb3BlcnR5LFxyXG4gICAgZ2V0T3duUHJvcGVydHlWYWx1ZXM6IGdldE93blByb3BlcnR5VmFsdWVzLFxyXG4gICAgZ2V0UHJvcGVydHlEZXNjcmlwdG9yOiBnZXRQcm9wRGVzY3JpcHRvcixcclxuICAgIG9iamVjdEZvckVhY2g6IG9iamVjdEZvckVhY2gsXHJcbiAgICBvYmplY3RGaXJzdDogb2JqZWN0Rmlyc3QsXHJcbiAgICBvYmplY3RNYXA6IG9iamVjdE1hcCwgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIHN0cm9uZ2x5IHR5cGVkLlxyXG4gICAgZXh0ZW5kOiBleHRlbmQsXHJcbiAgICBwcm9wRXE6IHByb3BFcSxcclxuICAgIHByb3BzRXE6IHByb3BzRXEsXHJcbiAgICBwbHVjazogcGx1Y2ssXHJcbiAgICBtYXA6IG1hcCxcclxuICAgIHJlc29sdmVQcm9wZXJ0aWVzOiByZXNvbHZlUHJvcGVydGllcyxcclxuICAgIHNldEFzRGVmYXVsdDogc2V0QXNEZWZhdWx0LFxyXG4gICAgdXBkYXRlV2l0aERlZmF1bHRzOiB1cGRhdGVXaXRoRGVmYXVsdHMsXHJcbiAgICBnZXRBcnJheTogZ2V0QXJyYXksXHJcbiAgICB0b0FycmF5OiB0b0FycmF5LFxyXG4gICAgYXJyYXlFcXVhbHM6IGFycmF5RXF1YWxzLFxyXG4gICAgYXJyYXlTbGljZTogYXJyYXlTbGljZSxcclxuICAgIGFycmF5Rmlyc3Q6IGFycmF5Rmlyc3QsXHJcbiAgICBhcnJheUluZGV4T2Y6IGFycmF5SW5kZXhPZixcclxuICAgIGFycmF5UmVtb3ZlSXRlbTogYXJyYXlSZW1vdmVJdGVtLFxyXG4gICAgYXJyYXlaaXA6IGFycmF5WmlwLFxyXG4gICAgYXJyYXlBZGRJdGVtVW5pcXVlOiBhcnJheUFkZEl0ZW1VbmlxdWUsXHJcbiAgICBhcnJheUZsYXRNYXA6IGFycmF5RmxhdE1hcCxcclxuXHJcbiAgICByZXF1aXJlTGliOiByZXF1aXJlTGliLFxyXG4gICAgdXNpbmc6IHVzaW5nLFxyXG4gICAgd3JhcEV4ZWN1dGlvbjogd3JhcEV4ZWN1dGlvbixcclxuXHJcbiAgICBtZW1vaXplOiBtZW1vaXplLFxyXG4gICAgZ2V0VXVpZDogZ2V0VXVpZCxcclxuICAgIGR1cmF0aW9uVG9TZWNvbmRzOiBkdXJhdGlvblRvU2Vjb25kcyxcclxuXHJcbiAgICBpc1NldHRhYmxlOiBpc1NldHRhYmxlLFxyXG5cclxuICAgIGlzRGF0ZTogaXNEYXRlLFxyXG4gICAgaXNEYXRlU3RyaW5nOiBpc0RhdGVTdHJpbmcsXHJcbiAgICBpc0d1aWQ6IGlzR3VpZCxcclxuICAgIGlzRHVyYXRpb246IGlzRHVyYXRpb24sXHJcbiAgICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxyXG4gICAgaXNFbXB0eTogaXNFbXB0eSxcclxuICAgIGlzTnVtZXJpYzogaXNOdW1lcmljLFxyXG5cclxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcclxuICAgIG5vb3A6IG5vb3AsXHJcblxyXG4gICAgc3RyaW5nU3RhcnRzV2l0aDogc3RyaW5nU3RhcnRzV2l0aCxcclxuICAgIHN0cmluZ0VuZHNXaXRoOiBzdHJpbmdFbmRzV2l0aCxcclxuICAgIGZvcm1hdFN0cmluZzogZm9ybWF0U3RyaW5nLFxyXG4gICAgdGl0bGVDYXNlOiB0aXRsZUNhc2VTcGFjZSxcclxuXHJcbiAgICB0b0pzb246IHRvSnNvbixcclxuICAgIHRvSlNPTlNhZmU6IHRvSlNPTlNhZmUsXHJcbiAgICB0b0pTT05TYWZlUmVwbGFjZXI6IHRvSlNPTlNhZmVSZXBsYWNlcixcclxuXHJcbiAgICBzdHJpbmdzOiBzdHJpbmdzXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ2FsbGJhY2sge1xyXG4gICAgKGVycm9yOiBhbnkpOiB2b2lkO1xyXG59XHJcblxyXG5cclxuLy8gVW51c2VkXHJcbi8qXHJcbi8vIHJldHVybnMgdHJ1ZSBmb3IgYm9vbGVhbnMsIG51bWJlcnMsIHN0cmluZ3MgYW5kIGRhdGVzXHJcbi8vIGZhbHNlIGZvciBudWxsLCBhbmQgbm9uLWRhdGUgb2JqZWN0cywgZnVuY3Rpb25zLCBhbmQgYXJyYXlzXHJcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKG9iajogYW55KSB7XHJcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIHRydWUgZm9yIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zIGFuZCBudWxsLCBmYWxzZSBmb3Igb2JqZWN0c1xyXG4gICAgaWYgKG9iaiAhPSBPYmplY3Qob2JqKSkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gaXNEYXRlKG9iaik7XHJcbn1cclxuXHJcbiovIl19