breeze-client 2.1.3-mjs → 2.1.4

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