breeze-client 2.1.5-mjs → 2.1.5
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.
- package/adapter-ajax-angularjs/{index.d.ts → breeze-client-adapter-ajax-angularjs.d.ts} +0 -1
- package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +1 -0
- package/adapter-ajax-angularjs/package.json +13 -0
- package/adapter-ajax-fetch/{index.d.ts → breeze-client-adapter-ajax-fetch.d.ts} +0 -1
- package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +1 -0
- package/adapter-ajax-fetch/package.json +13 -0
- package/adapter-ajax-httpclient/{index.d.ts → breeze-client-adapter-ajax-httpclient.d.ts} +0 -1
- package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +1 -0
- package/adapter-ajax-httpclient/package.json +13 -0
- package/adapter-ajax-jquery/{index.d.ts → breeze-client-adapter-ajax-jquery.d.ts} +0 -1
- package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +1 -0
- package/adapter-ajax-jquery/package.json +13 -0
- package/adapter-ajax-post/{index.d.ts → breeze-client-adapter-ajax-post.d.ts} +0 -1
- package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +1 -0
- package/adapter-ajax-post/package.json +13 -0
- package/adapter-data-service-odata/{index.d.ts → breeze-client-adapter-data-service-odata.d.ts} +0 -1
- package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +1 -0
- package/adapter-data-service-odata/package.json +13 -0
- package/adapter-data-service-webapi/{index.d.ts → breeze-client-adapter-data-service-webapi.d.ts} +0 -1
- package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +1 -0
- package/adapter-data-service-webapi/package.json +13 -0
- package/adapter-model-library-backing-store/{index.d.ts → breeze-client-adapter-model-library-backing-store.d.ts} +0 -1
- package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +1 -0
- package/adapter-model-library-backing-store/package.json +13 -0
- package/adapter-model-library-ko/{index.d.ts → breeze-client-adapter-model-library-ko.d.ts} +0 -1
- package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +1 -0
- package/adapter-model-library-ko/package.json +13 -0
- package/adapter-uri-builder-json/{index.d.ts → breeze-client-adapter-uri-builder-json.d.ts} +0 -1
- package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +1 -0
- package/adapter-uri-builder-json/package.json +13 -0
- package/adapter-uri-builder-odata/{index.d.ts → breeze-client-adapter-uri-builder-odata.d.ts} +0 -1
- package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +1 -0
- package/adapter-uri-builder-odata/package.json +13 -0
- package/breeze-client.d.ts +8 -0
- package/breeze-client.metadata.json +1 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +190 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js +190 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +195 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js +115 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.js +92 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +743 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +16 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +326 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +16 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +280 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.js +252 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js +96 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +262 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +1 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js +258 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +1 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +2 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +1 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.js +579 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +1 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +16 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +1 -0
- package/bundles/breeze-client.umd.js +14098 -0
- package/bundles/breeze-client.umd.js.map +1 -0
- package/bundles/breeze-client.umd.min.js +16 -0
- package/bundles/breeze-client.umd.min.js.map +1 -0
- package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +130 -0
- package/esm2015/adapter-ajax-angularjs/adapter-core.js +49 -0
- package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
- package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +130 -0
- package/esm2015/adapter-ajax-fetch/adapter-core.js +49 -0
- package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
- package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +137 -0
- package/esm2015/adapter-ajax-httpclient/adapter-core.js +49 -0
- package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
- package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +103 -0
- package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
- package/esm2015/adapter-ajax-post/adapter-ajax-post.js +77 -0
- package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
- package/esm2015/adapter-data-service-odata/adapter-core.js +49 -0
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +459 -0
- package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +93 -0
- package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
- package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +268 -0
- package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
- package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +240 -0
- package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
- package/esm2015/adapter-uri-builder-json/adapter-core.js +49 -0
- package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +36 -0
- package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
- package/esm2015/adapter-uri-builder-odata/adapter-core.js +49 -0
- package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +192 -0
- package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
- package/esm2015/breeze-client.js +9 -0
- package/esm2015/index.js +2 -0
- package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
- package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
- package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +400 -0
- package/esm2015/src/abstract-data-service-adapter.js +296 -0
- package/esm2015/src/array.js +4 -0
- package/esm2015/src/assert-param.js +312 -0
- package/esm2015/src/breeze.js +85 -0
- package/esm2015/src/complex-array.js +119 -0
- package/esm2015/src/config.js +223 -0
- package/esm2015/src/core.js +709 -0
- package/esm2015/src/csdl-metadata-parser.js +385 -0
- package/esm2015/src/data-service.js +203 -0
- package/esm2015/src/data-type.js +444 -0
- package/esm2015/src/default-property-interceptor.js +460 -0
- package/esm2015/src/entity-action.js +45 -0
- package/esm2015/src/entity-aspect.js +806 -0
- package/esm2015/src/entity-group.js +187 -0
- package/esm2015/src/entity-key.js +116 -0
- package/esm2015/src/entity-manager.js +2094 -0
- package/esm2015/src/entity-metadata.js +2109 -0
- package/esm2015/src/entity-query.js +996 -0
- package/esm2015/src/entity-state.js +99 -0
- package/esm2015/src/enum.js +141 -0
- package/esm2015/src/event.js +256 -0
- package/esm2015/src/interface-registry.js +41 -0
- package/esm2015/src/key-generator.js +108 -0
- package/esm2015/src/local-query-comparison-options.js +65 -0
- package/esm2015/src/mapping-context.js +405 -0
- package/esm2015/src/naming-convention.js +88 -0
- package/esm2015/src/observable-array.js +185 -0
- package/esm2015/src/predicate.js +1235 -0
- package/esm2015/src/primitive-array.js +87 -0
- package/esm2015/src/query-options.js +152 -0
- package/esm2015/src/relation-array.js +175 -0
- package/esm2015/src/save-options.js +41 -0
- package/esm2015/src/unattached-children-map.js +58 -0
- package/esm2015/src/validate.js +991 -0
- package/esm2015/src/validation-options.js +64 -0
- package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +132 -0
- package/esm5/adapter-ajax-angularjs/adapter-core.js +49 -0
- package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
- package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +132 -0
- package/esm5/adapter-ajax-fetch/adapter-core.js +49 -0
- package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
- package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +139 -0
- package/esm5/adapter-ajax-httpclient/adapter-core.js +49 -0
- package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
- package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +105 -0
- package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
- package/esm5/adapter-ajax-post/adapter-ajax-post.js +81 -0
- package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
- package/esm5/adapter-data-service-odata/adapter-core.js +49 -0
- package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +466 -0
- package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +98 -0
- package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
- package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +270 -0
- package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
- package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +242 -0
- package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
- package/esm5/adapter-uri-builder-json/adapter-core.js +49 -0
- package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +38 -0
- package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
- package/esm5/adapter-uri-builder-odata/adapter-core.js +49 -0
- package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +197 -0
- package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
- package/esm5/breeze-client.js +9 -0
- package/esm5/index.js +2 -0
- package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
- package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
- package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +412 -0
- package/esm5/src/abstract-data-service-adapter.js +302 -0
- package/esm5/src/array.js +4 -0
- package/esm5/src/assert-param.js +317 -0
- package/esm5/src/breeze.js +85 -0
- package/esm5/src/complex-array.js +119 -0
- package/esm5/src/config.js +228 -0
- package/esm5/src/core.js +717 -0
- package/esm5/src/csdl-metadata-parser.js +385 -0
- package/esm5/src/data-service.js +207 -0
- package/esm5/src/data-type.js +451 -0
- package/esm5/src/default-property-interceptor.js +460 -0
- package/esm5/src/entity-action.js +52 -0
- package/esm5/src/entity-aspect.js +812 -0
- package/esm5/src/entity-group.js +189 -0
- package/esm5/src/entity-key.js +118 -0
- package/esm5/src/entity-manager.js +2112 -0
- package/esm5/src/entity-metadata.js +2144 -0
- package/esm5/src/entity-query.js +1023 -0
- package/esm5/src/entity-state.js +106 -0
- package/esm5/src/enum.js +144 -0
- package/esm5/src/event.js +259 -0
- package/esm5/src/interface-registry.js +43 -0
- package/esm5/src/key-generator.js +111 -0
- package/esm5/src/local-query-comparison-options.js +67 -0
- package/esm5/src/mapping-context.js +407 -0
- package/esm5/src/naming-convention.js +90 -0
- package/esm5/src/observable-array.js +201 -0
- package/esm5/src/predicate.js +1300 -0
- package/esm5/src/primitive-array.js +87 -0
- package/esm5/src/query-options.js +167 -0
- package/esm5/src/relation-array.js +175 -0
- package/esm5/src/save-options.js +43 -0
- package/esm5/src/unattached-children-map.js +60 -0
- package/esm5/src/validate.js +996 -0
- package/esm5/src/validation-options.js +66 -0
- package/fesm2015/{breeze-client-adapter-ajax-angularjs.mjs → breeze-client-adapter-ajax-angularjs.js} +1 -2
- package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-fetch.mjs → breeze-client-adapter-ajax-fetch.js} +3 -6
- package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-httpclient.mjs → breeze-client-adapter-ajax-httpclient.js} +1 -2
- package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +1 -0
- package/fesm2015/{breeze-client-adapter-ajax-jquery.mjs → breeze-client-adapter-ajax-jquery.js} +2 -3
- package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-ajax-post.mjs → fesm2015/breeze-client-adapter-ajax-post.js} +1 -2
- package/fesm2015/breeze-client-adapter-ajax-post.js.map +1 -0
- package/fesm2015/{breeze-client-adapter-data-service-odata.mjs → breeze-client-adapter-data-service-odata.js} +22 -21
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -0
- package/fesm2015/{breeze-client-adapter-data-service-webapi.mjs → breeze-client-adapter-data-service-webapi.js} +13 -14
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-model-library-backing-store.mjs → fesm2015/breeze-client-adapter-model-library-backing-store.js} +13 -14
- package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-model-library-ko.mjs → fesm2015/breeze-client-adapter-model-library-ko.js} +13 -14
- package/fesm2015/breeze-client-adapter-model-library-ko.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-uri-builder-json.mjs → fesm2015/breeze-client-adapter-uri-builder-json.js} +8 -9
- package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-uri-builder-odata.mjs → fesm2015/breeze-client-adapter-uri-builder-odata.js} +86 -86
- package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +1 -0
- package/fesm2015/{breeze-client-mixin-get-entity-graph.mjs → breeze-client-mixin-get-entity-graph.js} +1 -2
- package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +1 -0
- package/fesm2015/{breeze-client-mixin-save-queuing.mjs → breeze-client-mixin-save-queuing.js} +1 -2
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +1 -0
- package/fesm2015/{breeze-client.mjs → breeze-client.js} +417 -408
- package/fesm2015/breeze-client.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-ajax-angularjs.mjs → fesm5/breeze-client-adapter-ajax-angularjs.js} +42 -42
- package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-ajax-fetch.mjs → fesm5/breeze-client-adapter-ajax-fetch.js} +43 -45
- package/fesm5/breeze-client-adapter-ajax-fetch.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-ajax-httpclient.mjs → fesm5/breeze-client-adapter-ajax-httpclient.js} +44 -44
- package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-ajax-jquery.mjs → fesm5/breeze-client-adapter-ajax-jquery.js} +19 -19
- package/fesm5/breeze-client-adapter-ajax-jquery.js.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-post.mjs → fesm5/breeze-client-adapter-ajax-post.js} +11 -9
- package/fesm5/breeze-client-adapter-ajax-post.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-data-service-odata.mjs → fesm5/breeze-client-adapter-data-service-odata.js} +134 -127
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -0
- package/{fesm2020/breeze-client-adapter-data-service-webapi.mjs → fesm5/breeze-client-adapter-data-service-webapi.js} +42 -39
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -0
- package/{fesm2015/breeze-client-adapter-model-library-backing-store.mjs → fesm5/breeze-client-adapter-model-library-backing-store.js} +64 -64
- package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +1 -0
- package/{fesm2015/breeze-client-adapter-model-library-ko.mjs → fesm5/breeze-client-adapter-model-library-ko.js} +58 -58
- package/fesm5/breeze-client-adapter-model-library-ko.js.map +1 -0
- package/fesm5/breeze-client-adapter-uri-builder-json.js +92 -0
- package/fesm5/breeze-client-adapter-uri-builder-json.js.map +1 -0
- package/fesm5/breeze-client-adapter-uri-builder-odata.js +250 -0
- package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +1 -0
- package/{fesm2020/breeze-client-mixin-get-entity-graph.mjs → fesm5/breeze-client-mixin-get-entity-graph.js} +45 -46
- package/fesm5/breeze-client-mixin-get-entity-graph.js.map +1 -0
- package/{fesm2020/breeze-client-mixin-save-queuing.mjs → fesm5/breeze-client-mixin-save-queuing.js} +126 -117
- package/fesm5/breeze-client-mixin-save-queuing.js.map +1 -0
- package/{fesm2020/breeze-client.mjs → fesm5/breeze-client.js} +3629 -3413
- package/fesm5/breeze-client.js.map +1 -0
- package/mixin-get-entity-graph/{index.d.ts → breeze-client-mixin-get-entity-graph.d.ts} +0 -1
- package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +1 -0
- package/mixin-get-entity-graph/package.json +13 -0
- package/mixin-save-queuing/{index.d.ts → breeze-client-mixin-save-queuing.d.ts} +0 -1
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +1 -0
- package/mixin-save-queuing/package.json +13 -0
- package/package.json +11 -125
- package/src/entity-metadata.d.ts +4 -6
- package/src/entity-query.d.ts +1 -1
- package/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -130
- package/esm2020/adapter-ajax-angularjs/adapter-core.mjs +0 -49
- package/esm2020/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
- package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -132
- package/esm2020/adapter-ajax-fetch/adapter-core.mjs +0 -49
- package/esm2020/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
- package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -137
- package/esm2020/adapter-ajax-httpclient/adapter-core.mjs +0 -49
- package/esm2020/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
- package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -103
- package/esm2020/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
- package/esm2020/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
- package/esm2020/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
- package/esm2020/adapter-data-service-odata/adapter-core.mjs +0 -49
- package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -456
- package/esm2020/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
- package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -93
- package/esm2020/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
- package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -268
- package/esm2020/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
- package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -240
- package/esm2020/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
- package/esm2020/adapter-uri-builder-json/adapter-core.mjs +0 -49
- package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -36
- package/esm2020/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
- package/esm2020/adapter-uri-builder-odata/adapter-core.mjs +0 -49
- package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -190
- package/esm2020/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
- package/esm2020/breeze-client.mjs +0 -5
- package/esm2020/index.mjs +0 -2
- package/esm2020/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
- package/esm2020/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
- package/esm2020/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
- package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +0 -400
- package/esm2020/src/abstract-data-service-adapter.mjs +0 -296
- package/esm2020/src/array.mjs +0 -4
- package/esm2020/src/assert-param.mjs +0 -312
- package/esm2020/src/breeze.mjs +0 -85
- package/esm2020/src/complex-array.mjs +0 -117
- package/esm2020/src/config.mjs +0 -223
- package/esm2020/src/core.mjs +0 -707
- package/esm2020/src/csdl-metadata-parser.mjs +0 -385
- package/esm2020/src/data-service.mjs +0 -203
- package/esm2020/src/data-type.mjs +0 -444
- package/esm2020/src/default-property-interceptor.mjs +0 -460
- package/esm2020/src/entity-action.mjs +0 -45
- package/esm2020/src/entity-aspect.mjs +0 -806
- package/esm2020/src/entity-group.mjs +0 -187
- package/esm2020/src/entity-key.mjs +0 -116
- package/esm2020/src/entity-manager.mjs +0 -2094
- package/esm2020/src/entity-metadata.mjs +0 -2109
- package/esm2020/src/entity-query.mjs +0 -996
- package/esm2020/src/entity-state.mjs +0 -99
- package/esm2020/src/enum.mjs +0 -141
- package/esm2020/src/event.mjs +0 -256
- package/esm2020/src/interface-registry.mjs +0 -41
- package/esm2020/src/key-generator.mjs +0 -108
- package/esm2020/src/local-query-comparison-options.mjs +0 -65
- package/esm2020/src/mapping-context.mjs +0 -405
- package/esm2020/src/naming-convention.mjs +0 -88
- package/esm2020/src/observable-array.mjs +0 -183
- package/esm2020/src/predicate.mjs +0 -1232
- package/esm2020/src/primitive-array.mjs +0 -85
- package/esm2020/src/query-options.mjs +0 -152
- package/esm2020/src/relation-array.mjs +0 -173
- package/esm2020/src/save-options.mjs +0 -41
- package/esm2020/src/unattached-children-map.mjs +0 -58
- package/esm2020/src/validate.mjs +0 -988
- package/esm2020/src/validation-options.mjs +0 -64
- package/fesm2015/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-json.mjs +0 -92
- package/fesm2015/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs +0 -246
- package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2015/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2015/breeze-client.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2020/breeze-client.mjs.map +0 -1
- package/mjs/README.md +0 -17
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
import { core } from './core';
|
|
2
|
-
import { MetadataStore, EntityType, ComplexType, DataProperty, NavigationProperty, AutoGeneratedKeyType } from './entity-metadata';
|
|
3
|
-
import { DataType } from './data-type';
|
|
4
|
-
import { Validator } from './validate';
|
|
5
|
-
const RX_COLLECTION = /Collection\((.*)\)/;
|
|
6
|
-
function parse(metadataStore, schemas, altMetadata) {
|
|
7
|
-
metadataStore._entityTypeResourceMap = {};
|
|
8
|
-
schemas = core.toArray(schemas);
|
|
9
|
-
schemas.forEach(function (schema) {
|
|
10
|
-
if (schema.cSpaceOSpaceMapping) {
|
|
11
|
-
// Web api only - not avail in OData.
|
|
12
|
-
// TODO throw informative error if already parsed and converted to map on a previous pass
|
|
13
|
-
let mappings = JSON.parse(schema.cSpaceOSpaceMapping);
|
|
14
|
-
let newMap = {};
|
|
15
|
-
mappings.forEach(function (mapping) {
|
|
16
|
-
newMap[mapping[0]] = mapping[1];
|
|
17
|
-
});
|
|
18
|
-
schema.cSpaceOSpaceMapping = newMap;
|
|
19
|
-
}
|
|
20
|
-
if (schema.entityContainer) {
|
|
21
|
-
core.toArray(schema.entityContainer).forEach(function (container) {
|
|
22
|
-
core.toArray(container.entitySet).forEach(function (entitySet) {
|
|
23
|
-
let entityTypeName = parseTypeNameWithSchema(entitySet.entityType, schema).typeName;
|
|
24
|
-
metadataStore.setEntityTypeForResourceName(entitySet.name, entityTypeName);
|
|
25
|
-
metadataStore._entityTypeResourceMap[entityTypeName] = entitySet.name;
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
// process complextypes before entity types.
|
|
30
|
-
if (schema.complexType) {
|
|
31
|
-
core.toArray(schema.complexType).forEach(function (ct) {
|
|
32
|
-
parseCsdlComplexType(ct, schema, metadataStore);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
if (schema.entityType) {
|
|
36
|
-
core.toArray(schema.entityType).forEach(function (et) {
|
|
37
|
-
parseCsdlEntityType(et, schema, schemas, metadataStore);
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
let badNavProps = metadataStore.getIncompleteNavigationProperties();
|
|
42
|
-
if (badNavProps.length > 0) {
|
|
43
|
-
let msg = badNavProps.map(function (npa) {
|
|
44
|
-
if (Array.isArray(npa)) {
|
|
45
|
-
return npa.map(function (np) {
|
|
46
|
-
return np.parentType.name + ":" + np.name;
|
|
47
|
-
}).join(', ');
|
|
48
|
-
}
|
|
49
|
-
return npa.parentType.name + ":" + npa.name;
|
|
50
|
-
}).join(', ');
|
|
51
|
-
throw new Error("Incomplete navigation properties: " + msg);
|
|
52
|
-
}
|
|
53
|
-
if (altMetadata) {
|
|
54
|
-
metadataStore.importMetadata(altMetadata, true);
|
|
55
|
-
}
|
|
56
|
-
return metadataStore;
|
|
57
|
-
}
|
|
58
|
-
function parseCsdlEntityType(csdlEntityType, schema, schemas, metadataStore) {
|
|
59
|
-
let shortName = csdlEntityType.name;
|
|
60
|
-
let ns = getNamespaceFor(shortName, schema);
|
|
61
|
-
let entityType = new EntityType({
|
|
62
|
-
shortName: shortName,
|
|
63
|
-
namespace: ns,
|
|
64
|
-
isAbstract: csdlEntityType.abstract && csdlEntityType.abstract === 'true'
|
|
65
|
-
});
|
|
66
|
-
if (csdlEntityType.baseType) {
|
|
67
|
-
let baseTypeName = parseTypeNameWithSchema(csdlEntityType.baseType, schema).typeName;
|
|
68
|
-
entityType.baseTypeName = baseTypeName;
|
|
69
|
-
let baseEntityType = metadataStore._getStructuralType(baseTypeName, true);
|
|
70
|
-
if (baseEntityType) {
|
|
71
|
-
completeParseCsdlEntityType(entityType, csdlEntityType, schema, schemas, metadataStore);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
let deferrals = metadataStore._deferredTypes[baseTypeName];
|
|
75
|
-
if (!deferrals) {
|
|
76
|
-
deferrals = [];
|
|
77
|
-
metadataStore._deferredTypes[baseTypeName] = deferrals;
|
|
78
|
-
}
|
|
79
|
-
deferrals.push({ entityType: entityType, csdlEntityType: csdlEntityType });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
completeParseCsdlEntityType(entityType, csdlEntityType, schema, schemas, metadataStore);
|
|
84
|
-
}
|
|
85
|
-
// entityType may or may not have been added to the metadataStore at this point.
|
|
86
|
-
return entityType;
|
|
87
|
-
}
|
|
88
|
-
function completeParseCsdlEntityType(entityType, csdlEntityType, schema, schemas, metadataStore) {
|
|
89
|
-
let keyNamesOnServer = csdlEntityType.key ? core.toArray(csdlEntityType.key.propertyRef).map(core.pluck("name")) : [];
|
|
90
|
-
core.toArray(csdlEntityType.property).forEach(function (prop) {
|
|
91
|
-
parseCsdlDataProperty(entityType, prop, schema, keyNamesOnServer);
|
|
92
|
-
});
|
|
93
|
-
core.toArray(csdlEntityType.navigationProperty).forEach(function (prop) {
|
|
94
|
-
parseCsdlNavProperty(entityType, prop, schema, schemas);
|
|
95
|
-
});
|
|
96
|
-
metadataStore.addEntityType(entityType);
|
|
97
|
-
entityType.defaultResourceName = metadataStore._entityTypeResourceMap[entityType.name];
|
|
98
|
-
let deferredTypes = metadataStore._deferredTypes;
|
|
99
|
-
let deferrals = deferredTypes[entityType.name];
|
|
100
|
-
if (deferrals) {
|
|
101
|
-
deferrals.forEach(function (d) {
|
|
102
|
-
completeParseCsdlEntityType(d.entityType, d.csdlEntityType, schema, schemas, metadataStore);
|
|
103
|
-
});
|
|
104
|
-
delete deferredTypes[entityType.name];
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function parseCsdlComplexType(csdlComplexType, schema, metadataStore) {
|
|
108
|
-
let shortName = csdlComplexType.name;
|
|
109
|
-
let ns = getNamespaceFor(shortName, schema);
|
|
110
|
-
let complexType = new ComplexType({
|
|
111
|
-
shortName: shortName,
|
|
112
|
-
namespace: ns
|
|
113
|
-
});
|
|
114
|
-
core.toArray(csdlComplexType.property).forEach(function (prop) {
|
|
115
|
-
parseCsdlDataProperty(complexType, prop, schema);
|
|
116
|
-
});
|
|
117
|
-
metadataStore.addEntityType(complexType);
|
|
118
|
-
return complexType;
|
|
119
|
-
}
|
|
120
|
-
function parseCsdlDataProperty(parentType, csdlProperty, schema, keyNamesOnServer) {
|
|
121
|
-
let dp;
|
|
122
|
-
let typeParts = csdlProperty.type.split(".");
|
|
123
|
-
// Both tests on typeParts are necessary because of differing metadata conventions for OData and Edmx feeds.
|
|
124
|
-
if (typeParts[0].endsWith("Edm") && typeParts.length === 2) {
|
|
125
|
-
dp = parseCsdlSimpleProperty(parentType, csdlProperty, keyNamesOnServer);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
if (isEnumType(csdlProperty, schema)) {
|
|
129
|
-
dp = parseCsdlSimpleProperty(parentType, csdlProperty, keyNamesOnServer);
|
|
130
|
-
if (dp) {
|
|
131
|
-
dp.enumType = csdlProperty.type;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
dp = parseCsdlComplexProperty(parentType, csdlProperty, schema);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
if (dp) {
|
|
139
|
-
parentType._addPropertyCore(dp);
|
|
140
|
-
addValidators(dp);
|
|
141
|
-
}
|
|
142
|
-
return dp;
|
|
143
|
-
}
|
|
144
|
-
function parseCsdlSimpleProperty(parentType, csdlProperty, keyNamesOnServer) {
|
|
145
|
-
let isCollectionType = isCollection(csdlProperty.type);
|
|
146
|
-
let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;
|
|
147
|
-
let dataType = DataType.fromEdmDataType(propertyType);
|
|
148
|
-
if (dataType == null) {
|
|
149
|
-
parentType.warnings.push("Unable to recognize DataType for property: " + csdlProperty.name + " DateType: " + csdlProperty.type);
|
|
150
|
-
return undefined;
|
|
151
|
-
}
|
|
152
|
-
let isNullable = csdlProperty.nullable === 'true' || csdlProperty.nullable == null;
|
|
153
|
-
// let fixedLength = csdlProperty.fixedLength ? csdlProperty.fixedLength === true : undefined;
|
|
154
|
-
let isPartOfKey = keyNamesOnServer != null && keyNamesOnServer.indexOf(csdlProperty.name) >= 0;
|
|
155
|
-
if (isPartOfKey && parentType instanceof EntityType && parentType.autoGeneratedKeyType === AutoGeneratedKeyType.None) {
|
|
156
|
-
if (isIdentityProperty(csdlProperty)) {
|
|
157
|
-
parentType.autoGeneratedKeyType = AutoGeneratedKeyType.Identity;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// TODO: nit - don't set maxLength if null;
|
|
161
|
-
let maxLength = csdlProperty.maxLength;
|
|
162
|
-
maxLength = (maxLength == null || maxLength === "Max") ? null : parseInt(maxLength, 10);
|
|
163
|
-
// can't set the name until we go thru namingConventions and these need the dp.
|
|
164
|
-
let dp = new DataProperty({
|
|
165
|
-
nameOnServer: csdlProperty.name,
|
|
166
|
-
dataType: dataType,
|
|
167
|
-
isNullable: isNullable,
|
|
168
|
-
isPartOfKey: isPartOfKey,
|
|
169
|
-
isScalar: !isCollectionType,
|
|
170
|
-
maxLength: maxLength,
|
|
171
|
-
defaultValue: csdlProperty.defaultValue,
|
|
172
|
-
// fixedLength: fixedLength,
|
|
173
|
-
concurrencyMode: csdlProperty.concurrencyMode
|
|
174
|
-
});
|
|
175
|
-
if (dataType === DataType.Undefined) {
|
|
176
|
-
dp.rawTypeName = csdlProperty.type;
|
|
177
|
-
}
|
|
178
|
-
return dp;
|
|
179
|
-
}
|
|
180
|
-
function parseCsdlComplexProperty(parentType, csdlProperty, schema) {
|
|
181
|
-
// Complex properties are never nullable ( per EF specs)
|
|
182
|
-
// let isNullable = csdlProperty.nullable === 'true' || csdlProperty.nullable == null;
|
|
183
|
-
// let complexTypeName = csdlProperty.type.split("Edm.")[1];
|
|
184
|
-
let isCollectionType = isCollection(csdlProperty.type);
|
|
185
|
-
let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;
|
|
186
|
-
let complexTypeName = parseTypeNameWithSchema(propertyType, schema).typeName;
|
|
187
|
-
// can't set the name until we go thru namingConventions and these need the dp.
|
|
188
|
-
let dp = new DataProperty({
|
|
189
|
-
nameOnServer: csdlProperty.name,
|
|
190
|
-
complexTypeName: complexTypeName,
|
|
191
|
-
isNullable: false,
|
|
192
|
-
isScalar: !isCollectionType
|
|
193
|
-
});
|
|
194
|
-
return dp;
|
|
195
|
-
}
|
|
196
|
-
function parseCsdlNavProperty(entityType, csdlProperty, schema, schemas) {
|
|
197
|
-
let association = getAssociation(csdlProperty, schema, schemas);
|
|
198
|
-
if (!association) {
|
|
199
|
-
throw new Error("Unable to resolve Foreign Key Association: " + csdlProperty.relationship);
|
|
200
|
-
}
|
|
201
|
-
let toEnd = core.arrayFirst(association.end, (assocEnd) => {
|
|
202
|
-
return assocEnd.role === csdlProperty.toRole;
|
|
203
|
-
});
|
|
204
|
-
let isScalar = toEnd.multiplicity !== "*";
|
|
205
|
-
let dataType = parseTypeNameWithSchema(toEnd.type, schema).typeName;
|
|
206
|
-
let constraint = association.referentialConstraint;
|
|
207
|
-
if (!constraint) {
|
|
208
|
-
// TODO: Revisit this later - right now we just ignore many-many and assocs with missing constraints.
|
|
209
|
-
// Think about adding this back later.
|
|
210
|
-
if (association.end[0].multiplicity === "*" && association.end[1].multiplicity === "*") {
|
|
211
|
-
// ignore many to many relations for now
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
// For now assume it will be set later directly on the client.
|
|
216
|
-
// other alternative is to throw an error:
|
|
217
|
-
// throw new Error("Foreign Key Associations must be turned on for this model");
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
let cfg = {
|
|
221
|
-
nameOnServer: csdlProperty.name,
|
|
222
|
-
entityTypeName: dataType,
|
|
223
|
-
isScalar: isScalar,
|
|
224
|
-
associationName: association.name,
|
|
225
|
-
};
|
|
226
|
-
if (constraint) {
|
|
227
|
-
let principal = constraint.principal;
|
|
228
|
-
let dependent = constraint.dependent;
|
|
229
|
-
let propRefs = core.toArray(dependent.propertyRef);
|
|
230
|
-
let fkNames = propRefs.map(core.pluck("name"));
|
|
231
|
-
if (csdlProperty.fromRole === principal.role) {
|
|
232
|
-
cfg.invForeignKeyNamesOnServer = fkNames;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
// will be used later by np._update
|
|
236
|
-
cfg.foreignKeyNamesOnServer = fkNames;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
let np = new NavigationProperty(cfg);
|
|
240
|
-
entityType._addPropertyCore(np);
|
|
241
|
-
return np;
|
|
242
|
-
}
|
|
243
|
-
function isCollection(propertyType) {
|
|
244
|
-
return RX_COLLECTION.test(propertyType);
|
|
245
|
-
}
|
|
246
|
-
function isEnumType(csdlProperty, schema) {
|
|
247
|
-
if (schema.enumType)
|
|
248
|
-
return isEdmxEnumType(csdlProperty, schema);
|
|
249
|
-
else if (schema.extensions)
|
|
250
|
-
return isODataEnumType(csdlProperty, schema);
|
|
251
|
-
else
|
|
252
|
-
return false;
|
|
253
|
-
}
|
|
254
|
-
function isEdmxEnumType(csdlProperty, schema) {
|
|
255
|
-
let enumTypes = core.toArray(schema.enumType);
|
|
256
|
-
let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;
|
|
257
|
-
let typeParts = propertyType.split(".");
|
|
258
|
-
let baseTypeName = typeParts[typeParts.length - 1];
|
|
259
|
-
return enumTypes.some(function (enumType) {
|
|
260
|
-
return enumType.name === baseTypeName;
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
function isODataEnumType(csdlProperty, schema) {
|
|
264
|
-
let enumTypes = schema.extensions.filter((ext) => {
|
|
265
|
-
return ext.name === "EnumType";
|
|
266
|
-
});
|
|
267
|
-
let propertyType = getCollectionType(csdlProperty.type) || csdlProperty.type;
|
|
268
|
-
let typeParts = propertyType.split(".");
|
|
269
|
-
let baseTypeName = typeParts[typeParts.length - 1];
|
|
270
|
-
return enumTypes.some((enumType) => {
|
|
271
|
-
return enumType.attributes.some((attr) => {
|
|
272
|
-
return attr.name === "Name" && attr.value === baseTypeName;
|
|
273
|
-
});
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
function addValidators(dataProperty) {
|
|
277
|
-
let typeValidator;
|
|
278
|
-
if (!dataProperty.isNullable) {
|
|
279
|
-
dataProperty.validators.push(Validator.required());
|
|
280
|
-
}
|
|
281
|
-
if (dataProperty.isComplexProperty)
|
|
282
|
-
return;
|
|
283
|
-
if (dataProperty.dataType === DataType.String) {
|
|
284
|
-
if (dataProperty.maxLength) {
|
|
285
|
-
let validatorArgs = { maxLength: dataProperty.maxLength };
|
|
286
|
-
typeValidator = Validator.maxLength(validatorArgs);
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
typeValidator = Validator.string();
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
let validatorCtor = dataProperty.dataType.validatorCtor;
|
|
294
|
-
if (!validatorCtor)
|
|
295
|
-
return;
|
|
296
|
-
typeValidator = validatorCtor();
|
|
297
|
-
}
|
|
298
|
-
dataProperty.validators.push(typeValidator);
|
|
299
|
-
}
|
|
300
|
-
function isIdentityProperty(csdlProperty) {
|
|
301
|
-
// see if web api feed
|
|
302
|
-
let propName = core.arrayFirst(Object.keys(csdlProperty), (pn) => {
|
|
303
|
-
return pn.indexOf("StoreGeneratedPattern") >= 0;
|
|
304
|
-
});
|
|
305
|
-
if (propName) {
|
|
306
|
-
return (csdlProperty[propName] === "Identity");
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
// see if Odata feed
|
|
310
|
-
let extensions = csdlProperty.extensions;
|
|
311
|
-
if (!extensions) {
|
|
312
|
-
return false;
|
|
313
|
-
}
|
|
314
|
-
let identityExtn = core.arrayFirst(extensions, (extension) => {
|
|
315
|
-
return extension.name === "StoreGeneratedPattern" && extension.value === "Identity";
|
|
316
|
-
});
|
|
317
|
-
return !!identityExtn;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
// Fast version
|
|
321
|
-
// np: schema.entityType[].navigationProperty.relationship -> schema.association
|
|
322
|
-
// match( shortName(np.relationship) == schema.association[].name
|
|
323
|
-
// --> association__
|
|
324
|
-
// Correct version
|
|
325
|
-
// np: schema.entityType[].navigationProperty.relationship -> schema.association
|
|
326
|
-
// match( np.relationship == schema.entityContainer[0].associationSet[].association )
|
|
327
|
-
// -> associationSet.name
|
|
328
|
-
// match ( associationSet.name == schema.association[].name )
|
|
329
|
-
// -> association
|
|
330
|
-
function getAssociation(csdlNavProperty, containingSchema, schemas) {
|
|
331
|
-
let assocFullName = parseTypeNameWithSchema(csdlNavProperty.relationship, containingSchema);
|
|
332
|
-
let assocNamespace = assocFullName.namespace;
|
|
333
|
-
let assocSchema = core.arrayFirst(schemas, (schema) => {
|
|
334
|
-
return schema.namespace === assocNamespace;
|
|
335
|
-
});
|
|
336
|
-
if (!assocSchema)
|
|
337
|
-
return null;
|
|
338
|
-
let assocName = assocFullName.shortTypeName;
|
|
339
|
-
let assocs = assocSchema.association;
|
|
340
|
-
if (!assocs)
|
|
341
|
-
return null;
|
|
342
|
-
if (!Array.isArray(assocs)) {
|
|
343
|
-
assocs = [assocs];
|
|
344
|
-
}
|
|
345
|
-
let association = core.arrayFirst(assocs, (assoc) => {
|
|
346
|
-
return assoc.name === assocName;
|
|
347
|
-
});
|
|
348
|
-
return association;
|
|
349
|
-
}
|
|
350
|
-
// schema is only needed for navProperty type name
|
|
351
|
-
function parseTypeNameWithSchema(entityTypeName, schema) {
|
|
352
|
-
let result = MetadataStore.parseTypeName(entityTypeName);
|
|
353
|
-
if (schema && schema.cSpaceOSpaceMapping) {
|
|
354
|
-
let ns = getNamespaceFor(result.shortTypeName, schema);
|
|
355
|
-
if (ns) {
|
|
356
|
-
result = MetadataStore.makeTypeHash(result.shortTypeName, ns);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
return result;
|
|
360
|
-
}
|
|
361
|
-
function getCollectionType(propertyType) {
|
|
362
|
-
const match = propertyType.match(RX_COLLECTION);
|
|
363
|
-
return match ? match[1] : null;
|
|
364
|
-
}
|
|
365
|
-
function getNamespaceFor(shortName, schema) {
|
|
366
|
-
let ns;
|
|
367
|
-
let mapping = schema.cSpaceOSpaceMapping;
|
|
368
|
-
if (mapping) {
|
|
369
|
-
let fullName = mapping[schema.namespace + "." + shortName];
|
|
370
|
-
ns = fullName && fullName.substr(0, fullName.length - (shortName.length + 1));
|
|
371
|
-
if (ns)
|
|
372
|
-
return ns;
|
|
373
|
-
}
|
|
374
|
-
// if schema does not also have an entityType node then
|
|
375
|
-
// this is an WebApi2 OData schema which is usually equal to 'Default'; which is useless.
|
|
376
|
-
if (schema.entityType || schema.namespace !== 'Default') {
|
|
377
|
-
return schema.namespace;
|
|
378
|
-
}
|
|
379
|
-
return null;
|
|
380
|
-
}
|
|
381
|
-
/** @hidden @internal */
|
|
382
|
-
export const CsdlMetadataParser = {
|
|
383
|
-
parse: parse
|
|
384
|
-
};
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NkbC1tZXRhZGF0YS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3NkbC1tZXRhZGF0YS1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkksT0FBTyxFQUFFLFFBQVEsRUFBRyxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBY3ZDLE1BQU0sYUFBYSxHQUFJLG9CQUFvQixDQUFDO0FBRTVDLFNBQVMsS0FBSyxDQUFDLGFBQTRCLEVBQUUsT0FBWSxFQUFFLFdBQWdCO0lBRXpFLGFBQWEsQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7SUFDMUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLE1BQVc7UUFDbkMsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7WUFDOUIscUNBQXFDO1lBQ3JDLHlGQUF5RjtZQUN6RixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsT0FBWTtnQkFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUM7U0FDckM7UUFFRCxJQUFJ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TUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFlBQW9CO0lBQzdDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxTQUFpQixFQUFFLE1BQVc7SUFDckQsSUFBSSxFQUFVLENBQUM7SUFDZixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7SUFDekMsSUFBSSxPQUFPLEVBQUU7UUFDWCxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDM0QsRUFBRSxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUksRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBQ0QsdURBQXVEO0lBQ3ZELHlGQUF5RjtJQUN6RixJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7UUFDdkQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDO0tBQ3pCO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLEtBQUssRUFBRSxLQUFLO0NBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVN0b3JlLCBFbnRpdHlUeXBlLCBDb21wbGV4VHlwZSwgRGF0YVByb3BlcnR5LCBOYXZpZ2F0aW9uUHJvcGVydHksIEF1dG9HZW5lcmF0ZWRLZXlUeXBlIH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZSAgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xyXG5cclxuaW50ZXJmYWNlIElBc3NvY2lhdGlvbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVuZDogSUVuZFtdO1xyXG4gIHJlZmVyZW50aWFsQ29uc3RyYWludDogYW55O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUVuZCB7XHJcbiAgbXVsdGlwbGljaXR5OiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHJvbGU6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgUlhfQ09MTEVDVElPTiA9ICAvQ29sbGVjdGlvblxcKCguKilcXCkvO1xyXG5cclxuZnVuY3Rpb24gcGFyc2UobWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgc2NoZW1hczogYW55LCBhbHRNZXRhZGF0YTogYW55KSB7XHJcblxyXG4gIG1ldGFkYXRhU3RvcmUuX2VudGl0eVR5cGVSZXNvdXJjZU1hcCA9IHt9O1xyXG4gIHNjaGVtYXMgPSBjb3JlLnRvQXJyYXkoc2NoZW1hcyk7XHJcbiAgc2NoZW1hcy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlbWE6IGFueSkge1xyXG4gICAgaWYgKHNjaGVtYS5jU3BhY2VPU3BhY2VNYXBwaW5nKSB7XHJcbiAgICAgIC8vIFdlYiBhcGkgb25seSAtIG5vdCBhdmFpbCBpbiBPRGF0YS5cclxuICAgICAgLy8gVE9ETyB0aHJvdyBpbmZvcm1hdGl2ZSBlcnJvciBpZiBhbHJlYWR5IHBhcnNlZCBhbmQgY29udmVydGVkIHRvIG1hcCBvbiBhIHByZXZpb3VzIHBhc3NcclxuICAgICAgbGV0IG1hcHBpbmdzID0gSlNPTi5wYXJzZShzY2hlbWEuY1NwYWNlT1NwYWNlTWFwcGluZyk7XHJcbiAgICAgIGxldCBuZXdNYXAgPSB7fTtcclxuICAgICAgbWFwcGluZ3MuZm9yRWFjaChmdW5jdGlvbiAobWFwcGluZzogYW55KSB7XHJcbiAgICAgICAgbmV3TWFwW21hcHBpbmdbMF1dID0gbWFwcGluZ1sxXTtcclxuICAgICAgfSk7XHJcbiAgICAgIHNjaGVtYS5jU3BhY2VPU3BhY2VNYXBwaW5nID0gbmV3TWFwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzY2hlbWEuZW50aXR5Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvcmUudG9BcnJheShzY2hlbWEuZW50aXR5Q29udGFpbmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChjb250YWluZXIpIHtcclxuICAgICAgICBjb3JlLnRvQXJyYXkoY29udGFpbmVyLmVudGl0eVNldCkuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5U2V0KSB7XHJcbiAgICAgICAgICBsZXQgZW50aXR5VHlwZU5hbWUgPSBwYXJzZVR5cGVOYW1lV2l0aFNjaGVtYShlbnRpdHlTZXQuZW50aXR5VHlwZSwgc2NoZW1hKS50eXBlTmFtZTtcclxuICAgICAgICAgIG1ldGFkYXRhU3RvcmUuc2V0RW50aXR5VHlwZUZvclJlc291cmNlTmFtZShlbnRpdHlTZXQubmFtZSwgZW50aXR5VHlwZU5hbWUpO1xyXG4gICAgICAgICAgbWV0YWRhdGFTdG9yZS5fZW50aXR5VHlwZVJlc291cmNlTWFwW2VudGl0eVR5cGVOYW1lXSA9IGVudGl0eVNldC5uYW1lO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcm9jZXNzIGNvbXBsZXh0eXBlcyBiZWZvcmUgZW50aXR5IHR5cGVzLlxyXG4gICAgaWYgKHNjaGVtYS5jb21wbGV4VHlwZSkge1xyXG4gICAgICBjb3JlLnRvQXJyYXkoc2NoZW1hLmNvbXBsZXhUeXBlKS5mb3JFYWNoKGZ1bmN0aW9uIChjdCkge1xyXG4gICAgICAgIHBhcnNlQ3NkbENvbXBsZXhUeXBlKGN0LCBzY2hlbWEsIG1ldGFkYXRhU3RvcmUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzY2hlbWEuZW50aXR5VHlwZSkge1xyXG4gICAgICBjb3JlLnRvQXJyYXkoc2NoZW1hLmVudGl0eVR5cGUpLmZvckVhY2goZnVuY3Rpb24gKGV0KSB7XHJcbiAgICAgICAgcGFyc2VDc2RsRW50aXR5VHlwZShldCwgc2NoZW1hLCBzY2hlbWFzLCBtZXRhZGF0YVN0b3JlKTtcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9KTtcclxuICBsZXQgYmFkTmF2UHJvcHMgPSBtZXRhZGF0YVN0b3JlLmdldEluY29tcGxldGVOYXZpZ2F0aW9uUHJvcGVydGllcygpO1xyXG4gIGlmIChiYWROYXZQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICBsZXQgbXNnID0gYmFkTmF2UHJvcHMubWFwKGZ1bmN0aW9uIChucGEpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobnBhKSkge1xyXG4gICAgICAgIHJldHVybiBucGEubWFwKGZ1bmN0aW9uIChucCkge1xyXG4gICAgICAgICAgcmV0dXJuIG5wLnBhcmVudFR5cGUubmFtZSArIFwiOlwiICsgbnAubmFtZTtcclxuICAgICAgICB9KS5qb2luKCcsICcpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBucGEucGFyZW50VHlwZS5uYW1lICsgXCI6XCIgKyBucGEubmFtZTtcclxuICAgIH0pLmpvaW4oJywgJyk7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvbXBsZXRlIG5hdmlnYXRpb24gcHJvcGVydGllczogXCIgKyBtc2cpO1xyXG4gIH1cclxuICBpZiAoYWx0TWV0YWRhdGEpIHtcclxuICAgIG1ldGFkYXRhU3RvcmUuaW1wb3J0TWV0YWRhdGEoYWx0TWV0YWRhdGEsIHRydWUpO1xyXG4gIH1cclxuICByZXR1cm4gbWV0YWRhdGFTdG9yZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VDc2RsRW50aXR5VHlwZShjc2RsRW50aXR5VHlwZTogYW55LCBzY2hlbWE6IGFueSwgc2NoZW1hczogYW55LCBtZXRhZGF0YVN0b3JlOiBNZXRhZGF0YVN0b3JlKSB7XHJcbiAgbGV0IHNob3J0TmFtZSA9IGNzZGxFbnRpdHlUeXBlLm5hbWU7XHJcbiAgbGV0IG5zID0gZ2V0TmFtZXNwYWNlRm9yKHNob3J0TmFtZSwgc2NoZW1hKTtcclxuICBsZXQgZW50aXR5VHlwZSA9IG5ldyBFbnRpdHlUeXBlKHtcclxuICAgIHNob3J0TmFtZTogc2hvcnROYW1lLFxyXG4gICAgbmFtZXNwYWNlOiBucyxcclxuICAgIGlzQWJzdHJhY3Q6IGNzZGxFbnRpdHlUeXBlLmFic3RyYWN0ICYmIGNzZGxFbnRpdHlUeXBlLmFic3RyYWN0ID09PSAndHJ1ZSdcclxuICB9KTtcclxuICBpZiAoY3NkbEVudGl0eVR5cGUuYmFzZVR5cGUpIHtcclxuICAgIGxldCBiYXNlVHlwZU5hbWUgPSBwYXJzZVR5cGVOYW1lV2l0aFNjaGVtYShjc2RsRW50aXR5VHlwZS5iYXNlVHlwZSwgc2NoZW1hKS50eXBlTmFtZTtcclxuICAgIGVudGl0eVR5cGUuYmFzZVR5cGVOYW1lID0gYmFzZVR5cGVOYW1lO1xyXG4gICAgbGV0IGJhc2VFbnRpdHlUeXBlID0gbWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoYmFzZVR5cGVOYW1lLCB0cnVlKTtcclxuICAgIGlmIChiYXNlRW50aXR5VHlwZSkge1xyXG4gICAgICBjb21wbGV0ZVBhcnNlQ3NkbEVudGl0eVR5cGUoZW50aXR5VHlwZSwgY3NkbEVudGl0eVR5cGUsIHNjaGVtYSwgc2NoZW1hcywgbWV0YWRhdGFTdG9yZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGVmZXJyYWxzID0gbWV0YWRhdGFTdG9yZS5fZGVmZXJyZWRUeXBlc1tiYXNlVHlwZU5hbWVdO1xyXG4gICAgICBpZiAoIWRlZmVycmFscykge1xyXG4gICAgICAgIGRlZmVycmFscyA9IFtdO1xyXG4gICAgICAgIG1ldGFkYXRhU3RvcmUuX2RlZmVycmVkVHlwZXNbYmFzZVR5cGVOYW1lXSA9IGRlZmVycmFscztcclxuICAgICAgfVxyXG4gICAgICBkZWZlcnJhbHMucHVzaCh7IGVudGl0eVR5cGU6IGVudGl0eVR5cGUsIGNzZGxFbnRpdHlUeXBlOiBjc2RsRW50aXR5VHlwZSB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgY29tcGxldGVQYXJzZUNzZGxFbnRpdHlUeXBlKGVudGl0eVR5cGUsIGNzZGxFbnRpdHlUeXBlLCBzY2hlbWEsIHNjaGVtYXMsIG1ldGFkYXRhU3RvcmUpO1xyXG4gIH1cclxuICAvLyBlbnRpdHlUeXBlIG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbWV0YWRhdGFTdG9yZSBhdCB0aGlzIHBvaW50LlxyXG4gIHJldHVybiBlbnRpdHlUeXBlO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGxldGVQYXJzZUNzZGxFbnRpdHlUeXBlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGNzZGxFbnRpdHlUeXBlOiBhbnksIHNjaGVtYTogYW55LCBzY2hlbWFzOiBhbnksIG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUpIHtcclxuICBsZXQga2V5TmFtZXNPblNlcnZlciA9IGNzZGxFbnRpdHlUeXBlLmtleSA/IGNvcmUudG9BcnJheShjc2RsRW50aXR5VHlwZS5rZXkucHJvcGVydHlSZWYpLm1hcChjb3JlLnBsdWNrKFwibmFtZVwiKSkgOiBbXTtcclxuXHJcbiAgY29yZS50b0FycmF5KGNzZGxFbnRpdHlUeXBlLnByb3BlcnR5KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XHJcbiAgICBwYXJzZUNzZGxEYXRhUHJvcGVydHkoZW50aXR5VHlwZSwgcHJvcCwgc2NoZW1hLCBrZXlOYW1lc09uU2VydmVyKTtcclxuICB9KTtcclxuXHJcbiAgY29yZS50b0FycmF5KGNzZGxFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0eSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xyXG4gICAgcGFyc2VDc2RsTmF2UHJvcGVydHkoZW50aXR5VHlwZSwgcHJvcCwgc2NoZW1hLCBzY2hlbWFzKTtcclxuICB9KTtcclxuXHJcbiAgbWV0YWRhdGFTdG9yZS5hZGRFbnRpdHlUeXBlKGVudGl0eVR5cGUpO1xyXG4gIGVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSA9IG1ldGFkYXRhU3RvcmUuX2VudGl0eVR5cGVSZXNvdXJjZU1hcFtlbnRpdHlUeXBlLm5hbWVdO1xyXG5cclxuICBsZXQgZGVmZXJyZWRUeXBlcyA9IG1ldGFkYXRhU3RvcmUuX2RlZmVycmVkVHlwZXM7XHJcbiAgbGV0IGRlZmVycmFscyA9IGRlZmVycmVkVHlwZXNbZW50aXR5VHlwZS5uYW1lXTtcclxuICBpZiAoZGVmZXJyYWxzKSB7XHJcbiAgICBkZWZlcnJhbHMuZm9yRWFjaChmdW5jdGlvbiAoZDogYW55KSB7XHJcbiAgICAgIGNvbXBsZXRlUGFyc2VDc2RsRW50aXR5VHlwZShkLmVudGl0eVR5cGUsIGQuY3NkbEVudGl0eVR5cGUsIHNjaGVtYSwgc2NoZW1hcywgbWV0YWRhdGFTdG9yZSk7XHJcbiAgICB9KTtcclxuICAgIGRlbGV0ZSBkZWZlcnJlZFR5cGVzW2VudGl0eVR5cGUubmFtZV07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VDc2RsQ29tcGxleFR5cGUoY3NkbENvbXBsZXhUeXBlOiBhbnksIHNjaGVtYTogYW55LCBtZXRhZGF0YVN0b3JlOiBNZXRhZGF0YVN0b3JlKSB7XHJcbiAgbGV0IHNob3J0TmFtZSA9IGNzZGxDb21wbGV4VHlwZS5uYW1lO1xyXG4gIGxldCBucyA9IGdldE5hbWVzcGFjZUZvcihzaG9ydE5hbWUsIHNjaGVtYSk7XHJcbiAgbGV0IGNvbXBsZXhUeXBlID0gbmV3IENvbXBsZXhUeXBlKHtcclxuICAgIHNob3J0TmFtZTogc2hvcnROYW1lLFxyXG4gICAgbmFtZXNwYWNlOiBuc1xyXG4gIH0pO1xyXG5cclxuICBjb3JlLnRvQXJyYXkoY3NkbENvbXBsZXhUeXBlLnByb3BlcnR5KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XHJcbiAgICBwYXJzZUNzZGxEYXRhUHJvcGVydHkoY29tcGxleFR5cGUsIHByb3AsIHNjaGVtYSk7XHJcbiAgfSk7XHJcblxyXG4gIG1ldGFkYXRhU3RvcmUuYWRkRW50aXR5VHlwZShjb21wbGV4VHlwZSk7XHJcbiAgcmV0dXJuIGNvbXBsZXhUeXBlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNzZGxEYXRhUHJvcGVydHkocGFyZW50VHlwZTogRW50aXR5VHlwZSB8IENvbXBsZXhUeXBlLCBjc2RsUHJvcGVydHk6IGFueSwgc2NoZW1hOiBhbnksIGtleU5hbWVzT25TZXJ2ZXI/OiBzdHJpbmdbXSkge1xyXG4gIGxldCBkcDogRGF0YVByb3BlcnR5IHwgdW5kZWZpbmVkO1xyXG4gIGxldCB0eXBlUGFydHMgPSBjc2RsUHJvcGVydHkudHlwZS5zcGxpdChcIi5cIik7XHJcbiAgLy8gQm90aCB0ZXN0cyBvbiB0eXBlUGFydHMgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIGRpZmZlcmluZyBtZXRhZGF0YSBjb252ZW50aW9ucyBmb3IgT0RhdGEgYW5kIEVkbXggZmVlZHMuXHJcbiAgaWYgKHR5cGVQYXJ0c1swXS5lbmRzV2l0aChcIkVkbVwiKSAmJiB0eXBlUGFydHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICBkcCA9IHBhcnNlQ3NkbFNpbXBsZVByb3BlcnR5KHBhcmVudFR5cGUsIGNzZGxQcm9wZXJ0eSwga2V5TmFtZXNPblNlcnZlcik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChpc0VudW1UeXBlKGNzZGxQcm9wZXJ0eSwgc2NoZW1hKSkge1xyXG4gICAgICBkcCA9IHBhcnNlQ3NkbFNpbXBsZVByb3BlcnR5KHBhcmVudFR5cGUsIGNzZGxQcm9wZXJ0eSwga2V5TmFtZXNPblNlcnZlcik7XHJcbiAgICAgIGlmIChkcCkge1xyXG4gICAgICAgIGRwLmVudW1UeXBlID0gY3NkbFByb3BlcnR5LnR5cGU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRwID0gcGFyc2VDc2RsQ29tcGxleFByb3BlcnR5KHBhcmVudFR5cGUsIGNzZGxQcm9wZXJ0eSwgc2NoZW1hKTtcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKGRwKSB7XHJcbiAgICBwYXJlbnRUeXBlLl9hZGRQcm9wZXJ0eUNvcmUoZHApO1xyXG4gICAgYWRkVmFsaWRhdG9ycyhkcCk7XHJcbiAgfVxyXG4gIHJldHVybiBkcDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VDc2RsU2ltcGxlUHJvcGVydHkocGFyZW50VHlwZTogRW50aXR5VHlwZSB8IENvbXBsZXhUeXBlLCBjc2RsUHJvcGVydHk6IGFueSwga2V5TmFtZXNPblNlcnZlcj86IHN0cmluZ1tdKSB7XHJcbiAgbGV0IGlzQ29sbGVjdGlvblR5cGUgPSBpc0NvbGxlY3Rpb24oY3NkbFByb3BlcnR5LnR5cGUpO1xyXG4gIGxldCBwcm9wZXJ0eVR5cGUgPSBnZXRDb2xsZWN0aW9uVHlwZShjc2RsUHJvcGVydHkudHlwZSkgfHwgY3NkbFByb3BlcnR5LnR5cGU7XHJcbiAgbGV0IGRhdGFUeXBlID0gRGF0YVR5cGUuZnJvbUVkbURhdGFUeXBlKHByb3BlcnR5VHlwZSk7XHJcbiAgaWYgKGRhdGFUeXBlID09IG51bGwpIHtcclxuICAgIHBhcmVudFR5cGUud2FybmluZ3MucHVzaChcIlVuYWJsZSB0byByZWNvZ25pemUgRGF0YVR5cGUgZm9yIHByb3BlcnR5OiBcIiArIGNzZGxQcm9wZXJ0eS5uYW1lICsgXCIgRGF0ZVR5cGU6IFwiICsgY3NkbFByb3BlcnR5LnR5cGUpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcbiAgbGV0IGlzTnVsbGFibGUgPSBjc2RsUHJvcGVydHkubnVsbGFibGUgPT09ICd0cnVlJyB8fCBjc2RsUHJvcGVydHkubnVsbGFibGUgPT0gbnVsbDtcclxuICAvLyBsZXQgZml4ZWRMZW5ndGggPSBjc2RsUHJvcGVydHkuZml4ZWRMZW5ndGggPyBjc2RsUHJvcGVydHkuZml4ZWRMZW5ndGggPT09IHRydWUgOiB1bmRlZmluZWQ7XHJcbiAgbGV0IGlzUGFydE9mS2V5ID0ga2V5TmFtZXNPblNlcnZlciAhPSBudWxsICYmIGtleU5hbWVzT25TZXJ2ZXIuaW5kZXhPZihjc2RsUHJvcGVydHkubmFtZSkgPj0gMDtcclxuICBpZiAoaXNQYXJ0T2ZLZXkgJiYgcGFyZW50VHlwZSBpbnN0YW5jZW9mIEVudGl0eVR5cGUgJiYgcGFyZW50VHlwZS5hdXRvR2VuZXJhdGVkS2V5VHlwZSA9PT0gQXV0b0dlbmVyYXRlZEtleVR5cGUuTm9uZSkge1xyXG4gICAgaWYgKGlzSWRlbnRpdHlQcm9wZXJ0eShjc2RsUHJvcGVydHkpKSB7XHJcbiAgICAgIHBhcmVudFR5cGUuYXV0b0dlbmVyYXRlZEtleVR5cGUgPSBBdXRvR2VuZXJhdGVkS2V5VHlwZS5JZGVudGl0eTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gVE9ETzogbml0IC0gZG9uJ3Qgc2V0IG1heExlbmd0aCBpZiBudWxsO1xyXG4gIGxldCBtYXhMZW5ndGggPSBjc2RsUHJvcGVydHkubWF4TGVuZ3RoO1xyXG4gIG1heExlbmd0aCA9IChtYXhMZW5ndGggPT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IFwiTWF4XCIpID8gbnVsbCA6IHBhcnNlSW50KG1heExlbmd0aCwgMTApO1xyXG4gIC8vIGNhbid0IHNldCB0aGUgbmFtZSB1bnRpbCB3ZSBnbyB0aHJ1IG5hbWluZ0NvbnZlbnRpb25zIGFuZCB0aGVzZSBuZWVkIHRoZSBkcC5cclxuXHJcbiAgbGV0IGRwID0gbmV3IERhdGFQcm9wZXJ0eSh7XHJcbiAgICBuYW1lT25TZXJ2ZXI6IGNzZGxQcm9wZXJ0eS5uYW1lLFxyXG4gICAgZGF0YVR5cGU6IGRhdGFUeXBlLFxyXG4gICAgaXNOdWxsYWJsZTogaXNOdWxsYWJsZSxcclxuICAgIGlzUGFydE9mS2V5OiBpc1BhcnRPZktleSxcclxuICAgIGlzU2NhbGFyOiAhaXNDb2xsZWN0aW9uVHlwZSxcclxuICAgIG1heExlbmd0aDogbWF4TGVuZ3RoLFxyXG4gICAgZGVmYXVsdFZhbHVlOiBjc2RsUHJvcGVydHkuZGVmYXVsdFZhbHVlLFxyXG4gICAgLy8gZml4ZWRMZW5ndGg6IGZpeGVkTGVuZ3RoLFxyXG4gICAgY29uY3VycmVuY3lNb2RlOiBjc2RsUHJvcGVydHkuY29uY3VycmVuY3lNb2RlXHJcbiAgfSk7XHJcblxyXG4gIGlmIChkYXRhVHlwZSA9PT0gRGF0YVR5cGUuVW5kZWZpbmVkKSB7XHJcbiAgICBkcC5yYXdUeXBlTmFtZSA9IGNzZGxQcm9wZXJ0eS50eXBlO1xyXG4gIH1cclxuICByZXR1cm4gZHA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQ3NkbENvbXBsZXhQcm9wZXJ0eShwYXJlbnRUeXBlOiBFbnRpdHlUeXBlIHwgQ29tcGxleFR5cGUsIGNzZGxQcm9wZXJ0eTogYW55LCBzY2hlbWE6IGFueSkge1xyXG5cclxuICAvLyBDb21wbGV4IHByb3BlcnRpZXMgYXJlIG5ldmVyIG51bGxhYmxlICggcGVyIEVGIHNwZWNzKVxyXG4gIC8vIGxldCBpc051bGxhYmxlID0gY3NkbFByb3BlcnR5Lm51bGxhYmxlID09PSAndHJ1ZScgfHwgY3NkbFByb3BlcnR5Lm51bGxhYmxlID09IG51bGw7XHJcbiAgLy8gbGV0IGNvbXBsZXhUeXBlTmFtZSA9IGNzZGxQcm9wZXJ0eS50eXBlLnNwbGl0KFwiRWRtLlwiKVsxXTtcclxuICBsZXQgaXNDb2xsZWN0aW9uVHlwZSA9IGlzQ29sbGVjdGlvbihjc2RsUHJvcGVydHkudHlwZSk7XHJcbiAgbGV0IHByb3BlcnR5VHlwZSA9IGdldENvbGxlY3Rpb25UeXBlKGNzZGxQcm9wZXJ0eS50eXBlKSB8fCBjc2RsUHJvcGVydHkudHlwZTtcclxuICBsZXQgY29tcGxleFR5cGVOYW1lID0gcGFyc2VUeXBlTmFtZVdpdGhTY2hlbWEocHJvcGVydHlUeXBlLCBzY2hlbWEpLnR5cGVOYW1lO1xyXG4gIC8vIGNhbid0IHNldCB0aGUgbmFtZSB1bnRpbCB3ZSBnbyB0aHJ1IG5hbWluZ0NvbnZlbnRpb25zIGFuZCB0aGVzZSBuZWVkIHRoZSBkcC5cclxuICBsZXQgZHAgPSBuZXcgRGF0YVByb3BlcnR5KHtcclxuICAgIG5hbWVPblNlcnZlcjogY3NkbFByb3BlcnR5Lm5hbWUsXHJcbiAgICBjb21wbGV4VHlwZU5hbWU6IGNvbXBsZXhUeXBlTmFtZSxcclxuICAgIGlzTnVsbGFibGU6IGZhbHNlLFxyXG4gICAgaXNTY2FsYXI6ICFpc0NvbGxlY3Rpb25UeXBlXHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBkcDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VDc2RsTmF2UHJvcGVydHkoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgY3NkbFByb3BlcnR5OiBhbnksIHNjaGVtYTogYW55LCBzY2hlbWFzOiBhbnlbXSkge1xyXG4gIGxldCBhc3NvY2lhdGlvbiA9IGdldEFzc29jaWF0aW9uKGNzZGxQcm9wZXJ0eSwgc2NoZW1hLCBzY2hlbWFzKTtcclxuICBpZiAoIWFzc29jaWF0aW9uKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBGb3JlaWduIEtleSBBc3NvY2lhdGlvbjogXCIgKyBjc2RsUHJvcGVydHkucmVsYXRpb25zaGlwKTtcclxuICB9XHJcbiAgbGV0IHRvRW5kID0gY29yZS5hcnJheUZpcnN0KGFzc29jaWF0aW9uLmVuZCwgKGFzc29jRW5kKSA9PiB7XHJcbiAgICByZXR1cm4gYXNzb2NFbmQucm9sZSA9PT0gY3NkbFByb3BlcnR5LnRvUm9sZTtcclxuICB9KTtcclxuXHJcbiAgbGV0IGlzU2NhbGFyID0gdG9FbmQhLm11bHRpcGxpY2l0eSAhPT0gXCIqXCI7XHJcbiAgbGV0IGRhdGFUeXBlID0gcGFyc2VUeXBlTmFtZVdpdGhTY2hlbWEodG9FbmQhLnR5cGUsIHNjaGVtYSkudHlwZU5hbWU7XHJcblxyXG4gIGxldCBjb25zdHJhaW50ID0gYXNzb2NpYXRpb24ucmVmZXJlbnRpYWxDb25zdHJhaW50O1xyXG4gIGlmICghY29uc3RyYWludCkge1xyXG4gICAgLy8gVE9ETzogUmV2aXNpdCB0aGlzIGxhdGVyIC0gcmlnaHQgbm93IHdlIGp1c3QgaWdub3JlIG1hbnktbWFueSBhbmQgYXNzb2NzIHdpdGggbWlzc2luZyBjb25zdHJhaW50cy5cclxuXHJcbiAgICAvLyBUaGluayBhYm91dCBhZGRpbmcgdGhpcyBiYWNrIGxhdGVyLlxyXG4gICAgaWYgKGFzc29jaWF0aW9uLmVuZFswXS5tdWx0aXBsaWNpdHkgPT09IFwiKlwiICYmIGFzc29jaWF0aW9uLmVuZFsxXS5tdWx0aXBsaWNpdHkgPT09IFwiKlwiKSB7XHJcbiAgICAgIC8vIGlnbm9yZSBtYW55IHRvIG1hbnkgcmVsYXRpb25zIGZvciBub3dcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRm9yIG5vdyBhc3N1bWUgaXQgd2lsbCBiZSBzZXQgbGF0ZXIgZGlyZWN0bHkgb24gdGhlIGNsaWVudC5cclxuICAgICAgLy8gb3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gdGhyb3cgYW4gZXJyb3I6XHJcbiAgICAgIC8vIHRocm93IG5ldyBFcnJvcihcIkZvcmVpZ24gS2V5IEFzc29jaWF0aW9ucyBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgdGhpcyBtb2RlbFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgbGV0IGNmZyA9IHtcclxuICAgIG5hbWVPblNlcnZlcjogY3NkbFByb3BlcnR5Lm5hbWUsXHJcbiAgICBlbnRpdHlUeXBlTmFtZTogZGF0YVR5cGUsXHJcbiAgICBpc1NjYWxhcjogaXNTY2FsYXIsXHJcbiAgICBhc3NvY2lhdGlvbk5hbWU6IGFzc29jaWF0aW9uLm5hbWUsXHJcbiAgfTtcclxuXHJcbiAgaWYgKGNvbnN0cmFpbnQpIHtcclxuICAgIGxldCBwcmluY2lwYWwgPSBjb25zdHJhaW50LnByaW5jaXBhbDtcclxuICAgIGxldCBkZXBlbmRlbnQgPSBjb25zdHJhaW50LmRlcGVuZGVudDtcclxuXHJcbiAgICBsZXQgcHJvcFJlZnMgPSBjb3JlLnRvQXJyYXkoZGVwZW5kZW50LnByb3BlcnR5UmVmKTtcclxuICAgIGxldCBma05hbWVzID0gcHJvcFJlZnMubWFwKGNvcmUucGx1Y2soXCJuYW1lXCIpKTtcclxuICAgIGlmIChjc2RsUHJvcGVydHkuZnJvbVJvbGUgPT09IHByaW5jaXBhbC5yb2xlKSB7XHJcbiAgICAgIChjZmcgYXMgYW55KS5pbnZGb3JlaWduS2V5TmFtZXNPblNlcnZlciA9IGZrTmFtZXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB3aWxsIGJlIHVzZWQgbGF0ZXIgYnkgbnAuX3VwZGF0ZVxyXG4gICAgICAoY2ZnIGFzIGFueSkuZm9yZWlnbktleU5hbWVzT25TZXJ2ZXIgPSBma05hbWVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IG5wID0gbmV3IE5hdmlnYXRpb25Qcm9wZXJ0eShjZmcpO1xyXG4gIGVudGl0eVR5cGUuX2FkZFByb3BlcnR5Q29yZShucCk7XHJcbiAgcmV0dXJuIG5wO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24ocHJvcGVydHlUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICByZXR1cm4gUlhfQ09MTEVDVElPTi50ZXN0KHByb3BlcnR5VHlwZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRW51bVR5cGUoY3NkbFByb3BlcnR5OiBhbnksIHNjaGVtYTogYW55KSB7XHJcbiAgaWYgKHNjaGVtYS5lbnVtVHlwZSkgcmV0dXJuIGlzRWRteEVudW1UeXBlKGNzZGxQcm9wZXJ0eSwgc2NoZW1hKTtcclxuICBlbHNlIGlmIChzY2hlbWEuZXh0ZW5zaW9ucykgcmV0dXJuIGlzT0RhdGFFbnVtVHlwZShjc2RsUHJvcGVydHksIHNjaGVtYSk7XHJcbiAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRWRteEVudW1UeXBlKGNzZGxQcm9wZXJ0eTogYW55LCBzY2hlbWE6IGFueSkge1xyXG4gIGxldCBlbnVtVHlwZXMgPSBjb3JlLnRvQXJyYXkoc2NoZW1hLmVudW1UeXBlKTtcclxuICBsZXQgcHJvcGVydHlUeXBlID0gZ2V0Q29sbGVjdGlvblR5cGUoY3NkbFByb3BlcnR5LnR5cGUpIHx8IGNzZGxQcm9wZXJ0eS50eXBlO1xyXG4gIGxldCB0eXBlUGFydHMgPSBwcm9wZXJ0eVR5cGUuc3BsaXQoXCIuXCIpO1xyXG4gIGxldCBiYXNlVHlwZU5hbWUgPSB0eXBlUGFydHNbdHlwZVBhcnRzLmxlbmd0aCAtIDFdO1xyXG4gIHJldHVybiBlbnVtVHlwZXMuc29tZShmdW5jdGlvbiAoZW51bVR5cGUpIHtcclxuICAgIHJldHVybiBlbnVtVHlwZS5uYW1lID09PSBiYXNlVHlwZU5hbWU7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzT0RhdGFFbnVtVHlwZShjc2RsUHJvcGVydHk6IGFueSwgc2NoZW1hOiBhbnkpIHtcclxuICBsZXQgZW51bVR5cGVzID0gc2NoZW1hLmV4dGVuc2lvbnMuZmlsdGVyKChleHQ6IGFueSkgPT4ge1xyXG4gICAgcmV0dXJuIGV4dC5uYW1lID09PSBcIkVudW1UeXBlXCI7XHJcbiAgfSk7XHJcbiAgbGV0IHByb3BlcnR5VHlwZSA9IGdldENvbGxlY3Rpb25UeXBlKGNzZGxQcm9wZXJ0eS50eXBlKSB8fCBjc2RsUHJvcGVydHkudHlwZTtcclxuICBsZXQgdHlwZVBhcnRzID0gcHJvcGVydHlUeXBlLnNwbGl0KFwiLlwiKTtcclxuICBsZXQgYmFzZVR5cGVOYW1lID0gdHlwZVBhcnRzW3R5cGVQYXJ0cy5sZW5ndGggLSAxXTtcclxuICByZXR1cm4gZW51bVR5cGVzLnNvbWUoKGVudW1UeXBlOiBhbnkpID0+IHtcclxuICAgIHJldHVybiBlbnVtVHlwZS5hdHRyaWJ1dGVzLnNvbWUoKGF0dHI6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gYXR0ci5uYW1lID09PSBcIk5hbWVcIiAmJiBhdHRyLnZhbHVlID09PSBiYXNlVHlwZU5hbWU7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkVmFsaWRhdG9ycyhkYXRhUHJvcGVydHk6IERhdGFQcm9wZXJ0eSkge1xyXG4gIGxldCB0eXBlVmFsaWRhdG9yOiBWYWxpZGF0b3I7XHJcbiAgaWYgKCFkYXRhUHJvcGVydHkuaXNOdWxsYWJsZSkge1xyXG4gICAgZGF0YVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucmVxdWlyZWQoKSk7XHJcbiAgfVxyXG5cclxuICBpZiAoZGF0YVByb3BlcnR5LmlzQ29tcGxleFByb3BlcnR5KSByZXR1cm47XHJcblxyXG4gIGlmIChkYXRhUHJvcGVydHkuZGF0YVR5cGUgPT09IERhdGFUeXBlLlN0cmluZykge1xyXG4gICAgaWYgKGRhdGFQcm9wZXJ0eS5tYXhMZW5ndGgpIHtcclxuICAgICAgbGV0IHZhbGlkYXRvckFyZ3MgPSB7IG1heExlbmd0aDogZGF0YVByb3BlcnR5Lm1heExlbmd0aCB9O1xyXG4gICAgICB0eXBlVmFsaWRhdG9yID0gVmFsaWRhdG9yLm1heExlbmd0aCh2YWxpZGF0b3JBcmdzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHR5cGVWYWxpZGF0b3IgPSBWYWxpZGF0b3Iuc3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgICAgbGV0IHZhbGlkYXRvckN0b3IgPSAoZGF0YVByb3BlcnR5LmRhdGFUeXBlIGFzIGFueSkudmFsaWRhdG9yQ3RvcjtcclxuICAgICAgaWYgKCF2YWxpZGF0b3JDdG9yKSByZXR1cm47XHJcbiAgICAgIHR5cGVWYWxpZGF0b3IgPSB2YWxpZGF0b3JDdG9yKCk7XHJcbiAgfVxyXG5cclxuICBkYXRhUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKHR5cGVWYWxpZGF0b3IpO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gaXNJZGVudGl0eVByb3BlcnR5KGNzZGxQcm9wZXJ0eTogYW55KSB7XHJcbiAgLy8gc2VlIGlmIHdlYiBhcGkgZmVlZFxyXG4gIGxldCBwcm9wTmFtZSA9IGNvcmUuYXJyYXlGaXJzdChPYmplY3Qua2V5cyhjc2RsUHJvcGVydHkpLCAocG4pID0+IHtcclxuICAgIHJldHVybiBwbi5pbmRleE9mKFwiU3RvcmVHZW5lcmF0ZWRQYXR0ZXJuXCIpID49IDA7XHJcbiAgfSk7XHJcbiAgaWYgKHByb3BOYW1lKSB7XHJcbiAgICByZXR1cm4gKGNzZGxQcm9wZXJ0eVtwcm9wTmFtZV0gPT09IFwiSWRlbnRpdHlcIik7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIHNlZSBpZiBPZGF0YSBmZWVkXHJcbiAgICBsZXQgZXh0ZW5zaW9ucyA9IGNzZGxQcm9wZXJ0eS5leHRlbnNpb25zO1xyXG4gICAgaWYgKCFleHRlbnNpb25zKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGxldCBpZGVudGl0eUV4dG4gPSBjb3JlLmFycmF5Rmlyc3QoZXh0ZW5zaW9ucywgKGV4dGVuc2lvbikgPT4ge1xyXG4gICAgICByZXR1cm4gZXh0ZW5zaW9uLm5hbWUgPT09IFwiU3RvcmVHZW5lcmF0ZWRQYXR0ZXJuXCIgJiYgZXh0ZW5zaW9uLnZhbHVlID09PSBcIklkZW50aXR5XCI7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAhIWlkZW50aXR5RXh0bjtcclxuICB9XHJcbn1cclxuXHJcbi8vIEZhc3QgdmVyc2lvblxyXG4vLyBucDogc2NoZW1hLmVudGl0eVR5cGVbXS5uYXZpZ2F0aW9uUHJvcGVydHkucmVsYXRpb25zaGlwIC0+IHNjaGVtYS5hc3NvY2lhdGlvblxyXG4vLyAgIG1hdGNoKCBzaG9ydE5hbWUobnAucmVsYXRpb25zaGlwKSA9PSBzY2hlbWEuYXNzb2NpYXRpb25bXS5uYW1lXHJcbi8vICAgICAgLS0+IGFzc29jaWF0aW9uX19cclxuXHJcbi8vIENvcnJlY3QgdmVyc2lvblxyXG4vLyBucDogc2NoZW1hLmVudGl0eVR5cGVbXS5uYXZpZ2F0aW9uUHJvcGVydHkucmVsYXRpb25zaGlwIC0+IHNjaGVtYS5hc3NvY2lhdGlvblxyXG4vLyAgIG1hdGNoKCBucC5yZWxhdGlvbnNoaXAgPT0gc2NoZW1hLmVudGl0eUNvbnRhaW5lclswXS5hc3NvY2lhdGlvblNldFtdLmFzc29jaWF0aW9uIClcclxuLy8gICAgICAtPiBhc3NvY2lhdGlvblNldC5uYW1lXHJcbi8vICAgbWF0Y2ggKCBhc3NvY2lhdGlvblNldC5uYW1lID09IHNjaGVtYS5hc3NvY2lhdGlvbltdLm5hbWUgKVxyXG4vLyAgICAgIC0+IGFzc29jaWF0aW9uXHJcblxyXG5mdW5jdGlvbiBnZXRBc3NvY2lhdGlvbihjc2RsTmF2UHJvcGVydHk6IGFueSwgY29udGFpbmluZ1NjaGVtYTogYW55LCBzY2hlbWFzOiBhbnlbXSkge1xyXG4gIGxldCBhc3NvY0Z1bGxOYW1lID0gcGFyc2VUeXBlTmFtZVdpdGhTY2hlbWEoY3NkbE5hdlByb3BlcnR5LnJlbGF0aW9uc2hpcCwgY29udGFpbmluZ1NjaGVtYSk7XHJcbiAgbGV0IGFzc29jTmFtZXNwYWNlID0gYXNzb2NGdWxsTmFtZS5uYW1lc3BhY2U7XHJcbiAgbGV0IGFzc29jU2NoZW1hID0gY29yZS5hcnJheUZpcnN0KHNjaGVtYXMsIChzY2hlbWEpID0+IHtcclxuICAgIHJldHVybiBzY2hlbWEubmFtZXNwYWNlID09PSBhc3NvY05hbWVzcGFjZTtcclxuICB9KTtcclxuICBpZiAoIWFzc29jU2NoZW1hKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgbGV0IGFzc29jTmFtZSA9IGFzc29jRnVsbE5hbWUuc2hvcnRUeXBlTmFtZTtcclxuICBsZXQgYXNzb2NzID0gYXNzb2NTY2hlbWEuYXNzb2NpYXRpb247XHJcbiAgaWYgKCFhc3NvY3MpIHJldHVybiBudWxsO1xyXG4gIGlmICghQXJyYXkuaXNBcnJheShhc3NvY3MpKSB7XHJcbiAgICBhc3NvY3MgPSBbYXNzb2NzXTtcclxuICB9XHJcbiAgbGV0IGFzc29jaWF0aW9uID0gY29yZS5hcnJheUZpcnN0KGFzc29jcywgKGFzc29jKSA9PiB7XHJcbiAgICByZXR1cm4gYXNzb2MubmFtZSA9PT0gYXNzb2NOYW1lO1xyXG4gIH0pO1xyXG4gIHJldHVybiBhc3NvY2lhdGlvbiBhcyBJQXNzb2NpYXRpb247XHJcbn1cclxuXHJcbi8vIHNjaGVtYSBpcyBvbmx5IG5lZWRlZCBmb3IgbmF2UHJvcGVydHkgdHlwZSBuYW1lXHJcbmZ1bmN0aW9uIHBhcnNlVHlwZU5hbWVXaXRoU2NoZW1hKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcsIHNjaGVtYTogYW55KSB7XHJcbiAgbGV0IHJlc3VsdCA9IE1ldGFkYXRhU3RvcmUucGFyc2VUeXBlTmFtZShlbnRpdHlUeXBlTmFtZSk7XHJcbiAgaWYgKHNjaGVtYSAmJiBzY2hlbWEuY1NwYWNlT1NwYWNlTWFwcGluZykge1xyXG4gICAgbGV0IG5zID0gZ2V0TmFtZXNwYWNlRm9yKHJlc3VsdCEuc2hvcnRUeXBlTmFtZSwgc2NoZW1hKTtcclxuICAgIGlmIChucykge1xyXG4gICAgICByZXN1bHQgPSBNZXRhZGF0YVN0b3JlLm1ha2VUeXBlSGFzaChyZXN1bHQhLnNob3J0VHlwZU5hbWUsIG5zKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblR5cGUocHJvcGVydHlUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IG1hdGNoID0gcHJvcGVydHlUeXBlLm1hdGNoKFJYX0NPTExFQ1RJT04pO1xyXG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRm9yKHNob3J0TmFtZTogc3RyaW5nLCBzY2hlbWE6IGFueSkge1xyXG4gIGxldCBuczogc3RyaW5nO1xyXG4gIGxldCBtYXBwaW5nID0gc2NoZW1hLmNTcGFjZU9TcGFjZU1hcHBpbmc7XHJcbiAgaWYgKG1hcHBpbmcpIHtcclxuICAgIGxldCBmdWxsTmFtZSA9IG1hcHBpbmdbc2NoZW1hLm5hbWVzcGFjZSArIFwiLlwiICsgc2hvcnROYW1lXTtcclxuICAgIG5zID0gZnVsbE5hbWUgJiYgZnVsbE5hbWUuc3Vic3RyKDAsIGZ1bGxOYW1lLmxlbmd0aCAtIChzaG9ydE5hbWUubGVuZ3RoICsgMSkpO1xyXG4gICAgaWYgKG5zKSByZXR1cm4gbnM7XHJcbiAgfVxyXG4gIC8vIGlmIHNjaGVtYSBkb2VzIG5vdCBhbHNvIGhhdmUgYW4gZW50aXR5VHlwZSBub2RlIHRoZW5cclxuICAvLyB0aGlzIGlzIGFuIFdlYkFwaTIgT0RhdGEgc2NoZW1hIHdoaWNoIGlzIHVzdWFsbHkgZXF1YWwgdG8gJ0RlZmF1bHQnOyB3aGljaCBpcyB1c2VsZXNzLlxyXG4gIGlmIChzY2hlbWEuZW50aXR5VHlwZSB8fCBzY2hlbWEubmFtZXNwYWNlICE9PSAnRGVmYXVsdCcpIHtcclxuICAgIHJldHVybiBzY2hlbWEubmFtZXNwYWNlO1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbmV4cG9ydCBjb25zdCBDc2RsTWV0YWRhdGFQYXJzZXIgPSB7XHJcbiAgcGFyc2U6IHBhcnNlXHJcbn07XHJcbiJdfQ==
|