breeze-client 2.2.0 → 2.2.1-cjs

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