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,1300 @@
1
+ import { __extends, __read, __spread } from "tslib";
2
+ import { core } from './core';
3
+ import { EntityType, DataProperty } from './entity-metadata';
4
+ import { DataType } from './data-type';
5
+ import { EntityAspect } from './entity-aspect';
6
+ /**
7
+ Used to define a 'where' predicate for an [[EntityQuery]]. Predicates are immutable, which means that any
8
+ method that would modify a Predicate actually returns a new Predicate.
9
+ **/
10
+ var Predicate = /** @class */ (function () {
11
+ /**
12
+ Predicate constructor
13
+ > let p1 = new Predicate("CompanyName", "StartsWith", "B");
14
+ > let query = new EntityQuery("Customers").where(p1);
15
+
16
+ or
17
+ > let p2 = new Predicate("Region", FilterQueryOp.Equals, null);
18
+ > let query = new EntityQuery("Customers").where(p2);
19
+ @param property - A property name, a nested property name or an expression involving a property name.
20
+ @param operator -
21
+ @param value - This will be treated as either a property expression or a literal depending on context. In general,
22
+ if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.
23
+ In most cases this works well, but you can also force the interpretation by making the value argument itself an object with a 'value'
24
+ property and an 'isLiteral' property set to either true or false. Breeze also tries to infer the dataType of any
25
+ literal based on context, if this fails you can force this inference by making the value argument an object with a
26
+ 'value' property and a 'dataType' property set to one of the breeze.DataType enumeration instances.
27
+ **/
28
+ function Predicate() {
29
+ var args = [];
30
+ for (var _i = 0; _i < arguments.length; _i++) {
31
+ args[_i] = arguments[_i];
32
+ }
33
+ if (args.length === 0)
34
+ return;
35
+ if (!(this instanceof Predicate)) {
36
+ return new (Predicate.bind.apply(Predicate, __spread([void 0], args)))();
37
+ }
38
+ return Predicate.create.apply(Predicate, __spread(args));
39
+ }
40
+ /**
41
+ Same as using the ctor.
42
+ > // so
43
+ > let p = Predicate.create(a, b, c);
44
+ > // is the same as
45
+ > let p = new Predicate(a, b, c);
46
+ @param property - A property name, a nested property name or an expression involving a property name.
47
+ @param operator - the filter query operator.
48
+ @param value - This will be treated as either a property expression or a literal depending on context. In general,
49
+ if the value can be interpreted as a property expression it will be, otherwise it will be treated as a literal.
50
+ In most cases this works well, but you can also force the interpretation by making the value argument itself an object with a 'value'
51
+ property and an 'isLiteral' property set to either true or false. Breeze also tries to infer the dataType of any
52
+ literal based on context, if this fails you can force this inference by making the value argument an object with a
53
+ 'value' property and a 'dataType' property set to one of the breeze.DataType enumeration instances.
54
+ **/
55
+ Predicate.create = function () {
56
+ // can be called from std javascript without new ( legacy )
57
+ var args = [];
58
+ for (var _i = 0; _i < arguments.length; _i++) {
59
+ args[_i] = arguments[_i];
60
+ }
61
+ // empty ctor is used by all subclasses.
62
+ if (args.length === 0)
63
+ return new Predicate();
64
+ if (args.length === 1) {
65
+ // possibilities:
66
+ // Predicate([ aPredicate ]) or Predicate(["freight", ">", 100]) - an array
67
+ // Predicate(aPredicate) - a predicate
68
+ // Predicate( "freight gt 100" } // passthru ( i.e. maybe an odata string) - a string
69
+ // Predicate( { freight: { ">": 100 } }) - an object
70
+ var arg = arguments[0];
71
+ if (Array.isArray(arg)) {
72
+ if (arg.length === 1) {
73
+ // recurse
74
+ return new Predicate(arg[0]);
75
+ }
76
+ else {
77
+ return createPredicateFromArray(arg);
78
+ }
79
+ }
80
+ else if (arg instanceof Predicate) {
81
+ return arg;
82
+ }
83
+ else if (typeof arg === 'string') {
84
+ return new PassthruPredicate(arg);
85
+ }
86
+ else {
87
+ return createPredicateFromObject(arg);
88
+ }
89
+ }
90
+ else {
91
+ // 2 possibilities
92
+ // Predicate("freight", ">", 100");
93
+ // Predicate("orders", "any", "freight", ">", 950);
94
+ return createPredicateFromArray(args);
95
+ }
96
+ };
97
+ /** @hidden @internal */
98
+ Predicate.prototype._validate = function (entityType, usesNameOnServer) {
99
+ // noop here;
100
+ };
101
+ /**
102
+ Creates a 'composite' Predicate by 'and'ing a set of specified Predicates together.
103
+ > let dt = new Date(88, 9, 12);
104
+ > let p1 = Predicate.create("OrderDate", "ne", dt);
105
+ > let p2 = Predicate.create("ShipCity", "startsWith", "C");
106
+ > let p3 = Predicate.create("Freight", ">", 100);
107
+ > let newPred = Predicate.and(p1, p2, p3);
108
+
109
+ or
110
+ > let preds = [p1, p2, p3];
111
+ > let newPred = Predicate.and(preds);
112
+ @param predicates - multiple Predicates or an array of Predicate.
113
+ Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.
114
+ **/
115
+ Predicate.and = function () {
116
+ var args = [];
117
+ for (var _i = 0; _i < arguments.length; _i++) {
118
+ args[_i] = arguments[_i];
119
+ }
120
+ var pred = new AndOrPredicate("and", args);
121
+ // TODO removed below
122
+ // return undefined if empty
123
+ // return pred.op && pred;
124
+ return pred;
125
+ };
126
+ /**
127
+ Creates a 'composite' Predicate by 'or'ing a set of specified Predicates together.
128
+ > let dt = new Date(88, 9, 12);
129
+ > let p1 = Predicate.create("OrderDate", "ne", dt);
130
+ > let p2 = Predicate.create("ShipCity", "startsWith", "C");
131
+ > let p3 = Predicate.create("Freight", ">", 100);
132
+ > let newPred = Predicate.or(p1, p2, p3);
133
+
134
+ or
135
+ > let preds = [p1, p2, p3];
136
+ > let newPred = Predicate.or(preds);
137
+ @param predicates - multiple Predicates or an array of Predicate.
138
+ Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.
139
+ **/
140
+ Predicate.or = function () {
141
+ var args = [];
142
+ for (var _i = 0; _i < arguments.length; _i++) {
143
+ args[_i] = arguments[_i];
144
+ }
145
+ var pred = new AndOrPredicate("or", args);
146
+ // return pred.op && pred;
147
+ return pred;
148
+ };
149
+ /**
150
+ Creates a 'composite' Predicate by 'negating' a specified predicate.
151
+ > let p1 = Predicate.create("Freight", "gt", 100);
152
+ > let not_p1 = Predicate.not(p1);
153
+
154
+ This can also be accomplished using the 'instance' version of the 'not' method
155
+ > let not_p1 = p1.not();
156
+
157
+ Both of which would be the same as
158
+ > let not_p1 = Predicate.create("Freight", "le", 100);
159
+ **/
160
+ Predicate.not = function (pred) {
161
+ return pred.not();
162
+ };
163
+ // TODO: determine if/where this is used.
164
+ // static extendBinaryPredicateFn(opMap: IOpMap, visitorFn: any) {
165
+ // let baseVisitorFn = toFunctionVisitor.binaryPredicate;
166
+ // for (let op in (opMap || {})) {
167
+ // let config = opMap[op];
168
+ // config.visitorFn = visitorFn;
169
+ // updateAliasMap(BinaryPredicate.prototype.aliasMap, op, opMap[op]);
170
+ // }
171
+ // if (!toFunctionVisitor.isExtended) {
172
+ // toFunctionVisitor.binaryPredicate = function (context, expr1Val, expr2Val) {
173
+ // let visitorFn = this.aliasMap[this.op.key].visitorFn;
174
+ // if (visitorFn) {
175
+ // return visitorFn(context, expr1Val, expr2Val);
176
+ // } else {
177
+ // return baseVisitorFn(context, expr1Val, expr2Val);
178
+ // }
179
+ // };
180
+ // toFunctionVisitor.isExtended = true;
181
+ // }
182
+ // };
183
+ Predicate.extendFuncMap = function (funcMap) {
184
+ for (var func in (funcMap || {})) {
185
+ var config = funcMap[func];
186
+ FnExpr._funcMap[func] = config;
187
+ }
188
+ };
189
+ ;
190
+ /**
191
+ 'And's this Predicate with one or more other Predicates and returns a new 'composite' Predicate
192
+ > let dt = new Date(88, 9, 12);
193
+ > let p1 = Predicate.create("OrderDate", "ne", dt);
194
+ > let p2 = Predicate.create("ShipCity", "startsWith", "C");
195
+ > let p3 = Predicate.create("Freight", ">", 100);
196
+ > let newPred = p1.and(p2, p3);
197
+
198
+ or
199
+ > let preds = [p2, p3];
200
+ > let newPred = p1.and(preds);
201
+
202
+ The 'and' method is also used to write "fluent" expressions
203
+ > let p4 = Predicate.create("ShipCity", "startswith", "F")
204
+ > .and("Size", "gt", 2000);
205
+ @param predicates - multiple Predicates or an array of Predicates.
206
+ Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.
207
+ **/
208
+ Predicate.prototype.and = function () {
209
+ var args = [];
210
+ for (var _i = 0; _i < arguments.length; _i++) {
211
+ args[_i] = arguments[_i];
212
+ }
213
+ return new AndOrPredicate("and", argsForAndOrPredicates(this, args));
214
+ };
215
+ /**
216
+ 'Or's this Predicate with one or more other Predicates and returns a new 'composite' Predicate
217
+ > let dt = new Date(88, 9, 12);
218
+ > let p1 = Predicate.create("OrderDate", "ne", dt);
219
+ > let p2 = Predicate.create("ShipCity", "startsWith", "C");
220
+ > let p3 = Predicate.create("Freight", ">", 100);
221
+ > let newPred = p1.or(p2, p3);
222
+
223
+ or
224
+ > let preds = [p2, p3];
225
+ > let newPred = p1.or(preds);
226
+
227
+ The 'or' method is also used to write "fluent" expressions
228
+ > let p4 = Predicate.create("ShipCity", "startswith", "F")
229
+ > .or("Size", "gt", 2000);
230
+ @param predicates - multiple Predicates or an array of Predicates.
231
+ Any null or undefined values passed in will be automatically filtered out before constructing the composite predicate.
232
+ **/
233
+ Predicate.prototype.or = function () {
234
+ var args = [];
235
+ for (var _i = 0; _i < arguments.length; _i++) {
236
+ args[_i] = arguments[_i];
237
+ }
238
+ return new AndOrPredicate("or", argsForAndOrPredicates(this, args));
239
+ };
240
+ /**
241
+ Returns the 'negated' version of this Predicate
242
+ > let p1 = Predicate.create("Freight", "gt", 100);
243
+ > let not_p1 = p1.not();
244
+
245
+ This can also be accomplished using the 'static' version of the 'not' method
246
+ > let p1 = Predicate.create("Freight", "gt", 100);
247
+ > let not_p1 = Predicate.not(p1);
248
+
249
+ which would be the same as
250
+ > let not_p1 = Predicate.create("Freight", "le", 100);
251
+ **/
252
+ Predicate.prototype.not = function () {
253
+ return new UnaryPredicate("not", this);
254
+ };
255
+ //
256
+ Predicate.prototype.toJSON = function () {
257
+ // toJSON ( part of js standard - takes a single parameter
258
+ // that is either "" or the name of the property being serialized.
259
+ return this.toJSONExt({ entityType: this._entityType });
260
+ };
261
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
262
+ @adapter (see [[IUriBuilderAdapter]])
263
+ @hidden @internal
264
+ */
265
+ Predicate.prototype.toJSONExt = function (context) {
266
+ return this.visit(context, toJSONVisitor);
267
+ };
268
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
269
+ @adapter (see [[IUriBuilderAdapter]])
270
+ @hidden @internal
271
+ */
272
+ Predicate.prototype.toFunction = function (context) {
273
+ return this.visit(context, toFunctionVisitor);
274
+ };
275
+ Predicate.prototype.toString = function () {
276
+ return JSON.stringify(this);
277
+ };
278
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
279
+ @adapter (see [[IUriBuilderAdapter]])
280
+ @hidden @internal
281
+ */
282
+ Predicate.prototype.visit = function (context, visitor) {
283
+ if (core.isEmpty(context)) {
284
+ context = { entityType: undefined };
285
+ }
286
+ else if (context instanceof EntityType) {
287
+ context = { entityType: context };
288
+ }
289
+ else if (!core.hasOwnProperty(context, "entityType")) {
290
+ throw new Error("All visitor methods must be called with a context object containing at least an 'entityType' property");
291
+ }
292
+ if (visitor) {
293
+ context.visitor = visitor;
294
+ }
295
+ var tVisitor = visitor || context.visitor;
296
+ var fn = tVisitor[this.visitorMethodName];
297
+ if (fn == null) {
298
+ throw new Error("Unable to locate method: " + this.visitorMethodName + " on visitor");
299
+ }
300
+ var entityType = context.entityType;
301
+ // don't bother validating if already done so ( or if no _validate method
302
+ if (this._validate && (entityType == null || this._entityType !== entityType)) {
303
+ // don't need to capture return value because validation fn doesn't have one.
304
+ // TODO: this was old code
305
+ // this._validate(entityType, context.usesNameOnServer);
306
+ this._validate(entityType, context.toNameOnServer);
307
+ this._entityType = entityType;
308
+ }
309
+ return fn.call(this, context);
310
+ };
311
+ /** @hidden @internal */
312
+ Predicate.prototype._initialize = function (visitorMethodName, opMap) {
313
+ if (opMap === void 0) { opMap = {}; }
314
+ this.visitorMethodName = visitorMethodName;
315
+ var aliasMap = this.aliasMap = {};
316
+ for (var op in opMap) {
317
+ updateAliasMap(aliasMap, op, opMap[op]);
318
+ }
319
+ };
320
+ /** @hidden @internal */
321
+ Predicate.prototype._resolveOp = function (op, okIfNotFound) {
322
+ var opStr = (typeof op === "string") ? op : op.operator;
323
+ var result = this.aliasMap[opStr.toLowerCase()];
324
+ if (!result && !okIfNotFound) {
325
+ throw new Error("Unable to resolve operator: " + opStr);
326
+ }
327
+ return result;
328
+ };
329
+ return Predicate;
330
+ }());
331
+ export { Predicate };
332
+ function createPredicateFromArray(arr) {
333
+ // TODO: assert that length of the array should be > 3
334
+ // Needs to handle:
335
+ // [ "freight", ">", 100"];
336
+ // [ "orders", "any", "freight", ">", 950 ]
337
+ // [ "orders", "and", anotherPred ]
338
+ // [ "orders", "and", [ "freight, ">", 950 ]]
339
+ var json = {};
340
+ var value = {};
341
+ json[arr[0]] = value;
342
+ var op = arr[1];
343
+ op = op.operator || op; // incoming op will be either a string or a FilterQueryOp
344
+ if (arr.length === 3) {
345
+ value[op] = arr[2];
346
+ }
347
+ else {
348
+ value[op] = createPredicateFromArray(arr.splice(2));
349
+ }
350
+ return createPredicateFromObject(json);
351
+ }
352
+ function createPredicateFromObject(obj) {
353
+ if (obj instanceof Predicate)
354
+ return obj;
355
+ if (typeof obj !== 'object') {
356
+ throw new Error("Unable to convert to a Predicate: " + obj);
357
+ }
358
+ var keys = Object.keys(obj);
359
+ var preds = keys.map(function (key) {
360
+ return createPredicateFromKeyValue(key, obj[key]);
361
+ });
362
+ return (preds.length === 1) ? preds[0] : new AndOrPredicate("and", preds);
363
+ }
364
+ function createPredicateFromKeyValue(key, value) {
365
+ // { and: [a,b] } key='and', value = [a,b]
366
+ if (AndOrPredicate.prototype._resolveOp(key, true)) {
367
+ return new AndOrPredicate(key, value);
368
+ }
369
+ // { not: a } key= 'not', value = a
370
+ if (UnaryPredicate.prototype._resolveOp(key, true)) {
371
+ return new UnaryPredicate(key, value);
372
+ }
373
+ if ((typeof value !== 'object') || value == null || core.isDate(value)) {
374
+ // { foo: bar } key='foo', value = bar ( where bar is a literal i.e. a string, a number, a boolean or a date.
375
+ return new BinaryPredicate("eq", key, value);
376
+ }
377
+ else if (core.hasOwnProperty(value, 'value')) {
378
+ // { foo: { value: bar, dataType: xxx} } key='foo', value = bar ( where bar is an object representing a literal
379
+ return new BinaryPredicate("eq", key, value);
380
+ }
381
+ if (Array.isArray(value)) {
382
+ throw new Error("Unable to resolve predicate after the phrase: " + key);
383
+ }
384
+ var expr = key;
385
+ var keys = Object.keys(value);
386
+ var preds = keys.map(function (op) {
387
+ // { a: { any: b } op = 'any', expr=a, value[op] = b
388
+ if (AnyAllPredicate.prototype._resolveOp(op, true)) {
389
+ return new AnyAllPredicate(op, expr, value[op]);
390
+ }
391
+ if (BinaryPredicate.prototype._resolveOp(op, true)) {
392
+ // { a: { ">": b }} op = ">", expr=a, value[op] = b
393
+ return new BinaryPredicate(op, expr, value[op]);
394
+ }
395
+ else if (core.hasOwnProperty(value[op], 'value')) {
396
+ // { a: { ">": { value: b, dataType: 'Int32' }} expr = a value[op] = { value: b, dataType: 'Int32' }
397
+ return new BinaryPredicate("eq", expr, value[op]);
398
+ }
399
+ var msg = core.formatString("Unable to resolve predicate after the phrase: '%1' for operator: '%2' and value: '%3'", expr, op, value[op]);
400
+ throw new Error(msg);
401
+ });
402
+ return (preds.length === 1) ? preds[0] : new AndOrPredicate("and", preds);
403
+ }
404
+ function argsForAndOrPredicates(obj, args) {
405
+ var preds = args[0];
406
+ if (preds instanceof Predicate) {
407
+ preds = core.arraySlice(args);
408
+ }
409
+ else if (!Array.isArray(preds)) {
410
+ preds = [new Predicate(core.arraySlice(args))];
411
+ }
412
+ return [obj].concat(preds);
413
+ }
414
+ function updateAliasMap(aliasMap, opStr, op) {
415
+ var key = opStr.toLowerCase();
416
+ op.key = key;
417
+ aliasMap[key] = op;
418
+ op.aliases && op.aliases.forEach(function (alias) {
419
+ aliasMap[alias.toLowerCase()] = op;
420
+ });
421
+ }
422
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
423
+ @adapter (see [[IUriBuilderAdapter]])
424
+ @hidden @internal
425
+ */
426
+ var PassthruPredicate = /** @class */ (function (_super) {
427
+ __extends(PassthruPredicate, _super);
428
+ function PassthruPredicate(value) {
429
+ var _this = _super.call(this) || this;
430
+ _this.value = value;
431
+ return _this;
432
+ }
433
+ return PassthruPredicate;
434
+ }(Predicate));
435
+ Error['x'] = PassthruPredicate.prototype._initialize('passthruPredicate');
436
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
437
+ @adapter (see [[IUriBuilderAdapter]])
438
+ @hidden
439
+ */
440
+ var UnaryPredicate = /** @class */ (function (_super) {
441
+ __extends(UnaryPredicate, _super);
442
+ function UnaryPredicate(op) {
443
+ var args = [];
444
+ for (var _i = 1; _i < arguments.length; _i++) {
445
+ args[_i - 1] = arguments[_i];
446
+ }
447
+ var _this = _super.call(this) || this;
448
+ _this.op = _this._resolveOp(op);
449
+ _this.pred = new Predicate(args);
450
+ return _this;
451
+ }
452
+ UnaryPredicate.prototype._validate = function (entityType, usesNameOnServer) {
453
+ this.pred._validate(entityType, usesNameOnServer);
454
+ };
455
+ return UnaryPredicate;
456
+ }(Predicate));
457
+ export { UnaryPredicate };
458
+ Error['x'] = UnaryPredicate.prototype._initialize('unaryPredicate', {
459
+ 'not': { aliases: ['!', '~'] },
460
+ });
461
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
462
+ @adapter (see [[IUriBuilderAdapter]])
463
+ @hidden
464
+ */
465
+ var BinaryPredicate = /** @class */ (function (_super) {
466
+ __extends(BinaryPredicate, _super);
467
+ function BinaryPredicate(op, expr1, expr2) {
468
+ var _this = _super.call(this) || this;
469
+ // 5 public props op, expr1Source, expr2Source, expr1, expr2
470
+ _this.op = _this._resolveOp(op);
471
+ _this.expr1Source = expr1;
472
+ _this.expr2Source = expr2;
473
+ return _this;
474
+ // this.expr1 and this.expr2 won't be
475
+ // determined until validate is run
476
+ }
477
+ BinaryPredicate.prototype._validate = function (entityType, usesNameOnServer) {
478
+ var expr1Context = { entityType: entityType, usesNameOnServer: usesNameOnServer };
479
+ this.expr1 = createExpr(this.expr1Source, expr1Context);
480
+ if (this.expr1 == null) {
481
+ throw new Error("Unable to validate 1st expression: " + this.expr1Source);
482
+ }
483
+ if (this.expr1 instanceof LitExpr) {
484
+ // lhs must be either a property or a function.
485
+ throw new Error("The left hand side of a binary predicate cannot be a literal expression, it must be a valid property or functional predicate expression: " + this.expr1Source);
486
+ }
487
+ if (this.op.key === 'in' && !Array.isArray(this.expr2Source)) {
488
+ throw new Error("The 'in' operator requires that its right hand argument be an array");
489
+ }
490
+ var expr2Context = core.extend(expr1Context, { isRHS: true, dataType: this.expr1.dataType });
491
+ this.expr2 = createExpr(this.expr2Source, expr2Context);
492
+ if (this.expr2 == null) {
493
+ throw new Error("Unable to validate 2nd expression: " + this.expr2Source);
494
+ }
495
+ if (this.expr1.dataType == null) {
496
+ this.expr1.dataType = this.expr2.dataType;
497
+ }
498
+ };
499
+ return BinaryPredicate;
500
+ }(Predicate));
501
+ export { BinaryPredicate };
502
+ Error['x'] = BinaryPredicate.prototype._initialize('binaryPredicate', {
503
+ 'eq': {
504
+ aliases: ["==", "equals"]
505
+ },
506
+ 'ne': {
507
+ aliases: ["!=", "~=", "notequals"]
508
+ },
509
+ 'lt': {
510
+ aliases: ["<", "lessthan"]
511
+ },
512
+ 'le': {
513
+ aliases: ["<=", "lessthanorequal"]
514
+ },
515
+ 'gt': {
516
+ aliases: [">", "greaterthan"]
517
+ },
518
+ 'ge': {
519
+ aliases: [">=", "greaterthanorequal"]
520
+ },
521
+ 'startswith': {
522
+ isFunction: true
523
+ },
524
+ 'endswith': {
525
+ isFunction: true
526
+ },
527
+ 'contains': {
528
+ aliases: ["substringof"],
529
+ isFunction: true
530
+ },
531
+ 'in': {}
532
+ });
533
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
534
+ @adapter (see [[IUriBuilderAdapter]])
535
+ @hidden
536
+ */
537
+ var AndOrPredicate = /** @class */ (function (_super) {
538
+ __extends(AndOrPredicate, _super);
539
+ function AndOrPredicate(op, preds) {
540
+ var _this = _super.call(this) || this;
541
+ _this.op = _this._resolveOp(op);
542
+ if (preds.length === 1 && Array.isArray(preds[0])) {
543
+ preds = preds[0];
544
+ }
545
+ _this.preds = preds.filter(function (pred) {
546
+ return pred != null;
547
+ }).map(function (pred) {
548
+ return new Predicate(pred);
549
+ });
550
+ // TODO: this was removed - test if really needed.
551
+ // if (this.preds.length === 0) {
552
+ // // marker for an empty predicate
553
+ // this.op = null;
554
+ // }
555
+ if (_this.preds.length === 1) {
556
+ return _this.preds[0]; // HACK: this.preds[0] is actually NOT a AndOrPredicate but some other kind of pred.
557
+ }
558
+ return _this;
559
+ }
560
+ AndOrPredicate.prototype._validate = function (entityType, usesNameOnServer) {
561
+ this.preds.forEach(function (pred) {
562
+ pred._validate(entityType, usesNameOnServer);
563
+ });
564
+ };
565
+ return AndOrPredicate;
566
+ }(Predicate));
567
+ export { AndOrPredicate };
568
+ Error['x'] = AndOrPredicate.prototype._initialize("andOrPredicate", {
569
+ 'and': { aliases: ['&&'] },
570
+ 'or': { aliases: ['||'] }
571
+ });
572
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
573
+ @adapter (see [[IUriBuilderAdapter]])
574
+ @hidden
575
+ */
576
+ var AnyAllPredicate = /** @class */ (function (_super) {
577
+ __extends(AnyAllPredicate, _super);
578
+ // 4 public props: op, exprSource, expr, pred
579
+ function AnyAllPredicate(op, expr, pred) {
580
+ var _this = _super.call(this) || this;
581
+ _this.op = _this._resolveOp(op);
582
+ _this.exprSource = expr;
583
+ // this.expr will not be resolved until validate is called
584
+ _this.pred = new Predicate(pred);
585
+ return _this;
586
+ }
587
+ AnyAllPredicate.prototype._validate = function (entityType, usesNameOnServer) {
588
+ this.expr = createExpr(this.exprSource, { entityType: entityType, usesNameOnServer: usesNameOnServer });
589
+ // can't really know the predicateEntityType unless the original entity type was known.
590
+ if (entityType == null || entityType.isAnonymous) {
591
+ this.expr.dataType = undefined;
592
+ }
593
+ this.pred._validate(this.expr.dataType, usesNameOnServer);
594
+ };
595
+ return AnyAllPredicate;
596
+ }(Predicate));
597
+ export { AnyAllPredicate };
598
+ Error['x'] = AnyAllPredicate.prototype._initialize("anyAllPredicate", {
599
+ 'any': { aliases: ['some'] },
600
+ 'all': { aliases: ["every"] }
601
+ });
602
+ /** @hidden */
603
+ var PredicateExpression = /** @class */ (function () {
604
+ function PredicateExpression(visitorMethodName) {
605
+ this.visitorMethodName = visitorMethodName;
606
+ // give expressions the Predicate prototype method
607
+ this.visit = Predicate.prototype.visit;
608
+ }
609
+ // default impls - may/will be overridden be subclass expressions
610
+ PredicateExpression.prototype._validate = function (entityType, usesNameOnServer) {
611
+ // noop;
612
+ };
613
+ return PredicateExpression;
614
+ }());
615
+ export { PredicateExpression };
616
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
617
+ @adapter (see [[IUriBuilderAdapter]])
618
+ @hidden
619
+ */
620
+ var LitExpr = /** @class */ (function (_super) {
621
+ __extends(LitExpr, _super);
622
+ // 2 public props: value, dataType
623
+ function LitExpr(value, dataType, hasExplicitDataType) {
624
+ var _this = _super.call(this, "litExpr") || this;
625
+ // dataType may come is an a string
626
+ var dt1 = resolveDataType(dataType);
627
+ // if the DataType comes in as Undefined this means
628
+ // that we should NOT attempt to parse it but just leave it alone
629
+ // for now - this is usually because it is part of a Func expr.
630
+ // TODO: cast as DataType seems to be needed by early version of TypeDoc - may be able to remove later
631
+ var dt2 = (dt1 || DataType.fromValue(value));
632
+ if (dt2.parse) {
633
+ if (Array.isArray(value)) {
634
+ _this.value = value.map(function (v) { return dt2.parse(v, typeof v); });
635
+ }
636
+ else {
637
+ _this.value = dt2.parse(value, typeof value);
638
+ }
639
+ }
640
+ else {
641
+ _this.value = value;
642
+ }
643
+ _this.dataType = dt2;
644
+ _this.hasExplicitDataType = !!hasExplicitDataType;
645
+ return _this;
646
+ }
647
+ LitExpr.prototype.toString = function () {
648
+ return " LitExpr - value: " + this.value.toString() + " dataType: " + this.dataType.toString();
649
+ };
650
+ return LitExpr;
651
+ }(PredicateExpression));
652
+ export { LitExpr };
653
+ function resolveDataType(dataType) {
654
+ if (dataType == null)
655
+ return dataType;
656
+ // if (DataType.contains(dataType)) {
657
+ if (dataType instanceof DataType) {
658
+ return dataType;
659
+ }
660
+ if (typeof dataType === 'string') {
661
+ var dt = DataType.fromName(dataType);
662
+ if (dt)
663
+ return dt;
664
+ throw new Error("Unable to resolve a dataType named: " + dataType);
665
+ }
666
+ throw new Error("The dataType parameter passed into this literal expression is not a 'DataType'" + dataType);
667
+ }
668
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
669
+ @adapter (see [[IUriBuilderAdapter]])
670
+ @hidden
671
+ */
672
+ var PropExpr = /** @class */ (function (_super) {
673
+ __extends(PropExpr, _super);
674
+ // two public props: propertyPath, dateType
675
+ function PropExpr(propertyPath) {
676
+ var _this = _super.call(this, 'propExpr') || this;
677
+ _this.propertyPath = propertyPath;
678
+ return _this;
679
+ //this.dataType = DataType.Undefined;
680
+ // this.dataType resolved after validate ( if not on an anon type }
681
+ }
682
+ PropExpr.prototype.toString = function () {
683
+ return " PropExpr - " + this.propertyPath;
684
+ };
685
+ PropExpr.prototype._validate = function (entityType, usesNameOnServer) {
686
+ if (entityType == null || entityType.isAnonymous)
687
+ return;
688
+ var props = entityType.getPropertiesOnPath(this.propertyPath, null, false);
689
+ if (!props) {
690
+ var msg = core.formatString("Unable to resolve propertyPath. EntityType: '%1' PropertyPath: '%2'", entityType.name, this.propertyPath);
691
+ throw new Error(msg);
692
+ }
693
+ // get the last property
694
+ var prop = props[props.length - 1];
695
+ if (prop instanceof DataProperty) {
696
+ this.dataType = prop.dataType;
697
+ }
698
+ else {
699
+ this.dataType = prop.entityType;
700
+ }
701
+ };
702
+ return PropExpr;
703
+ }(PredicateExpression));
704
+ export { PropExpr };
705
+ /** For use by breeze plugin authors only. The class is for use in building a [[IUriBuilderAdapter]] implementation.
706
+ @adapter (see [[IUriBuilderAdapter]])
707
+ @hidden @dynamic
708
+ */
709
+ var FnExpr = /** @class */ (function (_super) {
710
+ __extends(FnExpr, _super);
711
+ function FnExpr(fnName, exprs) {
712
+ var _this = _super.call(this, 'fnExpr') || this;
713
+ // 4 public props: fnName, exprs, localFn, dataType
714
+ _this.fnName = fnName;
715
+ _this.exprs = exprs;
716
+ var qf = FnExpr._funcMap[fnName];
717
+ if (qf == null) {
718
+ throw new Error("Unknown function: " + fnName);
719
+ }
720
+ _this.localFn = qf.fn;
721
+ _this.dataType = qf.dataType;
722
+ return _this;
723
+ }
724
+ FnExpr.prototype.toString = function () {
725
+ var exprStr = this.exprs.map(function (expr) {
726
+ expr.toString();
727
+ }).toString();
728
+ return "FnExpr - " + this.fnName + "(" + exprStr + ")";
729
+ };
730
+ FnExpr.prototype._validate = function (entityType, usesNameOnServer) {
731
+ this.exprs.forEach(function (expr) {
732
+ expr._validate(entityType, usesNameOnServer);
733
+ });
734
+ };
735
+ FnExpr._funcMap = {
736
+ toupper: {
737
+ fn: function (source) {
738
+ return source.toUpperCase();
739
+ }, dataType: DataType.String
740
+ },
741
+ tolower: {
742
+ fn: function (source) {
743
+ return source.toLowerCase();
744
+ }, dataType: DataType.String
745
+ },
746
+ substring: {
747
+ fn: function (source, pos, length) {
748
+ return source.substring(pos, length);
749
+ }, dataType: DataType.String
750
+ },
751
+ substringof: {
752
+ fn: function (find, source) {
753
+ return source.indexOf(find) >= 0;
754
+ }, dataType: DataType.Boolean
755
+ },
756
+ length: {
757
+ fn: function (source) {
758
+ return source.length;
759
+ }, dataType: DataType.Int32
760
+ },
761
+ trim: {
762
+ fn: function (source) {
763
+ return source.trim();
764
+ }, dataType: DataType.String
765
+ },
766
+ concat: {
767
+ fn: function (s1, s2) {
768
+ return s1.concat(s2);
769
+ }, dataType: DataType.String
770
+ },
771
+ replace: {
772
+ fn: function (source, find, replace) {
773
+ return source.replace(find, replace);
774
+ }, dataType: DataType.String
775
+ },
776
+ startswith: {
777
+ fn: function (source, find) {
778
+ return core.stringStartsWith(source, find);
779
+ }, dataType: DataType.Boolean
780
+ },
781
+ endswith: {
782
+ fn: function (source, find) {
783
+ return core.stringEndsWith(source, find);
784
+ }, dataType: DataType.Boolean
785
+ },
786
+ indexof: {
787
+ fn: function (source, find) {
788
+ return source.indexOf(find);
789
+ }, dataType: DataType.Int32
790
+ },
791
+ round: {
792
+ fn: function (source) {
793
+ return Math.round(source);
794
+ }, dataType: DataType.Int32
795
+ },
796
+ ceiling: {
797
+ fn: function (source) {
798
+ return Math.ceil(source);
799
+ }, dataType: DataType.Int32
800
+ },
801
+ floor: {
802
+ fn: function (source) {
803
+ return Math.floor(source);
804
+ }, dataType: DataType.Int32
805
+ },
806
+ second: {
807
+ fn: function (source) {
808
+ return source.getSeconds();
809
+ }, dataType: DataType.Int32
810
+ },
811
+ minute: {
812
+ fn: function (source) {
813
+ return source.getMinutes();
814
+ }, dataType: DataType.Int32
815
+ },
816
+ day: {
817
+ fn: function (source) {
818
+ return source.getDate();
819
+ }, dataType: DataType.Int32
820
+ },
821
+ month: {
822
+ fn: function (source) {
823
+ return source.getMonth() + 1;
824
+ }, dataType: DataType.Int32
825
+ },
826
+ year: {
827
+ fn: function (source) {
828
+ return source.getFullYear();
829
+ }, dataType: DataType.Int32
830
+ }
831
+ };
832
+ return FnExpr;
833
+ }(PredicateExpression));
834
+ export { FnExpr };
835
+ // TODO: add dataTypes for the args next - will help to infer other dataTypes.
836
+ var RX_IDENTIFIER = /^[a-z_][\w.$]*$/i;
837
+ // comma delimited expressions ignoring commas inside of both single and double quotes.
838
+ var RX_COMMA_DELIM1 = /('[^']*'|[^,]+)/g;
839
+ var RX_COMMA_DELIM2 = /("[^"]*"|[^,]+)/g;
840
+ var DELIM = String.fromCharCode(191);
841
+ function createExpr(source, exprContext) {
842
+ var entityType = exprContext.entityType;
843
+ // the right hand side of an 'in' clause
844
+ if (Array.isArray(source)) {
845
+ if (!exprContext.isRHS) {
846
+ throw new Error("Array expressions are only permitted on the right hand side of a BinaryPredicate");
847
+ }
848
+ return new LitExpr(source, exprContext.dataType);
849
+ }
850
+ if (!(typeof source === 'string')) {
851
+ if (source != null && typeof source === 'object' && !source.toISOString) {
852
+ // source is an object but not a Date-like thing such as a JS or MomentJS Date
853
+ if (source.value === undefined) {
854
+ throw new Error("Unable to resolve an expression for: " + source + " on entityType: " + (entityType ? entityType.name : 'null'));
855
+ }
856
+ if (source.isProperty) {
857
+ return new PropExpr(source.value);
858
+ }
859
+ else {
860
+ // we want to insure that any LitExpr created this way is tagged with 'hasExplicitDataType: true'
861
+ // because we want to insure that if we roundtrip thru toJSON that we don't
862
+ // accidentally reinterpret this node as a PropExpr.
863
+ // return new LitExpr(source.value, source.dataType || context.dataType, !!source.dataType);
864
+ return new LitExpr(source.value, source.dataType || exprContext.dataType, true);
865
+ }
866
+ }
867
+ else {
868
+ return new LitExpr(source, exprContext.dataType);
869
+ }
870
+ }
871
+ if (exprContext.isRHS) {
872
+ if (entityType == null || entityType.isAnonymous) {
873
+ // if entityType is unknown then assume that the rhs is a literal
874
+ return new LitExpr(source, exprContext.dataType);
875
+ }
876
+ else {
877
+ return parseLitOrPropExpr(source, exprContext);
878
+ }
879
+ }
880
+ else {
881
+ var regex = /\([^()]*\)/;
882
+ var m = void 0;
883
+ var tokens = [];
884
+ var i = 0;
885
+ while (m = regex.exec(source)) {
886
+ var token = m[0];
887
+ tokens.push(token);
888
+ var repl = DELIM + i++;
889
+ source = source.replace(token, repl);
890
+ }
891
+ var expr = parseExpr(source, tokens, exprContext);
892
+ expr._validate(entityType, exprContext.usesNameOnServer);
893
+ return expr;
894
+ }
895
+ }
896
+ function parseExpr(source, tokens, exprContext) {
897
+ var parts = source.split(DELIM);
898
+ if (parts.length === 1) {
899
+ return parseLitOrPropExpr(parts[0], exprContext);
900
+ }
901
+ else {
902
+ return parseFnExpr(source, parts, tokens, exprContext);
903
+ }
904
+ }
905
+ function parseLitOrPropExpr(value, exprContext) {
906
+ value = value.trim();
907
+ // value is either a string, a quoted string, a number, a bool value, or a date
908
+ // if a string ( not a quoted string) then this represents a property name ( 1st ) or a lit string ( 2nd)
909
+ var firstChar = value.substr(0, 1);
910
+ var isQuoted = (firstChar === "'" || firstChar === '"') && value.length > 1 && value.substr(value.length - 1) === firstChar;
911
+ if (isQuoted) {
912
+ var unquotedValue = value.substr(1, value.length - 2);
913
+ return new LitExpr(unquotedValue, exprContext.dataType || DataType.String);
914
+ }
915
+ else {
916
+ var entityType = exprContext.entityType;
917
+ // TODO: get rid of isAnonymous below when we get the chance.
918
+ if (entityType == null || entityType.isAnonymous) {
919
+ // this fork will only be reached on the LHS of an BinaryPredicate -
920
+ // a RHS expr cannot get here with an anon type
921
+ return new PropExpr(value);
922
+ }
923
+ else {
924
+ var mayBeIdentifier = RX_IDENTIFIER.test(value);
925
+ if (mayBeIdentifier) {
926
+ // if (entityType.getProperty(value, false) != null) {
927
+ if (entityType.getPropertiesOnPath(value, null, false) != null) {
928
+ return new PropExpr(value);
929
+ }
930
+ }
931
+ }
932
+ // we don't really know the datatype here because even though it comes in as a string
933
+ // its usually a string BUT it might be a number i.e. the "1" or the "2" from an expr
934
+ // like "toUpper(substring(companyName, 1, 2))"
935
+ return new LitExpr(value, exprContext.dataType);
936
+ }
937
+ }
938
+ function parseFnExpr(source, parts, tokens, exprContext) {
939
+ try {
940
+ var fnName = parts[0].trim().toLowerCase();
941
+ var argSource = tokens[parts[1]].trim();
942
+ if (argSource.substr(0, 1) === "(") {
943
+ argSource = argSource.substr(1, argSource.length - 2);
944
+ }
945
+ var commaMatchStr = source.indexOf("'") >= 0 ? RX_COMMA_DELIM1 : RX_COMMA_DELIM2;
946
+ var args = argSource.match(commaMatchStr);
947
+ var newContext_1 = core.extend({}, exprContext);
948
+ // a dataType of Undefined on a context basically means not to try parsing
949
+ // the value if the expr is a literal
950
+ newContext_1.dataType = DataType.Undefined;
951
+ newContext_1.isFnArg = true;
952
+ var exprs = args.map(function (a) {
953
+ return parseExpr(a, tokens, newContext_1);
954
+ });
955
+ return new FnExpr(fnName, exprs);
956
+ }
957
+ catch (e) {
958
+ // TODO: removed old code here
959
+ // return null;
960
+ // and replaced with
961
+ throw e;
962
+ }
963
+ }
964
+ var ɵ0 = function () {
965
+ throw new Error("Cannot execute an PassthruPredicate expression against the local cache: " + this.value);
966
+ }, ɵ1 = function (context) {
967
+ var predFn = this.pred.visit(context);
968
+ switch (this.op.key) {
969
+ case "not":
970
+ return function (entity) {
971
+ return !predFn(entity);
972
+ };
973
+ default:
974
+ throw new Error("Invalid unary operator:" + this.op.key);
975
+ }
976
+ }, ɵ2 = function (context) {
977
+ var expr1Fn = this.expr1.visit(context);
978
+ var expr2Fn = this.expr2.visit(context);
979
+ var dataType = this.expr1.dataType || this.expr2.dataType;
980
+ var lqco = context.entityType.metadataStore.localQueryComparisonOptions;
981
+ var predFn = getBinaryPredicateFn(this, dataType, lqco);
982
+ if (predFn == null) {
983
+ throw new Error("Invalid binaryPredicate operator:" + this.op.key);
984
+ }
985
+ return function (entity) {
986
+ return predFn(expr1Fn(entity), expr2Fn(entity));
987
+ };
988
+ }, ɵ3 = function (context) {
989
+ var predFns = this.preds.map(function (pred) {
990
+ return pred.visit(context);
991
+ });
992
+ switch (this.op.key) {
993
+ case "and":
994
+ return function (entity) {
995
+ var result = predFns.reduce(function (prev, cur) {
996
+ return prev && cur(entity);
997
+ }, true);
998
+ return result;
999
+ };
1000
+ case "or":
1001
+ return function (entity) {
1002
+ var result = predFns.reduce(function (prev, cur) {
1003
+ return prev || cur(entity);
1004
+ }, false);
1005
+ return result;
1006
+ };
1007
+ default:
1008
+ throw new Error("Invalid boolean operator:" + this.op.key);
1009
+ }
1010
+ }, ɵ4 = function (context) {
1011
+ var exprFn = this.expr.visit(context);
1012
+ var newContext = core.extend({}, context);
1013
+ newContext.entityType = this.expr.dataType;
1014
+ var predFn = this.pred.visit(newContext);
1015
+ var anyAllPredFn = getAnyAllPredicateFn(this.op);
1016
+ return function (entity) {
1017
+ return anyAllPredFn(exprFn(entity), predFn);
1018
+ };
1019
+ }, ɵ5 = function () {
1020
+ var value = this.value;
1021
+ return function (entity) {
1022
+ return value;
1023
+ };
1024
+ }, ɵ6 = function () {
1025
+ var propertyPath = this.propertyPath;
1026
+ var properties = propertyPath.split('.');
1027
+ if (properties.length === 1) {
1028
+ return function (entity) {
1029
+ return entity.getProperty(propertyPath);
1030
+ };
1031
+ }
1032
+ else {
1033
+ return function (entity) {
1034
+ return EntityAspect.getPropertyPathValue(entity, properties);
1035
+ };
1036
+ }
1037
+ }, ɵ7 = function (context) {
1038
+ var exprFns = this.exprs.map(function (expr) {
1039
+ return expr.visit(context);
1040
+ });
1041
+ var that = this;
1042
+ return function (entity) {
1043
+ var values = exprFns.map(function (exprFn) {
1044
+ var value = exprFn(entity);
1045
+ return value;
1046
+ });
1047
+ var result = that.localFn.apply(null, values);
1048
+ return result;
1049
+ };
1050
+ };
1051
+ // toFunctionVisitor
1052
+ var toFunctionVisitor = {
1053
+ isExtended: false,
1054
+ passthruPredicate: ɵ0,
1055
+ unaryPredicate: ɵ1,
1056
+ binaryPredicate: ɵ2,
1057
+ andOrPredicate: ɵ3,
1058
+ anyAllPredicate: ɵ4,
1059
+ litExpr: ɵ5,
1060
+ propExpr: ɵ6,
1061
+ fnExpr: ɵ7
1062
+ };
1063
+ function getAnyAllPredicateFn(op) {
1064
+ switch (op.key) {
1065
+ case "any":
1066
+ return function (v1, v2) {
1067
+ return v1.some(function (v) {
1068
+ return v2(v);
1069
+ });
1070
+ };
1071
+ case "all":
1072
+ return function (v1, v2) {
1073
+ return v1.every(function (v) {
1074
+ return v2(v);
1075
+ });
1076
+ };
1077
+ default:
1078
+ throw new Error("Unknown operator: " + op.key);
1079
+ }
1080
+ }
1081
+ function getBinaryPredicateFn(binaryPredicate, dataType, lqco) {
1082
+ var op = binaryPredicate.op;
1083
+ var mc = DataType.getComparableFn(dataType);
1084
+ var predFn;
1085
+ switch (op.key) {
1086
+ case 'eq':
1087
+ predFn = function (v1, v2) {
1088
+ if (v1 && typeof v1 === 'string') {
1089
+ return stringEquals(v1, v2, lqco);
1090
+ }
1091
+ else {
1092
+ return mc(v1) === mc(v2);
1093
+ }
1094
+ };
1095
+ break;
1096
+ case 'ne':
1097
+ predFn = function (v1, v2) {
1098
+ if (v1 && typeof v1 === 'string') {
1099
+ return !stringEquals(v1, v2, lqco);
1100
+ }
1101
+ else {
1102
+ return mc(v1) !== mc(v2);
1103
+ }
1104
+ };
1105
+ break;
1106
+ case 'gt':
1107
+ predFn = function (v1, v2) {
1108
+ return mc(v1) > mc(v2);
1109
+ };
1110
+ break;
1111
+ case 'ge':
1112
+ predFn = function (v1, v2) {
1113
+ return mc(v1) >= mc(v2);
1114
+ };
1115
+ break;
1116
+ case 'lt':
1117
+ predFn = function (v1, v2) {
1118
+ return mc(v1) < mc(v2);
1119
+ };
1120
+ break;
1121
+ case 'le':
1122
+ predFn = function (v1, v2) {
1123
+ return mc(v1) <= mc(v2);
1124
+ };
1125
+ break;
1126
+ case 'startswith':
1127
+ predFn = function (v1, v2) {
1128
+ return stringStartsWith(v1, v2, lqco);
1129
+ };
1130
+ break;
1131
+ case 'endswith':
1132
+ predFn = function (v1, v2) {
1133
+ return stringEndsWith(v1, v2, lqco);
1134
+ };
1135
+ break;
1136
+ case 'contains':
1137
+ predFn = function (v1, v2) {
1138
+ return stringContains(v1, v2, lqco);
1139
+ };
1140
+ break;
1141
+ case 'in':
1142
+ predFn = function (v1, v2) {
1143
+ v1 = mc(v1);
1144
+ v2 = v2.map(function (v) { return mc(v); });
1145
+ return v2.indexOf(v1) >= 0;
1146
+ };
1147
+ break;
1148
+ default:
1149
+ return null;
1150
+ }
1151
+ return predFn;
1152
+ }
1153
+ function stringEquals(a, b, lqco) {
1154
+ if (b == null)
1155
+ return false;
1156
+ if (typeof b !== 'string') {
1157
+ b = b.toString();
1158
+ }
1159
+ if (lqco.usesSql92CompliantStringComparison) {
1160
+ a = (a || "").trim();
1161
+ b = (b || "").trim();
1162
+ }
1163
+ if (!lqco.isCaseSensitive) {
1164
+ a = (a || "").toLowerCase();
1165
+ b = (b || "").toLowerCase();
1166
+ }
1167
+ return a === b;
1168
+ }
1169
+ function stringStartsWith(a, b, lqco) {
1170
+ if (!lqco.isCaseSensitive) {
1171
+ a = (a || "").toLowerCase();
1172
+ b = (b || "").toLowerCase();
1173
+ }
1174
+ return core.stringStartsWith(a, b);
1175
+ }
1176
+ function stringEndsWith(a, b, lqco) {
1177
+ if (!lqco.isCaseSensitive) {
1178
+ a = (a || "").toLowerCase();
1179
+ b = (b || "").toLowerCase();
1180
+ }
1181
+ return core.stringEndsWith(a, b);
1182
+ }
1183
+ function stringContains(a, b, lqco) {
1184
+ if (!lqco.isCaseSensitive) {
1185
+ a = (a || "").toLowerCase();
1186
+ b = (b || "").toLowerCase();
1187
+ }
1188
+ return a.indexOf(b) >= 0;
1189
+ }
1190
+ var ɵ8 = function () {
1191
+ return this.value;
1192
+ }, ɵ9 = function (context) {
1193
+ var predVal = this.pred.visit(context);
1194
+ var json = {};
1195
+ json[this.op.key] = predVal;
1196
+ return json;
1197
+ }, ɵ10 = function (context) {
1198
+ var expr1Val = this.expr1.visit(context);
1199
+ var expr2Val = this.expr2.visit(context);
1200
+ var json = {};
1201
+ if (this.expr2 instanceof PropExpr) {
1202
+ expr2Val = { value: expr2Val, isProperty: true };
1203
+ }
1204
+ if (this.op.key === "eq") {
1205
+ json[expr1Val] = expr2Val;
1206
+ }
1207
+ else {
1208
+ var value = {};
1209
+ json[expr1Val] = value;
1210
+ value[this.op.key] = expr2Val;
1211
+ }
1212
+ return json;
1213
+ }, ɵ11 = function (context) {
1214
+ var predVals = this.preds.map(function (pred) {
1215
+ return pred.visit(context);
1216
+ });
1217
+ if (!predVals || !predVals.length) {
1218
+ return {};
1219
+ }
1220
+ var json;
1221
+ // normalizeAnd clauses if possible.
1222
+ // passthru predicate will appear as string and their 'ands' can't be 'normalized'
1223
+ if (this.op.key === 'and' && predVals.length === 2 && !predVals.some(function (v) { return v.or || typeof (v) === 'string'; })) {
1224
+ // normalize 'and' clauses - will return null if can't be combined.
1225
+ json = predVals.reduce(combine);
1226
+ }
1227
+ if (json == null) {
1228
+ json = {};
1229
+ json[this.op.key] = predVals;
1230
+ }
1231
+ return json;
1232
+ }, ɵ12 = function (context) {
1233
+ var exprVal = this.expr.visit(context);
1234
+ var newContext = core.extend({}, context);
1235
+ newContext.entityType = this.expr.dataType;
1236
+ var predVal = this.pred.visit(newContext);
1237
+ var json = {};
1238
+ var value = {};
1239
+ value[this.op.key] = predVal;
1240
+ json[exprVal] = value;
1241
+ return json;
1242
+ }, ɵ13 = function (context) {
1243
+ if (this.hasExplicitDataType || context.useExplicitDataType) {
1244
+ return { value: this.value, dataType: this.dataType.name };
1245
+ }
1246
+ else {
1247
+ return this.value;
1248
+ }
1249
+ }, ɵ14 = function (context) {
1250
+ if (context.toNameOnServer) {
1251
+ if (!context.entityType) {
1252
+ console.warn("No EntityType for propertyPath \"" + this.propertyPath + "\". " + core.strings.TO_TYPE);
1253
+ return this.propertyPath;
1254
+ }
1255
+ return context.entityType.clientPropertyPathToServer(this.propertyPath);
1256
+ }
1257
+ else {
1258
+ return this.propertyPath;
1259
+ }
1260
+ }, ɵ15 = function (context) {
1261
+ var exprVals = this.exprs.map(function (expr) {
1262
+ return expr.visit(context);
1263
+ });
1264
+ return this.fnName + "(" + exprVals.join(",") + ")";
1265
+ };
1266
+ // toJSONVisitor
1267
+ var toJSONVisitor = {
1268
+ passthruPredicate: ɵ8,
1269
+ unaryPredicate: ɵ9,
1270
+ binaryPredicate: ɵ10,
1271
+ andOrPredicate: ɵ11,
1272
+ anyAllPredicate: ɵ12,
1273
+ litExpr: ɵ13,
1274
+ propExpr: ɵ14,
1275
+ fnExpr: ɵ15
1276
+ };
1277
+ function combine(j1, j2) {
1278
+ var ok = Object.keys(j2).every(function (key) {
1279
+ if (j1.hasOwnProperty(key)) {
1280
+ if (typeof (j2[key]) !== 'object') {
1281
+ // exit and indicate that we can't combine
1282
+ return false;
1283
+ }
1284
+ if (combine(j1[key], j2[key]) == null) {
1285
+ return false;
1286
+ }
1287
+ }
1288
+ else if (typeof (j1) !== 'object') {
1289
+ // cannot assign to j1[key]
1290
+ return false;
1291
+ }
1292
+ else {
1293
+ j1[key] = j2[key];
1294
+ }
1295
+ return true;
1296
+ });
1297
+ return ok ? j1 : null;
1298
+ }
1299
+ export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9, ɵ10, ɵ11, ɵ12, ɵ13, ɵ14, ɵ15 };
1300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGljYXRlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9wcmVkaWNhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBa0IsWUFBWSxFQUFHLE1BQU0sbUJBQW1CLENBQUM7QUFFOUUsT0FBTyxFQUFFLFFBQVEsRUFBRyxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUE4Q3ZEOzs7R0FHRztBQUNIO0lBU0U7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSDtRQUFZLGNBQWM7YUFBZCxVQUFjLEVBQWQscUJBQWMsRUFBZCxJQUFjO1lBQWQseUJBQWM7O1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksU0FBUyxDQUFDLEVBQUU7WUFDaEMsWUFBVyxTQUFTLFlBQVQsU0FBUyxxQkFBUyxJQUFJLE1BQUU7U0FDcEM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLE9BQWhCLFNBQVMsV0FBZ0IsSUFBSSxHQUFFO0lBQ3hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLGdCQUFNLEdBQWI7UUFDRSwyREFBMkQ7UUFEL0MsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFHMUIsd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckIsaUJBQWlCO1lBQ2pCLGlGQUFpRjtZQUNqRiwyQ0FBMkM7WUFDM0MsMkZBQTJGO1lBQzNGLHlEQUF5RDtZ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VWQ7SUFFRCxPQUFPLEtBTU47SUFFRCxRQUFRLEtBVVA7SUFFRCxNQUFNLEtBS0w7Q0FFRixDQUFDO0FBRUYsU0FBUyxPQUFPLENBQUMsRUFBVSxFQUFFLEVBQVU7SUFDckMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO1FBQzFDLElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7Z0JBQ2pDLDBDQUEwQztnQkFDMUMsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUFNLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUNuQywyQkFBMkI7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNuQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBTdHJ1Y3R1cmFsVHlwZSwgRGF0YVByb3BlcnR5ICB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuaW1wb3J0IHsgUXVlcnlPcCB9IGZyb20gJy4vZW50aXR5LXF1ZXJ5JztcclxuaW1wb3J0IHsgRGF0YVR5cGUgIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBc3BlY3QsIEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IExvY2FsUXVlcnlDb21wYXJpc29uT3B0aW9ucyB9IGZyb20gJy4vbG9jYWwtcXVlcnktY29tcGFyaXNvbi1vcHRpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3Age1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGFsaWFzZXM/OiBzdHJpbmdbXTtcclxuICBpc0Z1bmN0aW9uPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3BNYXAge1xyXG4gIFtrZXk6IHN0cmluZ106IE9wO1xyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGludGVyZmFjZSBWaXNpdG9yIHtcclxuXHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZpc2l0Q29udGV4dCB7XHJcbiAgZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgLy8gdXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW47XHJcbiAgdG9OYW1lT25TZXJ2ZXI/OiBib29sZWFuO1xyXG4gIHVzZUV4cGxpY2l0RGF0YVR5cGU/OiBib29sZWFuO1xyXG4gIHZpc2l0b3I/OiBWaXNpdG9yO1xyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGludGVyZmFjZSBFeHByZXNzaW9uQ29udGV4dCB7XHJcbiAgZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgdXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW47XHJcbiAgZGF0YVR5cGU/OiBEYXRhVHlwZSB8IHN0cmluZztcclxuICBpc1JIUz86IGJvb2xlYW47XHJcbiAgaXNGbkFyZz86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG5Vc2VkIHRvIGRlZmluZSBhICd3aGVyZScgcHJlZGljYXRlIGZvciBhbiBbW0VudGl0eVF1ZXJ5XV0uICBQcmVkaWNhdGVzIGFyZSBpbW11dGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgYW55XHJcbm1ldGhvZCB0aGF0IHdvdWxkIG1vZGlmeSBhIFByZWRpY2F0ZSBhY3R1YWxseSByZXR1cm5zIGEgbmV3IFByZWRpY2F0ZS5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBQcmVkaWNhdGUge1xyXG4gIG9wOiBPcDtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgYWxpYXNNYXA6IE9wTWFwO1xyXG4gIHZpc2l0b3JNZXRob2ROYW1lOiBzdHJpbmc7XHJcblxyXG5cclxuICAvKipcclxuICBQcmVkaWNhdGUgY29uc3RydWN0b3JcclxuICA+ICAgICBsZXQgcDEgPSBuZXcgUHJlZGljYXRlKFwiQ29tcGFueU5hbWVcIiwgXCJTdGFydHNXaXRoXCIsIFwiQlwiKTtcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIikud2hlcmUocDEpO1xyXG5cclxuICBvclxyXG4gID4gICAgIGxldCBwMiA9IG5ldyBQcmVkaWNhdGUoXCJSZWdpb25cIiwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIG51bGwpO1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKS53aGVyZShwMik7XHJcbiAgQHBhcmFtIHByb3BlcnR5IC0gQSBwcm9wZXJ0eSBuYW1lLCBhIG5lc3RlZCBwcm9wZXJ0eSBuYW1lIG9yIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIGEgcHJvcGVydHkgbmFtZS5cclxuICBAcGFyYW0gb3BlcmF0b3IgLSBcclxuICBAcGFyYW0gdmFsdWUgLSBUaGlzIHdpbGwgYmUgdHJlYXRlZCBhcyBlaXRoZXIgYSBwcm9wZXJ0eSBleHByZXNzaW9uIG9yIGEgbGl0ZXJhbCBkZXBlbmRpbmcgb24gY29udGV4dC4gIEluIGdlbmVyYWwsXHJcbiAgaWYgdGhlIHZhbHVlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHByb3BlcnR5IGV4cHJlc3Npb24gaXQgd2lsbCBiZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIGxpdGVyYWwuXHJcbiAgSW4gbW9zdCBjYXNlcyB0aGlzIHdvcmtzIHdlbGwsIGJ1dCB5b3UgY2FuIGFsc28gZm9yY2UgdGhlIGludGVycHJldGF0aW9uIGJ5IG1ha2luZyB0aGUgdmFsdWUgYXJndW1lbnQgaXRzZWxmIGFuIG9iamVjdCB3aXRoIGEgJ3ZhbHVlJ1xyXG4gIHByb3BlcnR5IGFuZCBhbiAnaXNMaXRlcmFsJyBwcm9wZXJ0eSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuICBCcmVlemUgYWxzbyB0cmllcyB0byBpbmZlciB0aGUgZGF0YVR5cGUgb2YgYW55XHJcbiAgbGl0ZXJhbCBiYXNlZCBvbiBjb250ZXh0LCBpZiB0aGlzIGZhaWxzIHlvdSBjYW4gZm9yY2UgdGhpcyBpbmZlcmVuY2UgYnkgbWFraW5nIHRoZSB2YWx1ZSBhcmd1bWVudCBhbiBvYmplY3Qgd2l0aCBhXHJcbiAgJ3ZhbHVlJyBwcm9wZXJ0eSBhbmQgYSAnZGF0YVR5cGUnIHByb3BlcnR5IHNldCB0byBvbmUgb2YgdGhlIGJyZWV6ZS5EYXRhVHlwZSBlbnVtZXJhdGlvbiBpbnN0YW5jZXMuXHJcbiAgKiovXHJcbiAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcclxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByZWRpY2F0ZSkpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGUoLi4uPGFueT5hcmdzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcmVkaWNhdGUuY3JlYXRlKC4uLjxhbnk+YXJncyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTYW1lIGFzIHVzaW5nIHRoZSBjdG9yLlxyXG4gID4gICAgICAvLyBzbyBcclxuICA+ICAgICAgbGV0IHAgPSBQcmVkaWNhdGUuY3JlYXRlKGEsIGIsIGMpO1xyXG4gID4gICAgICAvLyBpcyB0aGUgc2FtZSBhcyBcclxuICA+ICAgICAgbGV0IHAgPSBuZXcgUHJlZGljYXRlKGEsIGIsIGMpOyBcclxuICBAcGFyYW0gcHJvcGVydHkgLSAgQSBwcm9wZXJ0eSBuYW1lLCBhIG5lc3RlZCBwcm9wZXJ0eSBuYW1lIG9yIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIGEgcHJvcGVydHkgbmFtZS5cclxuICBAcGFyYW0gb3BlcmF0b3IgLSB0aGUgZmlsdGVyIHF1ZXJ5IG9wZXJhdG9yLlxyXG4gIEBwYXJhbSB2YWx1ZSAtIFRoaXMgd2lsbCBiZSB0cmVhdGVkIGFzIGVpdGhlciBhIHByb3BlcnR5IGV4cHJlc3Npb24gb3IgYSBsaXRlcmFsIGRlcGVuZGluZyBvbiBjb250ZXh0LiAgSW4gZ2VuZXJhbCxcclxuICBpZiB0aGUgdmFsdWUgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcHJvcGVydHkgZXhwcmVzc2lvbiBpdCB3aWxsIGJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbGl0ZXJhbC5cclxuICBJbiBtb3N0IGNhc2VzIHRoaXMgd29ya3Mgd2VsbCwgYnV0IHlvdSBjYW4gYWxzbyBmb3JjZSB0aGUgaW50ZXJwcmV0YXRpb24gYnkgbWFraW5nIHRoZSB2YWx1ZSBhcmd1bWVudCBpdHNlbGYgYW4gb2JqZWN0IHdpdGggYSAndmFsdWUnXHJcbiAgcHJvcGVydHkgYW5kIGFuICdpc0xpdGVyYWwnIHByb3BlcnR5IHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4gIEJyZWV6ZSBhbHNvIHRyaWVzIHRvIGluZmVyIHRoZSBkYXRhVHlwZSBvZiBhbnlcclxuICBsaXRlcmFsIGJhc2VkIG9uIGNvbnRleHQsIGlmIHRoaXMgZmFpbHMgeW91IGNhbiBmb3JjZSB0aGlzIGluZmVyZW5jZSBieSBtYWtpbmcgdGhlIHZhbHVlIGFyZ3VtZW50IGFuIG9iamVjdCB3aXRoIGFcclxuICAndmFsdWUnIHByb3BlcnR5IGFuZCBhICdkYXRhVHlwZScgcHJvcGVydHkgc2V0IHRvIG9uZSBvZiB0aGUgYnJlZXplLkRhdGFUeXBlIGVudW1lcmF0aW9uIGluc3RhbmNlcy5cclxuICAqKi9cclxuICBzdGF0aWMgY3JlYXRlKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAvLyBjYW4gYmUgY2FsbGVkIGZyb20gc3RkIGphdmFzY3JpcHQgd2l0aG91dCBuZXcgKCBsZWdhY3kgKVxyXG5cclxuICAgIC8vIGVtcHR5IGN0b3IgaXMgdXNlZCBieSBhbGwgc3ViY2xhc3Nlcy5cclxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBQcmVkaWNhdGUoKTtcclxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAvLyBwb3NzaWJpbGl0aWVzOlxyXG4gICAgICAvLyAgICAgIFByZWRpY2F0ZShbIGFQcmVkaWNhdGUgXSkgb3IgIFByZWRpY2F0ZShbXCJmcmVpZ2h0XCIsIFwiPlwiLCAxMDBdKSAtIGFuIGFycmF5XHJcbiAgICAgIC8vICAgICAgUHJlZGljYXRlKGFQcmVkaWNhdGUpIC0gYSBwcmVkaWNhdGVcclxuICAgICAgLy8gICAgICBQcmVkaWNhdGUoIFwiZnJlaWdodCBndCAxMDBcIiB9ICAvLyBwYXNzdGhydSAoIGkuZS4gbWF5YmUgYW4gb2RhdGEgc3RyaW5nKSAtIGEgc3RyaW5nXHJcbiAgICAgIC8vICAgICAgUHJlZGljYXRlKCB7IGZyZWlnaHQ6IHsgXCI+XCI6IDEwMCB9IH0pIC0gYW4gb2JqZWN0XHJcbiAgICAgIGxldCBhcmcgPSBhcmd1bWVudHNbMF07XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcclxuICAgICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgLy8gcmVjdXJzZVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGUoYXJnWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVByZWRpY2F0ZUZyb21BcnJheShhcmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBQcmVkaWNhdGUpIHtcclxuICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhydVByZWRpY2F0ZShhcmcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVQcmVkaWNhdGVGcm9tT2JqZWN0KGFyZyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIDIgcG9zc2liaWxpdGllc1xyXG4gICAgICAvLyAgICAgIFByZWRpY2F0ZShcImZyZWlnaHRcIiwgXCI+XCIsIDEwMFwiKTtcclxuICAgICAgLy8gICAgICBQcmVkaWNhdGUoXCJvcmRlcnNcIiwgXCJhbnlcIiwgXCJmcmVpZ2h0XCIsICBcIj5cIiwgOTUwKTtcclxuICAgICAgcmV0dXJuIGNyZWF0ZVByZWRpY2F0ZUZyb21BcnJheShhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF92YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkLCB1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgLy8gbm9vcCBoZXJlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhICdjb21wb3NpdGUnIFByZWRpY2F0ZSBieSAnYW5kJ2luZyBhIHNldCBvZiBzcGVjaWZpZWQgUHJlZGljYXRlcyB0b2dldGhlci5cclxuICA+ICAgICAgbGV0IGR0ID0gbmV3IERhdGUoODgsIDksIDEyKTtcclxuICA+ICAgICAgbGV0IHAxID0gUHJlZGljYXRlLmNyZWF0ZShcIk9yZGVyRGF0ZVwiLCBcIm5lXCIsIGR0KTtcclxuICA+ICAgICAgbGV0IHAyID0gUHJlZGljYXRlLmNyZWF0ZShcIlNoaXBDaXR5XCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIik7XHJcbiAgPiAgICAgIGxldCBwMyA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwiPlwiLCAxMDApO1xyXG4gID4gICAgICBsZXQgbmV3UHJlZCA9IFByZWRpY2F0ZS5hbmQocDEsIHAyLCBwMyk7XHJcblxyXG4gIG9yXHJcbiAgPiAgICAgIGxldCBwcmVkcyA9IFtwMSwgcDIsIHAzXTtcclxuICA+ICAgICAgbGV0IG5ld1ByZWQgPSBQcmVkaWNhdGUuYW5kKHByZWRzKTtcclxuICBAcGFyYW0gcHJlZGljYXRlcyAtIG11bHRpcGxlIFByZWRpY2F0ZXMgb3IgYW4gYXJyYXkgb2YgUHJlZGljYXRlLiBcclxuICBBbnkgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIHBhc3NlZCBpbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZmlsdGVyZWQgb3V0IGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIGNvbXBvc2l0ZSBwcmVkaWNhdGUuXHJcbiAgKiovXHJcbiAgc3RhdGljIGFuZCguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IHByZWQgPSBuZXcgQW5kT3JQcmVkaWNhdGUoXCJhbmRcIiwgYXJncyk7XHJcbiAgICAvLyBUT0RPIHJlbW92ZWQgYmVsb3dcclxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgZW1wdHlcclxuICAgIC8vIHJldHVybiBwcmVkLm9wICYmIHByZWQ7XHJcbiAgICByZXR1cm4gcHJlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYSAnY29tcG9zaXRlJyBQcmVkaWNhdGUgYnkgJ29yJ2luZyBhIHNldCBvZiBzcGVjaWZpZWQgUHJlZGljYXRlcyB0b2dldGhlci5cclxuICA+ICAgICAgbGV0IGR0ID0gbmV3IERhdGUoODgsIDksIDEyKTtcclxuICA+ICAgICAgbGV0IHAxID0gUHJlZGljYXRlLmNyZWF0ZShcIk9yZGVyRGF0ZVwiLCBcIm5lXCIsIGR0KTtcclxuICA+ICAgICAgbGV0IHAyID0gUHJlZGljYXRlLmNyZWF0ZShcIlNoaXBDaXR5XCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIik7XHJcbiAgPiAgICAgIGxldCBwMyA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwiPlwiLCAxMDApO1xyXG4gID4gICAgICBsZXQgbmV3UHJlZCA9IFByZWRpY2F0ZS5vcihwMSwgcDIsIHAzKTtcclxuXHJcbiAgb3JcclxuICA+ICAgICAgbGV0IHByZWRzID0gW3AxLCBwMiwgcDNdO1xyXG4gID4gICAgICBsZXQgbmV3UHJlZCA9IFByZWRpY2F0ZS5vcihwcmVkcyk7XHJcbiAgQHBhcmFtIHByZWRpY2F0ZXMgLSBtdWx0aXBsZSBQcmVkaWNhdGVzIG9yIGFuIGFycmF5IG9mIFByZWRpY2F0ZS5cclxuICBBbnkgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIHBhc3NlZCBpbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZmlsdGVyZWQgb3V0IGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIGNvbXBvc2l0ZSBwcmVkaWNhdGUuXHJcbiAgKiovXHJcbiAgc3RhdGljIG9yKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQgcHJlZCA9IG5ldyBBbmRPclByZWRpY2F0ZShcIm9yXCIsIGFyZ3MpO1xyXG4gICAgLy8gcmV0dXJuIHByZWQub3AgJiYgcHJlZDtcclxuICAgIHJldHVybiBwcmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhICdjb21wb3NpdGUnIFByZWRpY2F0ZSBieSAnbmVnYXRpbmcnIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS5cclxuICA+ICAgICAgbGV0IHAxID0gUHJlZGljYXRlLmNyZWF0ZShcIkZyZWlnaHRcIiwgXCJndFwiLCAxMDApO1xyXG4gID4gICAgICBsZXQgbm90X3AxID0gUHJlZGljYXRlLm5vdChwMSk7XHJcblxyXG4gIFRoaXMgY2FuIGFsc28gYmUgYWNjb21wbGlzaGVkIHVzaW5nIHRoZSAnaW5zdGFuY2UnIHZlcnNpb24gb2YgdGhlICdub3QnIG1ldGhvZFxyXG4gID4gICAgICBsZXQgbm90X3AxID0gcDEubm90KCk7XHJcblxyXG4gIEJvdGggb2Ygd2hpY2ggd291bGQgYmUgdGhlIHNhbWUgYXNcclxuICA+ICAgICAgbGV0IG5vdF9wMSA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwibGVcIiwgMTAwKTtcclxuICAqKi9cclxuICBzdGF0aWMgbm90KHByZWQ6IFByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIHByZWQubm90KCk7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiBkZXRlcm1pbmUgaWYvd2hlcmUgdGhpcyBpcyB1c2VkLlxyXG4gIC8vIHN0YXRpYyBleHRlbmRCaW5hcnlQcmVkaWNhdGVGbihvcE1hcDogSU9wTWFwLCB2aXNpdG9yRm46IGFueSkge1xyXG4gIC8vICAgbGV0IGJhc2VWaXNpdG9yRm4gPSB0b0Z1bmN0aW9uVmlzaXRvci5iaW5hcnlQcmVkaWNhdGU7XHJcbiAgLy8gICBmb3IgKGxldCBvcCBpbiAob3BNYXAgfHwge30pKSB7XHJcbiAgLy8gICAgIGxldCBjb25maWcgPSBvcE1hcFtvcF07XHJcbiAgLy8gICAgIGNvbmZpZy52aXNpdG9yRm4gPSB2aXNpdG9yRm47XHJcbiAgLy8gICAgIHVwZGF0ZUFsaWFzTWFwKEJpbmFyeVByZWRpY2F0ZS5wcm90b3R5cGUuYWxpYXNNYXAsIG9wLCBvcE1hcFtvcF0pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKCF0b0Z1bmN0aW9uVmlzaXRvci5pc0V4dGVuZGVkKSB7XHJcbiAgLy8gICAgIHRvRnVuY3Rpb25WaXNpdG9yLmJpbmFyeVByZWRpY2F0ZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBleHByMVZhbCwgZXhwcjJWYWwpIHtcclxuICAvLyAgICAgICBsZXQgdmlzaXRvckZuID0gdGhpcy5hbGlhc01hcFt0aGlzLm9wLmtleV0udmlzaXRvckZuO1xyXG4gIC8vICAgICAgIGlmICh2aXNpdG9yRm4pIHtcclxuICAvLyAgICAgICAgIHJldHVybiB2aXNpdG9yRm4oY29udGV4dCwgZXhwcjFWYWwsIGV4cHIyVmFsKTtcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgcmV0dXJuIGJhc2VWaXNpdG9yRm4oY29udGV4dCwgZXhwcjFWYWwsIGV4cHIyVmFsKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH07XHJcbiAgLy8gICAgIHRvRnVuY3Rpb25WaXNpdG9yLmlzRXh0ZW5kZWQgPSB0cnVlO1xyXG4gIC8vICAgfVxyXG4gIC8vIH07XHJcblxyXG4gIHN0YXRpYyBleHRlbmRGdW5jTWFwIChmdW5jTWFwOiB7W2tleTogc3RyaW5nXToge2ZuOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgZGF0YVR5cGU6IERhdGFUeXBlfX0pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGZ1bmMgaW4gKGZ1bmNNYXAgfHwge30pKSB7XHJcbiAgICAgIGxldCBjb25maWcgPSBmdW5jTWFwW2Z1bmNdO1xyXG4gICAgICBGbkV4cHIuX2Z1bmNNYXBbZnVuY10gPSBjb25maWc7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgJ0FuZCdzIHRoaXMgUHJlZGljYXRlIHdpdGggb25lIG9yIG1vcmUgb3RoZXIgUHJlZGljYXRlcyBhbmQgcmV0dXJucyBhIG5ldyAnY29tcG9zaXRlJyBQcmVkaWNhdGVcclxuICA+ICAgICAgbGV0IGR0ID0gbmV3IERhdGUoODgsIDksIDEyKTtcclxuICA+ICAgICAgbGV0IHAxID0gUHJlZGljYXRlLmNyZWF0ZShcIk9yZGVyRGF0ZVwiLCBcIm5lXCIsIGR0KTtcclxuICA+ICAgICAgbGV0IHAyID0gUHJlZGljYXRlLmNyZWF0ZShcIlNoaXBDaXR5XCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIik7XHJcbiAgPiAgICAgIGxldCBwMyA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwiPlwiLCAxMDApO1xyXG4gID4gICAgICBsZXQgbmV3UHJlZCA9IHAxLmFuZChwMiwgcDMpO1xyXG5cclxuICBvclxyXG4gID4gICAgICBsZXQgcHJlZHMgPSBbcDIsIHAzXTtcclxuICA+ICAgICAgbGV0IG5ld1ByZWQgPSBwMS5hbmQocHJlZHMpO1xyXG5cclxuICBUaGUgJ2FuZCcgbWV0aG9kIGlzIGFsc28gdXNlZCB0byB3cml0ZSBcImZsdWVudFwiIGV4cHJlc3Npb25zXHJcbiAgPiAgICAgIGxldCBwNCA9IFByZWRpY2F0ZS5jcmVhdGUoXCJTaGlwQ2l0eVwiLCBcInN0YXJ0c3dpdGhcIiwgXCJGXCIpXHJcbiAgPiAgICAgICAgLmFuZChcIlNpemVcIiwgXCJndFwiLCAyMDAwKTtcclxuICBAcGFyYW0gcHJlZGljYXRlcyAtIG11bHRpcGxlIFByZWRpY2F0ZXMgb3IgYW4gYXJyYXkgb2YgUHJlZGljYXRlcy4gXHJcbiAgQW55IG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlcyBwYXNzZWQgaW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dCBiZWZvcmUgY29uc3RydWN0aW5nIHRoZSBjb21wb3NpdGUgcHJlZGljYXRlLlxyXG4gICoqL1xyXG4gIGFuZCguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgcmV0dXJuIG5ldyBBbmRPclByZWRpY2F0ZShcImFuZFwiLCBhcmdzRm9yQW5kT3JQcmVkaWNhdGVzKHRoaXMsIGFyZ3MpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICdPcidzIHRoaXMgUHJlZGljYXRlIHdpdGggb25lIG9yIG1vcmUgb3RoZXIgUHJlZGljYXRlcyBhbmQgcmV0dXJucyBhIG5ldyAnY29tcG9zaXRlJyBQcmVkaWNhdGVcclxuICA+ICAgICAgbGV0IGR0ID0gbmV3IERhdGUoODgsIDksIDEyKTtcclxuICA+ICAgICAgbGV0IHAxID0gUHJlZGljYXRlLmNyZWF0ZShcIk9yZGVyRGF0ZVwiLCBcIm5lXCIsIGR0KTtcclxuICA+ICAgICAgbGV0IHAyID0gUHJlZGljYXRlLmNyZWF0ZShcIlNoaXBDaXR5XCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIik7XHJcbiAgPiAgICAgIGxldCBwMyA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwiPlwiLCAxMDApO1xyXG4gID4gICAgICBsZXQgbmV3UHJlZCA9IHAxLm9yKHAyLCBwMyk7XHJcblxyXG4gIG9yXHJcbiAgPiAgICAgIGxldCBwcmVkcyA9IFtwMiwgcDNdO1xyXG4gID4gICAgICBsZXQgbmV3UHJlZCA9IHAxLm9yKHByZWRzKTtcclxuXHJcbiAgVGhlICdvcicgbWV0aG9kIGlzIGFsc28gdXNlZCB0byB3cml0ZSBcImZsdWVudFwiIGV4cHJlc3Npb25zXHJcbiAgPiAgICAgIGxldCBwNCA9IFByZWRpY2F0ZS5jcmVhdGUoXCJTaGlwQ2l0eVwiLCBcInN0YXJ0c3dpdGhcIiwgXCJGXCIpXHJcbiAgPiAgICAgICAgLm9yKFwiU2l6ZVwiLCBcImd0XCIsIDIwMDApO1xyXG4gIEBwYXJhbSBwcmVkaWNhdGVzIC0gbXVsdGlwbGUgUHJlZGljYXRlcyBvciBhbiBhcnJheSBvZiBQcmVkaWNhdGVzLiBcclxuICBBbnkgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIHBhc3NlZCBpbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZmlsdGVyZWQgb3V0IGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIGNvbXBvc2l0ZSBwcmVkaWNhdGUuXHJcbiAgKiovXHJcbiAgb3IoLi4uYXJnczogYW55W10pIHtcclxuICAgIHJldHVybiBuZXcgQW5kT3JQcmVkaWNhdGUoXCJvclwiLCBhcmdzRm9yQW5kT3JQcmVkaWNhdGVzKHRoaXMsIGFyZ3MpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlICduZWdhdGVkJyB2ZXJzaW9uIG9mIHRoaXMgUHJlZGljYXRlXHJcbiAgPiAgICAgIGxldCBwMSA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwiZ3RcIiwgMTAwKTtcclxuICA+ICAgICAgbGV0IG5vdF9wMSA9IHAxLm5vdCgpO1xyXG5cclxuICBUaGlzIGNhbiBhbHNvIGJlIGFjY29tcGxpc2hlZCB1c2luZyB0aGUgJ3N0YXRpYycgdmVyc2lvbiBvZiB0aGUgJ25vdCcgbWV0aG9kXHJcbiAgPiAgICAgIGxldCBwMSA9IFByZWRpY2F0ZS5jcmVhdGUoXCJGcmVpZ2h0XCIsIFwiZ3RcIiwgMTAwKTtcclxuICA+ICAgICAgbGV0IG5vdF9wMSA9IFByZWRpY2F0ZS5ub3QocDEpO1xyXG5cclxuICB3aGljaCB3b3VsZCBiZSB0aGUgc2FtZSBhc1xyXG4gID4gICAgICBsZXQgbm90X3AxID0gUHJlZGljYXRlLmNyZWF0ZShcIkZyZWlnaHRcIiwgXCJsZVwiLCAxMDApO1xyXG4gICoqL1xyXG4gIG5vdCgpIHtcclxuICAgIHJldHVybiBuZXcgVW5hcnlQcmVkaWNhdGUoXCJub3RcIiwgdGhpcyk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIHRvSlNPTigpIHtcclxuICAgIC8vIHRvSlNPTiAoIHBhcnQgb2YganMgc3RhbmRhcmQgLSB0YWtlcyBhIHNpbmdsZSBwYXJhbWV0ZXJcclxuICAgIC8vIHRoYXQgaXMgZWl0aGVyIFwiXCIgb3IgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHNlcmlhbGl6ZWQuXHJcbiAgICByZXR1cm4gdGhpcy50b0pTT05FeHQoeyBlbnRpdHlUeXBlOiB0aGlzLl9lbnRpdHlUeXBlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbiAgQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuICBAaGlkZGVuIEBpbnRlcm5hbCBcclxuICAqL1xyXG4gIHRvSlNPTkV4dChjb250ZXh0OiBWaXNpdENvbnRleHQpIHtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0KGNvbnRleHQsIHRvSlNPTlZpc2l0b3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbiAgQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuICBAaGlkZGVuIEBpbnRlcm5hbCBcclxuICAqL1xyXG4gIHRvRnVuY3Rpb24oY29udGV4dDogVmlzaXRDb250ZXh0KSB7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdChjb250ZXh0LCB0b0Z1bmN0aW9uVmlzaXRvcik7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG4gIEBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbiAgQGhpZGRlbiBAaW50ZXJuYWwgXHJcbiAgKi9cclxuICB2aXNpdChjb250ZXh0OiBWaXNpdENvbnRleHQsIHZpc2l0b3I/OiBWaXNpdG9yKSB7XHJcbiAgICBpZiAoY29yZS5pc0VtcHR5KGNvbnRleHQpKSB7XHJcbiAgICAgIGNvbnRleHQgPSB7IGVudGl0eVR5cGU6IHVuZGVmaW5lZCB9O1xyXG4gICAgfSBlbHNlIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRW50aXR5VHlwZSkge1xyXG4gICAgICBjb250ZXh0ID0geyBlbnRpdHlUeXBlOiBjb250ZXh0IH07XHJcbiAgICB9IGVsc2UgaWYgKCFjb3JlLmhhc093blByb3BlcnR5KGNvbnRleHQsIFwiZW50aXR5VHlwZVwiKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbGwgdmlzaXRvciBtZXRob2RzIG11c3QgYmUgY2FsbGVkIHdpdGggYSBjb250ZXh0IG9iamVjdCBjb250YWluaW5nIGF0IGxlYXN0IGFuICdlbnRpdHlUeXBlJyBwcm9wZXJ0eVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmlzaXRvcikge1xyXG4gICAgICBjb250ZXh0LnZpc2l0b3IgPSB2aXNpdG9yO1xyXG4gICAgfVxyXG4gICAgbGV0IHRWaXNpdG9yID0gdmlzaXRvciB8fCBjb250ZXh0LnZpc2l0b3IhO1xyXG4gICAgbGV0IGZuID0gdFZpc2l0b3JbdGhpcy52aXNpdG9yTWV0aG9kTmFtZV07XHJcbiAgICBpZiAoZm4gPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbG9jYXRlIG1ldGhvZDogXCIgKyB0aGlzLnZpc2l0b3JNZXRob2ROYW1lICsgXCIgb24gdmlzaXRvclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IGNvbnRleHQuZW50aXR5VHlwZTtcclxuICAgIC8vIGRvbid0IGJvdGhlciB2YWxpZGF0aW5nIGlmIGFscmVhZHkgZG9uZSBzbyAoIG9yIGlmIG5vIF92YWxpZGF0ZSBtZXRob2RcclxuICAgIGlmICh0aGlzLl92YWxpZGF0ZSAmJiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IHRoaXMuX2VudGl0eVR5cGUgIT09IGVudGl0eVR5cGUpKSB7XHJcbiAgICAgIC8vIGRvbid0IG5lZWQgdG8gY2FwdHVyZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB2YWxpZGF0aW9uIGZuIGRvZXNuJ3QgaGF2ZSBvbmUuXHJcbiAgICAgIC8vIFRPRE86IHRoaXMgd2FzIG9sZCBjb2RlXHJcbiAgICAgIC8vIHRoaXMuX3ZhbGlkYXRlKGVudGl0eVR5cGUsIGNvbnRleHQudXNlc05hbWVPblNlcnZlcik7XHJcbiAgICAgIHRoaXMuX3ZhbGlkYXRlKGVudGl0eVR5cGUsIGNvbnRleHQudG9OYW1lT25TZXJ2ZXIpO1xyXG4gICAgICB0aGlzLl9lbnRpdHlUeXBlID0gZW50aXR5VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBjb250ZXh0KTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9pbml0aWFsaXplKHZpc2l0b3JNZXRob2ROYW1lOiBzdHJpbmcsIG9wTWFwOiB7IFtrZXk6IHN0cmluZ106IHsgYWxpYXNlcz86IHN0cmluZ1tdLCBpc0Z1bmN0aW9uPzogYm9vbGVhbiB9fSA9IHt9KSB7XHJcbiAgICB0aGlzLnZpc2l0b3JNZXRob2ROYW1lID0gdmlzaXRvck1ldGhvZE5hbWU7XHJcbiAgICBsZXQgYWxpYXNNYXAgPSB0aGlzLmFsaWFzTWFwID0ge307XHJcbiAgICBmb3IgKGxldCBvcCBpbiBvcE1hcCApIHtcclxuICAgICAgdXBkYXRlQWxpYXNNYXAoYWxpYXNNYXAsIG9wLCBvcE1hcFtvcF0gYXMgT3ApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3Jlc29sdmVPcChvcDogc3RyaW5nIHwgUXVlcnlPcCwgb2tJZk5vdEZvdW5kPzogYm9vbGVhbikge1xyXG4gICAgbGV0IG9wU3RyID0gKHR5cGVvZiBvcCA9PT0gXCJzdHJpbmdcIikgPyBvcCA6IG9wLm9wZXJhdG9yO1xyXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuYWxpYXNNYXBbb3BTdHIudG9Mb3dlckNhc2UoKV07XHJcbiAgICBpZiAoIXJlc3VsdCAmJiAhb2tJZk5vdEZvdW5kKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXNvbHZlIG9wZXJhdG9yOiBcIiArIG9wU3RyKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlUHJlZGljYXRlRnJvbUFycmF5KGFycjogYW55W10pIHtcclxuICAvLyBUT0RPOiBhc3NlcnQgdGhhdCBsZW5ndGggb2YgdGhlIGFycmF5IHNob3VsZCBiZSA+IDNcclxuICAvLyBOZWVkcyB0byBoYW5kbGU6XHJcbiAgLy8gICAgICBbIFwiZnJlaWdodFwiLCBcIj5cIiwgMTAwXCJdO1xyXG4gIC8vICAgICAgWyBcIm9yZGVyc1wiLCBcImFueVwiLCBcImZyZWlnaHRcIiwgIFwiPlwiLCA5NTAgXVxyXG4gIC8vICAgICAgWyBcIm9yZGVyc1wiLCBcImFuZFwiLCBhbm90aGVyUHJlZCBdXHJcbiAgLy8gICAgICBbIFwib3JkZXJzXCIsIFwiYW5kXCIsIFsgXCJmcmVpZ2h0LCBcIj5cIiwgOTUwIF1dXHJcbiAgbGV0IGpzb24gPSB7fTtcclxuICBsZXQgdmFsdWUgPSB7fTtcclxuICBqc29uW2FyclswXV0gPSB2YWx1ZTtcclxuICBsZXQgb3AgPSBhcnJbMV07XHJcbiAgb3AgPSBvcC5vcGVyYXRvciB8fCBvcDsgIC8vIGluY29taW5nIG9wIHdpbGwgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgRmlsdGVyUXVlcnlPcFxyXG4gIGlmIChhcnIubGVuZ3RoID09PSAzKSB7XHJcbiAgICB2YWx1ZVtvcF0gPSBhcnJbMl07XHJcbiAgfSBlbHNlIHtcclxuICAgIHZhbHVlW29wXSA9IGNyZWF0ZVByZWRpY2F0ZUZyb21BcnJheShhcnIuc3BsaWNlKDIpKTtcclxuICB9XHJcbiAgcmV0dXJuIGNyZWF0ZVByZWRpY2F0ZUZyb21PYmplY3QoanNvbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVByZWRpY2F0ZUZyb21PYmplY3Qob2JqOiBPYmplY3QpIHtcclxuICBpZiAob2JqIGluc3RhbmNlb2YgUHJlZGljYXRlKSByZXR1cm4gb2JqO1xyXG5cclxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBjb252ZXJ0IHRvIGEgUHJlZGljYXRlOiBcIiArIG9iaik7XHJcbiAgfVxyXG4gIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcclxuICBsZXQgcHJlZHMgPSBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICByZXR1cm4gY3JlYXRlUHJlZGljYXRlRnJvbUtleVZhbHVlKGtleSwgb2JqW2tleV0pO1xyXG4gIH0pO1xyXG4gIHJldHVybiAocHJlZHMubGVuZ3RoID09PSAxKSA/IHByZWRzWzBdIDogbmV3IEFuZE9yUHJlZGljYXRlKFwiYW5kXCIsIHByZWRzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlUHJlZGljYXRlRnJvbUtleVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJlZGljYXRlIHtcclxuICAvLyB7IGFuZDogW2EsYl0gfSBrZXk9J2FuZCcsIHZhbHVlID0gW2EsYl1cclxuICBpZiAoQW5kT3JQcmVkaWNhdGUucHJvdG90eXBlLl9yZXNvbHZlT3Aoa2V5LCB0cnVlKSkge1xyXG4gICAgcmV0dXJuIG5ldyBBbmRPclByZWRpY2F0ZShrZXksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIHsgbm90OiBhIH0gIGtleT0gJ25vdCcsIHZhbHVlID0gYVxyXG4gIGlmIChVbmFyeVByZWRpY2F0ZS5wcm90b3R5cGUuX3Jlc29sdmVPcChrZXksIHRydWUpKSB7XHJcbiAgICByZXR1cm4gbmV3IFVuYXJ5UHJlZGljYXRlKGtleSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB8fCB2YWx1ZSA9PSBudWxsIHx8IGNvcmUuaXNEYXRlKHZhbHVlKSkge1xyXG4gICAgLy8geyBmb286IGJhciB9IGtleT0nZm9vJywgdmFsdWUgPSBiYXIgKCB3aGVyZSBiYXIgaXMgYSBsaXRlcmFsIGkuZS4gYSBzdHJpbmcsIGEgbnVtYmVyLCBhIGJvb2xlYW4gb3IgYSBkYXRlLlxyXG4gICAgcmV0dXJuIG5ldyBCaW5hcnlQcmVkaWNhdGUoXCJlcVwiLCBrZXksIHZhbHVlKTtcclxuICB9IGVsc2UgaWYgKGNvcmUuaGFzT3duUHJvcGVydHkodmFsdWUsICd2YWx1ZScpKSB7XHJcbiAgICAvLyB7IGZvbzogeyB2YWx1ZTogYmFyLCBkYXRhVHlwZTogeHh4fSB9IGtleT0nZm9vJywgdmFsdWUgPSBiYXIgKCB3aGVyZSBiYXIgaXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGxpdGVyYWxcclxuICAgIHJldHVybiBuZXcgQmluYXJ5UHJlZGljYXRlKFwiZXFcIiwga2V5LCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXNvbHZlIHByZWRpY2F0ZSBhZnRlciB0aGUgcGhyYXNlOiBcIiArIGtleSk7XHJcbiAgfVxyXG5cclxuICBsZXQgZXhwciA9IGtleTtcclxuICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcclxuICBsZXQgcHJlZHMgPSBrZXlzLm1hcChmdW5jdGlvbiAob3ApIHtcclxuXHJcbiAgICAvLyB7IGE6IHsgYW55OiBiIH0gb3AgPSAnYW55JywgZXhwcj1hLCB2YWx1ZVtvcF0gPSBiXHJcbiAgICBpZiAoQW55QWxsUHJlZGljYXRlLnByb3RvdHlwZS5fcmVzb2x2ZU9wKG9wLCB0cnVlKSkge1xyXG4gICAgICByZXR1cm4gbmV3IEFueUFsbFByZWRpY2F0ZShvcCwgZXhwciwgdmFsdWVbb3BdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQmluYXJ5UHJlZGljYXRlLnByb3RvdHlwZS5fcmVzb2x2ZU9wKG9wLCB0cnVlKSkge1xyXG4gICAgICAvLyB7IGE6IHsgXCI+XCI6IGIgfX0gb3AgPSBcIj5cIiwgZXhwcj1hLCB2YWx1ZVtvcF0gPSBiXHJcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5UHJlZGljYXRlKG9wLCBleHByLCB2YWx1ZVtvcF0pO1xyXG4gICAgfSBlbHNlIGlmIChjb3JlLmhhc093blByb3BlcnR5KHZhbHVlW29wXSwgJ3ZhbHVlJykpIHtcclxuICAgICAgLy8geyBhOiB7IFwiPlwiOiB7IHZhbHVlOiBiLCBkYXRhVHlwZTogJ0ludDMyJyB9fSBleHByID0gYSB2YWx1ZVtvcF0gPSB7IHZhbHVlOiBiLCBkYXRhVHlwZTogJ0ludDMyJyB9XHJcbiAgICAgIHJldHVybiBuZXcgQmluYXJ5UHJlZGljYXRlKFwiZXFcIiwgZXhwciwgdmFsdWVbb3BdKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbXNnID0gY29yZS5mb3JtYXRTdHJpbmcoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcmVkaWNhdGUgYWZ0ZXIgdGhlIHBocmFzZTogJyUxJyBmb3Igb3BlcmF0b3I6ICclMicgIGFuZCB2YWx1ZTogJyUzJ1wiLCBleHByLCBvcCwgdmFsdWVbb3BdKTtcclxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xyXG5cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIChwcmVkcy5sZW5ndGggPT09IDEpID8gcHJlZHNbMF0gOiBuZXcgQW5kT3JQcmVkaWNhdGUoXCJhbmRcIiwgcHJlZHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcmdzRm9yQW5kT3JQcmVkaWNhdGVzKG9iajoge30sIGFyZ3M6IGFueVtdKSB7XHJcbiAgbGV0IHByZWRzID0gYXJnc1swXTtcclxuICBpZiAocHJlZHMgaW5zdGFuY2VvZiBQcmVkaWNhdGUpIHtcclxuICAgIHByZWRzID0gY29yZS5hcnJheVNsaWNlKGFyZ3MpO1xyXG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocHJlZHMpKSB7XHJcbiAgICBwcmVkcyA9IFtuZXcgUHJlZGljYXRlKGNvcmUuYXJyYXlTbGljZShhcmdzKSldO1xyXG4gIH1cclxuICByZXR1cm4gW29ial0uY29uY2F0KHByZWRzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlQWxpYXNNYXAoYWxpYXNNYXA6IE9wTWFwLCBvcFN0cjogc3RyaW5nLCBvcDogT3ApIHtcclxuICBsZXQga2V5ID0gb3BTdHIudG9Mb3dlckNhc2UoKTtcclxuICBvcC5rZXkgPSBrZXk7XHJcbiAgYWxpYXNNYXBba2V5XSA9IG9wO1xyXG5cclxuICBvcC5hbGlhc2VzICYmIG9wLmFsaWFzZXMuZm9yRWFjaCgoYWxpYXM6IGFueSkgPT4ge1xyXG4gICAgYWxpYXNNYXBbYWxpYXMudG9Mb3dlckNhc2UoKV0gPSBvcDtcclxuICB9KTtcclxufVxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbkBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gQGludGVybmFsIFxyXG4qL1xyXG5jbGFzcyBQYXNzdGhydVByZWRpY2F0ZSBleHRlbmRzIFByZWRpY2F0ZSB7XHJcbiAgdmFsdWU6IGFueTtcclxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gX3ZhbGlkYXRlID0gY29yZS5ub29wO1xyXG59XHJcbkVycm9yWyd4J10gPSBQYXNzdGhydVByZWRpY2F0ZS5wcm90b3R5cGUuX2luaXRpYWxpemUoJ3Bhc3N0aHJ1UHJlZGljYXRlJyk7XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGNsYXNzIFVuYXJ5UHJlZGljYXRlIGV4dGVuZHMgUHJlZGljYXRlIHtcclxuICBvcDogT3A7XHJcbiAgcHJlZDogUHJlZGljYXRlO1xyXG4gIGNvbnN0cnVjdG9yKG9wOiBzdHJpbmcgfCBRdWVyeU9wLCAuLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMub3AgPSB0aGlzLl9yZXNvbHZlT3Aob3ApO1xyXG4gICAgdGhpcy5wcmVkID0gbmV3IFByZWRpY2F0ZShhcmdzKTtcclxuICB9XHJcblxyXG4gIF92YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmVkLl92YWxpZGF0ZShlbnRpdHlUeXBlLCB1c2VzTmFtZU9uU2VydmVyKTtcclxuICB9XHJcbn1cclxuXHJcbkVycm9yWyd4J10gPSBVbmFyeVByZWRpY2F0ZS5wcm90b3R5cGUuX2luaXRpYWxpemUoJ3VuYXJ5UHJlZGljYXRlJywge1xyXG4gICdub3QnOiB7IGFsaWFzZXM6IFsnIScsICd+J10gfSxcclxufSk7XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGNsYXNzIEJpbmFyeVByZWRpY2F0ZSBleHRlbmRzIFByZWRpY2F0ZSB7XHJcbiAgb3A6IE9wO1xyXG4gIGV4cHIxU291cmNlOiBhbnk7XHJcbiAgZXhwcjJTb3VyY2U6IGFueTtcclxuICBleHByMT86IFByZWRpY2F0ZUV4cHJlc3Npb247XHJcbiAgZXhwcjI/OiBQcmVkaWNhdGVFeHByZXNzaW9uO1xyXG4gIGNvbnN0cnVjdG9yKG9wOiBzdHJpbmcgfCBRdWVyeU9wLCBleHByMTogYW55LCBleHByMjogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgLy8gNSBwdWJsaWMgcHJvcHMgb3AsIGV4cHIxU291cmNlLCBleHByMlNvdXJjZSwgZXhwcjEsIGV4cHIyXHJcbiAgICB0aGlzLm9wID0gdGhpcy5fcmVzb2x2ZU9wKG9wKTtcclxuICAgIHRoaXMuZXhwcjFTb3VyY2UgPSBleHByMTtcclxuICAgIHRoaXMuZXhwcjJTb3VyY2UgPSBleHByMjtcclxuICAgIC8vIHRoaXMuZXhwcjEgYW5kIHRoaXMuZXhwcjIgd29uJ3QgYmVcclxuICAgIC8vIGRldGVybWluZWQgdW50aWwgdmFsaWRhdGUgaXMgcnVuXHJcbiAgfVxyXG5cclxuXHJcbiAgX3ZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHVzZXNOYW1lT25TZXJ2ZXI/OiBib29sZWFuKSB7XHJcbiAgICBsZXQgZXhwcjFDb250ZXh0ID0geyBlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLCB1c2VzTmFtZU9uU2VydmVyOiB1c2VzTmFtZU9uU2VydmVyIH07XHJcbiAgICB0aGlzLmV4cHIxID0gY3JlYXRlRXhwcih0aGlzLmV4cHIxU291cmNlLCBleHByMUNvbnRleHQpO1xyXG4gICAgaWYgKHRoaXMuZXhwcjEgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gdmFsaWRhdGUgMXN0IGV4cHJlc3Npb246IFwiICsgdGhpcy5leHByMVNvdXJjZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5leHByMSBpbnN0YW5jZW9mIExpdEV4cHIpIHtcclxuICAgICAgLy8gbGhzIG11c3QgYmUgZWl0aGVyIGEgcHJvcGVydHkgb3IgYSBmdW5jdGlvbi5cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGxlZnQgaGFuZCBzaWRlIG9mIGEgYmluYXJ5IHByZWRpY2F0ZSBjYW5ub3QgYmUgYSBsaXRlcmFsIGV4cHJlc3Npb24sIGl0IG11c3QgYmUgYSB2YWxpZCBwcm9wZXJ0eSBvciBmdW5jdGlvbmFsIHByZWRpY2F0ZSBleHByZXNzaW9uOiBcIiArIHRoaXMuZXhwcjFTb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wLmtleSA9PT0gJ2luJyAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLmV4cHIyU291cmNlKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgJ2luJyBvcGVyYXRvciByZXF1aXJlcyB0aGF0IGl0cyByaWdodCBoYW5kIGFyZ3VtZW50IGJlIGFuIGFycmF5XCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IGV4cHIyQ29udGV4dCA9IGNvcmUuZXh0ZW5kKGV4cHIxQ29udGV4dCwgeyBpc1JIUzogdHJ1ZSwgZGF0YVR5cGU6IHRoaXMuZXhwcjEuZGF0YVR5cGUgfSk7XHJcbiAgICB0aGlzLmV4cHIyID0gY3JlYXRlRXhwcih0aGlzLmV4cHIyU291cmNlLCBleHByMkNvbnRleHQpO1xyXG4gICAgaWYgKHRoaXMuZXhwcjIgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gdmFsaWRhdGUgMm5kIGV4cHJlc3Npb246IFwiICsgdGhpcy5leHByMlNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZXhwcjEuZGF0YVR5cGUgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmV4cHIxLmRhdGFUeXBlID0gdGhpcy5leHByMi5kYXRhVHlwZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuRXJyb3JbJ3gnXSA9IEJpbmFyeVByZWRpY2F0ZS5wcm90b3R5cGUuX2luaXRpYWxpemUoJ2JpbmFyeVByZWRpY2F0ZScsIHtcclxuICAnZXEnOiB7XHJcbiAgICBhbGlhc2VzOiBbXCI9PVwiLCBcImVxdWFsc1wiXVxyXG4gIH0sXHJcbiAgJ25lJzoge1xyXG4gICAgYWxpYXNlczogW1wiIT1cIiwgXCJ+PVwiLCBcIm5vdGVxdWFsc1wiXVxyXG4gIH0sXHJcbiAgJ2x0Jzoge1xyXG4gICAgYWxpYXNlczogW1wiPFwiLCBcImxlc3N0aGFuXCJdXHJcbiAgfSxcclxuICAnbGUnOiB7XHJcbiAgICBhbGlhc2VzOiBbXCI8PVwiLCBcImxlc3N0aGFub3JlcXVhbFwiXVxyXG4gIH0sXHJcbiAgJ2d0Jzoge1xyXG4gICAgYWxpYXNlczogW1wiPlwiLCBcImdyZWF0ZXJ0aGFuXCJdXHJcbiAgfSxcclxuICAnZ2UnOiB7XHJcbiAgICBhbGlhc2VzOiBbXCI+PVwiLCBcImdyZWF0ZXJ0aGFub3JlcXVhbFwiXVxyXG4gIH0sXHJcbiAgJ3N0YXJ0c3dpdGgnOiB7XHJcbiAgICBpc0Z1bmN0aW9uOiB0cnVlXHJcbiAgfSxcclxuICAnZW5kc3dpdGgnOiB7XHJcbiAgICBpc0Z1bmN0aW9uOiB0cnVlXHJcbiAgfSxcclxuICAnY29udGFpbnMnOiB7XHJcbiAgICBhbGlhc2VzOiBbXCJzdWJzdHJpbmdvZlwiXSxcclxuICAgIGlzRnVuY3Rpb246IHRydWVcclxuICB9LFxyXG4gICdpbic6IHtcclxuXHJcbiAgfVxyXG59KTtcclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuXHJcbiovXHJcbmV4cG9ydCBjbGFzcyBBbmRPclByZWRpY2F0ZSBleHRlbmRzIFByZWRpY2F0ZSB7XHJcbiAgb3A6IE9wO1xyXG4gIHByZWRzOiBQcmVkaWNhdGVbXTtcclxuICBjb25zdHJ1Y3RvcihvcDogc3RyaW5nIHwgUXVlcnlPcCwgcHJlZHM6IGFueVtdKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5vcCA9IHRoaXMuX3Jlc29sdmVPcChvcCk7XHJcbiAgICBpZiAocHJlZHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocHJlZHNbMF0pKSB7XHJcbiAgICAgIHByZWRzID0gcHJlZHNbMF07XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZWRzID0gcHJlZHMuZmlsdGVyKGZ1bmN0aW9uIChwcmVkKSB7XHJcbiAgICAgIHJldHVybiBwcmVkICE9IG51bGw7XHJcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByZWQpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGUocHJlZCk7XHJcbiAgICB9KTtcclxuICAgIC8vIFRPRE86IHRoaXMgd2FzIHJlbW92ZWQgLSB0ZXN0IGlmIHJlYWxseSBuZWVkZWQuXHJcbiAgICAvLyBpZiAodGhpcy5wcmVkcy5sZW5ndGggPT09IDApIHtcclxuICAgIC8vICAgLy8gbWFya2VyIGZvciBhbiBlbXB0eSBwcmVkaWNhdGVcclxuICAgIC8vICAgdGhpcy5vcCA9IG51bGw7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAodGhpcy5wcmVkcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucHJlZHNbMF0gYXMgQW5kT3JQcmVkaWNhdGU7IC8vIEhBQ0s6IHRoaXMucHJlZHNbMF0gaXMgYWN0dWFsbHkgTk9UIGEgQW5kT3JQcmVkaWNhdGUgYnV0IHNvbWUgb3RoZXIga2luZCBvZiBwcmVkLlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3ZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHVzZXNOYW1lT25TZXJ2ZXI/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByZWRzLmZvckVhY2goKHByZWQpID0+IHtcclxuICAgICAgcHJlZC5fdmFsaWRhdGUoZW50aXR5VHlwZSwgdXNlc05hbWVPblNlcnZlcik7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbkVycm9yWyd4J10gPSBBbmRPclByZWRpY2F0ZS5wcm90b3R5cGUuX2luaXRpYWxpemUoXCJhbmRPclByZWRpY2F0ZVwiLCB7XHJcbiAgJ2FuZCc6IHsgYWxpYXNlczogWycmJiddIH0sXHJcbiAgJ29yJzogeyBhbGlhc2VzOiBbJ3x8J10gfVxyXG59ICk7XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGNsYXNzIEFueUFsbFByZWRpY2F0ZSBleHRlbmRzIFByZWRpY2F0ZSB7XHJcbiAgb3A6IE9wO1xyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBleHByOiBQcmVkaWNhdGVFeHByZXNzaW9uO1xyXG4gIGV4cHJTb3VyY2U6IHN0cmluZztcclxuICBwcmVkOiBQcmVkaWNhdGU7XHJcbiAgLy8gNCBwdWJsaWMgcHJvcHM6IG9wLCBleHByU291cmNlLCBleHByLCBwcmVkXHJcbiAgY29uc3RydWN0b3Iob3A6IHN0cmluZyB8IFF1ZXJ5T3AsIGV4cHI6IHN0cmluZywgcHJlZDogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5vcCA9IHRoaXMuX3Jlc29sdmVPcChvcCk7XHJcbiAgICB0aGlzLmV4cHJTb3VyY2UgPSBleHByO1xyXG4gICAgLy8gdGhpcy5leHByIHdpbGwgbm90IGJlIHJlc29sdmVkIHVudGlsIHZhbGlkYXRlIGlzIGNhbGxlZFxyXG4gICAgdGhpcy5wcmVkID0gbmV3IFByZWRpY2F0ZShwcmVkKTtcclxuICB9XHJcblxyXG4gIF92YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB1c2VzTmFtZU9uU2VydmVyOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmV4cHIgPSBjcmVhdGVFeHByKHRoaXMuZXhwclNvdXJjZSwgeyBlbnRpdHlUeXBlOiBlbnRpdHlUeXBlLCB1c2VzTmFtZU9uU2VydmVyOiB1c2VzTmFtZU9uU2VydmVyIH0gYXMgRXhwcmVzc2lvbkNvbnRleHQpO1xyXG4gICAgLy8gY2FuJ3QgcmVhbGx5IGtub3cgdGhlIHByZWRpY2F0ZUVudGl0eVR5cGUgdW5sZXNzIHRoZSBvcmlnaW5hbCBlbnRpdHkgdHlwZSB3YXMga25vd24uXHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHtcclxuICAgICAgdGhpcy5leHByLmRhdGFUeXBlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcmVkLl92YWxpZGF0ZSh0aGlzLmV4cHIuZGF0YVR5cGUgYXMgRW50aXR5VHlwZSB8IHVuZGVmaW5lZCwgdXNlc05hbWVPblNlcnZlcik7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuRXJyb3JbJ3gnXSA9IEFueUFsbFByZWRpY2F0ZS5wcm90b3R5cGUuX2luaXRpYWxpemUoXCJhbnlBbGxQcmVkaWNhdGVcIiwge1xyXG4gICdhbnknOiB7IGFsaWFzZXM6IFsnc29tZSddIH0sXHJcbiAgJ2FsbCc6IHsgYWxpYXNlczogW1wiZXZlcnlcIl0gfVxyXG59KTtcclxuXHJcbi8qKiBAaGlkZGVuICovXHJcbmV4cG9ydCBjbGFzcyBQcmVkaWNhdGVFeHByZXNzaW9uIHtcclxuICB2aXNpdG9yTWV0aG9kTmFtZTogc3RyaW5nO1xyXG4gIHZpc2l0OiBGdW5jdGlvbjsgLy8gVE9ET1xyXG4gIGRhdGFUeXBlPzogRGF0YVR5cGUgfCBTdHJ1Y3R1cmFsVHlwZTtcclxuICBjb25zdHJ1Y3Rvcih2aXNpdG9yTWV0aG9kTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnZpc2l0b3JNZXRob2ROYW1lID0gdmlzaXRvck1ldGhvZE5hbWU7XHJcbiAgICAvLyBnaXZlIGV4cHJlc3Npb25zIHRoZSBQcmVkaWNhdGUgcHJvdG90eXBlIG1ldGhvZFxyXG4gICAgdGhpcy52aXNpdCA9IFByZWRpY2F0ZS5wcm90b3R5cGUudmlzaXQ7XHJcbiAgfVxyXG5cclxuICAvLyBkZWZhdWx0IGltcGxzIC0gbWF5L3dpbGwgYmUgb3ZlcnJpZGRlbiBiZSBzdWJjbGFzcyBleHByZXNzaW9uc1xyXG4gIF92YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkLCB1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgLy8gbm9vcDtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgTGl0RXhwciBleHRlbmRzIFByZWRpY2F0ZUV4cHJlc3Npb24ge1xyXG4gIHZhbHVlOiBhbnk7XHJcbiAgZGF0YVR5cGU6IERhdGFUeXBlO1xyXG4gIGhhc0V4cGxpY2l0RGF0YVR5cGU6IGJvb2xlYW47XHJcbiAgLy8gMiBwdWJsaWMgcHJvcHM6IHZhbHVlLCBkYXRhVHlwZVxyXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBhbnksIGRhdGFUeXBlOiBzdHJpbmcgfCBEYXRhVHlwZSB8IHVuZGVmaW5lZCwgaGFzRXhwbGljaXREYXRhVHlwZT86IGJvb2xlYW4pIHtcclxuICAgIHN1cGVyKFwibGl0RXhwclwiKTtcclxuICAgIC8vIGRhdGFUeXBlIG1heSBjb21lIGlzIGFuIGEgc3RyaW5nXHJcbiAgICBsZXQgZHQxID0gcmVzb2x2ZURhdGFUeXBlKGRhdGFUeXBlKTtcclxuICAgIC8vIGlmIHRoZSBEYXRhVHlwZSBjb21lcyBpbiBhcyBVbmRlZmluZWQgdGhpcyBtZWFuc1xyXG4gICAgLy8gdGhhdCB3ZSBzaG91bGQgTk9UIGF0dGVtcHQgdG8gcGFyc2UgaXQgYnV0IGp1c3QgbGVhdmUgaXQgYWxvbmVcclxuICAgIC8vIGZvciBub3cgLSB0aGlzIGlzIHVzdWFsbHkgYmVjYXVzZSBpdCBpcyBwYXJ0IG9mIGEgRnVuYyBleHByLlxyXG4gICAgLy8gVE9ETzogY2FzdCBhcyBEYXRhVHlwZSBzZWVtcyB0byBiZSBuZWVkZWQgYnkgZWFybHkgdmVyc2lvbiBvZiBUeXBlRG9jIC0gbWF5IGJlIGFibGUgdG8gcmVtb3ZlIGxhdGVyXHJcbiAgICBsZXQgZHQyID0gKGR0MSB8fCBEYXRhVHlwZS5mcm9tVmFsdWUodmFsdWUpKSBhcyBEYXRhVHlwZTtcclxuXHJcbiAgICBpZiAoZHQyLnBhcnNlKSB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5tYXAoKHYpID0+IHsgcmV0dXJuIGR0Mi5wYXJzZSEodiwgdHlwZW9mIHYpOyB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gZHQyLnBhcnNlKHZhbHVlLCB0eXBlb2YgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFUeXBlID0gZHQyO1xyXG4gICAgdGhpcy5oYXNFeHBsaWNpdERhdGFUeXBlID0gISFoYXNFeHBsaWNpdERhdGFUeXBlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKSB7XHJcbiAgICByZXR1cm4gXCIgTGl0RXhwciAtIHZhbHVlOiBcIiArIHRoaXMudmFsdWUudG9TdHJpbmcoKSArIFwiIGRhdGFUeXBlOiBcIiArIHRoaXMuZGF0YVR5cGUudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlRGF0YVR5cGUoZGF0YVR5cGU/OiBEYXRhVHlwZSB8IHN0cmluZykge1xyXG4gIGlmIChkYXRhVHlwZSA9PSBudWxsKSByZXR1cm4gZGF0YVR5cGU7XHJcbiAgLy8gaWYgKERhdGFUeXBlLmNvbnRhaW5zKGRhdGFUeXBlKSkge1xyXG4gIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIERhdGFUeXBlKSB7XHJcbiAgICByZXR1cm4gZGF0YVR5cGU7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YgZGF0YVR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBsZXQgZHQgPSBEYXRhVHlwZS5mcm9tTmFtZShkYXRhVHlwZSkgYXMgRGF0YVR5cGU7XHJcbiAgICBpZiAoZHQpIHJldHVybiBkdDtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXNvbHZlIGEgZGF0YVR5cGUgbmFtZWQ6IFwiICsgZGF0YVR5cGUpO1xyXG4gIH1cclxuXHJcbiAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGRhdGFUeXBlIHBhcmFtZXRlciBwYXNzZWQgaW50byB0aGlzIGxpdGVyYWwgZXhwcmVzc2lvbiBpcyBub3QgYSAnRGF0YVR5cGUnXCIgKyBkYXRhVHlwZSk7XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgUHJvcEV4cHIgZXh0ZW5kcyBQcmVkaWNhdGVFeHByZXNzaW9uIHtcclxuICBwcm9wZXJ0eVBhdGg6IHN0cmluZztcclxuICBkYXRhVHlwZTogRGF0YVR5cGUgfCBTdHJ1Y3R1cmFsVHlwZTtcclxuICAvLyB0d28gcHVibGljIHByb3BzOiBwcm9wZXJ0eVBhdGgsIGRhdGVUeXBlXHJcbiAgY29uc3RydWN0b3IocHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKCdwcm9wRXhwcicpO1xyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGg7XHJcbiAgICAvL3RoaXMuZGF0YVR5cGUgPSBEYXRhVHlwZS5VbmRlZmluZWQ7XHJcbiAgICAvLyB0aGlzLmRhdGFUeXBlIHJlc29sdmVkIGFmdGVyIHZhbGlkYXRlICggaWYgbm90IG9uIGFuIGFub24gdHlwZSB9XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpIHtcclxuICAgIHJldHVybiBcIiBQcm9wRXhwciAtIFwiICsgdGhpcy5wcm9wZXJ0eVBhdGg7XHJcbiAgfVxyXG5cclxuICBfdmFsaWRhdGUoZW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCwgdXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW4pIHtcclxuXHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHJldHVybjtcclxuICAgIGxldCBwcm9wcyA9IGVudGl0eVR5cGUuZ2V0UHJvcGVydGllc09uUGF0aCh0aGlzLnByb3BlcnR5UGF0aCwgbnVsbCwgZmFsc2UpO1xyXG5cclxuICAgIGlmICghcHJvcHMpIHtcclxuICAgICAgbGV0IG1zZyA9IGNvcmUuZm9ybWF0U3RyaW5nKFwiVW5hYmxlIHRvIHJlc29sdmUgcHJvcGVydHlQYXRoLiAgRW50aXR5VHlwZTogJyUxJyAgIFByb3BlcnR5UGF0aDogJyUyJ1wiLCBlbnRpdHlUeXBlLm5hbWUsIHRoaXMucHJvcGVydHlQYXRoKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XHJcbiAgICB9XHJcbiAgICAvLyBnZXQgdGhlIGxhc3QgcHJvcGVydHlcclxuICAgIGxldCBwcm9wID0gcHJvcHNbcHJvcHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAocHJvcCBpbnN0YW5jZW9mIERhdGFQcm9wZXJ0eSkge1xyXG4gICAgICB0aGlzLmRhdGFUeXBlID0gcHJvcC5kYXRhVHlwZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YVR5cGUgPSBwcm9wLmVudGl0eVR5cGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbkBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gQGR5bmFtaWNcclxuKi9cclxuZXhwb3J0IGNsYXNzIEZuRXhwciBleHRlbmRzIFByZWRpY2F0ZUV4cHJlc3Npb24ge1xyXG4gIGZuTmFtZTogc3RyaW5nO1xyXG4gIGV4cHJzOiBQcmVkaWNhdGVFeHByZXNzaW9uW107XHJcbiAgbG9jYWxGbjogYW55OyAvLyBUT0RPOlxyXG4gIGRhdGFUeXBlOiBEYXRhVHlwZTtcclxuICBjb25zdHJ1Y3Rvcihmbk5hbWU6IHN0cmluZywgZXhwcnM6IFByZWRpY2F0ZUV4cHJlc3Npb25bXSkge1xyXG4gICAgc3VwZXIoJ2ZuRXhwcicpO1xyXG4gICAgLy8gNCBwdWJsaWMgcHJvcHM6IGZuTmFtZSwgZXhwcnMsIGxvY2FsRm4sIGRhdGFUeXBlXHJcbiAgICB0aGlzLmZuTmFtZSA9IGZuTmFtZTtcclxuICAgIHRoaXMuZXhwcnMgPSBleHBycztcclxuICAgIGxldCBxZiA9IEZuRXhwci5fZnVuY01hcFtmbk5hbWVdO1xyXG4gICAgaWYgKHFmID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBmdW5jdGlvbjogXCIgKyBmbk5hbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2NhbEZuID0gcWYuZm47XHJcbiAgICB0aGlzLmRhdGFUeXBlID0gcWYuZGF0YVR5cGU7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpIHtcclxuICAgIGxldCBleHByU3RyID0gdGhpcy5leHBycy5tYXAoZnVuY3Rpb24gKGV4cHIpIHtcclxuICAgICAgZXhwci50b1N0cmluZygpO1xyXG4gICAgfSkudG9TdHJpbmcoKTtcclxuICAgIHJldHVybiBcIkZuRXhwciAtIFwiICsgdGhpcy5mbk5hbWUgKyBcIihcIiArIGV4cHJTdHIgKyBcIilcIjtcclxuICB9XHJcblxyXG4gIF92YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkLCB1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5leHBycy5mb3JFYWNoKGZ1bmN0aW9uIChleHByKSB7XHJcbiAgICAgIGV4cHIuX3ZhbGlkYXRlKGVudGl0eVR5cGUsIHVzZXNOYW1lT25TZXJ2ZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgX2Z1bmNNYXAgPSB7XHJcbiAgICB0b3VwcGVyOiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5TdHJpbmdcclxuICAgIH0sXHJcbiAgICB0b2xvd2VyOiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5TdHJpbmdcclxuICAgIH0sXHJcbiAgICBzdWJzdHJpbmc6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzb3VyY2U6IHN0cmluZywgcG9zOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcocG9zLCBsZW5ndGgpO1xyXG4gICAgICB9LCBkYXRhVHlwZTogRGF0YVR5cGUuU3RyaW5nXHJcbiAgICB9LFxyXG4gICAgc3Vic3RyaW5nb2Y6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChmaW5kOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5pbmRleE9mKGZpbmQpID49IDA7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5Cb29sZWFuXHJcbiAgICB9LFxyXG4gICAgbGVuZ3RoOiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlLmxlbmd0aDtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkludDMyXHJcbiAgICB9LFxyXG4gICAgdHJpbToge1xyXG4gICAgICBmbjogZnVuY3Rpb24gKHNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS50cmltKCk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5TdHJpbmdcclxuICAgIH0sXHJcbiAgICBjb25jYXQ6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzMTogc3RyaW5nLCBzMjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHMxLmNvbmNhdChzMik7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5TdHJpbmdcclxuICAgIH0sXHJcbiAgICByZXBsYWNlOiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBzdHJpbmcsIGZpbmQ6IHN0cmluZywgcmVwbGFjZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKGZpbmQsIHJlcGxhY2UpO1xyXG4gICAgICB9LCBkYXRhVHlwZTogRGF0YVR5cGUuU3RyaW5nXHJcbiAgICB9LFxyXG4gICAgc3RhcnRzd2l0aDoge1xyXG4gICAgICBmbjogZnVuY3Rpb24gKHNvdXJjZTogc3RyaW5nLCBmaW5kOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gY29yZS5zdHJpbmdTdGFydHNXaXRoKHNvdXJjZSwgZmluZCk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5Cb29sZWFuXHJcbiAgICB9LFxyXG4gICAgZW5kc3dpdGg6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzb3VyY2U6IHN0cmluZywgZmluZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvcmUuc3RyaW5nRW5kc1dpdGgoc291cmNlLCBmaW5kKTtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkJvb2xlYW5cclxuICAgIH0sXHJcbiAgICBpbmRleG9mOiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBhbnksIGZpbmQ6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBzb3VyY2UuaW5kZXhPZihmaW5kKTtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkludDMyXHJcbiAgICB9LFxyXG4gICAgcm91bmQ6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzb3VyY2U6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHNvdXJjZSk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5JbnQzMlxyXG4gICAgfSxcclxuICAgIGNlaWxpbmc6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzb3VyY2U6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoc291cmNlKTtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkludDMyXHJcbiAgICB9LFxyXG4gICAgZmxvb3I6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzb3VyY2U6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHNvdXJjZSk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5JbnQzMlxyXG4gICAgfSxcclxuICAgIHNlY29uZDoge1xyXG4gICAgICBmbjogZnVuY3Rpb24gKHNvdXJjZTogRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBzb3VyY2UuZ2V0U2Vjb25kcygpO1xyXG4gICAgICB9LCBkYXRhVHlwZTogRGF0YVR5cGUuSW50MzJcclxuICAgIH0sXHJcbiAgICBtaW51dGU6IHtcclxuICAgICAgZm46IGZ1bmN0aW9uIChzb3VyY2U6IERhdGUpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlLmdldE1pbnV0ZXMoKTtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkludDMyXHJcbiAgICB9LFxyXG4gICAgZGF5OiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBEYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXREYXRlKCk7XHJcbiAgICAgIH0sIGRhdGFUeXBlOiBEYXRhVHlwZS5JbnQzMlxyXG4gICAgfSxcclxuICAgIG1vbnRoOiB7XHJcbiAgICAgIGZuOiBmdW5jdGlvbiAoc291cmNlOiBEYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRNb250aCgpICsgMTtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkludDMyXHJcbiAgICB9LFxyXG4gICAgeWVhcjoge1xyXG4gICAgICBmbjogZnVuY3Rpb24gKHNvdXJjZTogRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBzb3VyY2UuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgfSwgZGF0YVR5cGU6IERhdGFUeXBlLkludDMyXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbn1cclxuXHJcbi8vIFRPRE86IGFkZCBkYXRhVHlwZXMgZm9yIHRoZSBhcmdzIG5leHQgLSB3aWxsIGhlbHAgdG8gaW5mZXIgb3RoZXIgZGF0YVR5cGVzLlxyXG5cclxuXHJcbmxldCBSWF9JREVOVElGSUVSID0gL15bYS16X11bXFx3LiRdKiQvaTtcclxuLy8gY29tbWEgZGVsaW1pdGVkIGV4cHJlc3Npb25zIGlnbm9yaW5nIGNvbW1hcyBpbnNpZGUgb2YgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMuXHJcbmxldCBSWF9DT01NQV9ERUxJTTEgPSAvKCdbXiddKid8W14sXSspL2c7XHJcbmxldCBSWF9DT01NQV9ERUxJTTIgPSAvKFwiW15cIl0qXCJ8W14sXSspL2c7XHJcbmxldCBERUxJTSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTkxKTtcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUV4cHIoc291cmNlOiBhbnksIGV4cHJDb250ZXh0OiBFeHByZXNzaW9uQ29udGV4dCkge1xyXG4gIGxldCBlbnRpdHlUeXBlID0gZXhwckNvbnRleHQuZW50aXR5VHlwZTtcclxuXHJcbiAgLy8gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhbiAnaW4nIGNsYXVzZVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcclxuICAgIGlmICghZXhwckNvbnRleHQuaXNSSFMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJyYXkgZXhwcmVzc2lvbnMgYXJlIG9ubHkgcGVybWl0dGVkIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgYSBCaW5hcnlQcmVkaWNhdGVcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IExpdEV4cHIoc291cmNlLCBleHByQ29udGV4dC5kYXRhVHlwZSEpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCEodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpKSB7XHJcbiAgICBpZiAoc291cmNlICE9IG51bGwgJiYgdHlwZW9mIHNvdXJjZSA9PT0gJ29iamVjdCcgJiYgIXNvdXJjZS50b0lTT1N0cmluZykge1xyXG4gICAgICAvLyBzb3VyY2UgaXMgYW4gb2JqZWN0IGJ1dCBub3QgYSBEYXRlLWxpa2UgdGhpbmcgc3VjaCBhcyBhIEpTIG9yIE1vbWVudEpTIERhdGVcclxuICAgICAgaWYgKHNvdXJjZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJlc29sdmUgYW4gZXhwcmVzc2lvbiBmb3I6IFwiICsgc291cmNlICsgXCIgb24gZW50aXR5VHlwZTogXCIgKyAoZW50aXR5VHlwZSA/IGVudGl0eVR5cGUubmFtZSA6ICdudWxsJykpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzb3VyY2UuaXNQcm9wZXJ0eSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvcEV4cHIoc291cmNlLnZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB3ZSB3YW50IHRvIGluc3VyZSB0aGF0IGFueSBMaXRFeHByIGNyZWF0ZWQgdGhpcyB3YXkgaXMgdGFnZ2VkIHdpdGggJ2hhc0V4cGxpY2l0RGF0YVR5cGU6IHRydWUnXHJcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIGluc3VyZSB0aGF0IGlmIHdlIHJvdW5kdHJpcCB0aHJ1IHRvSlNPTiB0aGF0IHdlIGRvbid0XHJcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHJlaW50ZXJwcmV0IHRoaXMgbm9kZSBhcyBhIFByb3BFeHByLlxyXG4gICAgICAgIC8vIHJldHVybiBuZXcgTGl0RXhwcihzb3VyY2UudmFsdWUsIHNvdXJjZS5kYXRhVHlwZSB8fCBjb250ZXh0LmRhdGFUeXBlLCAhIXNvdXJjZS5kYXRhVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMaXRFeHByKHNvdXJjZS52YWx1ZSwgc291cmNlLmRhdGFUeXBlIHx8IGV4cHJDb250ZXh0LmRhdGFUeXBlLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5ldyBMaXRFeHByKHNvdXJjZSwgZXhwckNvbnRleHQuZGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKGV4cHJDb250ZXh0LmlzUkhTKSB7XHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHtcclxuICAgICAgLy8gaWYgZW50aXR5VHlwZSBpcyB1bmtub3duIHRoZW4gYXNzdW1lIHRoYXQgdGhlIHJocyBpcyBhIGxpdGVyYWxcclxuICAgICAgcmV0dXJuIG5ldyBMaXRFeHByKHNvdXJjZSwgZXhwckNvbnRleHQuZGF0YVR5cGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHBhcnNlTGl0T3JQcm9wRXhwcihzb3VyY2UsIGV4cHJDb250ZXh0KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IHJlZ2V4ID0gL1xcKFteKCldKlxcKS87XHJcbiAgICBsZXQgbTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcclxuICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICB3aGlsZSAobSA9IHJlZ2V4LmV4ZWMoc291cmNlKSkge1xyXG4gICAgICBsZXQgdG9rZW4gPSBtWzBdO1xyXG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XHJcbiAgICAgIGxldCByZXBsID0gREVMSU0gKyBpKys7XHJcbiAgICAgIHNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlKHRva2VuLCByZXBsKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzb3VyY2UsIHRva2VucywgZXhwckNvbnRleHQpO1xyXG4gICAgZXhwci5fdmFsaWRhdGUoZW50aXR5VHlwZSwgZXhwckNvbnRleHQudXNlc05hbWVPblNlcnZlcik7XHJcbiAgICByZXR1cm4gZXhwcjtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlRXhwcihzb3VyY2U6IHN0cmluZywgdG9rZW5zOiBzdHJpbmdbXSwgZXhwckNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0KTogUHJlZGljYXRlRXhwcmVzc2lvbiB7XHJcbiAgbGV0IHBhcnRzID0gc291cmNlLnNwbGl0KERFTElNKTtcclxuICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gcGFyc2VMaXRPclByb3BFeHByKHBhcnRzWzBdLCBleHByQ29udGV4dCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBwYXJzZUZuRXhwcihzb3VyY2UsIHBhcnRzLCB0b2tlbnMsIGV4cHJDb250ZXh0KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlTGl0T3JQcm9wRXhwcih2YWx1ZTogc3RyaW5nLCBleHByQ29udGV4dDogRXhwcmVzc2lvbkNvbnRleHQpOiBQcmVkaWNhdGVFeHByZXNzaW9uIHtcclxuICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcclxuICAvLyB2YWx1ZSBpcyBlaXRoZXIgYSBzdHJpbmcsIGEgcXVvdGVkIHN0cmluZywgYSBudW1iZXIsIGEgYm9vbCB2YWx1ZSwgb3IgYSBkYXRlXHJcbiAgLy8gaWYgYSBzdHJpbmcgKCBub3QgYSBxdW90ZWQgc3RyaW5nKSB0aGVuIHRoaXMgcmVwcmVzZW50cyBhIHByb3BlcnR5IG5hbWUgKCAxc3QgKSBvciBhIGxpdCBzdHJpbmcgKCAybmQpXHJcbiAgbGV0IGZpcnN0Q2hhciA9IHZhbHVlLnN1YnN0cigwLCAxKTtcclxuICBsZXQgaXNRdW90ZWQgPSAoZmlyc3RDaGFyID09PSBcIidcIiB8fCBmaXJzdENoYXIgPT09ICdcIicpICYmIHZhbHVlLmxlbmd0aCA+IDEgJiYgdmFsdWUuc3Vic3RyKHZhbHVlLmxlbmd0aCAtIDEpID09PSBmaXJzdENoYXI7XHJcbiAgaWYgKGlzUXVvdGVkKSB7XHJcbiAgICBsZXQgdW5xdW90ZWRWYWx1ZSA9IHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKTtcclxuICAgIHJldHVybiBuZXcgTGl0RXhwcih1bnF1b3RlZFZhbHVlLCBleHByQ29udGV4dC5kYXRhVHlwZSB8fCBEYXRhVHlwZS5TdHJpbmcpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IGV4cHJDb250ZXh0LmVudGl0eVR5cGU7XHJcbiAgICAvLyBUT0RPOiBnZXQgcmlkIG9mIGlzQW5vbnltb3VzIGJlbG93IHdoZW4gd2UgZ2V0IHRoZSBjaGFuY2UuXHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHtcclxuICAgICAgLy8gdGhpcyBmb3JrIHdpbGwgb25seSBiZSByZWFjaGVkIG9uIHRoZSBMSFMgb2YgYW4gQmluYXJ5UHJlZGljYXRlIC1cclxuICAgICAgLy8gYSBSSFMgZXhwciBjYW5ub3QgZ2V0IGhlcmUgd2l0aCBhbiBhbm9uIHR5cGVcclxuICAgICAgcmV0dXJuIG5ldyBQcm9wRXhwcih2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbWF5QmVJZGVudGlmaWVyID0gUlhfSURFTlRJRklFUi50ZXN0KHZhbHVlKTtcclxuICAgICAgaWYgKG1heUJlSWRlbnRpZmllcikge1xyXG4gICAgICAgIC8vIGlmIChlbnRpdHlUeXBlLmdldFByb3BlcnR5KHZhbHVlLCBmYWxzZSkgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChlbnRpdHlUeXBlLmdldFByb3BlcnRpZXNPblBhdGgodmFsdWUsIG51bGwsIGZhbHNlKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BFeHByKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHdlIGRvbid0IHJlYWxseSBrbm93IHRoZSBkYXRhdHlwZSBoZXJlIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgY29tZXMgaW4gYXMgYSBzdHJpbmdcclxuICAgIC8vIGl0cyB1c3VhbGx5IGEgc3RyaW5nIEJVVCBpdCBtaWdodCBiZSBhIG51bWJlciAgaS5lLiB0aGUgXCIxXCIgb3IgdGhlIFwiMlwiIGZyb20gYW4gZXhwclxyXG4gICAgLy8gbGlrZSBcInRvVXBwZXIoc3Vic3RyaW5nKGNvbXBhbnlOYW1lLCAxLCAyKSlcIlxyXG4gICAgcmV0dXJuIG5ldyBMaXRFeHByKHZhbHVlLCBleHByQ29udGV4dC5kYXRhVHlwZSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUZuRXhwcihzb3VyY2U6IHN0cmluZywgcGFydHM6IHN0cmluZ1tdLCB0b2tlbnM6IHN0cmluZ1tdLCBleHByQ29udGV4dDogRXhwcmVzc2lvbkNvbnRleHQpIHtcclxuICB0cnkge1xyXG4gICAgbGV0IGZuTmFtZSA9IHBhcnRzWzBdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGxldCBhcmdTb3VyY2UgPSB0b2tlbnNbcGFydHNbMV1dLnRyaW0oKSBhcyBzdHJpbmc7XHJcbiAgICBpZiAoYXJnU291cmNlLnN1YnN0cigwLCAxKSA9PT0gXCIoXCIpIHtcclxuICAgICAgYXJnU291cmNlID0gYXJnU291cmNlLnN1YnN0cigxLCBhcmdTb3VyY2UubGVuZ3RoIC0gMik7XHJcbiAgICB9XHJcbiAgICBsZXQgY29tbWFNYXRjaFN0ciA9IHNvdXJjZS5pbmRleE9mKFwiJ1wiKSA+PSAwID8gUlhfQ09NTUFfREVMSU0xIDogUlhfQ09NTUFfREVMSU0yO1xyXG4gICAgbGV0IGFyZ3MgPSBhcmdTb3VyY2UubWF0Y2goY29tbWFNYXRjaFN0cik7XHJcbiAgICBsZXQgbmV3Q29udGV4dCA9IGNvcmUuZXh0ZW5kKHt9LCBleHByQ29udGV4dCkgYXMgRXhwcmVzc2lvbkNvbnRleHQ7XHJcbiAgICAvLyBhIGRhdGFUeXBlIG9mIFVuZGVmaW5lZCBvbiBhIGNvbnRleHQgYmFzaWNhbGx5IG1lYW5zIG5vdCB0byB0cnkgcGFyc2luZ1xyXG4gICAgLy8gdGhlIHZhbHVlIGlmIHRoZSBleHByIGlzIGEgbGl0ZXJhbFxyXG4gICAgbmV3Q29udGV4dC5kYXRhVHlwZSA9IERhdGFUeXBlLlVuZGVmaW5lZDtcclxuICAgIG5ld0NvbnRleHQuaXNGbkFyZyA9IHRydWU7XHJcbiAgICBsZXQgZXhwcnMgPSBhcmdzIS5tYXAoZnVuY3Rpb24gKGEpIHtcclxuICAgICAgcmV0dXJuIHBhcnNlRXhwcihhLCB0b2tlbnMsIG5ld0NvbnRleHQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmV3IEZuRXhwcihmbk5hbWUsIGV4cHJzKTtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBUT0RPOiByZW1vdmVkIG9sZCBjb2RlIGhlcmVcclxuICAgIC8vIHJldHVybiBudWxsO1xyXG4gICAgLy8gYW5kIHJlcGxhY2VkIHdpdGggXHJcbiAgICB0aHJvdyBlO1xyXG4gIH1cclxufVxyXG5cclxuLy8gdG9GdW5jdGlvblZpc2l0b3JcclxuXHJcbmxldCB0b0Z1bmN0aW9uVmlzaXRvciA9IHtcclxuXHJcbiAgaXNFeHRlbmRlZDogZmFsc2UsXHJcblxyXG4gIHBhc3N0aHJ1UHJlZGljYXRlOiBmdW5jdGlvbiAodGhpczogUGFzc3RocnVQcmVkaWNhdGUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBleGVjdXRlIGFuIFBhc3N0aHJ1UHJlZGljYXRlIGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgbG9jYWwgY2FjaGU6IFwiICsgdGhpcy52YWx1ZSk7XHJcbiAgfSxcclxuXHJcbiAgdW5hcnlQcmVkaWNhdGU6IGZ1bmN0aW9uICh0aGlzOiBVbmFyeVByZWRpY2F0ZSwgY29udGV4dDogVmlzaXRDb250ZXh0KSB7XHJcbiAgICBsZXQgcHJlZEZuID0gdGhpcy5wcmVkLnZpc2l0KGNvbnRleHQpO1xyXG4gICAgc3dpdGNoICh0aGlzLm9wLmtleSkge1xyXG4gICAgICBjYXNlIFwibm90XCI6XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IGFueSkge1xyXG4gICAgICAgICAgcmV0dXJuICFwcmVkRm4oZW50aXR5KTtcclxuICAgICAgICB9O1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdW5hcnkgb3BlcmF0b3I6XCIgKyB0aGlzLm9wLmtleSk7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgYmluYXJ5UHJlZGljYXRlOiBmdW5jdGlvbiAodGhpczogQmluYXJ5UHJlZGljYXRlLCBjb250ZXh0OiBWaXNpdENvbnRleHQpIHtcclxuICAgIGxldCBleHByMUZuID0gdGhpcy5leHByMSEudmlzaXQoY29udGV4dCk7XHJcbiAgICBsZXQgZXhwcjJGbiA9IHRoaXMuZXhwcjIhLnZpc2l0KGNvbnRleHQpO1xyXG4gICAgbGV0IGRhdGFUeXBlID0gdGhpcy5leHByMSEuZGF0YVR5cGUgfHwgdGhpcy5leHByMiEuZGF0YVR5cGU7XHJcbiAgICBsZXQgbHFjbyA9IGNvbnRleHQuZW50aXR5VHlwZSEubWV0YWRhdGFTdG9yZS5sb2NhbFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnM7XHJcbiAgICBsZXQgcHJlZEZuID0gZ2V0QmluYXJ5UHJlZGljYXRlRm4odGhpcywgZGF0YVR5cGUgYXMgRGF0YVR5cGUsIGxxY28pO1xyXG4gICAgaWYgKHByZWRGbiA9PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmluYXJ5UHJlZGljYXRlIG9wZXJhdG9yOlwiICsgdGhpcy5vcC5rZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgICByZXR1cm4gcHJlZEZuIShleHByMUZuKGVudGl0eSksIGV4cHIyRm4oZW50aXR5KSk7XHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIGFuZE9yUHJlZGljYXRlOiBmdW5jdGlvbiAodGhpczogQW5kT3JQcmVkaWNhdGUsIGNvbnRleHQ6IFZpc2l0Q29udGV4dCkge1xyXG4gICAgbGV0IHByZWRGbnMgPSB0aGlzLnByZWRzLm1hcCgocHJlZCkgPT4ge1xyXG4gICAgICByZXR1cm4gcHJlZC52aXNpdChjb250ZXh0KTtcclxuICAgIH0pO1xyXG4gICAgc3dpdGNoICh0aGlzLm9wIS5rZXkpIHtcclxuICAgICAgY2FzZSBcImFuZFwiOlxyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5OiBhbnkpIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSBwcmVkRm5zLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2ICYmIGN1cihlbnRpdHkpO1xyXG4gICAgICAgICAgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH07XHJcbiAgICAgIGNhc2UgXCJvclwiOlxyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5OiBhbnkpIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSBwcmVkRm5zLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2IHx8IGN1cihlbnRpdHkpO1xyXG4gICAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9O1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYm9vbGVhbiBvcGVyYXRvcjpcIiArIHRoaXMub3AhLmtleSk7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgYW55QWxsUHJlZGljYXRlOiBmdW5jdGlvbiAodGhpczogQW55QWxsUHJlZGljYXRlLCBjb250ZXh0OiBWaXNpdENvbnRleHQpIHtcclxuICAgIGxldCBleHByRm4gPSB0aGlzLmV4cHIudmlzaXQoY29udGV4dCk7XHJcbiAgICBsZXQgbmV3Q29udGV4dCA9IGNvcmUuZXh0ZW5kKHt9LCBjb250ZXh0KSBhcyBWaXNpdENvbnRleHQ7XHJcbiAgICBuZXdDb250ZXh0LmVudGl0eVR5cGUgPSB0aGlzLmV4cHIuZGF0YVR5cGUgYXMgRW50aXR5VHlwZTtcclxuICAgIGxldCBwcmVkRm4gPSB0aGlzLnByZWQudmlzaXQobmV3Q29udGV4dCk7XHJcbiAgICBsZXQgYW55QWxsUHJlZEZuID0gZ2V0QW55QWxsUHJlZGljYXRlRm4odGhpcy5vcCk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTogYW55KSB7XHJcbiAgICAgIHJldHVybiBhbnlBbGxQcmVkRm4oZXhwckZuKGVudGl0eSksIHByZWRGbik7XHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIGxpdEV4cHI6IGZ1bmN0aW9uICh0aGlzOiBMaXRFeHByKSB7XHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IGFueSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIHByb3BFeHByOiBmdW5jdGlvbiAodGhpczogUHJvcEV4cHIpIHtcclxuICAgIGxldCBwcm9wZXJ0eVBhdGggPSB0aGlzLnByb3BlcnR5UGF0aDtcclxuICAgIGxldCBwcm9wZXJ0aWVzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcuJyk7XHJcbiAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBlbnRpdHkuZ2V0UHJvcGVydHkocHJvcGVydHlQYXRoKTtcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgICAgICByZXR1cm4gRW50aXR5QXNwZWN0LmdldFByb3BlcnR5UGF0aFZhbHVlKGVudGl0eSwgcHJvcGVydGllcyk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgZm5FeHByOiBmdW5jdGlvbiAodGhpczogRm5FeHByLCBjb250ZXh0OiBFeHByZXNzaW9uQ29udGV4dCkge1xyXG4gICAgbGV0IGV4cHJGbnMgPSB0aGlzLmV4cHJzLm1hcChmdW5jdGlvbiAoZXhwcikge1xyXG4gICAgICByZXR1cm4gZXhwci52aXNpdChjb250ZXh0KTtcclxuICAgIH0pO1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IGFueSkge1xyXG4gICAgICBsZXQgdmFsdWVzID0gZXhwckZucy5tYXAoZnVuY3Rpb24gKGV4cHJGbikge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGV4cHJGbihlbnRpdHkpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCByZXN1bHQgPSB0aGF0LmxvY2FsRm4uYXBwbHkobnVsbCwgdmFsdWVzKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldEFueUFsbFByZWRpY2F0ZUZuKG9wOiBPcCk6ICh2MTogYW55W10sIHYyOiBhbnkpID0+IGJvb2xlYW4ge1xyXG4gIHN3aXRjaCAob3Aua2V5KSB7XHJcbiAgICBjYXNlIFwiYW55XCI6XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodjEsIHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIHYxLnNvbWUoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgIHJldHVybiB2Mih2KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIGNhc2UgXCJhbGxcIjpcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2MSwgdjIpIHtcclxuICAgICAgICByZXR1cm4gdjEuZXZlcnkoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgIHJldHVybiB2Mih2KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3BlcmF0b3I6IFwiICsgb3Aua2V5KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEJpbmFyeVByZWRpY2F0ZUZuKGJpbmFyeVByZWRpY2F0ZTogQmluYXJ5UHJlZGljYXRlLCBkYXRhVHlwZTogRGF0YVR5cGUsIGxxY286IExvY2FsUXVlcnlDb21wYXJpc29uT3B0aW9ucykge1xyXG4gIGxldCBvcCA9IGJpbmFyeVByZWRpY2F0ZS5vcDtcclxuICBsZXQgbWMgPSBEYXRhVHlwZS5nZXRDb21wYXJhYmxlRm4oZGF0YVR5cGUpO1xyXG4gIGxldCBwcmVkRm46ICh2MTogYW55LCB2MjogYW55KSA9PiBib29sZWFuO1xyXG4gIHN3aXRjaCAob3Aua2V5KSB7XHJcbiAgICBjYXNlICdlcSc6XHJcbiAgICAgIHByZWRGbiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcclxuICAgICAgICBpZiAodjEgJiYgdHlwZW9mIHYxID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcmV0dXJuIHN0cmluZ0VxdWFscyh2MSwgdjIsIGxxY28pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gbWModjEpID09PSBtYyh2Mik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ25lJzpcclxuICAgICAgcHJlZEZuID0gZnVuY3Rpb24gKHYxLCB2Mikge1xyXG4gICAgICAgIGlmICh2MSAmJiB0eXBlb2YgdjEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICByZXR1cm4gIXN0cmluZ0VxdWFscyh2MSwgdjIsIGxxY28pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gbWModjEpICE9PSBtYyh2Mik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2d0JzpcclxuICAgICAgcHJlZEZuID0gZnVuY3Rpb24gKHYxLCB2Mikge1xyXG4gICAgICAgIHJldHVybiBtYyh2MSkgPiBtYyh2Mik7XHJcbiAgICAgIH07XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnZ2UnOlxyXG4gICAgICBwcmVkRm4gPSBmdW5jdGlvbiAodjEsIHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIG1jKHYxKSA+PSBtYyh2Mik7XHJcbiAgICAgIH07XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnbHQnOlxyXG4gICAgICBwcmVkRm4gPSBmdW5jdGlvbiAodjEsIHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIG1jKHYxKSA8IG1jKHYyKTtcclxuICAgICAgfTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdsZSc6XHJcbiAgICAgIHByZWRGbiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcclxuICAgICAgICByZXR1cm4gbWModjEpIDw9IG1jKHYyKTtcclxuICAgICAgfTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdzdGFydHN3aXRoJzpcclxuICAgICAgcHJlZEZuID0gZnVuY3Rpb24gKHYxLCB2Mikge1xyXG4gICAgICAgIHJldHVybiBzdHJpbmdTdGFydHNXaXRoKHYxLCB2MiwgbHFjbyk7XHJcbiAgICAgIH07XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnZW5kc3dpdGgnOlxyXG4gICAgICBwcmVkRm4gPSBmdW5jdGlvbiAodjEsIHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZ0VuZHNXaXRoKHYxLCB2MiwgbHFjbyk7XHJcbiAgICAgIH07XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnY29udGFpbnMnOlxyXG4gICAgICBwcmVkRm4gPSBmdW5jdGlvbiAodjEsIHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZ0NvbnRhaW5zKHYxLCB2MiwgbHFjbyk7XHJcbiAgICAgIH07XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnaW4nOlxyXG4gICAgICBwcmVkRm4gPSBmdW5jdGlvbiAodjE6IGFueSwgdjI6IGFueVtdKSB7XHJcbiAgICAgICAgdjEgPSBtYyh2MSk7XHJcbiAgICAgICAgdjIgPSB2Mi5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1jKHYpOyB9KTtcclxuICAgICAgICByZXR1cm4gdjIuaW5kZXhPZih2MSkgPj0gMDtcclxuICAgICAgfTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgcmV0dXJuIHByZWRGbjtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RyaW5nRXF1YWxzKGE6IGFueSwgYjogYW55LCBscWNvOiBMb2NhbFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpIHtcclxuICBpZiAoYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgaWYgKHR5cGVvZiBiICE9PSAnc3RyaW5nJykge1xyXG4gICAgYiA9IGIudG9TdHJpbmcoKTtcclxuICB9XHJcbiAgaWYgKGxxY28udXNlc1NxbDkyQ29tcGxpYW50U3RyaW5nQ29tcGFyaXNvbikge1xyXG4gICAgYSA9IChhIHx8IFwiXCIpLnRyaW0oKTtcclxuICAgIGIgPSAoYiB8fCBcIlwiKS50cmltKCk7XHJcbiAgfVxyXG4gIGlmICghbHFjby5pc0Nhc2VTZW5zaXRpdmUpIHtcclxuICAgIGEgPSAoYSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgYiA9IChiIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG4gIHJldHVybiBhID09PSBiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJpbmdTdGFydHNXaXRoKGE6IGFueSwgYjogYW55LCBscWNvOiBMb2NhbFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpIHtcclxuICBpZiAoIWxxY28uaXNDYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICBhID0gKGEgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcclxuICAgIGIgPSAoYiB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuICByZXR1cm4gY29yZS5zdHJpbmdTdGFydHNXaXRoKGEsIGIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJpbmdFbmRzV2l0aChhOiBhbnksIGI6IGFueSwgbHFjbzogTG9jYWxRdWVyeUNvbXBhcmlzb25PcHRpb25zKSB7XHJcbiAgaWYgKCFscWNvLmlzQ2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgYSA9IChhIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBiID0gKGIgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcbiAgcmV0dXJuIGNvcmUuc3RyaW5nRW5kc1dpdGgoYSwgYik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0cmluZ0NvbnRhaW5zKGE6IGFueSwgYjogYW55LCBscWNvOiBMb2NhbFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpIHtcclxuICBpZiAoIWxxY28uaXNDYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICBhID0gKGEgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcclxuICAgIGIgPSAoYiB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuICByZXR1cm4gYS5pbmRleE9mKGIpID49IDA7XHJcbn1cclxuXHJcbi8vIHRvSlNPTlZpc2l0b3JcclxuXHJcbmxldCB0b0pTT05WaXNpdG9yID0ge1xyXG5cclxuICBwYXNzdGhydVByZWRpY2F0ZTogZnVuY3Rpb24gKHRoaXM6IFBhc3N0aHJ1UHJlZGljYXRlKSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICB9LFxyXG5cclxuICB1bmFyeVByZWRpY2F0ZTogZnVuY3Rpb24gKHRoaXM6IFVuYXJ5UHJlZGljYXRlLCBjb250ZXh0OiBWaXNpdENvbnRleHQpIHtcclxuICAgIGxldCBwcmVkVmFsID0gdGhpcy5wcmVkLnZpc2l0KGNvbnRleHQpO1xyXG4gICAgbGV0IGpzb24gPSB7fTtcclxuICAgIGpzb25bdGhpcy5vcC5rZXldID0gcHJlZFZhbDtcclxuICAgIHJldHVybiBqc29uO1xyXG4gIH0sXHJcblxyXG4gIGJpbmFyeVByZWRpY2F0ZTogZnVuY3Rpb24gKHRoaXM6IEJpbmFyeVByZWRpY2F0ZSwgY29udGV4dDogVmlzaXRDb250ZXh0KSB7XHJcbiAgICBsZXQgZXhwcjFWYWwgPSB0aGlzLmV4cHIxIS52aXNpdChjb250ZXh0KTtcclxuICAgIGxldCBleHByMlZhbCA9IHRoaXMuZXhwcjIhLnZpc2l0KGNvbnRleHQpO1xyXG4gICAgbGV0IGpzb24gPSB7fTtcclxuICAgIGlmICh0aGlzLmV4cHIyIGluc3RhbmNlb2YgUHJvcEV4cHIpIHtcclxuICAgICAgZXhwcjJWYWwgPSB7IHZhbHVlOiBleHByMlZhbCwgaXNQcm9wZXJ0eTogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3Aua2V5ID09PSBcImVxXCIpIHtcclxuICAgICAganNvbltleHByMVZhbF0gPSBleHByMlZhbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHt9O1xyXG4gICAgICBqc29uW2V4cHIxVmFsXSA9IHZhbHVlO1xyXG4gICAgICB2YWx1ZVt0aGlzLm9wLmtleV0gPSBleHByMlZhbDtcclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG4gIH0sXHJcblxyXG4gIGFuZE9yUHJlZGljYXRlOiBmdW5jdGlvbiAodGhpczogQW5kT3JQcmVkaWNhdGUsIGNvbnRleHQ6IFZpc2l0Q29udGV4dCkge1xyXG4gICAgbGV0IHByZWRWYWxzID0gdGhpcy5wcmVkcy5tYXAoZnVuY3Rpb24gKHByZWQpIHtcclxuICAgICAgcmV0dXJuIHByZWQudmlzaXQoY29udGV4dCk7XHJcbiAgICB9KTtcclxuICAgIGlmICghcHJlZFZhbHMgfHwgIXByZWRWYWxzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBsZXQganNvbjogT2JqZWN0IHwgdW5kZWZpbmVkO1xyXG4gICAgLy8gbm9ybWFsaXplQW5kIGNsYXVzZXMgaWYgcG9zc2libGUuXHJcbiAgICAvLyBwYXNzdGhydSBwcmVkaWNhdGUgd2lsbCBhcHBlYXIgYXMgc3RyaW5nIGFuZCB0aGVpciAnYW5kcycgY2FuJ3QgYmUgJ25vcm1hbGl6ZWQnXHJcbiAgICBpZiAodGhpcy5vcCEua2V5ID09PSAnYW5kJyAmJiBwcmVkVmFscy5sZW5ndGggPT09IDIgJiYgIXByZWRWYWxzLnNvbWUoKHYpID0+IHYub3IgfHwgdHlwZW9mKHYpID09PSAnc3RyaW5nJykpIHtcclxuICAgICAgLy8gbm9ybWFsaXplICdhbmQnIGNsYXVzZXMgLSB3aWxsIHJldHVybiBudWxsIGlmIGNhbid0IGJlIGNvbWJpbmVkLlxyXG4gICAgICBqc29uID0gcHJlZFZhbHMucmVkdWNlKGNvbWJpbmUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGpzb24gPT0gbnVsbCkge1xyXG4gICAgICBqc29uID0ge307XHJcbiAgICAgIGpzb25bdGhpcy5vcCEua2V5IV0gPSBwcmVkVmFscztcclxuICAgIH1cclxuICAgIHJldHVybiBqc29uO1xyXG4gIH0sXHJcblxyXG4gIGFueUFsbFByZWRpY2F0ZTogZnVuY3Rpb24gKHRoaXM6IEFueUFsbFByZWRpY2F0ZSwgY29udGV4dDogVmlzaXRDb250ZXh0KSB7XHJcbiAgICBsZXQgZXhwclZhbCA9IHRoaXMuZXhwci52aXNpdChjb250ZXh0KTtcclxuICAgIGxldCBuZXdDb250ZXh0ID0gY29yZS5leHRlbmQoe30sIGNvbnRleHQpIGFzIFZpc2l0Q29udGV4dDtcclxuICAgIG5ld0NvbnRleHQuZW50aXR5VHlwZSA9IHRoaXMuZXhwci5kYXRhVHlwZSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgbGV0IHByZWRWYWwgPSB0aGlzLnByZWQudmlzaXQobmV3Q29udGV4dCk7XHJcbiAgICBsZXQganNvbiA9IHt9O1xyXG4gICAgbGV0IHZhbHVlID0ge307XHJcbiAgICB2YWx1ZVt0aGlzLm9wLmtleV0gPSBwcmVkVmFsO1xyXG4gICAganNvbltleHByVmFsXSA9IHZhbHVlO1xyXG4gICAgcmV0dXJuIGpzb247XHJcbiAgfSxcclxuXHJcbiAgbGl0RXhwcjogZnVuY3Rpb24gKHRoaXM6IExpdEV4cHIsIGNvbnRleHQ6IFZpc2l0Q29udGV4dCkge1xyXG4gICAgaWYgKHRoaXMuaGFzRXhwbGljaXREYXRhVHlwZSB8fCBjb250ZXh0LnVzZUV4cGxpY2l0RGF0YVR5cGUpIHtcclxuICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMudmFsdWUsIGRhdGFUeXBlOiB0aGlzLmRhdGFUeXBlLm5hbWUgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIHByb3BFeHByOiBmdW5jdGlvbiAodGhpczogUHJvcEV4cHIsIGNvbnRleHQ6IFZpc2l0Q29udGV4dCkge1xyXG4gICAgaWYgKGNvbnRleHQudG9OYW1lT25TZXJ2ZXIpIHtcclxuICAgICAgaWYgKCFjb250ZXh0LmVudGl0eVR5cGUpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYE5vIEVudGl0eVR5cGUgZm9yIHByb3BlcnR5UGF0aCBcIiR7dGhpcy5wcm9wZXJ0eVBhdGh9XCIuICAke2NvcmUuc3RyaW5ncy5UT19UWVBFfWApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5UGF0aDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29udGV4dC5lbnRpdHlUeXBlIS5jbGllbnRQcm9wZXJ0eVBhdGhUb1NlcnZlcih0aGlzLnByb3BlcnR5UGF0aCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVBhdGg7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgZm5FeHByOiBmdW5jdGlvbiAodGhpczogRm5FeHByLCBjb250ZXh0OiBWaXNpdENvbnRleHQpIHtcclxuICAgIGxldCBleHByVmFscyA9IHRoaXMuZXhwcnMubWFwKGZ1bmN0aW9uIChleHByKSB7XHJcbiAgICAgIHJldHVybiBleHByLnZpc2l0KGNvbnRleHQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5mbk5hbWUgKyBcIihcIiArIGV4cHJWYWxzLmpvaW4oXCIsXCIpICsgXCIpXCI7XHJcbiAgfVxyXG5cclxufTtcclxuXHJcbmZ1bmN0aW9uIGNvbWJpbmUoajE6IE9iamVjdCwgajI6IE9iamVjdCkge1xyXG4gIGxldCBvayA9IE9iamVjdC5rZXlzKGoyKS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICBpZiAoajEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICBpZiAodHlwZW9mIChqMltrZXldKSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAvLyBleGl0IGFuZCBpbmRpY2F0ZSB0aGF0IHdlIGNhbid0IGNvbWJpbmVcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbWJpbmUoajFba2V5XSwgajJba2V5XSkgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKGoxKSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gY2Fubm90IGFzc2lnbiB0byBqMVtrZXldXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGoxW2tleV0gPSBqMltrZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG9rID8gajEgOiBudWxsO1xyXG59XHJcblxyXG5cclxuXHJcblxyXG4iXX0=