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
@@ -0,0 +1,513 @@
1
+ import { __extends } from "tslib";
2
+ import { core } from './core';
3
+ import { BreezeEnum } from './enum';
4
+ import { Validator } from './validate';
5
+ var _localTimeRegex = /.\d{3}$/;
6
+ /**
7
+ DataType is an 'Enum' containing all of the supported data types.
8
+ @dynamic
9
+ **/
10
+ var DataType = /** @class */ (function (_super) {
11
+ __extends(DataType, _super);
12
+ function DataType() {
13
+ return _super !== null && _super.apply(this, arguments) || this;
14
+ }
15
+ DataType.getComparableFn = function (dataType) {
16
+ if (dataType && dataType.normalize) {
17
+ return dataType.normalize;
18
+ }
19
+ else if (dataType === DataType.Time) {
20
+ // durations must be converted to compare them
21
+ return function (value) {
22
+ return value && core.durationToSeconds(value);
23
+ };
24
+ }
25
+ else {
26
+ // TODO: __identity
27
+ return function (value) {
28
+ return value;
29
+ };
30
+ }
31
+ };
32
+ /** Returns the DataType for a specified EDM type name.
33
+ **/
34
+ DataType.fromEdmDataType = function (typeName) {
35
+ var dt;
36
+ var parts = typeName.split(".");
37
+ if (parts.length > 1) {
38
+ var simpleName = parts[1];
39
+ if (simpleName === "image") {
40
+ // hack
41
+ dt = DataType.Byte;
42
+ }
43
+ else if (parts.length === 2) {
44
+ dt = DataType.fromName(simpleName) || DataType.Undefined;
45
+ }
46
+ else {
47
+ // enum
48
+ // dt = DataType.Int32;
49
+ dt = DataType.String;
50
+ }
51
+ }
52
+ return dt;
53
+ };
54
+ /** Returns the DataType for a specified input. */
55
+ DataType.fromValue = function (val) {
56
+ if (core.isDate(val))
57
+ return DataType.DateTime;
58
+ switch (typeof val) {
59
+ case "string":
60
+ if (core.isGuid(val))
61
+ return DataType.Guid;
62
+ // the >3 below is a hack to insure that if we are inferring datatypes that
63
+ // very short strings that are valid but unlikely ISO encoded Time's are treated as strings instead.
64
+ else if (core.isDuration(val) && val.length > 3)
65
+ return DataType.Time;
66
+ else if (core.isDateString(val))
67
+ return DataType.DateTime;
68
+ return DataType.String;
69
+ case "boolean":
70
+ return DataType.Boolean;
71
+ case "number":
72
+ return DataType.Double;
73
+ }
74
+ return DataType.Undefined;
75
+ };
76
+ DataType.parseTimeFromServer = function (source) {
77
+ if (typeof source === 'string') {
78
+ return source;
79
+ }
80
+ // ODATA v3 format
81
+ if (source && source.__edmType === 'Edm.Time') {
82
+ var seconds = Math.floor(source.ms / 1000);
83
+ return 'PT' + seconds + 'S';
84
+ }
85
+ return source;
86
+ };
87
+ DataType.parseDateAsUTC = function (source) {
88
+ if (typeof source === 'string') {
89
+ // convert to UTC string if no time zone specifier.
90
+ var isLocalTime = _localTimeRegex.test(source);
91
+ // var isLocalTime = !hasTimeZone(source);
92
+ source = isLocalTime ? source + 'Z' : source;
93
+ }
94
+ source = new Date(Date.parse(source));
95
+ return source;
96
+ };
97
+ /** Parse as UTC then shift to local time */
98
+ DataType.parseDateAsLocal = function (source) {
99
+ var dt = DataType.parseDateAsUTC(source);
100
+ if (core.isDate(dt)) {
101
+ dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000);
102
+ }
103
+ return dt;
104
+ };
105
+ ;
106
+ /** if val is a Date, return a date-only string e.g. '2023-12-31' */
107
+ DataType.toDateOnlyString = function (val) {
108
+ // DateOnly types should not have time component, but JSON.stringify makes a full ISO string.
109
+ // We convert it to string here to prevent that, and shift the time zone because toISOString converts to UTC.
110
+ return val && val.getTime && new Date(val.getTime() - val.getTimezoneOffset() * 60000).toISOString().substring(0, 10) || val;
111
+ };
112
+ /** Returns a raw value converted to the specified DataType */
113
+ DataType.parseRawValue = function (val, dataType) {
114
+ // undefined values will be the default for most unmapped properties EXCEPT when they are set
115
+ // in a jsonResultsAdapter ( an unusual use case).
116
+ if (val === undefined)
117
+ return undefined;
118
+ if (!val)
119
+ return val;
120
+ if (dataType && dataType.parseRawValue) {
121
+ val = dataType.parseRawValue(val);
122
+ }
123
+ return val;
124
+ };
125
+ /** @hidden @internal */
126
+ // used during initialization; visible on instance for testing purposes.
127
+ DataType._resetConstants = function () {
128
+ DataType.constants = {
129
+ stringPrefix: "K_",
130
+ nextNumber: -1,
131
+ nextNumberIncrement: -1
132
+ };
133
+ };
134
+ DataType.parseDateFromServer = function (value) { return DataType.parseDateAsUTC(value); };
135
+ DataType.String = new DataType({
136
+ defaultValue: "",
137
+ parse: coerceToString,
138
+ fmtOData: fmtString,
139
+ getNext: getNextString
140
+ });
141
+ DataType.Int64 = new DataType({
142
+ defaultValue: 0,
143
+ isNumeric: true,
144
+ isInteger: true,
145
+ quoteJsonOData: true,
146
+ parse: coerceToInt,
147
+ fmtOData: makeFloatFmt("L"),
148
+ getNext: getNextNumber
149
+ });
150
+ DataType.Int32 = new DataType({
151
+ defaultValue: 0,
152
+ isNumeric: true,
153
+ isInteger: true,
154
+ parse: coerceToInt,
155
+ fmtOData: fmtInt,
156
+ getNext: getNextNumber
157
+ });
158
+ DataType.Int16 = new DataType({
159
+ defaultValue: 0,
160
+ isNumeric: true,
161
+ isInteger: true,
162
+ parse: coerceToInt,
163
+ fmtOData: fmtInt,
164
+ getNext: getNextNumber
165
+ });
166
+ DataType.Byte = new DataType({
167
+ defaultValue: 0,
168
+ isNumeric: true,
169
+ isInteger: true,
170
+ parse: coerceToInt,
171
+ fmtOData: fmtInt
172
+ });
173
+ DataType.Decimal = new DataType({
174
+ defaultValue: 0,
175
+ isNumeric: true,
176
+ quoteJsonOData: true,
177
+ isFloat: true,
178
+ parse: coerceToFloat,
179
+ fmtOData: makeFloatFmt("m"),
180
+ getNext: getNextNumber
181
+ });
182
+ DataType.Double = new DataType({
183
+ defaultValue: 0,
184
+ isNumeric: true,
185
+ isFloat: true,
186
+ parse: coerceToFloat,
187
+ fmtOData: makeFloatFmt("d"),
188
+ getNext: getNextNumber
189
+ });
190
+ DataType.Single = new DataType({
191
+ defaultValue: 0,
192
+ isNumeric: true,
193
+ isFloat: true,
194
+ parse: coerceToFloat,
195
+ fmtOData: makeFloatFmt("f"),
196
+ getNext: getNextNumber
197
+ });
198
+ DataType.DateOnly = new DataType({
199
+ defaultValue: new Date(1900, 0, 1),
200
+ isDate: true,
201
+ parse: coerceToDateOnly,
202
+ parseRawValue: parseRawDateOnly,
203
+ normalize: function (value) { return value && value.getTime && (new Date(value.getYear(), value.getMonth(), value.getDate())).getTime(); },
204
+ fmtOData: fmtDateOnly,
205
+ getNext: getNextDateTime,
206
+ getConcurrencyValue: getConcurrencyDateTime
207
+ });
208
+ DataType.DateTime = new DataType({
209
+ defaultValue: new Date(1900, 0, 1),
210
+ isDate: true,
211
+ parse: coerceToDate,
212
+ parseRawValue: parseRawDate,
213
+ normalize: function (value) { return value && value.getTime && value.getTime(); },
214
+ fmtOData: fmtDateTime,
215
+ getNext: getNextDateTime,
216
+ getConcurrencyValue: getConcurrencyDateTime
217
+ });
218
+ DataType.DateTimeOffset = new DataType({
219
+ defaultValue: new Date(1900, 0, 1),
220
+ isDate: true,
221
+ parse: coerceToDate,
222
+ parseRawValue: parseRawDate,
223
+ normalize: function (value) { return value && value.getTime && value.getTime(); },
224
+ fmtOData: fmtDateTimeOffset,
225
+ getNext: getNextDateTime,
226
+ getConcurrencyValue: getConcurrencyDateTime
227
+ });
228
+ DataType.Time = new DataType({
229
+ defaultValue: "PT0S",
230
+ fmtOData: fmtTime,
231
+ parseRawValue: DataType.parseTimeFromServer
232
+ });
233
+ DataType.Boolean = new DataType({
234
+ defaultValue: false,
235
+ parse: coerceToBool,
236
+ fmtOData: fmtBoolean
237
+ });
238
+ DataType.Guid = new DataType({
239
+ defaultValue: "00000000-0000-0000-0000-000000000000",
240
+ parse: coerceToGuid,
241
+ fmtOData: fmtGuid,
242
+ getNext: getNextGuid,
243
+ parseRawValue: function (val) { return val.toLowerCase(); },
244
+ getConcurrencyValue: core.getUuid
245
+ });
246
+ DataType.Binary = new DataType({
247
+ defaultValue: null,
248
+ fmtOData: fmtBinary,
249
+ parseRawValue: parseRawBinary
250
+ });
251
+ DataType.Undefined = new DataType({
252
+ defaultValue: undefined,
253
+ fmtOData: fmtUndefined
254
+ });
255
+ return DataType;
256
+ }(BreezeEnum));
257
+ export { DataType };
258
+ DataType.prototype._$typeName = "DataType";
259
+ Error['x'] = DataType._resetConstants();
260
+ Error['x'] = DataType.resolveSymbols();
261
+ Error['x'] = DataType.getSymbols().forEach(function (sym) { return sym.validatorCtor = getValidatorCtor(sym); });
262
+ // private functions;
263
+ function getValidatorCtor(dataType) {
264
+ switch (dataType) {
265
+ case DataType.String:
266
+ return Validator.string;
267
+ case DataType.Int64:
268
+ return Validator.int64;
269
+ case DataType.Int32:
270
+ return Validator.int32;
271
+ case DataType.Int16:
272
+ return Validator.int16;
273
+ case DataType.Decimal:
274
+ return Validator.number;
275
+ case DataType.Double:
276
+ return Validator.number;
277
+ case DataType.Single:
278
+ return Validator.number;
279
+ case DataType.DateTime:
280
+ return Validator.date;
281
+ case DataType.DateTimeOffset:
282
+ return Validator.date;
283
+ case DataType.Boolean:
284
+ return Validator.bool;
285
+ case DataType.Guid:
286
+ return Validator.guid;
287
+ case DataType.Byte:
288
+ return Validator.byte;
289
+ case DataType.Binary:
290
+ // TODO: don't quite know how to validate this yet.
291
+ return Validator.none;
292
+ case DataType.Time:
293
+ return Validator.duration;
294
+ case DataType.Undefined:
295
+ return Validator.none;
296
+ }
297
+ }
298
+ function getNextString() {
299
+ return DataType.constants.stringPrefix + getNextNumber().toString();
300
+ }
301
+ function getNextNumber() {
302
+ var result = DataType.constants.nextNumber;
303
+ DataType.constants.nextNumber += DataType.constants.nextNumberIncrement;
304
+ return result;
305
+ }
306
+ function getNextGuid() {
307
+ return core.getUuid();
308
+ }
309
+ function getNextDateTime() {
310
+ return new Date();
311
+ }
312
+ function getConcurrencyDateTime(val) {
313
+ // use the current datetime but insure that it is different from previous call.
314
+ var dt = new Date();
315
+ var dt2 = new Date();
316
+ while (dt.getTime() === dt2.getTime()) {
317
+ dt2 = new Date();
318
+ }
319
+ return dt2;
320
+ }
321
+ function coerceToString(source, sourceTypeName) {
322
+ return (source == null) ? source : source.toString();
323
+ }
324
+ function coerceToGuid(source, sourceTypeName) {
325
+ if (sourceTypeName === "string") {
326
+ return source.trim().toLowerCase();
327
+ }
328
+ return source;
329
+ }
330
+ function coerceToInt(source, sourceTypeName) {
331
+ if (sourceTypeName === "string") {
332
+ var src = source.trim();
333
+ if (src === "")
334
+ return null;
335
+ var val = parseInt(src, 10);
336
+ return isNaN(val) ? source : val;
337
+ }
338
+ else if (sourceTypeName === "number") {
339
+ return Math.round(source);
340
+ }
341
+ // do we want to coerce floats -> ints
342
+ return source;
343
+ }
344
+ function coerceToFloat(source, sourceTypeName) {
345
+ if (sourceTypeName === "string") {
346
+ var src = source.trim();
347
+ if (src === "")
348
+ return null;
349
+ var val = parseFloat(src);
350
+ return isNaN(val) ? source : val;
351
+ }
352
+ return source;
353
+ }
354
+ function coerceToDate(source, sourceTypeName) {
355
+ var val;
356
+ if (sourceTypeName === "string") {
357
+ var src = source.trim();
358
+ if (!source || !source.trim()) {
359
+ return null;
360
+ }
361
+ val = new Date(Date.parse(src));
362
+ return core.isDate(val) ? val : source;
363
+ }
364
+ else if (sourceTypeName === "number") {
365
+ val = new Date(source);
366
+ return core.isDate(val) ? val : source;
367
+ }
368
+ return source;
369
+ }
370
+ /** Trim off time portion before parse if source is string */
371
+ function coerceToDateOnly(source, sourceTypeName) {
372
+ var val;
373
+ if (sourceTypeName === "string") {
374
+ if (!source || !source.trim()) {
375
+ return null;
376
+ }
377
+ val = DataType.parseDateAsLocal(val);
378
+ return core.isDate(val) ? val : source;
379
+ }
380
+ else if (sourceTypeName === "number") {
381
+ val = new Date(source);
382
+ return core.isDate(val) ? val : source;
383
+ }
384
+ return source;
385
+ }
386
+ function coerceToBool(source, sourceTypeName) {
387
+ if (sourceTypeName === "string") {
388
+ var src = source.trim().toLowerCase();
389
+ if (src === "false" || src === "") {
390
+ return false;
391
+ }
392
+ else if (src === "true") {
393
+ return true;
394
+ }
395
+ else {
396
+ return source;
397
+ }
398
+ }
399
+ return source;
400
+ }
401
+ function fmtString(val) {
402
+ return val == null ? null : "'" + val.replace(/'/g, "''") + "'";
403
+ }
404
+ function fmtInt(val) {
405
+ return val == null ? null : ((typeof val === "string") ? parseInt(val, 10) : val);
406
+ }
407
+ function makeFloatFmt(fmtSuffix) {
408
+ return function (val) {
409
+ if (val == null)
410
+ return null;
411
+ if (typeof val === "string") {
412
+ val = parseFloat(val);
413
+ }
414
+ return val + fmtSuffix;
415
+ };
416
+ }
417
+ function fmtDateTime(val) {
418
+ if (val == null)
419
+ return null;
420
+ try {
421
+ return "datetime'" + val.toISOString() + "'";
422
+ }
423
+ catch (e) {
424
+ throwError("'%1' is not a valid dateTime", val);
425
+ }
426
+ }
427
+ function fmtDateOnly(val) {
428
+ if (val == null)
429
+ return null;
430
+ try {
431
+ return "date'" + val.toISOString().substring(0, 10) + "'";
432
+ }
433
+ catch (e) {
434
+ throwError("'%1' is not a valid dateTime", val);
435
+ }
436
+ }
437
+ function fmtDateTimeOffset(val) {
438
+ if (val == null)
439
+ return null;
440
+ try {
441
+ return "datetimeoffset'" + val.toISOString() + "'";
442
+ }
443
+ catch (e) {
444
+ throwError("'%1' is not a valid dateTime", val);
445
+ }
446
+ }
447
+ function fmtTime(val) {
448
+ if (val == null)
449
+ return null;
450
+ if (!core.isDuration(val)) {
451
+ throwError("'%1' is not a valid ISO 8601 duration", val);
452
+ }
453
+ return "time'" + val + "'";
454
+ }
455
+ function fmtGuid(val) {
456
+ if (val == null)
457
+ return null;
458
+ if (!core.isGuid(val)) {
459
+ throwError("'%1' is not a valid guid", val);
460
+ }
461
+ return "guid'" + val + "'";
462
+ }
463
+ function fmtBoolean(val) {
464
+ if (val == null)
465
+ return null;
466
+ if (typeof val === "string") {
467
+ return val.trim().toLowerCase() === "true";
468
+ }
469
+ else {
470
+ return !!val;
471
+ }
472
+ }
473
+ function fmtBinary(val) {
474
+ if (val == null)
475
+ return val;
476
+ return "binary'" + val + "'";
477
+ }
478
+ // TODO: use __identity instead;
479
+ function fmtUndefined(val) {
480
+ return val;
481
+ }
482
+ function throwError(msg, val) {
483
+ msg = core.formatString(msg, val);
484
+ throw new Error(msg);
485
+ }
486
+ function parseRawDate(val) {
487
+ if (!core.isDate(val)) {
488
+ val = DataType.parseDateFromServer(val);
489
+ }
490
+ return val;
491
+ }
492
+ /** Trim off time portion before parse */
493
+ function parseRawDateOnly(val) {
494
+ if (typeof val === 'string') {
495
+ if (val.length > 10) {
496
+ val = val.substring(0, 10);
497
+ }
498
+ val = DataType.parseDateAsLocal(val);
499
+ }
500
+ return val;
501
+ }
502
+ function parseRawBinary(val) {
503
+ if (val && val.$value !== undefined) {
504
+ val = val.$value; // this will be a byte[] encoded as a string
505
+ }
506
+ return val;
507
+ }
508
+ //function hasTimeZone(source) {
509
+ // var ix = source.indexOf("T");
510
+ // var timePart = source.substring(ix+1);
511
+ // return timePart.indexOf("-") >= 0 || timePart.indexOf("+") >= 0 || timePart.indexOf("Z");
512
+ //}
513
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10eXBlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9kYXRhLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXZDLElBQUksZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUVoQzs7O0dBR0c7QUFDSDtJQUE4Qiw0QkFBVTtJQUF4Qzs7SUFrVEEsQ0FBQztJQXRIUSx3QkFBZSxHQUF0QixVQUF1QixRQUFtQjtRQUN4QyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ2xDLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUMzQjthQUFNLElBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDckMsOENBQThDO1lBQzlDLE9BQU8sVUFBVSxLQUFVO2dCQUN6QixPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDO1NBQ0g7YUFBTTtZQUNMLG1CQUFtQjtZQUNuQixPQUFPLFVBQVUsS0FBVTtnQkFDekIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRDtPQUNHO0lBQ0ksd0JBQWUsR0FBdEIsVUFBdUIsUUFBZ0I7UUFDckMsSUFBSSxFQUF3QixDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxVQUFVLEtB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RTtRQUNyQixHQUFHLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLFNBQVMsZ0JBQWdCLENBQUMsR0FBUTtJQUNoQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUMzQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQ25CLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM1QjtRQUNELEdBQUcsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdEM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFRO0lBQzlCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQ25DLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsNENBQTRDO0tBQy9EO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLGlDQUFpQztBQUNqQywwQ0FBMEM7QUFDMUMsOEZBQThGO0FBQzlGLEdBQUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgQnJlZXplRW51bSB9IGZyb20gJy4vZW51bSc7XHJcbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xyXG5cclxubGV0IF9sb2NhbFRpbWVSZWdleCA9IC8uXFxkezN9JC87XHJcblxyXG4vKiogIFxyXG5EYXRhVHlwZSBpcyBhbiAnRW51bScgY29udGFpbmluZyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzLlxyXG5AZHluYW1pY1xyXG4qKi9cclxuZXhwb3J0IGNsYXNzIERhdGFUeXBlIGV4dGVuZHMgQnJlZXplRW51bSB7XHJcbiAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgRGF0YVR5cGUuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgZGVjbGFyZSBkZWZhdWx0VmFsdWU/OiBhbnk7XHJcbiAgLyoqIFdoZXRoZXIgdGhpcyBpcyBhICdudW1lcmljJyBEYXRhVHlwZS4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBkZWNsYXJlIGlzTnVtZXJpYz86IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdGhpcyBpcyBhbiAnaW50ZWdlcicgRGF0YVR5cGUuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgZGVjbGFyZSBpc0ludGVnZXI/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRvIHF1b3RlIHRoZSBqc29uIHZhbHVlIHdoZW4gZm9ybWF0dGluZyB0aGlzIERhdGFUeXBlIGZvciBPRGF0YS4gKi9cclxuICBkZWNsYXJlIHF1b3RlSnNvbk9EYXRhPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBjcmVhdGUgYSBbW1ZhbGlkYXRvcl1dIHRvIGJlIHVzZWQgaW4gdmFsaWRhdGluZyBpbnN0YW5jZXMgb2YgdGhpcyBEYXRhVHlwZS4gKi9cclxuICB2YWxpZGF0b3JDdG9yPyhjb250ZXh0PzogYW55KTogVmFsaWRhdG9yO1xyXG4gIC8qKiBcclxuICBPcHRpb25hbCBmdW5jdGlvbiB0byBub3JtYWxpemUgYSBkYXRhIHZhbHVlIGZvciBjb21wYXJpc29uLCBpZiBpdHMgdmFsdWUgY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkuIFxyXG4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSBhIHByb3BlcnR5IGlzIGNoYW5nZWQsIHNvIG1ha2UgaXQgZmFzdC5cclxuICBAcmV0dXJuIHZhbHVlIGFwcHJvcHJpYXRlIGZvciB0aGlzIERhdGFUeXBlXHJcbiAgKiovXHJcbiAgbm9ybWFsaXplPyh2YWx1ZTogYW55KTogYW55O1xyXG4gIC8qKlxyXG4gIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSByYXcgKHNlcnZlcikgdmFsdWUgZnJvbSBzdHJpbmcgdG8gdGhpcyBEYXRhVHlwZS5cclxuICBAcmV0dXJuIHZhbHVlIGFwcHJvcHJpYXRlIGZvciB0aGlzIERhdGFUeXBlXHJcbiAgKiovXHJcbiAgcGFyc2VSYXdWYWx1ZT8odmFsdWU6IGFueSk6IGFueTtcclxuICAvKipcclxuICBPcHRpb25hbCBmdW5jdGlvbiB0byBjb252ZXJ0IGEgdmFsdWUgZnJvbSBzdHJpbmcgdG8gdGhpcyBEYXRhVHlwZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSBhIHByb3BlcnR5IGlzIGNoYW5nZWQsIHNvIG1ha2UgaXQgZmFzdC5cclxuICBAcmV0dXJuIHZhbHVlIGFwcHJvcHJpYXRlIGZvciB0aGlzIERhdGFUeXBlIFxyXG4gICoqL1xyXG4gIHBhcnNlPyhzb3VyY2U6IGFueSwgc291cmNlVHlwZU5hbWU6IHN0cmluZyk6IGFueTtcclxuICAvKiogXHJcbiAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gZm9ybWF0IHRoaXMgRGF0YVR5cGUgZm9yIE9EYXRhIHF1ZXJpZXMuXHJcbiAgQHJldHVybiB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgT0RhdGEgcXVlcnkgICBcclxuICAqKi9cclxuICBmbXRPRGF0YT8odmFsdWU6IGFueSk6IGFueTtcclxuICAvKiogXHJcbiAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IHZhbHVlIGZvciBrZXkgZ2VuZXJhdGlvbiwgaWYgdGhpcyBkYXRhdHlwZSBpcyB1c2VkIGFzIGEga2V5LiAgVXNlcyBhbiBpbnRlcm5hbCB0YWJsZSBvZiBwcmV2aW91cyB2YWx1ZXMuXHJcbiAgQHJldHVybiB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBEYXRhVHlwZSBcclxuICAqKi9cclxuICBnZXROZXh0PygpOiBhbnk7XHJcbiAgLyoqXHJcbiAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IHZhbHVlIHdoZW4gdGhlIGRhdGF0eXBlIGlzIHVzZWQgYXMgYSBjb25jdXJyZW5jeSBwcm9wZXJ0eS5cclxuICBAcGFyYW0gcHJldmlvdXNWYWx1ZVxyXG4gIEByZXR1cm4gdGhlIG5leHQgY29uY3VycmVuY3kgdmFsdWUsIHdoaWNoIG1heSBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBwcmV2aW91c1ZhbHVlLlxyXG4gICoqL1xyXG4gIGdldENvbmN1cnJlbmN5VmFsdWU/KHByZXZpb3VzVmFsdWU/OiBhbnkpOiBhbnk7XHJcblxyXG4gIHN0YXRpYyBwYXJzZURhdGVGcm9tU2VydmVyID0gKHZhbHVlOiBhbnkpID0+IERhdGFUeXBlLnBhcnNlRGF0ZUFzVVRDKHZhbHVlKTtcclxuICAvLyBzYW1lIGVmZmVjdCBhcyBhYm92ZSBidXQgZG9lc24ndCBnaXZlIHJpZ2h0IFRTRE9DLlxyXG4gIC8vIHN0YXRpYyBwYXJzZURhdGVGcm9tU2VydmVyID0gRGF0YVR5cGUucGFyc2VEYXRlQXNVVEM7XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHN0YXRpYyBjb25zdGFudHM6IHsgc3RyaW5nUHJlZml4OiBzdHJpbmcsIG5leHROdW1iZXI6IG51bWJlciwgbmV4dE51bWJlckluY3JlbWVudDogbnVtYmVyIH07XHJcblxyXG4gIHN0YXRpYyBTdHJpbmcgPSBuZXcgRGF0YVR5cGUoe1xyXG4gICAgZGVmYXVsdFZhbHVlOiBcIlwiLFxyXG4gICAgcGFyc2U6IGNvZXJjZVRvU3RyaW5nLFxyXG4gICAgZm10T0RhdGE6IGZtdFN0cmluZyxcclxuICAgIGdldE5leHQ6IGdldE5leHRTdHJpbmdcclxuICB9KTtcclxuXHJcbiAgc3RhdGljIEludDY0ID0gbmV3IERhdGFUeXBlKHtcclxuICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgIGlzTnVtZXJpYzogdHJ1ZSxcclxuICAgIGlzSW50ZWdlcjogdHJ1ZSxcclxuICAgIHF1b3RlSnNvbk9EYXRhOiB0cnVlLFxyXG4gICAgcGFyc2U6IGNvZXJjZVRvSW50LFxyXG4gICAgZm10T0RhdGE6IG1ha2VGbG9hdEZtdChcIkxcIiksXHJcbiAgICBnZXROZXh0OiBnZXROZXh0TnVtYmVyXHJcbiAgfSk7XHJcblxyXG4gIHN0YXRpYyBJbnQzMiA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICBpc051bWVyaWM6IHRydWUsXHJcbiAgICBpc0ludGVnZXI6IHRydWUsXHJcbiAgICBwYXJzZTogY29lcmNlVG9JbnQsXHJcbiAgICBmbXRPRGF0YTogZm10SW50LFxyXG4gICAgZ2V0TmV4dDogZ2V0TmV4dE51bWJlclxyXG4gIH0pO1xyXG5cclxuICBzdGF0aWMgSW50MTYgPSBuZXcgRGF0YVR5cGUoe1xyXG4gICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgaXNOdW1lcmljOiB0cnVlLFxyXG4gICAgaXNJbnRlZ2VyOiB0cnVlLFxyXG4gICAgcGFyc2U6IGNvZXJjZVRvSW50LFxyXG4gICAgZm10T0RhdGE6IGZtdEludCxcclxuICAgIGdldE5leHQ6IGdldE5leHROdW1iZXJcclxuICB9KTtcclxuXHJcbiAgc3RhdGljIEJ5dGUgPSBuZXcgRGF0YVR5cGUoe1xyXG4gICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgaXNOdW1lcmljOiB0cnVlLFxyXG4gICAgaXNJbnRlZ2VyOiB0cnVlLFxyXG4gICAgcGFyc2U6IGNvZXJjZVRvSW50LFxyXG4gICAgZm10T0RhdGE6IGZtdEludFxyXG4gIH0pO1xyXG5cclxuICBzdGF0aWMgRGVjaW1hbCA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICBpc051bWVyaWM6IHRydWUsXHJcbiAgICBxdW90ZUpzb25PRGF0YTogdHJ1ZSxcclxuICAgIGlzRmxvYXQ6IHRydWUsXHJcbiAgICBwYXJzZTogY29lcmNlVG9GbG9hdCxcclxuICAgIGZtdE9EYXRhOiBtYWtlRmxvYXRGbXQoXCJtXCIpLFxyXG4gICAgZ2V0TmV4dDogZ2V0TmV4dE51bWJlclxyXG4gIH0pO1xyXG5cclxuICBzdGF0aWMgRG91YmxlID0gbmV3IERhdGFUeXBlKHtcclxuICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgIGlzTnVtZXJpYzogdHJ1ZSxcclxuICAgIGlzRmxvYXQ6IHRydWUsXHJcbiAgICBwYXJzZTogY29lcmNlVG9GbG9hdCxcclxuICAgIGZtdE9EYXRhOiBtYWtlRmxvYXRGbXQoXCJkXCIpLFxyXG4gICAgZ2V0TmV4dDogZ2V0TmV4dE51bWJlclxyXG4gIH0pO1xyXG5cclxuICBzdGF0aWMgU2luZ2xlID0gbmV3IERhdGFUeXBlKHtcclxuICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgIGlzTnVtZXJpYzogdHJ1ZSxcclxuICAgIGlzRmxvYXQ6IHRydWUsXHJcbiAgICBwYXJzZTogY29lcmNlVG9GbG9hdCxcclxuICAgIGZtdE9EYXRhOiBtYWtlRmxvYXRGbXQoXCJmXCIpLFxyXG4gICAgZ2V0TmV4dDogZ2V0TmV4dE51bWJlclxyXG4gIH0pO1xyXG5cclxuICBzdGF0aWMgRGF0ZU9ubHkgPSBuZXcgRGF0YVR5cGUoe1xyXG4gICAgZGVmYXVsdFZhbHVlOiBuZXcgRGF0ZSgxOTAwLCAwLCAxKSxcclxuICAgIGlzRGF0ZTogdHJ1ZSxcclxuICAgIHBhcnNlOiBjb2VyY2VUb0RhdGVPbmx5LFxyXG4gICAgcGFyc2VSYXdWYWx1ZTogcGFyc2VSYXdEYXRlT25seSxcclxuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHsgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmdldFRpbWUgJiYgKG5ldyBEYXRlKHZhbHVlLmdldFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgdmFsdWUuZ2V0RGF0ZSgpKSkuZ2V0VGltZSgpOyB9LCAvLyBkYXRlcyBkb24ndCBwZXJmb3JtIGVxdWFsaXR5IGNvbXBhcmlzb25zIHByb3Blcmx5XHJcbiAgICBmbXRPRGF0YTogZm10RGF0ZU9ubHksXHJcbiAgICBnZXROZXh0OiBnZXROZXh0RGF0ZVRpbWUsXHJcbiAgICBnZXRDb25jdXJyZW5jeVZhbHVlOiBnZXRDb25jdXJyZW5jeURhdGVUaW1lXHJcbiAgfSk7XHJcblxyXG4gIHN0YXRpYyBEYXRlVGltZSA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IG5ldyBEYXRlKDE5MDAsIDAsIDEpLFxyXG4gICAgaXNEYXRlOiB0cnVlLFxyXG4gICAgcGFyc2U6IGNvZXJjZVRvRGF0ZSxcclxuICAgIHBhcnNlUmF3VmFsdWU6IHBhcnNlUmF3RGF0ZSxcclxuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHsgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmdldFRpbWUgJiYgdmFsdWUuZ2V0VGltZSgpOyB9LCAvLyBkYXRlcyBkb24ndCBwZXJmb3JtIGVxdWFsaXR5IGNvbXBhcmlzb25zIHByb3Blcmx5XHJcbiAgICBmbXRPRGF0YTogZm10RGF0ZVRpbWUsXHJcbiAgICBnZXROZXh0OiBnZXROZXh0RGF0ZVRpbWUsXHJcbiAgICBnZXRDb25jdXJyZW5jeVZhbHVlOiBnZXRDb25jdXJyZW5jeURhdGVUaW1lXHJcbiAgfSk7XHJcblxyXG4gIHN0YXRpYyBEYXRlVGltZU9mZnNldCA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IG5ldyBEYXRlKDE5MDAsIDAsIDEpLFxyXG4gICAgaXNEYXRlOiB0cnVlLFxyXG4gICAgcGFyc2U6IGNvZXJjZVRvRGF0ZSxcclxuICAgIHBhcnNlUmF3VmFsdWU6IHBhcnNlUmF3RGF0ZSxcclxuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHsgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmdldFRpbWUgJiYgdmFsdWUuZ2V0VGltZSgpOyB9LCAvLyBkYXRlcyBkb24ndCBwZXJmb3JtIGVxdWFsaXR5IGNvbXBhcmlzb25zIHByb3Blcmx5XHJcbiAgICBmbXRPRGF0YTogZm10RGF0ZVRpbWVPZmZzZXQsXHJcbiAgICBnZXROZXh0OiBnZXROZXh0RGF0ZVRpbWUsXHJcbiAgICBnZXRDb25jdXJyZW5jeVZhbHVlOiBnZXRDb25jdXJyZW5jeURhdGVUaW1lXHJcbiAgfSk7XHJcblxyXG4gIHN0YXRpYyBUaW1lID0gbmV3IERhdGFUeXBlKHtcclxuICAgIGRlZmF1bHRWYWx1ZTogXCJQVDBTXCIsXHJcbiAgICBmbXRPRGF0YTogZm10VGltZSxcclxuICAgIHBhcnNlUmF3VmFsdWU6IERhdGFUeXBlLnBhcnNlVGltZUZyb21TZXJ2ZXJcclxuICB9KTtcclxuXHJcbiAgc3RhdGljIEJvb2xlYW4gPSBuZXcgRGF0YVR5cGUoe1xyXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcclxuICAgIHBhcnNlOiBjb2VyY2VUb0Jvb2wsXHJcbiAgICBmbXRPRGF0YTogZm10Qm9vbGVhblxyXG4gIH0pO1xyXG5cclxuICBzdGF0aWMgR3VpZCA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXHJcbiAgICBwYXJzZTogY29lcmNlVG9HdWlkLFxyXG4gICAgZm10T0RhdGE6IGZtdEd1aWQsXHJcbiAgICBnZXROZXh0OiBnZXROZXh0R3VpZCxcclxuICAgIHBhcnNlUmF3VmFsdWU6IGZ1bmN0aW9uICh2YWw6IHN0cmluZykgeyByZXR1cm4gdmFsLnRvTG93ZXJDYXNlKCk7IH0sXHJcbiAgICBnZXRDb25jdXJyZW5jeVZhbHVlOiBjb3JlLmdldFV1aWRcclxuICB9KTtcclxuXHJcbiAgc3RhdGljIEJpbmFyeSA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwsXHJcbiAgICBmbXRPRGF0YTogZm10QmluYXJ5LFxyXG4gICAgcGFyc2VSYXdWYWx1ZTogcGFyc2VSYXdCaW5hcnlcclxuICB9KTtcclxuXHJcbiAgc3RhdGljIFVuZGVmaW5lZCA9IG5ldyBEYXRhVHlwZSh7XHJcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcclxuICAgIGZtdE9EYXRhOiBmbXRVbmRlZmluZWRcclxuICB9KTtcclxuXHJcbiAgc3RhdGljIGdldENvbXBhcmFibGVGbihkYXRhVHlwZT86IERhdGFUeXBlKSB7XHJcbiAgICBpZiAoZGF0YVR5cGUgJiYgZGF0YVR5cGUubm9ybWFsaXplKSB7XHJcbiAgICAgIHJldHVybiBkYXRhVHlwZS5ub3JtYWxpemU7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBEYXRhVHlwZS5UaW1lKSB7XHJcbiAgICAgIC8vIGR1cmF0aW9ucyBtdXN0IGJlIGNvbnZlcnRlZCB0byBjb21wYXJlIHRoZW1cclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIGNvcmUuZHVyYXRpb25Ub1NlY29uZHModmFsdWUpO1xyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogX19pZGVudGl0eVxyXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB0aGUgRGF0YVR5cGUgZm9yIGEgc3BlY2lmaWVkIEVETSB0eXBlIG5hbWUuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21FZG1EYXRhVHlwZSh0eXBlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZHQ6IERhdGFUeXBlIHwgdW5kZWZpbmVkO1xyXG4gICAgbGV0IHBhcnRzID0gdHlwZU5hbWUuc3BsaXQoXCIuXCIpO1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgbGV0IHNpbXBsZU5hbWUgPSBwYXJ0c1sxXTtcclxuICAgICAgaWYgKHNpbXBsZU5hbWUgPT09IFwiaW1hZ2VcIikge1xyXG4gICAgICAgIC8vIGhhY2tcclxuICAgICAgICBkdCA9IERhdGFUeXBlLkJ5dGU7XHJcbiAgICAgIH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgZHQgPSBEYXRhVHlwZS5mcm9tTmFtZShzaW1wbGVOYW1lKSB8fCBEYXRhVHlwZS5VbmRlZmluZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZW51bVxyXG4gICAgICAgIC8vIGR0ID0gRGF0YVR5cGUuSW50MzI7XHJcbiAgICAgICAgZHQgPSBEYXRhVHlwZS5TdHJpbmc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHQ7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB0aGUgRGF0YVR5cGUgZm9yIGEgc3BlY2lmaWVkIGlucHV0LiAqL1xyXG4gIHN0YXRpYyBmcm9tVmFsdWUodmFsOiBhbnkpIHtcclxuICAgIGlmIChjb3JlLmlzRGF0ZSh2YWwpKSByZXR1cm4gRGF0YVR5cGUuRGF0ZVRpbWU7XHJcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcclxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgIGlmIChjb3JlLmlzR3VpZCh2YWwpKSByZXR1cm4gRGF0YVR5cGUuR3VpZDtcclxuICAgICAgICAvLyB0aGUgPjMgYmVsb3cgaXMgYSBoYWNrIHRvIGluc3VyZSB0aGF0IGlmIHdlIGFyZSBpbmZlcnJpbmcgZGF0YXR5cGVzIHRoYXRcclxuICAgICAgICAvLyB2ZXJ5IHNob3J0IHN0cmluZ3MgdGhhdCBhcmUgdmFsaWQgYnV0IHVubGlrZWx5IElTTyBlbmNvZGVkIFRpbWUncyBhcmUgdHJlYXRlZCBhcyBzdHJpbmdzIGluc3RlYWQuXHJcbiAgICAgICAgZWxzZSBpZiAoY29yZS5pc0R1cmF0aW9uKHZhbCkgJiYgdmFsLmxlbmd0aCA+IDMpIHJldHVybiBEYXRhVHlwZS5UaW1lO1xyXG4gICAgICAgIGVsc2UgaWYgKGNvcmUuaXNEYXRlU3RyaW5nKHZhbCkpIHJldHVybiBEYXRhVHlwZS5EYXRlVGltZTtcclxuICAgICAgICByZXR1cm4gRGF0YVR5cGUuU3RyaW5nO1xyXG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgIHJldHVybiBEYXRhVHlwZS5Cb29sZWFuO1xyXG4gICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgcmV0dXJuIERhdGFUeXBlLkRvdWJsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBEYXRhVHlwZS5VbmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcGFyc2VUaW1lRnJvbVNlcnZlcihzb3VyY2U6IGFueSkge1xyXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9XHJcbiAgICAvLyBPREFUQSB2MyBmb3JtYXRcclxuICAgIGlmIChzb3VyY2UgJiYgc291cmNlLl9fZWRtVHlwZSA9PT0gJ0VkbS5UaW1lJykge1xyXG4gICAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3Ioc291cmNlLm1zIC8gMTAwMCk7XHJcbiAgICAgIHJldHVybiAnUFQnICsgc2Vjb25kcyArICdTJztcclxuICAgIH1cclxuICAgIHJldHVybiBzb3VyY2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcGFyc2VEYXRlQXNVVEMoc291cmNlOiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAvLyBjb252ZXJ0IHRvIFVUQyBzdHJpbmcgaWYgbm8gdGltZSB6b25lIHNwZWNpZmllci5cclxuICAgICAgbGV0IGlzTG9jYWxUaW1lID0gX2xvY2FsVGltZVJlZ2V4LnRlc3Qoc291cmNlKTtcclxuICAgICAgLy8gdmFyIGlzTG9jYWxUaW1lID0gIWhhc1RpbWVab25lKHNvdXJjZSk7XHJcbiAgICAgIHNvdXJjZSA9IGlzTG9jYWxUaW1lID8gc291cmNlICsgJ1onIDogc291cmNlO1xyXG4gICAgfVxyXG4gICAgc291cmNlID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzb3VyY2UpKTtcclxuICAgIHJldHVybiBzb3VyY2U7XHJcbiAgfVxyXG5cclxuICAvKiogUGFyc2UgYXMgVVRDIHRoZW4gc2hpZnQgdG8gbG9jYWwgdGltZSAqL1xyXG4gIHN0YXRpYyBwYXJzZURhdGVBc0xvY2FsKHNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICB2YXIgZHQgPSBEYXRhVHlwZS5wYXJzZURhdGVBc1VUQyhzb3VyY2UpO1xyXG4gICAgaWYgKGNvcmUuaXNEYXRlKGR0KSkge1xyXG4gICAgICAgIGR0ID0gbmV3IERhdGUoZHQuZ2V0VGltZSgpICsgZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZHQ7XHJcbiAgfTtcclxuXHJcbiAgLyoqIGlmIHZhbCBpcyBhIERhdGUsIHJldHVybiBhIGRhdGUtb25seSBzdHJpbmcgZS5nLiAnMjAyMy0xMi0zMScgKi9cclxuICBzdGF0aWMgdG9EYXRlT25seVN0cmluZyh2YWw6IGFueSkge1xyXG4gICAgLy8gRGF0ZU9ubHkgdHlwZXMgc2hvdWxkIG5vdCBoYXZlIHRpbWUgY29tcG9uZW50LCBidXQgSlNPTi5zdHJpbmdpZnkgbWFrZXMgYSBmdWxsIElTTyBzdHJpbmcuXHJcbiAgICAvLyBXZSBjb252ZXJ0IGl0IHRvIHN0cmluZyBoZXJlIHRvIHByZXZlbnQgdGhhdCwgYW5kIHNoaWZ0IHRoZSB0aW1lIHpvbmUgYmVjYXVzZSB0b0lTT1N0cmluZyBjb252ZXJ0cyB0byBVVEMuXHJcbiAgICByZXR1cm4gdmFsICYmIHZhbC5nZXRUaW1lICYmIG5ldyBEYXRlKHZhbC5nZXRUaW1lKCkgLSB2YWwuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMCkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApIHx8IHZhbDtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIGEgcmF3IHZhbHVlIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIERhdGFUeXBlICovXHJcbiAgc3RhdGljIHBhcnNlUmF3VmFsdWUodmFsOiBhbnksIGRhdGFUeXBlPzogRGF0YVR5cGUpIHtcclxuICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCBiZSB0aGUgZGVmYXVsdCBmb3IgbW9zdCB1bm1hcHBlZCBwcm9wZXJ0aWVzIEVYQ0VQVCB3aGVuIHRoZXkgYXJlIHNldFxyXG4gICAgLy8gaW4gYSBqc29uUmVzdWx0c0FkYXB0ZXIgKCBhbiB1bnVzdWFsIHVzZSBjYXNlKS5cclxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xyXG4gICAgaWYgKGRhdGFUeXBlICYmIGRhdGFUeXBlLnBhcnNlUmF3VmFsdWUpIHtcclxuICAgICAgdmFsID0gZGF0YVR5cGUucGFyc2VSYXdWYWx1ZSh2YWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIC8vIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uOyB2aXNpYmxlIG9uIGluc3RhbmNlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxyXG4gIHN0YXRpYyBfcmVzZXRDb25zdGFudHMoKSB7XHJcbiAgICBEYXRhVHlwZS5jb25zdGFudHMgPSB7XHJcbiAgICAgIHN0cmluZ1ByZWZpeDogXCJLX1wiLFxyXG4gICAgICBuZXh0TnVtYmVyOiAtMSxcclxuICAgICAgbmV4dE51bWJlckluY3JlbWVudDogLTFcclxuICAgIH07XHJcbiAgfVxyXG5cclxufVxyXG5EYXRhVHlwZS5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiRGF0YVR5cGVcIjtcclxuRXJyb3JbJ3gnXSA9IERhdGFUeXBlLl9yZXNldENvbnN0YW50cygpO1xyXG5FcnJvclsneCddID0gRGF0YVR5cGUucmVzb2x2ZVN5bWJvbHMoKTtcclxuRXJyb3JbJ3gnXSA9IERhdGFUeXBlLmdldFN5bWJvbHMoKS5mb3JFYWNoKChzeW06IERhdGFUeXBlKSA9PiBzeW0udmFsaWRhdG9yQ3RvciA9IGdldFZhbGlkYXRvckN0b3Ioc3ltKSk7XHJcblxyXG4vLyBwcml2YXRlIGZ1bmN0aW9ucztcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRWYWxpZGF0b3JDdG9yKGRhdGFUeXBlOiBEYXRhVHlwZSkge1xyXG4gIHN3aXRjaCAoZGF0YVR5cGUpIHtcclxuICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOlxyXG4gICAgICByZXR1cm4gVmFsaWRhdG9yLnN0cmluZztcclxuICAgIGNhc2UgRGF0YVR5cGUuSW50NjQ6XHJcbiAgICAgIHJldHVybiBWYWxpZGF0b3IuaW50NjQ7XHJcbiAgICBjYXNlIERhdGFUeXBlLkludDMyOlxyXG4gICAgICByZXR1cm4gVmFsaWRhdG9yLmludDMyO1xyXG4gICAgY2FzZSBEYXRhVHlwZS5JbnQxNjpcclxuICAgICAgcmV0dXJuIFZhbGlkYXRvci5pbnQxNjtcclxuICAgIGNhc2UgRGF0YVR5cGUuRGVjaW1hbDpcclxuICAgICAgcmV0dXJuIFZhbGlkYXRvci5udW1iZXI7XHJcbiAgICBjYXNlIERhdGFUeXBlLkRvdWJsZTpcclxuICAgICAgcmV0dXJuIFZhbGlkYXRvci5udW1iZXI7XHJcbiAgICBjYXNlIERhdGFUeXBlLlNpbmdsZTpcclxuICAgICAgcmV0dXJuIFZhbGlkYXRvci5udW1iZXI7XHJcbiAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxyXG4gICAgICByZXR1cm4gVmFsaWRhdG9yLmRhdGU7XHJcbiAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lT2Zmc2V0OlxyXG4gICAgICByZXR1cm4gVmFsaWRhdG9yLmRhdGU7XHJcbiAgICBjYXNlIERhdGFUeXBlLkJvb2xlYW46XHJcbiAgICAgIHJldHVybiBWYWxpZGF0b3IuYm9vbDtcclxuICAgIGNhc2UgRGF0YVR5cGUuR3VpZDpcclxuICAgICAgcmV0dXJuIFZhbGlkYXRvci5ndWlkO1xyXG4gICAgY2FzZSBEYXRhVHlwZS5CeXRlOlxyXG4gICAgICByZXR1cm4gVmFsaWRhdG9yLmJ5dGU7XHJcbiAgICBjYXNlIERhdGFUeXBlLkJpbmFyeTpcclxuICAgICAgLy8gVE9ETzogZG9uJ3QgcXVpdGUga25vdyBob3cgdG8gdmFsaWRhdGUgdGhpcyB5ZXQuXHJcbiAgICAgIHJldHVybiBWYWxpZGF0b3Iubm9uZTtcclxuICAgIGNhc2UgRGF0YVR5cGUuVGltZTpcclxuICAgICAgcmV0dXJuIFZhbGlkYXRvci5kdXJhdGlvbjtcclxuICAgIGNhc2UgRGF0YVR5cGUuVW5kZWZpbmVkOlxyXG4gICAgICByZXR1cm4gVmFsaWRhdG9yLm5vbmU7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXROZXh0U3RyaW5nKCkge1xyXG4gIHJldHVybiBEYXRhVHlwZS5jb25zdGFudHMuc3RyaW5nUHJlZml4ICsgZ2V0TmV4dE51bWJlcigpLnRvU3RyaW5nKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5leHROdW1iZXIoKSB7XHJcbiAgbGV0IHJlc3VsdCA9IERhdGFUeXBlLmNvbnN0YW50cy5uZXh0TnVtYmVyO1xyXG4gIERhdGFUeXBlLmNvbnN0YW50cy5uZXh0TnVtYmVyICs9IERhdGFUeXBlLmNvbnN0YW50cy5uZXh0TnVtYmVySW5jcmVtZW50O1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5leHRHdWlkKCkge1xyXG4gIHJldHVybiBjb3JlLmdldFV1aWQoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dERhdGVUaW1lKCkge1xyXG4gIHJldHVybiBuZXcgRGF0ZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDb25jdXJyZW5jeURhdGVUaW1lKHZhbDogYW55KSB7XHJcbiAgLy8gdXNlIHRoZSBjdXJyZW50IGRhdGV0aW1lIGJ1dCBpbnN1cmUgdGhhdCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBjYWxsLlxyXG4gIGxldCBkdCA9IG5ldyBEYXRlKCk7XHJcbiAgbGV0IGR0MiA9IG5ldyBEYXRlKCk7XHJcbiAgd2hpbGUgKGR0LmdldFRpbWUoKSA9PT0gZHQyLmdldFRpbWUoKSkge1xyXG4gICAgZHQyID0gbmV3IERhdGUoKTtcclxuICB9XHJcbiAgcmV0dXJuIGR0MjtcclxufVxyXG5cclxuZnVuY3Rpb24gY29lcmNlVG9TdHJpbmcoc291cmNlOiBhbnksIHNvdXJjZVR5cGVOYW1lPzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIChzb3VyY2UgPT0gbnVsbCkgPyBzb3VyY2UgOiBzb3VyY2UudG9TdHJpbmcoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29lcmNlVG9HdWlkKHNvdXJjZTogYW55LCBzb3VyY2VUeXBlTmFtZTogc3RyaW5nKSB7XHJcbiAgaWYgKHNvdXJjZVR5cGVOYW1lID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICByZXR1cm4gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuICByZXR1cm4gc291cmNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb2VyY2VUb0ludChzb3VyY2U6IGFueSwgc291cmNlVHlwZU5hbWU6IHN0cmluZykge1xyXG4gIGlmIChzb3VyY2VUeXBlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgbGV0IHNyYyA9IHNvdXJjZS50cmltKCk7XHJcbiAgICBpZiAoc3JjID09PSBcIlwiKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCB2YWwgPSBwYXJzZUludChzcmMsIDEwKTtcclxuICAgIHJldHVybiBpc05hTih2YWwpID8gc291cmNlIDogdmFsO1xyXG4gIH0gZWxzZSBpZiAoc291cmNlVHlwZU5hbWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKHNvdXJjZSk7XHJcbiAgfVxyXG4gIC8vIGRvIHdlIHdhbnQgdG8gY29lcmNlIGZsb2F0cyAtPiBpbnRzXHJcbiAgcmV0dXJuIHNvdXJjZTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29lcmNlVG9GbG9hdChzb3VyY2U6IGFueSwgc291cmNlVHlwZU5hbWU6IHN0cmluZykge1xyXG4gIGlmIChzb3VyY2VUeXBlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgbGV0IHNyYyA9IHNvdXJjZS50cmltKCk7XHJcbiAgICBpZiAoc3JjID09PSBcIlwiKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCB2YWwgPSBwYXJzZUZsb2F0KHNyYyk7XHJcbiAgICByZXR1cm4gaXNOYU4odmFsKSA/IHNvdXJjZSA6IHZhbDtcclxuICB9XHJcbiAgcmV0dXJuIHNvdXJjZTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29lcmNlVG9EYXRlKHNvdXJjZTogYW55LCBzb3VyY2VUeXBlTmFtZTogc3RyaW5nKSB7XHJcbiAgbGV0IHZhbDogYW55O1xyXG4gIGlmIChzb3VyY2VUeXBlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgbGV0IHNyYyA9IHNvdXJjZS50cmltKCk7XHJcbiAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlLnRyaW0oKSkgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgdmFsID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzcmMpKTtcclxuICAgIHJldHVybiBjb3JlLmlzRGF0ZSh2YWwpID8gdmFsIDogc291cmNlO1xyXG4gIH0gZWxzZSBpZiAoc291cmNlVHlwZU5hbWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgIHZhbCA9IG5ldyBEYXRlKHNvdXJjZSk7XHJcbiAgICByZXR1cm4gY29yZS5pc0RhdGUodmFsKSA/IHZhbCA6IHNvdXJjZTtcclxuICB9XHJcbiAgcmV0dXJuIHNvdXJjZTtcclxufVxyXG5cclxuLyoqIFRyaW0gb2ZmIHRpbWUgcG9ydGlvbiBiZWZvcmUgcGFyc2UgaWYgc291cmNlIGlzIHN0cmluZyAqL1xyXG5mdW5jdGlvbiBjb2VyY2VUb0RhdGVPbmx5KHNvdXJjZTogYW55LCBzb3VyY2VUeXBlTmFtZTogc3RyaW5nKSB7XHJcbiAgbGV0IHZhbDogYW55O1xyXG4gIGlmIChzb3VyY2VUeXBlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS50cmltKCkpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIHZhbCA9IERhdGFUeXBlLnBhcnNlRGF0ZUFzTG9jYWwodmFsKTtcclxuICAgIHJldHVybiBjb3JlLmlzRGF0ZSh2YWwpID8gdmFsIDogc291cmNlO1xyXG4gIH0gZWxzZSBpZiAoc291cmNlVHlwZU5hbWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgIHZhbCA9IG5ldyBEYXRlKHNvdXJjZSk7XHJcbiAgICByZXR1cm4gY29yZS5pc0RhdGUodmFsKSA/IHZhbCA6IHNvdXJjZTtcclxuICB9XHJcbiAgcmV0dXJuIHNvdXJjZTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29lcmNlVG9Cb29sKHNvdXJjZTogYW55LCBzb3VyY2VUeXBlTmFtZTogc3RyaW5nKSB7XHJcbiAgaWYgKHNvdXJjZVR5cGVOYW1lID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICBsZXQgc3JjID0gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKHNyYyA9PT0gXCJmYWxzZVwiIHx8IHNyYyA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHNyYyA9PT0gXCJ0cnVlXCIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gc291cmNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmbXRTdHJpbmcodmFsOiBhbnkpIHtcclxuICByZXR1cm4gdmFsID09IG51bGwgPyBudWxsIDogXCInXCIgKyB2YWwucmVwbGFjZSgvJy9nLCBcIicnXCIpICsgXCInXCI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZtdEludCh2YWw6IGFueSkge1xyXG4gIHJldHVybiB2YWwgPT0gbnVsbCA/IG51bGwgOiAoKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpID8gcGFyc2VJbnQodmFsLCAxMCkgOiB2YWwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtYWtlRmxvYXRGbXQoZm10U3VmZml4OiBzdHJpbmcpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKHZhbDogYW55KSB7XHJcbiAgICBpZiAodmFsID09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbCArIGZtdFN1ZmZpeDtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmbXREYXRlVGltZSh2YWw6IERhdGUpIHtcclxuICBpZiAodmFsID09IG51bGwpIHJldHVybiBudWxsO1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gXCJkYXRldGltZSdcIiArIHZhbC50b0lTT1N0cmluZygpICsgXCInXCI7XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgdGhyb3dFcnJvcihcIiclMScgaXMgbm90IGEgdmFsaWQgZGF0ZVRpbWVcIiwgdmFsKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZtdERhdGVPbmx5KHZhbDogRGF0ZSkge1xyXG4gIGlmICh2YWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBcImRhdGUnXCIgKyB2YWwudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApICsgXCInXCI7XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgdGhyb3dFcnJvcihcIiclMScgaXMgbm90IGEgdmFsaWQgZGF0ZVRpbWVcIiwgdmFsKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZtdERhdGVUaW1lT2Zmc2V0KHZhbDogRGF0ZSkge1xyXG4gIGlmICh2YWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBcImRhdGV0aW1lb2Zmc2V0J1wiICsgdmFsLnRvSVNPU3RyaW5nKCkgKyBcIidcIjtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICB0aHJvd0Vycm9yKFwiJyUxJyBpcyBub3QgYSB2YWxpZCBkYXRlVGltZVwiLCB2YWwpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZm10VGltZSh2YWw6IGFueSkge1xyXG4gIGlmICh2YWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgaWYgKCFjb3JlLmlzRHVyYXRpb24odmFsKSkge1xyXG4gICAgdGhyb3dFcnJvcihcIiclMScgaXMgbm90IGEgdmFsaWQgSVNPIDg2MDEgZHVyYXRpb25cIiwgdmFsKTtcclxuICB9XHJcbiAgcmV0dXJuIFwidGltZSdcIiArIHZhbCArIFwiJ1wiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmbXRHdWlkKHZhbDogYW55KSB7XHJcbiAgaWYgKHZhbCA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICBpZiAoIWNvcmUuaXNHdWlkKHZhbCkpIHtcclxuICAgIHRocm93RXJyb3IoXCInJTEnIGlzIG5vdCBhIHZhbGlkIGd1aWRcIiwgdmFsKTtcclxuICB9XHJcbiAgcmV0dXJuIFwiZ3VpZCdcIiArIHZhbCArIFwiJ1wiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmbXRCb29sZWFuKHZhbDogYW55KSB7XHJcbiAgaWYgKHZhbCA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgcmV0dXJuIHZhbC50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiAhIXZhbDtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZtdEJpbmFyeSh2YWw6IGFueSkge1xyXG4gIGlmICh2YWwgPT0gbnVsbCkgcmV0dXJuIHZhbDtcclxuICByZXR1cm4gXCJiaW5hcnknXCIgKyB2YWwgKyBcIidcIjtcclxufVxyXG5cclxuLy8gVE9ETzogdXNlIF9faWRlbnRpdHkgaW5zdGVhZDtcclxuZnVuY3Rpb24gZm10VW5kZWZpbmVkKHZhbDogYW55KSB7XHJcbiAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuZnVuY3Rpb24gdGhyb3dFcnJvcihtc2c6IHN0cmluZywgdmFsOiBhbnkpIHtcclxuICBtc2cgPSBjb3JlLmZvcm1hdFN0cmluZyhtc2csIHZhbCk7XHJcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlUmF3RGF0ZSh2YWw6IGFueSkge1xyXG4gIGlmICghY29yZS5pc0RhdGUodmFsKSkge1xyXG4gICAgdmFsID0gRGF0YVR5cGUucGFyc2VEYXRlRnJvbVNlcnZlcih2YWwpO1xyXG4gIH1cclxuICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG4vKiogVHJpbSBvZmYgdGltZSBwb3J0aW9uIGJlZm9yZSBwYXJzZSAqL1xyXG5mdW5jdGlvbiBwYXJzZVJhd0RhdGVPbmx5KHZhbDogYW55KSB7XHJcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBpZiAodmFsLmxlbmd0aCA+IDEwKSB7XHJcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgMTApO1xyXG4gICAgfVxyXG4gICAgdmFsID0gRGF0YVR5cGUucGFyc2VEYXRlQXNMb2NhbCh2YWwpO1xyXG4gIH1cclxuICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVJhd0JpbmFyeSh2YWw6IGFueSkge1xyXG4gIGlmICh2YWwgJiYgdmFsLiR2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB2YWwgPSB2YWwuJHZhbHVlOyAvLyB0aGlzIHdpbGwgYmUgYSBieXRlW10gZW5jb2RlZCBhcyBhIHN0cmluZ1xyXG4gIH1cclxuICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG4vL2Z1bmN0aW9uIGhhc1RpbWVab25lKHNvdXJjZSkge1xyXG4vLyAgdmFyIGl4ID0gc291cmNlLmluZGV4T2YoXCJUXCIpO1xyXG4vLyAgdmFyIHRpbWVQYXJ0ID0gc291cmNlLnN1YnN0cmluZyhpeCsxKTtcclxuLy8gIHJldHVybiAgdGltZVBhcnQuaW5kZXhPZihcIi1cIikgPj0gMCB8fCB0aW1lUGFydC5pbmRleE9mKFwiK1wiKSA+PSAwIHx8IHRpbWVQYXJ0LmluZGV4T2YoXCJaXCIpO1xyXG4vL31cclxuIl19