From 00d0ac5dce8e14e141aaa9e140d9efafacfa3a70 Mon Sep 17 00:00:00 2001 From: elias couppe Date: Thu, 14 Dec 2023 11:38:13 +0100 Subject: [PATCH] suppression tgz beta 2 --- geoportal-access-lib-3.4.0-beta2.tgz | Bin 979587 -> 0 bytes .../package/LICENCE.md | 47 - .../package/README.md | 376 - .../package/dist/GpServices-map.js | 836 -- .../package/dist/GpServices-src.js | 10814 ---------------- .../package/dist/GpServices.js | 30 - .../package/package.json | 96 - .../package/src/Exceptions/ErrorService.js | 72 - .../package/src/Formats/GML.js | 4 - .../package/src/Formats/GML/Geometry.js | 267 - .../package/src/Formats/WKT.js | 142 - .../package/src/Formats/WPS.js | 306 - .../package/src/Formats/XLS.js | 482 - .../src/Formats/XLS/AbstractService.js | 85 - .../src/Formats/XLS/LocationUtilityService.js | 194 - .../GeocodeFilterExtension.js | 188 - .../LocationUtilityService/GeocodeRequest.js | 226 - .../ReverseGeocodeRequest.js | 177 - .../LocationUtilityService/model/Address.js | 281 - .../LocationUtilityService/model/Building.js | 26 - .../XLS/LocationUtilityService/model/Place.js | 25 - .../LocationUtilityService/model/Position.js | 180 - .../model/PostalCode.js | 21 - .../model/Preference.js | 81 - .../LocationUtilityService/model/Street.js | 22 - .../model/StreetAddress.js | 32 - .../package/src/Formats/XLS/Request.js | 113 - .../package/src/Formats/XLS/RequestHeader.js | 83 - .../package/src/Formats/XLS/RouteService.js | 312 - .../XLS/RouteService/DetermineRouteRequest.js | 211 - .../XLS/RouteService/RouteRequestExtension.js | 10 - .../XLS/RouteService/model/AvoidList.js | 37 - .../model/RouteGeometryRequest.js | 31 - .../model/RouteInstructionsRequest.js | 35 - .../XLS/RouteService/model/RouteMapRequest.js | 35 - .../XLS/RouteService/model/RoutePlan.js | 255 - .../XLS/RouteService/model/RoutePreference.js | 31 - .../XLS/RouteService/model/WayPointList.js | 58 - .../package/src/Formats/XML.js | 360 - .../package/src/Gp.js | 109 - .../package/src/Protocols/JSONP.js | 247 - .../package/src/Protocols/Protocol.js | 139 - .../package/src/Protocols/XHR.js | 423 - .../package/src/Services/Alti/Alti.js | 253 - .../Alti/Formats/AltiResponseReader.js | 391 - .../Alti/Request/AltiRequestFactory.js | 130 - .../Services/Alti/Request/AltiRequestREST.js | 209 - .../Services/Alti/Request/AltiRequestWPS.js | 113 - .../Request/model/AltiElevationRequest.js | 108 - .../Alti/Request/model/AltiProfilRequest.js | 106 - .../Alti/Request/model/AltiRequest.js | 220 - .../Alti/Response/AltiResponseFactory.js | 188 - .../Alti/Response/model/AltiResponse.js | 23 - .../Services/Alti/Response/model/Elevation.js | 27 - .../Services/Alti/Response/model/Measure.js | 30 - .../src/Services/AutoComplete/AutoComplete.js | 227 - .../Response/AutoCompleteResponseFactory.js | 142 - .../Response/model/AutoCompleteResponse.js | 23 - .../Response/model/SuggestedLocation.js | 123 - .../package/src/Services/CommonService.js | 493 - .../package/src/Services/Config/Config.js | 310 - .../src/Services/Config/ConfigInterface.js | 319 - .../package/src/Services/DefaultUrlService.js | 295 - .../Geocode/Formats/GeocodeResponseParser.js | 134 - .../package/src/Services/Geocode/Geocode.js | 281 - .../Geocode/Request/GeocodeLocation.js | 48 - .../Geocode/Request/GeocodeRequestFactory.js | 54 - .../Geocode/Request/GeocodeRequestREST.js | 87 - .../Geocode/Request/model/CadastralParcel.js | 60 - .../Geocode/Request/model/GeocodeParamREST.js | 175 - .../Request/model/PositionOfInterest.js | 55 - .../Geocode/Request/model/StreetAddress.js | 56 - .../Response/GeocodeResponseFactory.js | 86 - .../Geocode/Response/model/GeocodeResponse.js | 24 - .../Response/model/GeocodedLocation.js | 77 - .../src/Services/Geocode/ReverseGeocode.js | 341 - .../Formats/ProcessIsoCurveResponseReader.js | 284 - .../ProcessIsoCurve/ProcessIsoCurve.js | 323 - .../Request/ProcessIsoCurveRequest.js | 190 - .../Request/model/ProcessIsoCurveParam.js | 202 - .../ProcessIsoCurveResponseFactory.js | 106 - .../Response/model/ProcessIsoCurveResponse.js | 45 - .../Route/Request/RouteRequestFactory.js | 86 - .../Route/Request/RouteRequestREST.js | 102 - .../Route/Request/model/RouteParamREST.js | 242 - .../Route/Response/RouteResponseFactory.js | 247 - .../Route/Response/model/RouteInstruction.js | 48 - .../Route/Response/model/RouteResponse.js | 40 - .../package/src/Services/Route/Route.js | 328 - .../package/src/Services/Services.js | 290 - .../package/src/Utils/Helper.js | 117 - .../package/src/Utils/LoggerByDefault.js | 21 - .../package/src/Utils/MessagesResources.js | 78 - 93 files changed, 25456 deletions(-) delete mode 100644 geoportal-access-lib-3.4.0-beta2.tgz delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/LICENCE.md delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/README.md delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/package.json delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Exceptions/ErrorService.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/GML.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/GML/Geometry.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/DetermineRouteRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Gp.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js delete mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js diff --git a/geoportal-access-lib-3.4.0-beta2.tgz b/geoportal-access-lib-3.4.0-beta2.tgz deleted file mode 100644 index 423870372041599c9e264c6ab2763dd1d1e8b56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979587 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

owBOoz&*9<5XP`L5LF1vJb0IQtf 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%0D?Y3OSq+P(?Qe=q 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�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 z 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

cq)V4#MVrz6U|>v{q@5Z_ytnS_ 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

pwc*HMT*O5Ma~9 z(17o>2uWHV$2lecR#Qe`XZE_OB6;6Dzh46KO7l-Gry%LFXAA*;U*k42?bIXmNsJ>I zt=@-lP5m;MJY7Byao(F-*t}g$HQI)sIYG`Z{xo?xS~Iq1C-tO$V)@m5h{83YpVu{* zf7)zL;_}F-z>iNUiy@=ussf4GMI&x_h~AXW-_|GE6lTXHo8q7IeKsWlZ9K!dx({^mOR6PH^Z#;JuCKomb%^!a?>5QyB|KV;)dut*^5 zikw$1SCZNY&1cGWmmb_WN0g_V4;xc1u~C#MNC-Ln#{~S~;3>9^mv_}TJUfts{-YI8OWpALIvl0OXkqpYzFpFSD! zs;c9(-dD#`wSCMUCGc~l#&ycM2z#^_>~ey!L$o2ub=I7S-UgVk;e6jKB(3^ z=!5n-!=U1Sdhr~#&UeSH$3kL?^+nekTbwBn`?iDQKw@Mns`kbgTiSzuGnNdG4;=NiH=O*~y0boIkPkefiqQCMfG+_!^7p`(u4-;=F_Fq9ueleyXLHN8k)O-{ebL7@6E*(0zWd@qD&xSAZ&Dmx%PRhu%)ofD$lv(<(RTBg93pn9u61tRG4ULhyZmJ%8@1M^{B|DO zk-Wwn9v$OVE`xtRCZ%vaQ%0W+!!- zEwlkP)1%yaR|91HaLGp3I%k6A-uk#gGv&$dM8C8MzB6Nv8Y?eEKS zrQPS=S)h57i72x07+Xa&g z&mCnZdbe!%F6zU6u{~_yvkUC2#z^mMhqoMEm!S(2bIC%m(3B7fyxYD0b%x(vww#5D zh`~vX5aSsW6+`^pz8N8s@gDOj72I<#3ai!jjh#d`EwiH`o6w4wwHT|`VlXv^h>+Yv zMwp_Fj3`u}0kW#NOj~UwKf!tx%8r9_D6+NP{Q44;81!4q?9_04>?;z&@e%eY+bY7? zo;INVD`b$8&X%RF2g$?=^A*2wq~c+{kazS>eh<2{t=JN?oyW|iGBJd(DR^hVu2xbz z4~>iK>t8#yMSp73xf^2ik#yrG>u{DGFO6Q%c6zr3>9qY#1lvO!>W*h%?sH)>r1)7b zkR_KweJ94Aaxy`IoubD^!N>}F=vFC?JNYtBajVQ-U=`WB<(S4I~ohfG9lO|_Q+yXDqtJdpe>Q9KJ%bAku@H4u~=OP`ch(I z>LlI1SbOK+QXD}&VV1J-A@~3bvwAy6{WUH$825W9D*^KgjA3MkDneUzOG8SJW0o;T zAFW+80sK7m)uR`T~)* zoxapQ(3T5gOxk%Yc>OMp&HS%0M&rncw0(2M#xtG`Gj4wcTe4PI?{e6uhwT~UT?AP+ zG=~-Pi$PYfXfcKpxgAhG&=*397qUVc_ItN)_jbGv*xtqR0-3ppDe#)>kiytQtOJz3 zPWBtmt|4oJjf_{e`de*b7HzQoDJ7pK*j$0OUV^sjCqWkK%W&CYPQZC3HDKczY-d&2 zTs&L3(-Fm;+WhK`(vGZO4LVmPHHfw^E95>_h-mHCHZpwF3t~NYdbJM<=ythXJlv5?sxG#Av_zvoK8MQ7v$E$ z->rAbd+|Qa!)-hxnqKz{Hs~>%lf-lQ&QRrTkyk1Ka_j~P@x5>3dBy>?V=CNsM~rtE zOOt+gIOJ?ij0GSkF>u)NVWpX&v&GErY-fU<4BmY}+uch(fc;c;ti|SM;eVkGo#A-F zy7oGz9mYKAG6gZ)EZGhmzi890W>Jh8Ww4oS4kp_dACOODgPv3!H!axfKInYC(_r($ z&QxTEag`9Pno;8w8QO@=GizQ;b3mQV4cnP(2VI|}W+Mw3+GBanaM>|Mdu2_Sdm6Tt zy_!kv8#A0+`WI!iiNqR8%#8RRlOe!z0__0pcc`7zavNE5WOgxal`&4S`XV{on_pj^H>&|87v!7GZW0Y(Dx>NwgzqYnV=En>16A*&B-XH1X&A^LN8 zw*uD!#Ogw9m1S7VfGiucGa8|<%EnABVGz?L>BERK7O&73f_V$u7G$$+Zr?ZD2JHEJ zbnjsRb0^v-pWT`E7*k+qpQvmw+GP*d)qMR!EPTk~C9PEibD6}Dyw%$)+ag9kn3oG% zl|h-cxoy~ZZw21Tnsc+**xrucZphAe9_KKI;*|@xZ#L!KqdG6)_$=C5d$L6q7-IBc z%x7*LLH84O3+yv8pH*8|+v@d|Q_8;GlnRNxDv$530x_lK9a^zw z3T;n@>=m+>$8~6TwN2#v4gp5dox);w5qJD)8&mM7i770QmNDRrL(-A#o~^~ZAnMvv z^Uw9}d;#_O3Fot0WPB{-jg7 zJCWz?ak9)3V=dG5ihE}c*+s?Q)Gja|oA6mehEab!Mrnszp9}*YYpw8mcG#|+xSt)` zV{}BuS7DcL;8AHTGwX5&R4+!87Uh7AkN1+JJDwKSBPqPch-}hx={}(+AF<30N7DSt z*VJXas~2Q^41W*pW_Y}`nUdnypl=DZlS4l{DP#Nf@{YJ47|s^>Su)K+Z4y(Y%6Tt6oWutYMk+OSTL&P0(TkLn9ra%;bV6zt=Vd(!iF5|pLwrayEBui zx?owfnj=_)V;s4hqA_@QybGrG`w-ULdR;4LT3Wi+)M~9}J5_YosCf5ohOvf;%EIok zsc%FKM$F+tfBkkFo{i*ngpifBMN0BVSeFhH>lKXa+iM*e@Z9wl_Y2s) z)VOLp^Ilo}j%Zlh(fIYs7wb4>eR6c2{Sams1A6bq3L_Y~`STK%!`DgmHQq@zb|a}S z{9fp+>euTjvdZ7EycXE5)oTY?vERZx%-Pd*LtZ6qa=@#FjmA%-V(nlr;0*S|>n zaJK9Nx^{peUDi21cN}Hvrn=_XybC_+z7Fg3UUw4eGs4;u$Ni#|?S=bEynR6LV2&{3 zdiLrEoPUqW;O{@l*A44`)<&AM?Y0i*dz>l!Gs-_!wie;<`22$~zvDpLN3fBnLdHYH z*arC-ZcDh|{R|r^WW4jrDvt*j!vkYIeC&X}JAI7jhU?b2H%(vOhRCe8^(l5SFz$W| zTaWwgfE4o!==6bi*HLZ#BwKOeVeC|9!;|f3#2Vkf7j(!Ume$LX4217<6}5-9wyux+ z#*zIqQ|juQzZ0SJZA9Ht;kMczhf7^RTdy%@rWHoEIB$iz2)^D-saNwN4 z9vX)cZHqBxU(7HbM`fOb2TE=f@#2(M2kNdF&^kF~K2MfWBI&FRotslpO zYJi;mc7J0`(|fX!#<1aqueXD2m3hgb!tn##=-p-SZkH{!97B6F9PQ2 zy*RswXT_jhoI#;H>Lpi4*C4%_wipx|?m1T+7yX&$o{PLGF#NDe)+v>3w zR}d!DrLUL*an^% zh@&3E*r&a2Is-|%jpH>p>`iTZFurEzI-40cE6mEC;UY^Mq>eg;t*BYCrs z$GF=gj*%1WKb{c?i?VdwUiWpZ0_umq|WDWQ9!RMO{Z@jh;_a-9SR;RHHW#&e0Eq{ga z*Dcit^>#B1>Zxg9kc!t5nMeXOjc%VC{vADMqWA$vYbk0VNJ%*eQ2wU%|=Y)d!K8B?UoG%Lc z1nN7Lki8`jKNWSH+t2X#yuN|5JdD{e**Na1kjWR1<#(PWy*YTdDgbIgmA}FtxI7rU z;`7y-^ea1JK1epR?stu$|6bco{_R@DZ^qa{E#J2L<$7GZZ%?#VJD0wNdHlZ7PSmwL z+kf|+vElVf*;bL=kLwEz=B(%M(3;bZBQ`C&r>B)SgNyq3c3c|Y*FSua5wj60n?rE_ zI7Z&`nQp&3KR-V^cb3Mvpi({O7~JCX?7{gsd-3Z1H{YCp|NZypvEN?37Jt5oNXhv( z&O_-qAio#yAcJqe|GfXc{r=-Ou^8qOd!`sM%mwoJ_?eQNV{JIlxr3Yw$Q5b6b0N^_ z1#GXEf?wh#!!v&!hKVl!i2M%YrS%C(>Av~q#oDoA$lz$KUcCRt+UWMn7a{MSEnkLY z`$~mpA5R4=JHqongO(R*SAu1~#FjWaJ7@n-xt{xS#WFu~%?W)074F4han&AeAWg|3 zVEaR|o(J=iB|K57Fqtbi`#+EJ$l^R2->qksOxf{$>?K!5i3NpeMl4ik*&9UM7z-gk zKI3nn9Z0-bjyF0h{ruw$8#DA}LDb;!MU%m}*9|MSo*_{Y`36O|e#EKbn=yV6!-vzm|Ql!Vt9*baSk4enqConDXmsP$c`3YlM zl7A6&Me=WcW+U$*CzuezE-eR#!-w!52;+{Rq{Mi}(!NrwiS=ZJ5@%;#p`yJQjgu4m zdy_a|e~ZZ!GmOleij-*FRS^Vd1(d?5!#sMAuf*>is>Uu2nL_XVbHwZK-myx&g3Lui zlo%OOp%o-fNu+uG`)|@K(;Z|5&xw-bi55p?;}C@@w3n1UvJoLG3D1{x&C6E`PoBy} z{qY5T#&|-}i?NqW$T5sUR6A*ELQ4LE-tJ&B|ayQBTQuTH5fnCUi&xV|46uT zDD`eW{njY-*uC!*;yc{!>xt@qIPNy_t|9JoR0-SRP&(p!VE!ucYq;k%h`)lxzwz&u z^f&pQ(s#T^$$1g>ux5>OP6FhyNMXDzz-Pc@XkuK6Fe!@V4f*D7T^o2N3h&%|{0rj% zmxCKq5_iDKPo3i3X1oh$?hzxSj+ixssgW1Br--SM8N?Y@OQXf`q0C(USvV~mFDFwe z<`LWDu|D=Nsv6x&kUG z$8o9z?!SaJ$K#b+G1jhCzP3C!@buVBR1c8zO+ zvnbNY7*cbk4dIhxF4~z!XK}3^;xF*w!c&@VnPbDH1+F9E8x3+LhHo_XaF`mMnhtd? zFx}_eGKDs-55JgQ`x4kSPsOi^v{y3LO9&nduD!K<7*0xU*LP#I0uMxui{6Z{<{k!& zt=z#IbkY+OF(nS+#+;1f(O!F8JgEbF8@78c(U{sv+>dqd9L?w~_@R9fzULNsmuG=} zXiWP!cMMI$Zh&_7;w;L$R|CQQQ(#;|-g~$QP>bW;(w=me=h#_FjOR=HcN5S9#Q31S zJNFJR;>w^tBxqK?km0t zmcjQDTZ@qN?w(m#y3o6`Qf!mzc`xnLvpZ^}BN!J<42sX)N0VjY=i#~-Bg8nB62JUa zy*I#PgX7D!FORgUJACgG`bEY<2-)ZG?uT(5q!_)jpA&t)lJ<+a-3hs$AzfvWzxM5+KUY8LcW}DC+c%4|Iqthr4I8e=`1(x%hZ~FU+^XyaV|IfPLolZ za6Yo4$g}F{K=x{mdp)RcB`tU!#dl7PwUL(=>MP_8__u*`U4i?4MR%TD1l!d;>+Sl& z%6VY1&pOpEIi}h~%y$Rp5vm_?jES{NbC68O(Vs5O;-3@qJr*+kGLc{&E&Kd1@N;9p zT!1eU0RC_E_n#g8eGa$j=>iAx4T>Ci5H?U?!9 zcr~6`OC9ROLg6f|O!UUqELO<1q@XzGR!1xJycjqNqY#EaD-PY5uUY7vW#vVnzYmE% z^Pud@v$Hd*2@C&z9~Opp1Fk`#ebHCqLH=h%TdBc#C{ZeuhX+5t_&F=O1ZlcM_E28F z`bDIta3}E_$HtHdS*+*xA!)p@rx)~Wfhvi>XGkfMVt{7NX7g2Sz{s#IGX@%>yTR-; zAgSB6BfC*xx8~vE?9bH7F72 zcd^;pwqL6mDGK(I2K*~21F7fVh3HaLW)h)2w^(QDw$cgPBw;aoY1bq?q%X6fd*S$x zFFw9_&zg`_k_WYwt`#)(k`cAPySgjIxKR^(Uu4N0v0?Fy`9|HeP;^P&I$4Nvc!{XS z?5~&NwR;$jFY(Eu14_F4?jq|98>{#m%a4!_?P$M364dv8{xh0 zDp2ePY{b7%E3yZ_c?9$B8}qYC><4)7!^ao!IX~N|TO>5zmHM73yMVYgbm;N7A5aL# z(wD{vO8CoPPI!B1ZLFnZ!RS7|*Q2IKBM08!*bHp-P^rquA{F~9)mq-X3A5?J#J=61 z;0s@IBZ%gM|CC)IicHcDP_mxrw~SMEfZW{|g|+<|tnV7$nrnM(-bb0{XLOsJ?a=Vu zA6Rv|?BibKg-2sZE*bHLvxXnuHF8(PRL2B6B}{en(2VO8A=D`9KW-I>sW+~& zSTk0PSwm)MzE~7)S-Ba;NUSncdJM=OJD#TQ0M-1gZHL)_^ThPXnFy5jJe>{LWjLaK z(zuMboZX5sYUFbgbBkaZlvpVZ%D);fsjL^QEz03LpV&UOS_jTX!gfqE{vA`XbIBPd zi78?%F~ne5bIve%6RzV_=7Y2|$JudeH2(O`ZHDsJCe%L_!BphwJl`o~eaLp!M#}DJ zEATGgsml`U+RWP#l-WD3e2m|iZ%Qy%HiRy+T|SkWsId#}d&ZdN?n;W?LcR;BFu`J7 zkkwIohGj^MO%0b}ir&pByO~Xe{fpPj&a3&&)%<+BvMtVj&Dwga+81O^OEfaRU0uGr z&X^t<6IWh+$7A63vBGhtFp2rgV_D|Ax6)4UZJQW?^7U|*8pZ~dRoKXEq1Vl}#4^jC zO%+zKWLq#baW-Z4jOYD?bZDy;cIY?FtYTY`Jx|)9t~xhpbDJw=R~~F`NL`WDosUzg z&G>G6QS1yiIn$-wF1^DxTQ1{Hlp*c#?>u%Lm6?V!b>=yfT97FvF?aNKAM#seX-=Nn z4)`2zkmbU-C_hvZ(r&1`d)wZ4yP@f*U5T}hx94W$3%I^qJ()%X<+YhDz3J@AGJA>G z#R;;O;J<_hKG!42z9dCa7h53D~jq#Me zKtWbe_VHAF?*bV`>NC2j(0REo1z0tWGHsV^_#~Puc{n%ej9up@BIEVdde~M0d|7yxpALw+wc+lF-ef^v#(XzlAcuN4=yrOyKQcMGE$(v4 zyPA<}2N`KnzIm&nA3SwOQ|Q`fBVqc+FSLPeihQ4jgz7up5wf!g>0!-d3_&k1N_j$t zlXe!P^6}~87;j^x)`N@sus0PqjkHOLP^5G6PV-uAA3vI+cByw=w9^Sgr_ZRjg96AA zftx^a9oJ<$`36cj%4<89Z-TEP-83OoGY_@uAiC>(i0I5_furY3rzGf{OUiwu_L) z=UArGXg_kH@dVEiUKqBhZSj9gzKlIQR) zn-Osl7Xk7XY~{_)i8x_Fr#&`UwveNfw9PQ|60*P235Nq{HC{X?>rg+HZRRJPf`}sZ z@e)t0RHn}GW(WS%10p0}ElY*BYx5y^szXH;U^X+@4=ML1W=ot>!;>)L7N2Cd5INV6 z{!kJ~oJkE?LFNL9^Q3aJIgVTkV+VX9L}tgEe$P7j5`s)In5N^5y}+J?oG=O?RQYfF zdt;GKOrB%ipxuL~Rl?DGzy{=D4jcIp8QeJEp%XDtX%tkLdw#;H-yJbuyC4|;qECQ+ z#T$`_?|wb=XiVg8{1>?;`Gg}fk%D}wdy@Y>Did|`Y&~?|j3ZwVYZj+@GBCy-U7d>1|+oxt^VToP&;9xQ99Do2!zi9ppImu!Wng@2JJW zQwwgQ6VEJo2XvlyV&N;E{CMIS53eTf2@iFv{g!uxHDfvknzdxAWk}hbN&D$kws&~O ze;<#Z)?immxgMh^`p|OwNzNi-?>78t#MbShmxDXE&)m25`c-}L!vPtj_J}+xpd1dM ztmx({<_nq$N~|w#zfLZqN9V!k?YM$Q*_YMPjKdMK7yiRfN z9J_~Rpq&;l=P11=of1KVCqFtH>CWwTb_c1f$%LP?eX+$jFGu%(!qSa&=R}O$l0`#Wy)~_iE3ZF^ib^ zR)V)5;wC?6ZO8nZiQ(7ZW|ObK!Gx2TUO3js0WsigrismU66Ok5#01zV+VSXQ)6~R^ zPCxp)fROlb%FV0Vp-=t0H|tk1vg|-LYYJFm%N%$P0ELRN=iK;jK$ZjF0Zkgl&(-Nb z=afS|TP)1=7iqDn>O`A(tK^e`WgRS9IYu!gicw&qH2L^R+S$gb6Pk)6@c~s2=PQ5o zN>ar56v}=6`NeB#m3OMB51cj>)kUYZT@AC_a{8Eckb`v@3%9bt;hFAweyie3@+|MFFNefRqPqP=pR1wHM1`RClsf3?hS*-R8*7QN)drQ$X+7Gj0PJ8>tuH z$qWS8zLx1Q#wJtESjS<;yM&_J24$%y7)B#2d2%%HD3iKpO&b}3pJp(Q6lO-ktZV&F zU9{KgcQ8x)NQpp<_L>x(lk6_|J=wg^#t^pAT=u#&?t8miBO6Tse*Sl`tz`Ct@YyF@M>|(%HZq04#)a9Gq3xp?*wK&; zl(2v4z_U)fF53u2m7oX_^|faAQ((41+%AmUVP56yij80`-C*`}*>ADoRN9+`Y_Lhi|q^-|cevN^a1{KeRN))F#<{wKEMJpFl$x zB}Upcs_)twu2WUN2cJDzhWaPkaK`lw5nYu2`8&haXv7d>Q|Fr5vGyZ&(Yg(tY6Cjd z#@}fQn?hDb?Z2b<-`8vdVUC~P2ep$A*+vHA=!`DH^S-fh`<+W?+XNp`XsYus^(`oJQ+uJGU(o5`M2Gt4zkV z<78IhGr&JZ*!qIEq?b7%PdIJ`>|}RYN!I*mos?dO+vW?qO~K!3ys#EE8**VMUV!;D zEXEU$vbjpp&XFzkE#n8_wp5#Ot6dUy^SZq^w%KO3=N%zCU55Lnq)SFesvR-edK0dd zH6L30`kaOAnbB7Hv6hQl4^i2}_?lSP`aCjyp^bL8<3JX&vVN#+l!pcW2;9b3h53TOK_ab zXhU9Ymoy!K%~g+Vlk0JF18ZDuvr>e%I+`8zOzLNhhPj=z^chj)a%3*K{9trqVidHF zms8<&#&SIq|6=fFq+ZAMuX3EM)Zx~A8aRy^GCCNQWpgeh;%MJgM9r_S#&@L=r6joA-eG2RfX z3l{{fDX^M|Gu1~$m#@rUq?NC#ep}KH0pE2Z?^GSA9`UuQA2o7Mgd1fe>Bj)2NuN&U7dFa;->c&_$K+#${z96Lin5}molT_l zh?n}f%awvbd*{gfr03_Fz83g0QGN71i$*;y=YoCmzT>vVnjm^=i*puEPi9`0Nq=h?RgljtKyzKT9fLX%)s5P2Ir*B6KOMD zNvH4})K?-}s%N6VukX{I{!e=J%}W8)Q7!pb=cD~nrF1Ejj9d!-hNHF@g`p=8Ho|#9;m(&l<_GZAF+N*VZV!3;EUkF z95LFru0GpH_l(|eL;fJEIA4=+MjkyIY4-h1F8l6AiwcSUMm*j@k@-A`I0)z;q|-qm znu#wGGXeXMnTnLGe^0iX->>e(pnIu4Ms;lN=>sJrl4qm$Iz^(fG|<;v&s-Wr9p&&v z>jJL#fIXa9P{xc3YwM$h+M>a%x0u&4)_175Ew__nueKqgOx^$NTtrf{bGPIX2oh#-3tr z?cvj@W;&Ge0OgmBwg=>IZ;Ur&j}J0#3m&#P%Jas4fCnJ0deBz3Uuhj%%Yn&=cyIg96&X)Vu-eAUnp|WpS@SCx3We zzg{43TIqh7MfFF2-TnF=q`l|$I|;I0?uTEkd}xo6(&`FXC1e-3zfrO{K5X_M2U!Tb z9QhXWeJ+h zDUgoTNog6yRbCON_j4cKAOn14-4s(JE0-a=rps9Q;`1!>1<=dmGMx5;Oz2ZQJ1A## z`cKBklZaV=&xVcHhqdR&@PxFI5f<&b%8aKD=TC<-y5GBw+3%HdJ-OErdq~AbF2YZ6 zZb7$BS?S@-iSuPgJww@#;@)-u{lsObwNY>4eWR|@j`lyh49V#D7#bRF`Jp`l>h;ea z$Dl}ja@SlzpP3Nv9zT;lV6RfxjjutmkbF8#$UVw8;KN(OzH9gTl6_@2;zd1IVlfc5 z?~$I*4}`u&`>3hp$$QY{CRp~vJv)C3>C|$4+Ijh0i9><1s|2{9_z`HY3Aj0Cdjrzr zBk~CCJ%L{vk7jNZr)MmXPR+ED**I1SUu}Tpy8ErUKu-kP!SU}GM?kSlKL73+HZ}+0 ze{viFmS{AHO2B^q&gqu-izKiMl;16sz&}GQf&7EzFlWqP$X}S_^P8gy1ns_2+f{=J zY$)>2ntY=`j%5BXA-cRqSBS;4b8sBK;qAVOZFg%fj;%G75ixf%k(HTT&4yopn|}Rm z0UfY>(o~WB+7e&?9sSFe?t+p{C%V{~@joq9wc6W1SE}j-M`c3GDZMc78?i5ZYc>x(noXN4i&6uJ9XeJ_Vu9~ED<5)gmal^`YtGEP(Qqq)2QzboRcfGDyz*0K zG4Lsr24zclK7-JcCLDZF`{AInt`6xVI(n@J1+&0v2Rg)YF(xW6O;9z~EVK(IwD|fP zqYx#E%MX7Ek_3d(BOs-;b6+GW1c2z7ycc;%laeoSd|aiEhh^R!eReGwT{ICpBg+Ip~N zAP}aeyCi|>2>79$>D_Go^*3_LRx+#vZ6T54YCM#cQ1&dAA(H;@Kp**TE`QxBUDc36 zVsY|a$)(vaHj_&_nZ#)?l)BY?g8lqUlz?`TkRAXd#A*I>rugqTy)5sPI*H$T0)w@# z&K-Ly)gU=5+6-#5$0sb9Ag=zzP7#UL?~}Gh)k*)sJhhLqcpBvC`Lb*Gc$3_32l;=^ zY4uI@ynK7bGN-J1os@@JQ#$Li8r3;m53Le;-dglNmX;FueBA3cMm(zw&s$6$+3Q}{ z4qzb9>+Hw^7+L0<7&r~(Jue&b;-=pNHPg+cao0OCmirHs>HTvzmannwfI}M}Uq;aJ)ExS{@#oJ8gNuL^77g-jK`F7@R z%4nlKdzL44HOaj%n)EL1vFs$>GWU@4Lu%R&TI9Bw*d74bRj+A$ogCNW=^(+Crg~yPoKOolJ7&_SjrryHqnsgacxkRjkV@A zMmTHcpVKzYVMBP@$t*<7dq(wYC7jt~hP%2E@myBD7tgnO2lu2Ww~_^_&9f^R(wZOf z^|_HhRy_eO;B(s0J;}H?9GkOhz6`uA%f0%HrZzv+W;N3&Xwe)lnmN{HhqnpOX+2)0 zn1@bX%eG@FG>6_e8m%$w{}g(l3~3!VZ+-m4Y)=h^pC}%cgfH|I^x(Ir(x;s-qX(?+ zk*(2NB)f}R_Ez)cYD!wy#!6#M&+{!;je22U^Nd=7CyM6Dai2tw;u`QXYP&Pa>GOS( z)98ue{ix9%ZpC|Rt>Zn&FlMOU;{lG-^IRE?Md18Zh>Cz8bEhe`>EbELZ8&K2ywmB zDE63_M+P%B;vduT&{7EWI?80y!0a`Yu~D&(k@ZR!**nbS(0_k5ANW^u&}rAD3j?j~ z*8MKiu}gW1mNUG6dq&asLAP6D)*QQYJnZCCRo3R&tT8E&XN1%AG;11+rex!I^V@WF zZjRDobIB)0-Oe zL9wA)jh@bz4=3PZz2_{DNDmF&=en45HPH;{D z&lwe$n_$$kDhW8GWmh!25{EyqG!%4RI-keAAK9s0Woow=F)Q{R%wzk=xTTDz>$A5y zjAWH?HxQW|!u5H^CsuAAXVuO3&tXgHc(1O&^9ScGPhLMPvraaS_F^opS-tCK)RJGZ z+|j%N1l~4Sl#&&c;@uG1--j(nR7)8NOKg9!*3-f|b+d&wT5xUdQ_lc%&(Z60T(7NJp=!R&1m?o8;c?_n#hxV+(KfzVzq`LG@L$@#8zC@cmy(wmm4F8l}b zq)?l)Y+;r2&qALqa=my`m;yMX=$UlC3((u3z3T1R zJ<&nFUxvL(K|VV_+0Or)Pw+qi4%%lf09QO=DDR zV7rpnWCM8^hw}|{8P8jy8OXGG@M@_ZWe2QoTbE3)(Jg&Xm`fL4e`fRga%}`ic-u*q(gY5w1zhinZW<@D&@@8Zz zNI}N``fr{)9g9pR0-OJv2e8-7DaEr_2VWAKYw|Gn#h3;{udp3=ddJf_B<@GfG~u($ z@SBx)2;f?dd&kmDEiuEwVn`-Y3AEvoR)ctLK7b)Bd8m|3S}ey1Pit`aFLBnP{L`** zK>qbhLZp~LBg){rNo@qJPt6G+)FcC(ZT6>%px{XWK{3dJmC zF*Nn~mf;wUwQ(a`Z}szPEG#?U3&mLzw?$e^S{}m-ZwmU%N}ydR>Nk#-cH<~41?t+( zxP8guYCYtXn7M^sGVfpIsjcVU3Sd5IZ;*>Sp>6LMV@rusq0}7?c&_T4V`4xH#?by5^o|{BS(0;(MSI& zFBo&=HXx=9YaiN811uvRTk6P!v4W<^wYJ*C?%c1?pBmtv+Y_D({h~p>&ep_EvD1X? zUEj^B+8)oHjK&B63?lNr}(%78(^$} zbT794uDD2QehfVIh=t+1#^d7j!+Z<}-PVSD@PdDD%LTtH4?1syb{$jh;|)7$e)EIz zB}TB`;%{zR-_hr9hYJ1sY!0Nx^`GMNw-J>8mOg(>rEP+0iR zCbV04Ys}`!_5}D18rIV0hBa_djIU=vd|whWQRR;bkvT3wSw5AXhoJaRSyDlV68<{= z5&*Dfvjy~KV)9>q4UZ;=;eJG}Hqu1{^_~5Wq|yV_gGOvl6Fh(3!RrnA?0CV%+(Sn# zRQ(Td6BLt7kCn8<;{;2jcd!xA2|Bg37_=i$>BL6h%+7G#sSl#zS3&(EXn4QO($`K`OG66DGgw~+05q-dxyzXrkq`4V>k@1Ei2lyjo3JdrLsQIkgih zF@C~e6bRuEM^kpT1auEpNH_qD@6Rk3I=FM#u8uW~+*8PuVMa{UflQrII%6PxuHMez|afh&=bkd6^K2 z$8e8myEivLo3I@w*Tk2!xLy*O2kY-oP>^lP;_^r)PWAp7g;38;m1YiQ30S&I)5`(J zq*Aa@mO17=$lfzb(OQ6&B3~o1(90Z>k$5_q0spE|Po?S2%%>7S)3gR*>^l9rQLa;a+s9g2b#NPN=&Vb0*6ZW>nf5^Aa12Bk! z>v(o#%mJH8aDsMO0>&qd*LV4NW4Tmls3--ILRVAgY{0;w0~wR^FZ3D3G_pu*Carp) zPIH;K$HRkxKU)kKLouf_pxVXj1Re3vVuw;Q&!#$u07^2Mgzl--z3V%N8VF~L#cXQ3 zzE56n3@h5B00%bwa&KId7Yj4ogr!czjk9t+kIxc&-y9)Ty>f;KRO;s!2Z!oHa27MQ zFe6V?)9Rz(lIb6E39w5TF}sK-)l;ku`s1OZv>GwHs1K7Me(CuL|AKggQM~o+J^F&&!LvV_>LkLB(oYnxd;BAbeh?B?W4vT#{zIL zzN($c9t&$#w3xt{ke;1aVz0VqGm7TZtDD(j`u!V=*r_$+26yw8nSvA9-a=XTJ-anu&$G>e!kL7PL&y@0r(*r0gM%3{Ou zu~R(lluOp(IQH%cWKVtA>omsXHM<`B6xR@N+V2?2QqjP;#VercFyV zhwCOy_aJm{k!5-Yn{R>{XxNAGAF(y9w__s><2ioOm;-HMzJe6R;Z8%FFqYnw;}^Y4 zfaV4l-h42zpq}9>c}#{^>YYYz4ty!K#PtQRAbq-+n}k^x&K14^{2({O+!T6@LwAPb zBiPGFWv|z{hc)X>`b~>+O7OUtWR2X%=M!U1Jdk@@lv9lNl-F#{S9I9sIL|!3I*(f% zyY}B+YW0!;?_ALJXM(*Dq4$+KF4X_*V!^M|ozaZiXydcI^ga;na@wy)+C{#hwh8kM z^ugMy<9C*u1@LwD`EoJ>xlr?3Q)Agfukua?)_Ik+iTta`_!Z(aSi_mrpi@RK5}4Qi zoi#}@KJ2OOdU(&|spDw2Gp$CuJ)~zwfF};?XPg^xufi>z>rxJkPbL5x#uEozH#Xs# z=7`fmUFD-7Gw_~VEsHWH3AB5Tdbz9v&jR@PSf-#G!`gO`AG31p0qqIArB-fY93y{j zOgwK;Y&`O^z_%N042(DXJ<1z|cl+(3$d=%IG2Y%881k68o1c@(+>pF7%1VZ3JG z`C}9FIKkWurgcHLxSs;v<2?cn$$DHJtJy(MxyBsytx-@%k*_&ztU4`B`W||_fR4o1 zoshMlI~8&Lfeh?eE5v`5^1@`oyZ~hW`*7VWA^U*WPX!KY=NOOK)7CulcandcUIm=( zw88H@mHzXTXGP;LgUQJf=w~_TqUWFBFN`)ozMv--%mdveqfDW-Q_ zUzYYV?NzL9>}}6arR~$7a|f>J;n8@|uoghqu$U!pLABu-S&FTXdcH8!^L>$?w1W9e zq8`C=kUgNjgf;*p)f21Yg>wnXShPH*x1wKT&ZZ4HSTtR6OF66ffOZL4`vUdoa*A|r z%u8~l#Wm-B(^*8UHy6L79|igr#!v^@Q@nq-C6B}v%5&iz)Js2%KsJ-bxtd=^onLsa zc@%Q}KG+8sF>&zuShwYH(fcR``C{VdcWWM(@Z4W*pw%bX7N~uHcgy3A_wP?PE>NvX zpKVL9kLf_Dqi0(R{1XHNW&yrJ@lU@k6mV=v)o4K7P=Wuf7{K2(0PvH8n5FlC_`Akg zX1Cir;XK*}r`AqvNMfzT9*}W5X)nB;&>ioBF49&kgppEvK*{5*2N7NAC-=wL3~^>V z#4>z)Y_nSOh8_LXBFFU}P9jf=JXdI!uOZ*^zD;I@-QDHw-VR@}! z>;nsQs{bcU&HjzVB5jK;W$YcD%YKo=*0p>c#4E(x*oHxp%9B0 z8r2nng@Itc{-33EdH`HPvmRi_1O80WvcLXqxq$D^RK#I?EnE8f+nqCAt{jgA-lb^B zXw~B^6C!?bD1dQL7x0b|&oP*}6U1|cUV=_}-J2Poups^;M@ujl?1A&Jbf&gX26Xa5 zUgLpZHeK863X5Wtw<}<{KmYoh<=$X0az9}Plk)1%ghEklB=qs4H8haXu}4%$Tk?D%-$e8PTmNF;v) z%J*0Ex%c%qTvaA8bT$-LaKYBC1r%kW!QpJ>vsJR-=29#^IVK6PW~(`lA6j|?3atZe zeEs)?4JdM_?m}JYG#uA+X>gpiU~%(ywn9>ZY6`bdrmEs>U_&AH12SOZ&NLb zAnP|3i2M}r{yMP{8_XCBzexkF{ecM?GI2ZvrcmrbU`!P$a5nIRXS!_}d(JJlctd3N z#lCZcF+SGqi^_LkkRxHai8P;|z^Ht|qs-4FPJq`VWsgi0NY2d-G_nd&zD9(5El+3> zXB}7_EHlKi`=dEueEnM-rxS}e9&Tp9lt4p8{K6?8U%9~f$-MN}oV&0*=huomby&Fk zU$1B0dN`XNM0?{dm&EV>^;h;wd$th})yf zuzdc~T#=H96YLY@3tVa-D}W{zT!{EW;JgIAaptXrVxxLOu=cJo!3anxX!UhM5J6n` z8u>80Q-ypcCJ6i0L~LA0lGkRF!9wUi>~Vt1nO*|O6{$(#Jb*<9l;wp68!;6wPUiun zhm@PZk)jjV9AF&vFn?z5pD~9wVb0x4XAMI}YtUfhz!1D>FJMoTcsW`w=cjMp5DX(&Q*St? z-n>+5pxU=?H!9J#mhQy40+gR7Qc3vt8spVZ{NTNoorevI%Aotfuk=%aizVz~T~MKs zt2Ct~?@{)kN~WAIuhqf@AduC<(F!|w&J-#M{U}=yWd{-zVJqk~yn-~8syrTw{#92m zh;g4L80UVizf&d9Y2xGY``3x|r%)L#GziPV8+90R(*u12lQ>N$aCIzCkKZ3=)Ng=F= z5Y&kUpKvs;1A=vqwOSRN&mTE<@ z+fpHw%UvK=%V9%Q8$U!PotpmQgFZi~ic#u2&;_|-Nx~ZeUPjPJ1rB1n7wXzh9X{|e zQOTE|k;t}jd9r8F2HQ;@j-9n1slc&={-m$4k_+XNAK>F(c>P1qnGTmDc=YE#D^rVQ zp+P9kihXoH$=pEfu$ zG!grXPSX!|z^&h$gyixE6+73IxsaV1m?$q$0@GemIZwyhxZ9e}R(B34z2xW$yO4=< zxa)xZ7d73dt}g!@zYUUAWXWBli_;m9rv#Txy4tC$9pdGOcy@Rd%F?N-J@@8f3KFC> za@fs@gRJtUR_`Tx$J@>vcC+Zq9;A)j*b|*^Y4Yz$9a8m;y>68y;`KI0qXQXXH|lG_ zbpAEOauSJ6j3C;^$K)q9n_Ntu%Kh8gl9o>L!JW0g?3%s7VD|70vxn99oxKeT6_=i3 z@v@Tyho6uJMK)yZa4@WDWdRKqZ4@8#4J|pNLLY zYhQ%U`2qOzG0I!`uYghx$~K&e@jel$yjm2iKZLZS?P{Tr8u2_Z+|&lHr30}I?09`X zvYCo|dH6JL6;#`o4%CZkjS6CKvZMOr;ls`;j1>K{WxVU>jd%U@@tVsW<29FY<6ZAR z-t~vDR;~`&Upz%^fzlg?80sI21{5cZcqAo$(KO0eGg#;Mc|40X!GY6JT~pmFL*mTe>~lG9KmalqI4Rw zBjfJ{ah=BR@OY`{9Y?5qv;eOO+ceywoo?UP@xq)#p2luai3Ec!;zCZ{H&`j^+cY8x zd2abZJ+WD004Tb_VKj{E!%PfZXPTgkaMh~o2dwsk2IOBDRkLim?Ck7$d5+WJJjdTJ zr*XZVZ?=BPwo4U^5_52Xd4<)az-$=mFb{UJgEMZcCYXVYK>VM}3&@1-F^EgNlO518 z6dSp`R0>YfB8(y-1B;y|v}!VwvvT_tURl8#S(@k1K4th(9`k!IIaBf#-I$$ z1OL9sB6i2}32)*4@zy{nulIqL_4+%WqtIUbO9Ho0K*sp7>Ci+f(+Sb!GJ#=dc8Wi- z9eFQjsE=esdL8~^ruV^!TqYG~EB%gDpAIaFl=Ccftq2q-cBiiCG1 z?@0dqXIBaj(Wz={_A&YCaK7?KuRijcAKgzlN6N4Dr-O)sE}Du=9$HQMiTri5NG2u2 zg*hKFZS)oFP~PCS?J$81m8_tcxum5TyUj4dq%b*RHt_i3Fdq9bSJc^03E;T+?ezF4 z{T6uc?-8&oWIXT>6|T#k7?|uXcs7|oUZ=}$@3u}Zj)O@7-Pb8mYI|Z(|16XQxeH@h z0DnM$zbu*PrMr#^vG2XdGFrke4Bw-on1HYluDOZiTTca-1ga^6ep{jyMC zLAN~w$f{B^RdEw$|bjyB_fCoeVXFNM)tOuAdY;xlF3lc{X zhXe=Iqj8{nILwFMM&aHnK4e(ZSp(hHXN@4N1`AClL-s)VaS+nX>}1CM?ofoi#}E#W zBHR%s0VVv15JOl#ZDc59(S+Ld`<=|xE>itPze~?<$VInvG9h@o<#mrepIb>5E}ih- zDIA*^&Oiyhy&)ySy5GT&D>3O26gXQlIS{sC0}hV$&})eTuf?n zz?aY4XWv`pODoMnz*)r;-|5(_EQYwb@TP~%*J znw($|;cc)jElmZ3B}fWOxJdyGj0t8+sua*lh~6mCqcaJmyHJx9Qs0FmB^(y5p@Bks zP_Lzq-2&Kn=)0{+mKl5}ch&^f9){y#VfKI)`-EE<4>oPLYFnqDI8gs!kMLJ^sLQ7 z&3P=une~oBjdlBl{|UeM&k-`P2cH-!u1+aQWOzQFu7nbi=d@(&BF#wwo*7=gQmkd` z9hoql*MoN;Q!4os)JyV&@NE&wPK4m2#P9WWeB$>(8^aN%aw4gGI6PqxYOtDWw0xF= zrS;r!d^U#To7P##!p}i?Kpp~+kAp%0Lfxx;gMNqFVqpi*8_-rhS$CCW?vF-Z?_VaQ zr!tN8Lj^u7Vr&k~Q@!hHAq;EnI>%$xZ$TTawH88A!ZIK{op3zWIwE|b5}NUIBd3k8 zr6saY%6SUr@+g~Y=n3o#T6!Dkw~9FFc%oldql&Xbl5A$b0IYZ2k2&c)`yB?BqE$Eu)g7JvtOuVBo zq4X{})W+G`G)|qbhwS6?o>+_M<+BI@oyL~Y?3jV?&Jxv{dV}To@i;laY zJr@3xQcg*@FdS!_!(-_5+mquB(o2~l3~5`g2kJ8juPW$ES<~rJPJ=g{*ZN`eFqbsR z+8>Mg&}f}-(#~t|nmMiSvgCDCwyyDYF_sojl_mH(#|^dD(%TEKGk8~90iVTB85)+x zlb&xKXRE1?h0hreg9`0Dk_@?KVQ;a_$$ed)%aP9KlA&<1DZ(FLOGGbC_xbY@hF4uX z4T+VG%uaZ)8PYN%;{2*M{R8H{HkqSXnZeO z)!MV41~11sg%e&qZJwx1Uh=nquQB?3GzwQKCdW8D>e~08(iid4qbyrv$r*)FZpMW* zPKR(E@MOZVq4#OAGeI_>m_6mwGz9R9({tK<=pP4Cm+(LrVAfd(;7RodoCE z%X4|a!iQ7YT1m)SmSV3Lqx%;8`dZTo7J8aL)NO!P4U54F^Uue^_dezPzPdKRw5=c5 z2|wJSY#o4X<#b0nFwj5)J{yAHBAuA|HkUKH{s;1p%CgYV4L(<%uG2l1VZPzBlUL

_r>#hef?e)JeG1s>W` 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 z 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�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�?XSeMeQYWKod&*SKED-FnT!*n>AO`%t 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ⅇ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

ZID=oVGl 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%0Ay0)4TFZA5l!OL+egt~e zloJ&2{_}G6SsOvADynE;JS+e z0u`$u;anDy!AKd1qXe?Aj(ajl8fz;CY<5|MIWjH#&gFuwTSAY(IAOhMAf{|gDLFIp zUrHDf){#^W=Aefl;#+8Zu(O`t&t5BiL;ySM%+!UR-3D06!MMjb2cUn)qaNzxMM`@L zkX$^$#I(GIbu;HojcZGuTW*2X>&ie?TYk>ku$J$jxflheK0)46qK;lE(|DiCv*aI( zuNevud2~J5lO7e2Yu68x>EJGlBC8<}FS>dj*BOf^hCx}YKDLj=T=d>g+Fbg1|Gw^$ z(Vev5eWP!uBMO4N@R+7r_HDb>0 zRS}?H6W5e}&-PF!8@kysC*En>%y-&mv(?peUHH4)D>chTxm|xt7 z8;S1u^*4+O16L02!cF{r$As@jGKppx^8m z`^x*7zKE{>TX-k{2=|c3IB0jWEYQ8iWz1$sU&lUK;FE%me7y$^k6PzNa+SUK@whdT zWM;=Yu-M5130yXICsMYn+|gH8o$4;C@s1$S2}Wi z?7QPYFF$=Xf2K9QcOu!quny50^cZ^r6D@d7@fdh}=d$uOup8&}xu4BX$ZtlOp41BM za=z6vYlW_18f}w-z*eW=&t{vO;UybioU3Txn3b`IYsl!#^bolIJ+4E&980KxbB5%? z1mCs{erE}7KY!S3DInt@w-c~|-4Xb1_}uP6xg!(SGEBa9vTAg%?+`?pf#2U<s^*(mWo;D}W6~3N`WSRHlaNpD1R~JXe>k;#n ztq1abbxKMT(+@f2F8ul9Y`(F&Z)XJlSk#|-Uz|M7x2ph+KytrGdu}(YNBLF!PX2m$ z*(`uOjh)U|>EnB*6P5469eA`f2GK01`}iyC@H1gJEp`Y15AV`z4O$z*q)F) z9?j9v)G5)&xAY-CCOJyFa?y$NkCHpwJYmd}l7xJhzVES5^vJ&B-fK$V$M)$zPv0H) zvGY7elhns!sP80SO={<#XuSKq=FN8=Z;V$;8SnB<|KXoV)_dj{>_PA+8c)-^@?Mgp zkD^H;$ZD&Y3!e*Fcx=bTgEs z6V|s|uq{_Gervn@#QCbq?CZpF>ONs?Vu=7BA)_T0D_Ea;58PgvM`IA{Q^kH*e9M^Z zs9Pi@k#*YQ{0aJTpMA!s$o1a!hG#BO+w?o`O+9fh_>Z^0S?Es6jh+d<V|$;zS6bBXA8|&rzf6l{LHn%Vkt9jqwx1a!YT0KWQ%Xi0oIS7m*|I+>j-@ll z=FRA+fcjQCe+ch>?0;_dO|n$!W@^or+2&^#`|fWSSUfni7p1%IwFgGYyfTeky=~$h z_^?*O{q$LQu7YPAbPtN%WeC0>TUDE@L&F}p@7e-5&E)i%c^jdW9tgyBH-8yU!85HNY zY>$cVU(`8Xz|Jve`y3widxCqAWdAF5)Fb=6JLvuWblCUZOO<)B*M8~VXLRm9G8j28 z+}i#g`fKNUmt?C&6PJ=*{V+&Q#`=B6`LT1~$h2TiqV1A=o|)3`n4VU3U2qR<+x|bd z55t7R=AMb!qIa=~Zo=#k_c=SGY+kS4%-!ltfA{nxZCjI@JuOdLVrrmoP1Ck-mbS#k zzeAF?KTwV~mMAAcRA!jIgiie1Up#j<(HLQG1qc7e|(nFrhn2(;fEoW4QrhZr@)AzwKXA-;1$pP6C|6FpS|EP zbOb#5Vl{Ss;D^5&&MbtHmER0uRm0pB-Oa*b`76}4Fq)i^Da3R~J_$_skX6qDlrOB> z^$!)u?Ozch7M>}xA7*mm`F^DK-fC*!zdLl;9}qJv?LK%X_sM#Av*}M8nX0Gz)oE^w z_9(R#z5j|>Paf^HaeJ7snB=_{!r77%%Mwl&mbK4n8M-^`Cg3wo0!*gD6S0k0ypPVY z5=0z2i}R@=))M0NC~Ve;ciBFGjt)tpaJtORTuoFopCb!al(k;fC40?C5ScLj?@qj-J_lzY~we;pK z-sd09TJE{$yCR|Xd$%CTPT{scU3mSY)-@)4t)8t;Mip;8+!Qd*ATz2Mufw>M=AY39 zqPD>f#KhOpxRvPh_eC!cHb44`H++xp+Rl!>kqbTuw`T@3kbk5J=E(4J;0@^h1SSRs zKlHLTvwIor!!_LxlJCP;&-J205rC5xsQ{l zGZwKoj&UNhChq5xJ)3mjT1oglHII2*5XPO1ZFn~pNAsg?;^Y*U-(V8U*(blr9)6rL zEI0eDmhd0W4DNt&;W<)j4Q>uIxK*&RMjLHCvz?{4fj2d%OMp!uYQ_0%HFVLaTxp&& z^j9yzl$Gmx@o;dcHHI5)==pO(vxe8T#T-NoKFyc5I~%SXC_l5MQbWsHFNf9!P00_> zC^^7~XBuUGbU-wErzCHFIRd zmhW6=nqLErR@LRf!aY-`ApUImVdUC6(hPO$BXAJ#vc@)JzdgObg|_o}5!Nn(@m?<6 zLjQF7Tw#~E>lo;Xmp?jqku$gmGVRl*vbU>VybvkZ3%s%y!1u|ZLxHr=mkAwuv3^bR zgDLXMSO@?B>kQ^RjEfELIr_jKWy=^8jfaHSMkT*M$49yRBbSoK}p55c@Yu=62q1sjxYWYBH8 z3E4)P;$|>qyO0({+3>u~qO)Si=u20@ZRSoabHqQLqe7@%iH^#6yQ3l_rzwt#xx-N@ zqoZ=KI4TcbImJ;SG_#1KQYIux6{+jAUV-1ehKjyTb(f0@N}S$EK>nW)a#ufEr;LOe z)LACfRB~>Nay%mg>uZ=Hqc<*w{U8*-7ITd50~AE$T_484BDAwNC>PTqqGW-wQFrqX z*0gae8H(&gqm!3TCIY0RKxV(eNeXVnS1UY{D7dwh!`*5Z4ByNMZxK!Jb10|PGnkKV zc%zLRl!|)u9%X#cVU7(q@Nw6g8O>(8V`6Z04KVb>`GrPx2TvGi?vc@MQ&&VBW&3D@V$K4S8xQnRBr)K0_a2~n8)UJN5WAY8)ai-hf@Sj9i5cO&K*XYtB6*3 za=;8^;V|yuFg^K%WwP$7{f?fngnIE2&PPyZXA+C>fW84=Ef$emmN$6DR&^5S>K}KS zG7IE^^nW}mKlWZIH>vN=DcTYo3qQDF$4;Fn(kIE$33-&0*NF%cSs}7!(2Ywm*QlOt zx0r%9exDPX&`a3cy;-m3#rbsMIV(r`@GZ{G7T0D=bKm0F{DIt>z#Md^!VJVbjvs*& z@b%6Nefr0bU==2``2sm`c=$@G2W$Tj9dqRkl$B@ODLZ9MG?v~@>N2~ii`A7#VeG9v zs1#G-qbydDi+o!XA8sRDx*nKbdtz45aXzH^pa;2Of7inYq2mWHrTUW8d#V(4(_>zTShj zu+mp@r81c*uLKlF{}Wp_f3duw?_&m9`gpQfIG$#&gPj@s`4Gh4Lh=9lg?16(Vdd+W zIre(!dfHnmhnbIEOd5}QlA#A*|Mx1`8*o>c2^o)TJs5U6F#h`Y6>jx7Gm$IwCDrov z%dIn8tsT#E=n^Kp>*H3Dv(kpJux>z~i#B*JW>#+LtUzLbR?Np7q-loQ!^U{It2y5b z33HQjHiVl3>r)IAtUVMx1HNQ?H{IcfB%{QCdQhzl0HYpuTi z9eDEfe`#W5LAa?Z`d4&TIDEX!?78FPSok1pVDA85t+@>Zfapm@=q2y@$wgHI0oMHI zbIV#U7~h{$5tvsC947C%JF`68)Uk)qA4y^kV?E+`YFWqr$7k)=plfVH=hqL<;F;sB zPHY<_3WWWye}x|7P8Dkz_aJc#(gL{1_|)Rta=XfX6~&8-QprhSl+rSow_TwiOJ^H!<-3Nz#;m6ZovfchqIOc&8+vZMc_M0jA#R77(P#->=KILof*7P zq7~;$PyuhX80paU=Z#XgeSUFXFFk)LG5x&J(YpA5DW%{Ac>MgO1|tfsu4l+oVAYB# ztCUhlndkCA_}CFJMID$3i*Q(E-V76-YdE`XP+ppa+A(>UAH!A3Rqr|=ziYhegYxLk zuI9@rznJ}LjT`X8wFTYe{ee}9>jI&v_;gZ)rn#PuoTVf*)8V~4T~CGOgd6-B9R;X4 zpN^Pf7Ao7<=;fgY&C}$ap_?@x;tB#I?f}Kh!|%aOVAC*}oiL0UUFwx{KSV{&E5s#U z=wY^-%$s@jD)=6lK81A%RrtNA)eqksF5LId2AaX0YDxU?O=k&KG(37fUac13M$+UN zgT8ph>v<&$ENyICb1G2loHs8(G=UEK^KX}DZRO4T4XW-~tJqM(S&ip5)>0{TSsn1l z-!9HO-SEYgJ9W<2D`F4)qqn9~x0b`ZAUNPHJFua5@GR$V!TAmEDkcCIw9rdqSE?$E zyLcNM9%wI?;F+vk_^%ViK}TukJbDUp2SO=w42VWkCD>Ljk0Z(*7H@JuR53KPGL ztTgf~!Hj>KqFrLM02#?2Y_KBw=XCQu$AfT6Jb63B{B#DRth#3S|u+48s@1eGPqE)j?w zRPusR!e|i<&OQ4?tWWSNZz!PaM^m3_RuA z(Byp?#G3gDV}+V1VHW?G8GLclK52YxR6Ct&v%+RCwjZ0dz#X(a$(-Hcv;;D*xFYWq z&*Yb&S~4N8+?mVj=68yh>`%5YxQep~G+IoOQ`~}=aoZfY5IK#G)FFTTC80l|jTis! zZ-1jjBwj4R7)pHvm1OjgN!4cgod4;Ch8{Y+4ivD-K?9c;H#tv6 zrAA8eng~*AKc{W;<@}nt63_#z6tApnqoHrDv9IXcuhA&c{v`CFmQESa1+N14xoAOg zJWIcJptLH@D{yc|>y=Mbum#4Cu25yNiSeF>_4P|+_d&HAKRm;8dl+|C&>ya^G~bPw zv1>74P>P#c6t{K9fzb{~-C3h+=mlq~uTii)j6-Yb48cBmvN8;+e8~g|Ey1}x=YL+~Cd3jfU;G8svt6uLjC^J3 zd_h|<2b}I?st@IhD({rl_7|Bi7r3bMeTpG20=TX+A2(Eb@Eu9;Y`(sAKK{>;Swp665@2_dcgQ|ZisA| z;@z<$g@HU*%01Uy^wAdJy@9CM;p|OqN!9C*Zjg$nwz_QzNmxeG2@LA{ELjm-dnML} zZ|Rz-WAFY!f#m+dgY^E1W>Pw7J7l9K77mwGF3j`b`_IZedoc$=y@Pgma840)s=S#b zwghAIsm#UtvqnxH(DPFmpO2Fiz6Pb>rxfDB|5BmtlWVkgJ-h9od9zX`6}A3S)OQeQ zFz5b||HYm7yLllfexbJi5ZVu{qIZR*>-+?ito~Je z3v|5OWzGaIi@|#rxS`@v)WCR$4yY)$#MO!Ru>uQBdw*f#!sU~Gqm7!?aO8o)6Iw(z zf&zOdW?IBWUoMyYYA8q44x5f!nvf?le>?WV;mzE|IrdVzh{(G?;|e?~fhgz0TgM6+ z60FF}KqmG-gi@D3*68NJxeycHe-SX~e)X1Zv^z$-igG!h!Qi}z+0+Lw!%n}Y|9=_s z_-)8({%uqS-flNfiA#)Ge^Pq=A8hs=;w0kk4EiTeI{s3)^4*=APN{8Hi=~fkjO6ch zKNgH?{S;lB1F(+x?3KGAck^JU+B)IKQbJ?`JdPi$v#>q<_Uqq$cFZwU>EQP1cGX5@ z9)ct7-P$dfcG6xP6RY^XDBBd|@4eNOVlRW|p~d<()s_w34)z6uag!dAw7q5g4Zfz0 z#Qph_IA62YboQ!bk00aH0I{&=&cb8+76ls=Xk7u`Nh7ojr058jHr zUHMOcTiU*C-?p;(l~uX-?22*Qx-|8XPB|p~!DX9nlwM@}n`YK=Mu2iZst^V_Uj4FV)AeKH;;-Ns52>k7{0@k9p*Vrnt$BbYBFyOR@cmxnbBlEC(gf ze{c892Wo#R-LgM2Z%~ejH`B%Kuy>4gZU&d-%;1u>-$5L0%o9jsMEMmdPn1z9Z}2uJ zwMFI4HOqrzb~*;jjXIiAj%0X7IB_B0BjY7K$+d>SFne+eAgXNSZ*uBq5_(w zD*YaoSkCG;h4408?3TM%Jb$2&-q-EZ?-qIR-`_>PW1-c}LKse3BahDpRT#drIHzE%_<*Y9&Vdgr|yAJgw=2@>~iY#wA&wI}!EqD}# z6vfdjpR>?#-p_fY@9>U3iAH$vFmo1Z(T8$sn&+(XYAa7roQj+&{D?<$|SGg*<^AHRmn;PI<50k;l>Im}2FH;D2Am1e?M4oNtWR zoG-wSMh0{ZM)bVQwq4I{p?@Tb4B;2$> zKB!zvk&h>Z@~OEM!0(SBh*?^+2|&(AVGG&rs$EDD%kYY%BG-Qa96EIWE7^@s#^9QTqXN z9o{iILcW+>CzPA20ij%JX`~tKhtC2YM6d zK~B|g*+nsp4jw6|=ut^NHmwJr^k}Oqe$(3UKC&+2yEV1Vaiq;vQRp^oGr}jFo3bq6 z+9gF21`&;12hrT5ww;pkGmGqttlP{EDuBhw@EJM3&Viq@42J8hx@Iw&`@W^4elA7j zHv&7|w*>2QMvnq5oqphE0Q{-BTj%^&bVh}FScaujmA|@o`AFH#sDD7*nv^rbc zS;OaBoF5}Gf4E*W-TOBDZVUOuh|6=no_0-jJvEE$U5cQ*6p^T&x<(#>+*QiNPs!Ga zM20pp@L3*{`^a;@IcbtzEUky-x>yf;5m}eo6uM2-FBu*I8xHU^Z5W?El_1y@GKX$ zMQcy=d0KynhEb_SI<<3ya%S=f=)9XEA0*%CSG5`cs2!)o=_Y;B455;keknc9k0|#P z`|bhcOtI^Ap{tmlBOPr9b`yrd%a-9 zk6ROUo!`24b32sb<+e|isB&Su2YNr$Lt*6iK6XpEzK$lff-=Xp*(({f@5AWYE8ACW zz0||?GQpP9Rh>l+re;hb2ztxwX_rQch&uk8nbUnk8Hwvs4ddJ z=B%vliKt^-;Lq54QL6c&&1Z(_5uCT9$oheEgrMx$+N-y+nWCbLgx|!TuUnoa>rIqr zvUzFk%nrtij%D+1DBBn9651U=SGQJ7^k*N+r;#zn{hwS2-N$TJT8~b#jvp=0Hp=r+ zqC7L&ZaEJ4dll7U?l-WX=43ajMfAKukL;5o&ie*`Xy2Yi;$Jr5c}~aub2{sodMgg= zh2>U=fgPe!3^t>zetlW2uA%+dbNC*k>=(E%Y|UEN?TR_=Uz)yMHaDYkmX9b|3Katl*y znqMJYVBI~w#UB%)<<1(n-AaBo0RFdTUP(ZpMd|LERkgnx_{o?$jN=2M=&*Ae^8x!K z&YYrk1pD&}|KH#kn0CeUtxdi<=-neahE+w_wQvlhd+~8vbn_V66z4s+(R?(V7Hj0b z`4l2zH2pqesbfy{4FB%3a5w1PT@TKTYb!X%DNJfv;{6TrzHz?b2pAK)Q#iYO?cEZc z2<2EjdClSdywPlMJM2)dOuyeL&{@UZ>xGWccmla$i036|O%L-MBYY$xdk}=9bw0N- z5Ba8mxbI=!oid{n+RUP?+db0zGTWA68I#UXKimZZ9i1cR%cc*C!Ia!Vsr6oH&RJtPN)bn#LG_MXK_w-)d_itNH1YNpu&R% zxR@@=8IQk#ZB+74w+jHB0y7 zYNa{vTjy(n3`P9@Eb_al-@P6KzfVu+g!Ccg&fEw%OAgm~3gbsIHLRSSE~h!rZ^tt_ z6FVaW6szi)oi64NGs@wXdSgIp1BqLnhq{Xr*LogCfC-+zJ)Q(Ao2*wPtj&| z;2b_Hkj%h$(6^?~P=eZH#GofR!*e|A{F7ZV)+v19Ip2@p2xK439ni~4JQC23;#T2XnQ|6R zK=DTp6p#kgI0`u;1 z+B}4zt)4Az#asd2fZXGHGxqrNTg+89yljFjwjUzAYRLH(tCiNQFP+^(zd|0AfG@o~ zt)cy%=Yzb%IA=V92?aT0bm3Zt^hk2R<}2#Q71oDnPopg6O*RQa7a@Z!JWD^FOL`Y47YdhlHnerlULc+Y@!OoBJ}2MXfcezu7Hoz@#&U2o zeN%_I%IrO$mzC|6p-<%u*L`b3H0zDW%&tJWG_y!=gnuoB@9}ep)$v);@mDXQe z7gu&KM^M@J<#o7TUpAF;{ma6llQnZB=ZLmdROb{cXKv_T54=;$j&=L&1n)_Kp2RyL z<6Dr?+t40(GZVHL=Mh8dLK!S#zFPaeq36$yqUBeMZ*HrlMYpTxT36+9)$n5FjvW)% zXed|7Wk!`dUzs}I^HFfwhWPawyufdMj(^`4gQ z8mA|B_2S8G9c0JKC^T&Pm$rl=h;+bQh4JI>6Kwbu|4yOpjOBq0`O0V_lsdHy*+#^? zo)VJW$=s51?ZBAlBfPyGO$M<3-V^#;wCsT0tw|_Hw5xVq2jnD@b2sb@-MPa0!L|S! zNu?pkZ;ZJ|qiY@JtBuwbtYsaNhi2Psceio%uFpxc(K4IeOTCG?Sq;N8Phl)>^HN=E7-m#zhCK?<7T@9I)2uKbs&d69ok+uqe}S!{hW&s z0-g9Pqx7}(`+|{ap0|ul8Fe$}cT#y}GJn-m%Z<2Sjb((7&GOg^pB#C#%b!sY3wh2b zQ9j4-I$~bc)v1IANP2pkT)c;6m_e`yXo3m4m-WNK{HWQnxVMMx;5}2k*Eg5$b}r6Ej&SeEm}O7|;ckn<_;0S%?(eU%uWI=S`W(uQ~L=F$AIEPu9~7k1m7%_wa=ueFpn z7HNPVYzq+?gFO>mJEUB}(fPCnAIX1TjO6zXa?-2v4tfjk`FW!v*+Dnav1My8+MJ$_ z`P@aF*xm^9WQTO{JEjbcvyP~kQ}FY9Ciqv49b-oNa63vT&ykGzeiL#uw_0Yc&^7bT z4(Nf7kvkJ}pZwo4=9f=S1AuD?^H*BTuL{TS+ByQCrq=}9(WASf)k;~iHO$CdiTT`d zKm1ghySP?Yn6Cl#uZN<2?z@1jY?zOR{AaRhmsR~L+tH{aV|ui*uaDdC)BH!^tsSC? zX5zXhLIa_UM!t)pk*3@Kg=8PCQ+RV#WNYP?x>9Z2o$s98zd^f2mQj=okfTaBBafHr z&(j_j=84bdCVUSB_s|F#xk`3Y>-zm^>#o@eZK^J!$Ck=I= z%VD2kEhAo35Z#>iH5MZ_Ua(#WAKF}V9{5boYhx?h#GIAahz84iCcA7FPsT{sc{DZ1 zj(*|XMtcbamdAJC_h?30Hrwm=1ZJCGlii?a{B z2=@s>e<|*dfZR?O513k|>V<1RyaT$t5B|Ue_qK3v6Zf;{;5*_TTSk&C%meCzU998Y zpd=d+TUxe5@~OHB+R&{tQ*X0->pISl1i6dU4RdqD<{!69KUv@d^1beSe82mi?Yp9U zoSFWhyNIq)H_V33v)qxz*V$mN1Dj@wZ3SZ%ZW2(exE!DKs7LIP)Yi)7y^dO!0|0M+Lw1g{YGeE$o{GJ^qgrm897NkqvXQM>eEm-LZRlOqo|AY`2LWHf*Da`a&pV_i`KHsYsJ1HTj_LuTR*aoL3S5| z?D2XqtKPQs`*PdO-{M(3?o(PDe$HHBXEGPEt;_bP@-3JjgH8tN*K3~g9O=*FncAR- zdBxik+FRS)w?;=zc5Xe%Pdh!b@p0dMD$^*-9vF#bvs}9{O8EwGLSDBM?e&Xp=`P~K z;{L=UIAf@^!}IM

CAX&dO)tyD8dm{0tBL*_uD-l`}y~xGDHr>V6v8nas}FYNyM7 zOoELa_LVY|FrAX@>m+B5pgoh&hue>)L|uFqWO#`CtyF*R6K4Ft6nyn^S{4i9`I_wE z-u=SLM$gS)yf00(g}~MZTSOU)K_qJhdl%1TfF^z~qqV!|a;ne9<(# zMw{)QEEK*2pF-UiY4IhyS zojTre0ACxkVflQ22j`-hv1ZNf>%&=ih7emHI!qVey&gX>8t-P|9hh)Ef;EcyPkZ|c z;Dh$=bI#P1&q(reW*Oia@86xo|LETPIGkHt4&!=Yfah?Ey_{tKNarOu$71!Wb4Zja z9~nvIBwZ7E$4{{DqUSil`j^xu^nu5(NQ#L*I7XG~68G4>Ym=xDSi^+0f073A(Or<~wb( z+3M=KF8p2Yngye0vN@~l-EB=p8nIJ;K(?MOiEo~it7p$tBHxgp^qX?~>`C6YB{Tg` zn+xcXFv9vC`9A)sa=c_7L+}qu^YUn*oa}x?e}}{>=|oeSuS9^MC#V16sl$@$d_+Q{ z^h);bRc8%y=dT>QK4&OAPtFmEiNkUGQQxJ2qFLifD>`elY_v`Yn&6~Xf{ zxdWzka9Ktf?Xpov*m3$BpEDpZUYV4Hg()U&ixL(2f!*8T%GoD-%waGvJ8FF;=k~#I z+Lro?BXorrx3m^s4K0MHMI>kTHGlY*DZ|wzj4Sb-kC{I#@o8sj8;0%-+JI$zaVYJ~ z9J7LGm>N%QFHE_hr6gU@f~*5U$^rRX1teE_qGTzMAMlg}N-bd;0`+TB1JaiqRP5g* z%wFP^l#oEh2NR%Rh~!NAI|NaCGCIA!4V`|Q@C4YQ3OfC-TMNB?%Q|!b4T<7NJwkKI zd6`u})EH`9|dl>{CJ3ot(-Vxq~_uz#%fCKUVv;FB)&+62b4M|*B9rS2WPjFO28c#E2Qq*A@qy z$Baloh7T_fR{~{I&8f6i-eFckQ6Dk%SrRkXr{9Th9mFOEDkMK<6UDR={=0(J=moy- z!gKu>`1S8vQX_|+GrL}m;e|i{Io2L)k-f>aRJ8oB?q7e2iD43n;Rrp>OpFhY+8FYf z(UL&E{1~RddbUDKhZJ)pZ%<<3gsvR=R1SK?Yh|B**{^VbSsZCSp*Yv|sq`l$uh_d2 zi@E#69!%Vs9Tvq;kL`LA;Ys~Z9?PV@u=*a+c~;=?KJ3W-FOMv{3CnKwqds04PYM>+ zWVx%P%Hk!jV8VA<@)TYazv1~)_UgrI=oK;5Mo__nyTCPKukw^^$-Q!e*)8Z-zK>NE zV+ttO6P7$?9jaAK7{ejOpLWwdf!8V+N$`-h9QKaPu0RIwdUYNQEaH2;)QMkz9sv4M3?Y7z9(N%V-1!e=CEh2LWaX#4i0!mq?_~_8DHZAfWO||FS(MK=lZKxq7i2!O1CL zHQ~Es4yIq@VCNx7dwAHd0I5rW=g|Xnd`|)WZz2zZJ_HwG@V&NYWt*GfCA+M{K;heC z`;5I$fbJayB;V+nh4N*l*)b<(hms6z0bCb6!9#Zf7MhfS)-v&bc-iD&6$Chxq2Rlt zwl^pd*g!zfkm$rq_O?D`0Q&Hr=@YQLmtGEN&x~g64X>XC0a5wFEvs|27)@#X?}AHw zln~$=zsvDDR-;RE&3FaxoH3v!=#Otw;1hm7$c!p@*>+5T`2uL774UAcuqt?2i}=Tb zBfaU6F2#yAll#HImyptAN^bK>QASc21zET>%*G73!xo1Qg#0;A#S!>w3jxpz|LJ8c*Q3As96S zH!~O?2;A3{0+g%Y6y~AltIIrM!TW_o9dPT zgHu4lEFFQ=o2PNGZ&Mc_=pkUA9fGwHD4Z!k;Tln}JPw*10TgG|eS%WXyOjh}lA)S7;`%I7^rKSo1m^o4V1bVMWfQeNFOjESqBY;5~7X;)t38x_r*|GR1l&gM7J-fCc`H<=VZ)sWQI3aZycD;01uoVhm*dgusvi*tDEjV4(u~ z20*d{Or9Zh4e)D$a~lCzWzg31j0f+UMFoIe0qqPE7BKMKlJd-&sNmpOeOCipkPM1w_TVjtZyH@5KIsypr4wjcTl1yDQ|zD=D(q zT_I5Gslms-)lqb4IT$-OW*jh-&D9|$#Q=J`5Vv<60u|ArmA{A=zu_4H{b*n|_oZ zq0Xmz47DCZ@RRDXCrvk6z8|coRKBm4pNKV$$~O_PHc}n|j5%*d!f@Nwgg5_KTog)I`X1u!9m+CJ0y zqe+WwiH@rR&a(BuEJlH?Wjz-GUv?wl%?e;J*D1SvxcQ9&3Y-GO+wN?) zB^qRh3((*Q0Ct8Y>tO5aoNP(xe|t;+xjhW;X9|rUJEjfJ!*&2{OneBEPfe16hhg;s zzeW#$@-yVilsYQdcq<}5OQ4tRD0+XBFJj^juK&x@I!-b&C?l8>5e(1;~Z+1_!`$!=R|W7Brpowc(BV& zHPHgj zpNT{o_#0&iedkv1K9bNTQ&N&Q9JL?eub77NE(hdh!0-`3Zm|Cwr2**>+HaeB{-9HR zU3HIdt)tpaJtKiq#Q?bT(!OAHk5mehG6v)R5d~kahX@wJ5^)Cmuq^~ns8Hg?*S$?O z3_vRd{EmWf$AP~I{JZQ_fG;8lRFCWt z#{kW@?BUAwXAuO)^tXYgN9i?=Ox!bnKmdSlC66Er356`Q1`sB>;_h0J{v7b3*&&74IetcvAxC zFZ$Dk2lGw_$ch4vFioPX$Jkawx1SR7boeAa3qWxASx*e)GUQDR z5Cen0IS@uo4UR?`tO&3`1ndcb1LdU2^8`S{1Rd^iz(6@zG6qCA+OMw3>vIvDS%i8$ zJr26U0%6&C6@rlBk$4TQYdyfI|%Je^i*U8{D@(+TWvA}Rj zln_g>U~c7glrP)BdD4LHEKFKG%`Xr%1J((@dWPqJ6lhPNSQp#*lSoIMpXctTC(u2f zQ#{_$Rt#k5b~I4~t!02srh8L^uJ@sf13!rK?LnO#ZNF=en&$J%JWee9atoxx_>`%d_ zqPqz7srS&j#Jd`k_`DT&4bB>i{pK!PE36co7j)$s?+)zd57jkAP`LMO&0Y|I{i%OF z?3}!*Zs}WH+?Akr{pFrIM*;;B_bbr0NpGi@_3VA*m;;(8-_yV~6!lR#`8fmj-9FY) z-7D^!Jf`0gmt{Rx9JUX36a!apkNdDzQ$n<vR&l>nGzI4mT z6}n{)`2A*swo?)S+~fUNakuz>kNMuz`v`1{ppQlUek)JU^u;b6vUB`*?HiSwi#R|% z0+M55%<{r6GNAdv<@jbG?z{8EWsY^eU;xKe+ItTYQkiM{jARS3xte$fdzTF)gB9o3 zJmJrp032md>={c0RWBCSgG(!R_Va!(9T3C<;Qlwo0wg3A0XeGmIz|&@pjI|8p%Td5 zrEc~??pkKagU=XuP}tVzJ@!*V;L&Jb>Rx+blt9KawI0yY*+-t`y`IL+$=&ZFgYNe4 zwy$#tCY&Ir#qsf|ch3_zTJW5b-~nISIQ9tq%o5iS=so^~;LDiQK>#=>0ZV=tIeY9r zpOI;qWjfnP<~hte7`IK-?uzSh&abmJ*-_TUCh*+;)WhT>cbI7S?)8Kx-6-E#6-?Y~ z@bfbn4Ao!&qHoUUR$7uIC1zrqzNa&Wr-MxnmfA{m@ao? zXGW2ej_+Tsy+dfwa@dA*)Gvz3PESOIQY5O*oqbQpr=0aq8!a<$QZ zW9T^lo(h2%!;twOpW`?c2sYP=e>tSO!&Ya*DX?m2?FGIkxXSVM0x-9vcV6(2ZHn!G zu^PKR@XucjXBGm6C6x#ve^%q={Ei}YyPJhWk+~_DZ5V0}^0LM`58R#2<|}Q);#=8R z3?)`S3u0EW3D-}6Y|!3mzapj&ypuS)V31aGj^;wdO6|YZl6m#R0%ZT#k+I^IO!{pm z18;-9YTlUcd52b$b)QmZ<4v$FHwZ9F(ZdK&GmJFd9+4=eETYIrHSLe5V+1N%ESQe^ z0avkDRN-SI^ExbI4u13Kfm(sxyerWS!wyC6HIBll87b0;M^c4lgPYA#1m7Zv0uqra z81-j}+s_rOzq}MT=`ljF_0X(Pq@q!ZMt}vk!g)jpZwGH0j!!B2(I{8ym3&c-b28)89tj9ztKz4kmXS+h@8V4iZ{@=Rh#vVB2Dvck>U{v~e4F zdY6ru{M0kjiPs)CyfFG2e<<1&Q%y`kc6IJ)%~}+NUEj>b%|A)b3b*Vw6iX`x7V^oc z;;n}pN+XBq(q4yjHvim@rrIn;(t1v#Hz-f$?=N*s!I}+s0}Dq(OwSfT+&8Co?`~Z! zQyS-mJvAp)O!0O`DQ?0vj$j!MT=iCxVo`=^OQPx6H)u&)vvv;p$0MAN-?WcT*3uZn z(}1N!GGDN?D@nKF9uV^1NPAY{r<-c(Y^D#6P!B!!Mx~@LLWqCqHr2KhVHg)_*M;rI zlsF8$ls*=3$!xKf-^XqrfftV{1vboUF;O2G{H8@hDqQ*23Z@vt8#gxH{;cBIVj2#; zTB!-|${Q3Z&EZ&1Nl^FF(u9a~0cm=Z(oxchDf4o+@K;TngQv!FN-sHWDN6ycg=bXm ziQWl$IH=2KP4K>IH}LFs1RD0-t-4pOci+z|*$yWC9h{ORT<7oVkvz>ENh0fe`yzih zN2CMBm*>PSag9Mkb1WCIRYx0bJ+qyqw}BEG)G5G`$XM4(Lu(uw`I;xHSvrfQ0w%r1R9~-Dfq&*+y%Hqt4&(D0E_S^tqgx^h(Z{S$#6T(snkdig^66o=Lr87EstEi zc9zf`6{GMct+}3#5ZK*^YF2acd_#mWID2%=1gT6uz{g#}Q$LO4SIhZS%V;pc{8doN z>HzEiS$pB31cu+H_La*l^ppKTQkg!?FA_v+=55mJC(KS@z!2uywu(_`Vc4!!gjAa_WCZDJFd2#=5I4_ zeXU(0Oe>BQ5C3FvHG~UCbTQx>j>Y+VV6^g>gYMGvUsYVPIQS_J7a_)ec=k4VY+fdm zxreuZ${gl$`OKSK(hFGK@z00(T=unol=K3km{OC4rRyX&!of!At)pBfrzgM0CI-D_ z&6lH;%22%Nox1C+f3n?`HXe@L)z>e{uM4Equ-caz(V(T%t11&H`8t9Y`tosu5t+Yf z;{d~O^d_56ABLmDO#b!p>+diMdj4m9pHWyZQFL~V#9o}|RlU@x?Zp!=Mkn*@n=PQ-V-_H|Cr_BrG1yAL zc3WpR6%2wsc}V}khT3l8ISM?d9v;UX-|fc)31;1QIU|UhcmF942vS0B>2Touw2|p= zVuu6W!Xr+bJ|5!_d$_4vmSHF<*D^1&ASlSJw;mLqd;oF! zO$QK9`;HwVz;6Kq(_)7N1$IC&!A<_th6?*o7H|UucV(2K5HbQbsYZ}_0n`$Q1(9J6 zHg`*e9el61Bi&@(Z5y|@6N$xAbJu2`H5ePy7_eKXj zy>SX8rAhE$kwYK}>c}Ekir%ClA3Ozh<1-`jjOxsYLmt)#4yn0UA2^&vLLYKZ?E{B* zVzeMEV2iq zw*sHfJiI!0ZD&na3g=z(`pf-ZbFPF6QRsPaNVpkX;!o2X&DsxD3^^9-Po+E=Q0PG8 znyx(a?_0h0gu=M#igN+h#=^LIR`B}-$&nk6dIo!cOSn_ya1IZB?qIFgolfCrgNK7( zb@-LZ$YCGC1O)3P&vSq77Vt_Q3n42Bx|>$jE!^4&wc!DsS&zzevx6EQ*izUM&>7?z zKZA81Xtd8J*N%<{u7z8mLkBvf_5Ng4Er)egEBPruK$Su=TGt~P?j!4E2fgF#A^Zfn z(y1S?b|2Ly&<4W1Jir*`aC}Cc+%CS{fNZV^wkF1#3_^O`3@_<$QqLHLaBRSaInu8q;V>&D1X7hvO8WmPTZGNT^!!9^%(;Lln67Wgjgt{m?Rhiqw&M^lvHppP*B2_^*((l_{? zwZX$qLphjM%=}yadUD(@4{%LN4-8$$E5Dq2-?L(V)7}5v2 zG{-I-l$sAIyza^UUOaKK1^0vINO%5UDGo)X{nd-sd}W#js( zmlQ(ir0}3TEu^}x#iq#VNS zL!C@UCiyx-BP6~np!8wQ!7J~*#B1tX!duD`EIvX&d0W>fe_K5cLR`7}ef`GBoOesd z%}#pA2#i4v>U-ThwbtidW7E7jc}TzBPx8M2-_8O%0r*jad5800YyCk8A+`fQ56x~V z)4=((tsN0=U1q!h-fa5Qoo&(lXYJG)KwGBXYh!rHyx*%W?8fV*1UT0gwb6r6k(n4cGc6*-j6|dEx?YGpt9!K#4=}ka$Q?ONG>s5!I6p3JUQOq zq)_qQa&l8zH@l7F#?2(NeLQf?=Xzsve1G2U>&@-sKw+?)uD$r>Ouaj{j8=CVNc5r%-#U#C#+f}L%6wX$idkXcEgP;%%F(2M0R zj1(S)DMU_QSIhqOr9y8Q5=d)M8suBLeHDZxrN}oy9d2D~RX8?QpJZPqL6Wh{Z((SE z9EvMS|L{h%*#wn5*d6U{{g8cwd{n16MHsgV*f^Ctb$)_P3~L@iqKNOW zx~qN15N&_(@nBAa{etU768(YQ7Rn6Cu&^73VCN`d_KZ#$c0@pEin=REZx{&#jj?R6CSw^BY zAGz#Eb&N+Pf>YXyp6<+C!5X^(zx@Ga)~>v{4%V^Rgz>GyAvh5VENe*oyl8Phk0VRfY$KLE$HzT>H>l{D@$h~^v=l|d^vXcUGjC9Pny0rgW-*%vq_pf z?z7GWFg3wCGh=>B+F23qTiBI+us%7G%tkLygAPyjv7mmT&%v%?P_qPgT1JSaH2)6$ z7fS0Uf(wjk{ubekt8Oj-oi80HUBTV=#xc}6ozM8k$KEJTzcC!G_OUmD|3Ei>gX3Fv zKLC$yF@-!&5m}$Z*ena1Q$~1tf=K=2N9|n_oiC6Rhlj7IzE_d@u(c0-OcP%~QFyiw zp=XY_aF$yWSnfj~t0qns`+jd~9+6oyyB}e(8sjv^UfF}(3q13;=0LLeE1lA#U6clu z1%Jsz#-Hv%-=lM#9`7PDtnrmxqfBYaD|?WOO~Md-#5)M-H0E~E2>;_X9b!#_Hu*b7 z$>SRR7+mCq=3o8WzkK|7VYEvhKmOaRB%QH(6g4lk%mH1C5&yk+t(AtUv%MzL4;N5fJ%#?>#+rbdf1#sS%g#+{eW9IHsdtU3DH!q&!jnL1v*};<)}q%MinkVfPoUQFEo1y1jFz- zvs-sLpUoVKibkR;b*iWg@C@aUnLzL-R!(Drk|m4f7-U164R77+;mU#M zpb`#w&kkf6qoUG_5ym0I5Fr6a7uq8JkaBTpM!-~9dNkzFsl&sxkpz0U1gW)SPqi1o zt9MsJ&vy>?lhXSQOqftg?>BJ?T?{?Xg%6+);Ej>@_3u*$>9v+~-~Y*m?zl5H`jjTy zr&;XK?clHfdqu-6^#uiijiE9U&qYU`gFJzFlQ6&3To1>HBosw$v2};n~M5F356MY5c;@ ze9USu4wPkq2?d*bLiR|8L~eWF;0<)fnOVbyzxKX<3G|JV$Wa)e`HXsp{KPK6>N{J< z#Lxk+hvwmKfn?8$ zOkfyYXb%IgkX=Rg@hAMur!WO4teht?4thZg6f)|Gd~#N=fYn}P7}*=&&LNa;3s-{K zbFmhnEW+zDC*pkMQ3D|#SMJm~U$2mdr(eH#Ll;f z&^CDiyoDB4AZ4_UfeA2orEx&U9;9`7xVAuzaYBSyp>p{JKAo>ur;az=ywmi(tcKx);=gohu6!I9x0o(vE1(QqP>AH>`&k ztg~E#FTo}(jGQz`66IDPvsqmSMUOLP%6xq2GZ^7u-yA506^Ko!ix*&9+c<<$?~}P4 zU6Fk9VQ}?WqMd;r0T2AH0mpr7=`IMI3altt;b=H$RD86|fQPor7CxxL-^^CSdsS3X zq;R#R-b)7lf%Z#;kkN9zLa%~1rZFW13kvoQ#tQ8=XezdHz#vPqhr>JsKZS@zV;?6l z$c|$nh3MV@*-!*LLwtA7u`h$5te4K-V?PUrAB9;Kfy6PlQJ_~Sowj>*h2F`GY*dg1 zTtc|A5u>@U#1w#K3$quM1G`c`wY#mvJHc@Jy1i56^as z*oS8*VJtq8w;?knsfX&!>#&)}R$dw=i2;|5x+DY6{SeJV-V$yTiOmWY+aqR~*m?j< zJ?+s-(cmI>h|#^@`Tj#bs8#u>JZh7`36fBX$?gz!bNjJ?$|x{i7i-kSR1b6GJ6^6(uTo4?UVsSDP8 z5zs;}ja{j#a3Ogc1dwYlmICNZ`|a~f`DLy#l$RacUyQve%~G}MkajG?i+uhi8ey+& zV!hxazct8SDX~4k{z+ThO4!%owX@>IUwn90teGRtAPRoUupl6^p8IaHk|lo zjN=EhQ{L}dFa_jG3PHR$b3A{0Lu!2D`69ZTr3MZ1z0GLQpsF)8YEM!CAD+>)4T*IYF!z2@HqDpGVA6&QVY$V30%y?aMi(ck{2{YidsAOi(N85JsH*-b8*r>X?$!{JDqB?!lM5}C4V5BKb&dh z>Sd#(k-N*hW^i6+?yUpAP~_SEvK5?rl6bA~O3gADt=?rv19SPJ932Pw)PuhpN-DD= z0$wTH4SWYll%V2jvwSXn+^?N*RS8axaK~+iJJP=Y_3yaD4&Tr|A?_G!Sd&U7Zx8FR z*k;knwbpoS;**XEDkiTCcYIu2zOW{r9VeZ5D;M|JZkM=m&GwYU76a2ELk8AC(;#5C z)Hv-4()Je87oN|Br<@M$UQ?HYtxzPHsEBtcc0P_LaWE&;f$+UxDZ$wTb%hsf-o@+q zl}eM@-8^ZO{(1-nUeMV9@Jq}Mu{`j3rPfKa$tRB;7dHiuCs{^-4!Mf|pS?HRa^pr8 zMc@4ul=iyECAVDSP?SvR`1UT&WRa|5l9?QAFD){Y#VI+6$+=tqvLCn4Z}`VuxO;lL;UYh#3LI1q~Z+fuqMLk;`xY1%Cl~FQ!YjEhe}@S{K~Ed+k%Q z>cu~Tv6iFlc6Fk#8Z5<~@xYhcN3Xn1KsWdq0p9WPg7?HF4t4WeA`2ig2G58>xs*@f zFtF6FkYq9bJc{jckAVk-NQF4pv2TTRWg8A)L#%h(Z-F&7F>_>MXxOwzOLHsi^f=f&j_e&gX1k}NS5B5pZU*RA;O|qg1+uZj zh=(=4cGmWE3l#BpvADd!CAy+MQkgPD~Z(2eu1-$LLyhw0Xw_(;ra>v9_iIgCM3@ZhY9l?+ zCSRx(+6Dj9a^W`be|G=Su7I;HjqtD0myP@O=a&9}4VljLkm9P$n8>jF7sIAE?i%-< zMkHLJ_K&+`&3{r>+;y{mbY*bxCzaIRNW>=I2_ZG^vwsQ@xHRN5M|{?J6bXnXZPC(C z*c?oi_NcE=%KkT4cQKQYRVN9<^%dKllM-}5z8**Bj^7hC1h~;E0I7}p9Di4wL7T3F zLMvz_aumS;59DwKvLTp#wWNF*E}13eewZ#TKo(nEywCR$zy#tYyE>dg=vBT%|6;pY zk^}H}zEEwc=>L(;_zI(&qk)C@tWlm*$g+ebRr&IfzV-IggPQ+Id_<`aS>Q+bMxdGl z9J*Z5bI6A_tdAeDPf8yWIu~s<+LWSO6|sj;ZWu%g&PZZTjON0**)6a9;ik(_Knn#3-e|a+ z+Lp#>gObdyIAoZ%M`8*8$VzX$kz-deghXj4V){yin$l;dEZ`&-&@&^Yy?l9&>abVr zX402UTJ6FMxnM^s9uQJNoRMhAc`r#=h@S1Yv`y@1N_mD-kH2$*QV*BrN8!V>SEL|v zj<@QI&zdKOTj`=kcR{7#n>1Tr-@kLlzFs0`jmjs`e^khip@a4_0v!ciZg!o&K$_eZ zb@}f)gP~|~EQ94ndzFoeW$d?KL4BFASAUmmcsU{-x=5ba=59j()@b9OrDS3OHBwI` zl4Ym^YsgF$|0ct;7LGMlWDr_vwDIu~bDRhY3NG)0kf4QE@HR)77)AX-9VqMm>S`o! z*8cGod85z}DZxKyr7!Pr1jvVGsToY9)O6w@<4%T8f3R)OkCd}W*!_qG_Sd&Ki;v%i_zT~DeY&?BueWbEqhJrLcN)m+tgvJV_icq+ zQ!n|_8SM6>@nB=Q`Ru-hm66TO+|B4MYAz4ml+MQYGv$4~*cIQQ=Ds{00)FGAJD^X$ z6!~h653Ky%eT{>2a=}4_gR?Oh+9Q5ALS(56h5%vV!ZGxL z>EHWvv&Wu@Oi-LivD`PbkIuHCSfki@J)DBP5F3v!(*xPjQ`%PmmfNhb89#f-V(jd2 zBCOP7Y=HTGbOvxeWdU+AAvav$Zne;kCHVfM6|3UlPQ(9(Hp1aXProRit5>#SBE#X& zKQFCDVwUK)qn!%fMC^aOm5qv@Uys+{GwgnEPlrFh{`i8Es@ELbQYnYQdU`iHeN-pL z9%A&v+rM&cj<+l%5@zx9WKJSpbti@xnsd}BbPI?rtU{^2?3Bp3&yQ~8N3p+x>={n< zfBS0}PiFnM6cz9cxR@j&B-tTZc27^7ZB_g`&Yb0UM$gzM6r+6<=6|aD!|u^7l<$(P zb4K=~8ZHT@>C%5df*%8z0+NrIjcB&uNpTU2;=bo)?S)EI_dPeAPI*nF+X6gs_f?iy z{V_WH_g3xAP8 zcZNgsZ7{1+0aE=@0Z&cS3~fcf0VbtH%~*^|H3+tHpH4;t3#9!=^<5aJeV@PQn-x4w z2~S1&2lS4iF*P8Uf&dFj!mO0#>9GxEcyne7n!r5)Ffe`b`zK0ZcGF1ShKrY& zjK{A&tg&69kIYIKeJ`>YFQQDaFWc2yiwyu5aqJYEIJS4<2fhCwF8!NP&%h=&iAE<6 zKn6+M|05}xH^GW(l>BE zbJ3S=6q zs6(|3xYE4c=jgt!_(}!EFb6~F=u%Fm2+fG;sVAvL>IiO7GiR7$o%jNV3IiSS2qn9C z4$O2PUrAPn2j7L2k=I2;g+nkgpLYqwjRglSf=$YAT9`%HETh7p@`Q?ZhIS{5Bm15ZIA>vGUSIPtp>OL~+VL zSN2O#{#C+b^ycY>5nimfE^Xn~O6$U(UA=T!+;-}+{B_cj5BMr{^OQe$=^cOS5;~)$ zM_?!fiP@&NJW}zLtD0gM6nq|K9s`e^OOPRW|>- zS9HV*TUY_ceO6nn&kxD|ywNu47F<@br9Qp4ohep+9Kv{Rl@_Xgm^sjGyURLOV3ez$ z;P*$W^p!N??T&Falf@-#bKKMI##p&=F8#f*Y^xxBUuq}1aeGQP9^;L`vtbf%GOj{j z^odn+ZbpXDYUijD<78MmPNB_4PZ^8;!oH!(jb$xv7815qn(SExM{Paq7!OvriG7@U zT}!GiMpeURSm6lUB5tfs11pG~2@bE~CAOt1F2m%Jy<5sGd7DzNV>?ux2j}nM1FJ5@ ztuEmTE8(1b9gDS1WvSZapj14!Q`S!RDmUS~)3y%|3CHna!Z_f&&18|oZ(-$!y@eIf z7HPb7eKufKGxt_kJHWrvFjd|5`273bVgheZmhjAOUS`!a<=d8N&ON+=p8sZ*j2nw^ zT1`+T&P6pb=p5&|xb>gbC9{*@-4Ev>?<}#Jf#F!*I=VE;ahk_*RoW}=;8}XKFx2&f z@tU3VWLUP}_YLefixoO;4{ueaZ@%V^^4WuY!lz5-zWC4oaOYM-kXaAhm-$qXE%MS zTnBBI4ZM*W$DNoZyVma#Eu8zE;{wMA`l59JT8o*+Qcdq zuxUO8@_7|B`2{;w^lZ z;I|G|*2RjKM!r_az~>L5T5hqa*Hg`@sJMw$GIddnvk%YuTJAW3&q+v?UB_2tx2ROv zjn|z%R`=As?*_Crc$LpuDUpNEEsV{+^NO6T@^6z>;tf<6O~7ZIRTqW+?h6`y7ya`J zpuB$=yQ51Le(QU$vMBXe68*9ErqhDYmS|tL@H5rq-&qw?{S5q9^eUGYSfy3Qzt5?V z+H~=cb2t+od-rj`U%aT*iqOs|FdUzbHE36(-;xuoWXdbN8gf-sY~S%J(z4&AHJb9i z0Ut1ar!M+tm09t(R2BO+;Je}Wjd(coHJ-awb9r@MwoX*Jw*YGjzZvdtIDdzJ0~wp= z--BZ&SQS`(7D~T3t_Co*;d@)aq%%3mXb5OZhfkeXhQ5!(I-U)j#{+zS@K>YdRi97z zS)X$p=snQ~TVKM3R+Q(*Wo;{*=Wre{XHN5cj%||dEr!n~UqjAUAKK7VVJ4IZ%r@Z;5dWdW(*#qsP?Ceb>{d$oZ5mf*;wr@ z&{?C>&RrbijFoxKc!lFxkC-QuHS!!l)^L1LzeT|-oQI)ZJ;CYvj`82hUkRFcQ_PFu zxvt=HRH(@GTogROWmr}jGiB!l-!L3CMPFQIdFu*Rs#3*R8i&4Hh!3SL;>@~fs_TWa zxa{XMv%utH%d1cxDueJHPi9J0qEnNcGOwh|w-SBT75Mw=8ZQAZi63Um+%^n$8OH-3jr4&=xDI1{z$=7HFduv}!EmdHOEO>RH9`L} z|DpW3te2VIPSWq5m_&}(9@;2GDN^Pp`12%6@)AFG&KWnmY{ur_p+b~;?=kUTp#a)JiA+$KB2 zrAwyYL7q15nSHPl@Ow5#qNmJ>*&!A2jAS@_Z!De>?UUYswp^|gt@c}rTz?OIvPAl7 zdOCsI9}EXW9ek)xA}4f22j1b_!cpdWYL>K01N5j^EJx!1G8?RYmsD8cH@sY7P3-DthY( zGF_H&r=tzO*<#%lxg_}qLs)l3=e332XS#-PcFyKpSQyM4SL_{ym*P=)<~$Uz7qZ1a zHqXNWZKQgkBIN7_pAX{oAl)U`^LOlA)bD&wjINlkwdcC#3116;Q`hs}CmZizeYp(b^C21__y;`Za;ZPhudrm_ zt4Mfc?d~r4d<&VUJwJ%qWjuZps_%wCA3YeWC+r2!$EA4?KDt_twOxs}2v@b~(mV2! zh3ieaoavNCXq#c&wE>wwhqjqstf7yU!@hIgW(Gi2U%5=|4wXx>)%P^s?=^8FfZHhmrwy;D$ z!cOqTB_#d=`jF*?=W}^_tD!e(?oEBH*s$6(ykFttV4K0bLVduTN#6pD)PIw~R`mH- zp}vXv1WpEV^m(@2zcDsmpB|1H;0yV9MAAhV=aB6FxDrDsYA!!f|5X;FDhT_sing_u zXY=KLL{vP>jp1(nzs}e5`L$;=4Bxw6t}bM@CdN17V@5~uo+95{7y9NlVVCRUzGq`1jVJOx z-=;x6){Ms(h!%~kB6||I90o?OTIZNk;#_P!PCgp^0^cvJhi4B+G?(J=WL>*fi5-|n zVds+EOIDP5yM3M9I4;@1o*nJ2<-K0@`yT|mzl~%QGP%)`*PN}JHD{kbyCCVaHTORH zuoZc6lH<`v-?v7%HaFZhxRdO{B9GVIh5M7J*KJ+c_r7=?>PBPW&5z-59vUmkhv~kC zuFBMbUh&0~8yN3Ci+DHdYpwR>#RR>$W+IzaXeFuYCV@9@M{e<*p^B^bfESXXJ!QQx zP7sB2-OnE^E)O!_ivbt~pA8X=eS^$X;={t8pfxZ~o}Wfzo;(_nVoU`lADeAeA8@?! z-=6!-r&AbTc`*;a-El7F+;>836OKnmz|G`^er(Q^u{|Gw>$#8^qOzvLc~g;ZhULKih;JXy3n3J3Y`WF1h^_9fyXTFEy(?cvyc`JMa4}ZyCm~Xh#au;J(${vMI z^w&6gzPRM`xHfeZebT#ev@f)RCkurR3X3yazP?PoDSRABe~UG&<`i2>jb{+-qq(*5 z3h9JSPS9C! zJqA&5DoI_d@758VW5E|1E_HukB?;)yf6XEe7#$%IwOR?`&JoZ$1JPC{YvwqTG zBQ!6-Z>#X1wmELQpxh94<^lJl)cskdkLSf(5FT%zWv$u*rq9Q3UW}D_v1KlkQWNwq zrF}=Wzm6)Kx_rNl`2gIeY<7XxWjiO?lxVdv@3%tMqb@(!7QRX@2rPj%SymPi>$*pzL=ih`w|6LWnHA z;MdpZpqq(zxjm3TIiYGm8UZ9o^vaMYheBSP;dD8>mmZ@y?Q zvh85B)V)4~U}&s0Mc!Fo;Jf^u(6Ji%6Eg?(2ik_g`L(mEEIv01FNn7q6emn33PE{( zA^$|)hck3FR{?Q$HuCPCwVXH7-u6+>`hR1zm{Iwty`51kFWDe_5O9ii^Gvdh4=TP1IW=K<3v6wZ7Vu3y-GsH2=hjpCB|QJA!}lr0Ud(yB0UsHC)f>;3CL66DHAf~l zGr~suFhJWB_(qil*8Roy$%)`~xBbAQRg$^5*RQ~uvU6KnlbFjA=hDg(uJ3#~ z7VNjeLGTdS3Ik6DF#gc}xd@E*$^NGOepHY`8%*)+Z^fsMMjkYXvgrqA=bZ^ zV>Gk+&|&cx4gUAZA`H*&v8%d+gD>) zXP?cUR`=q)JTg8Hg#YC6Ccz56AmG|CeS6akmJW-J(`S>(jI6HM&6a3SaF6B{!beMy z|HXxh51;{guOsQ&Fx1xKeKaX%CevZ%;+nQk!8jA{HApeL0^5r$q%Y=;dAd*b`A$uH z{xUsUKs}nx$$m#8&OV!6OQo@tq1wvGn+k0<(qbQ%+v$u({;0h4?Ip^%8_nxsxQnYf zJ}U0`9!sD5Jvq!>`Qtci%>E4C4%;VY_EnSZO-nI1O>crsKAg}$)jj`I=Dn0ZuE}yz zD=&+EwKY|Tdo~@)_pH(F`{Kqv-?r_>Iji#CHiN-XdkhQzI# zO*L0z_L3MO%Nt-gM;R#FfW1pG`cfiKxxn(i_qjnh)^w5MNBg8RjF&WU{0^NPSPVKx zyE0o%YtzixT-5jOIgBpYCV_K7=`ZF9|55(_-s)EI+)93!Ovn43bezs7E$ppX%ABlR zwmwW+%YL^q?k}tRVJmA^rZ>Aa_boZ17}f6{nIcRAH#b)z;kg_YS?BO zU`nO|55@_`IJr1B7!GQuAI2UYG`qhjCWd7V&#r{`8xMbn!FIE+ow5f!KZWO#@GRIc zc{9GlGd|_&q?c-rtp&i5wD-fQt>9viG}ZMx!M_xqKif|FNqsi}IvCmvW*p~kx;BT? z+b@+ub~Y>(0pFT!CL8=2yo)$W7I)CM2V)6fv5&h-ZZ&R}@VrVRZZ3@(;QBt;d;2RGL_=i?XxDI4=ToSJVT!!#{HZH zxO>QdDc8rnu0A$h-ntp z*Q}IlFn%Lp*6-IQ@D{>pp0dz?pU#E}I_#Ha8n}J0-~(hI!f!2#&M;}8Dmm*;k7w@n zoH-t*^l>#YspwPFheMdpl-37jYP^=q&Znp=Nvl$Zb!}zOz>5=D zJ4OdT+^=gKKa6&=S)fB)Pdv9Ka4z8>%i+rI_*e(zRfK!cL0Z!$I9H@8&=bi)7v#wz zZ38VLE!_`6Mzrku_^#-uLoHD$CH8#|>s^b{vych6&b>~2Jc>hq$)nxtr2Ra2=Db%O zF0{4TH2`j;vBMJOpP9@g2BqTKg8m1fzW`?_i%DnsdA|a5Un$`^x$N18n>^yR2lyMB z_rR~f1Enl?vb?ZM(R3=Q=@p9uF5qkck%1hmkO+x2t}4ysH$_ zfCJ-BKh6F80`FuK!)bQc>-Ir56yyD_ajJ!^HRFLI&}nAd>oQz${M(~4p2xMhTsSQ0 z{2}5Va0R#lo#mG!3V*@70KYpQeT?II=X!xw2yeIJyE3dtKCuAaJ@;F`hYu%d!>HC( zKAfbP%ogJ#?=d_BeK^CCjXXKA7(S-M`u%Fy0ek?Ay;OB?rs~^1;-q8m1f3%MAYac+ z4&qu>ZL{0We^~;4ipX;+KFGenIVb0A?nIXX%oio^0UmnMR7Jr9Hw`1@S}6t{o%uW+|s!|C^z;4l&#PnWfaObzyrXK&(cg* zlpX=551`9HmNPj&19@?@fPPFo<80o40se4Qna%nQ(m_^&iQ_q!Jy(;s{vXo&I9b9cN&^k98Z*=4PE6b6K{vgk1y>9kwbaKT&*r{77~*zQHV7GJm9@pQ9#I>1^V#w3qn zUcDC6Q_yA&Fx!AHXqPxxoR_7(P?sgF-0c$eQ1uj{hZ117F7O<4eB4R8w&qT`r-13B zI*bkWicROcVQv+ps5KQj^2@Ym%ck4+A$9|J1+`UY$qDJn1kTK_5x*igxtwl zo-P5~gWsN(H*06p#47edl>gl;1{NvB!57s zt_g22Z*0r$75ZJs9>Al``gDB{rjJ|M4|+;Ffo@+uwz5OKivi^c*wHiLvl?al&^KsJ zTtBvEFgYS*pvmqti1!t`4A^~hus_aZ8-c6>dYXe>O?-p*FdW{mJb79@Ws_**RSJy0frsKXuxXh51fJ+>E3~b^kJgRitynjtg=gE0 zK03v=Xv?fQzw-G%aNY+RIAu}p>^z@BXF3gKctPAn(A*Ng4?Hn`^01f@AZJs@5p9LobNzh0qi&zMTS|-?q$AoZiefLbQ2#S zJ>uHuz_(iV_XDZDx0ds#a5%BR{s&wD9ujstg?`t~lIflhKFdw$J&?U|tz#$Ry1B@JU1xwyP;mr$U%H3EuqwIuxYbF|2Y43<%opb3RFlZ-jlI>GOa@)#ar*5t zewd9yx{cc?6LZPdo%vgbWz)!3!NyGXFct*z3Gqb!7{CMY#X(=L#hMGbb603AK-a1E zbNz0EHYM05GqkCK4= zGIWSC3GgyZRnN>GINF|10P}Ldw*xr)sJBv8kaLZ=kaegVUD-i)f}zg4)F7GGDr&l( zyFJzOw_wvXn2dMt)BzciMBf^H0Ux~;8aC3rVkZGzf&7}2uj2EG2^J17@}%l_9u?TY zFIuBL0{A`)TMT?wTf_z0$?6xJE6AM*$dohK(QC8Z9E&?j&_8E1!F_Y^+btpEOG{x( zA-$bPKr214ak#(X;ui74;%S=jQx2-0n2#~$B+1P)=o+BA>d8Wy249E6J;7KLvx7~v zH3&~A(*Qqf3;JU|VK9zx_~MLJeu8HkXWXOs2H30UQ#fR^ohc^K?b{&#a9+RzN18MC z0b>JyAq_{#yM98fp-)fkhx7gf&z)?-HY0>%Uv#*EF4;)+OLCf*GOwidKgWs=_)H8CEzU^b=C&qAHc zW4_=YFF+p|jTzYG2ku{>jmK$5UF%LEQTNfSJt`HqCd}QHy#On~>BWxoX!omf2zd|w z8Rp_JzMtMM$^Or;_O;}Z;l@pRoQlg|D;Hooe_F*jS~5Iw&iXUbu*MzPqyk&b})PVIJk`#7cN~ zn}O~6;n9^{*$mft`)(;MjhPMH_XqZ*OQYBa;s{|Fbb8~vTwz7{z%U*K%8iUkz}RNuge`PFeY0z*YB@2K!cPi2LvEKpr&X$E==cJT}o+OlU1b zZ|Lnr75IC;W^=(l6Xwtse`_nSjdytGULXBl;IB6SyQbVDI58`8KfEY6<}SQ!j%kPQ zL+)s=E2*!#x$3Yf-G7HM(~!A?taR<_b=Npd@7h}r&fE|CO0GVuoFe`ur1zA)05`Uc z`vIODDXad2h+(ogv}~84O~&EE7yf+em zC%NGJO_h5vRyS916q?303X^?d@0LRDqI6}A3cGqgCF>7mW1!Endruz9(t{8FXj$mP z0qBbZ{myvEKSz1Z*_x^`RieK>-!n6ry~llCCX3YmBKBCz(!Gpex0#YHAmfJYU$Du+ ze~3$TMsU>>dU=tYR>t7#g|Ofr2+0(bNy^=y03-L)gx~ANp3Ibi@a-`6LbNwMjOFp} zRX8*1dfbY=aCy#N4EV(T8J7E?@_UK*Ei_Hg6yj9P5(L< zkO%B!5BwtE8tzrv&g`@W`qRdV)0yj+fIeY;Pv?Gq_Vh}LI?rfKc5LW5KrQ7wDF>KUwtOO*JF3cQjDvQc^>X~ z&)4m8f5Lz4dHdG(lY3Z7d@B$;roF0wFS@MKnzOxJ^xca)T1P=IY)#^Wl8t_JL`+a0 zSEs#krR&2##u_|18(6d2Y4yb~|K+_v=6A9jB#hN?pK(I^AWHs+$TCU3BEOwny=VMR znO43y&+$X+FVZJr>!!rqe!rdxwVTO?!F?0H-&R)lYGoK*Ta9?V`k>~ZS$JP`uD4+OuExHPvF=Ol@^Neja@^A^U<-NkBl;ardUKgK{Q3sQK%4NC-SxZX z_>%9T7mBT>o_K8Qc3Y3z_gaEvGU*Yo|M41O@Z>Ve7e(flTE?WIwX!T;STeRO_J#4q zG_0F}u@sCqxqHJD(+3});@~3Z1NTcx7{B)X3nMXU!@7;NM7AW$lYWxo=BM9#`_xa`Q0TyxN}kAAa!y=pE`<$Xp6br!ZaPZw|#kuyp;QMubp zh+IS;%IE7-tPAmz8|k9ICd$kL(H-E*064td%Pr%7`L1*$zC&2=cn$*QEGj(DczWGO z+XMFmF%E(2UXb#FbIgwHvU}Pwp9TH=P&@Q8z2m%nedkpf{|Is!eXEN$i-FMe?`oEfc$H*H1=huw z(Y|k|0FXd$zu{nx%K&6I=E#N4PsDPh_zvy=CygD@`~mA9V9p)OHKuo6pBnyl4)5(H z$UrYo0`zi!0kqkHIp=P6HQSGG-1o0A8IZ*N28<)dFVnt9=Pu4j|06%p9-T(98o5ts ze;AhRIMVk+g2%u7eLRQXc>kSqRK#+4}LdRXGF=?=4Jb6-z$i<0} zD-Tj!&et#4Xc+_dhRr$H=}CPhd_5l5k^Hsn*-F~+UUEFX3(8u`>u&S81$`^(8{wk- z5a{=P#P1;8HM25XhuEpOA6?w|WC_rAgZ63kqH(F;f~FsfM!^X5-J@D0U_;F(#ip)Z z_&w7!3idLKS$qVj`9{6OTrOFEFpI0TJZxF=r% zIU;<^CHN0u+uI&s3-fd@uB$)S-pvIJJA?Va$kGDo>g^Z_*`Va*P?vs z#>$n8!8P0g{wBTT#8zU4@^g$i^SzS$#P5t1f*oou>?!!zlyl40sJIj7!JgNjrvv0Y zfxBr|)a&x+%|!0Q)uQFFzXsS?#Aqa&OWpS?O1Z;$u4{qkxonm@74#1PUcvW#y|K1e z*PuAov&MSi+~ioG+&`xq`K%$@=yR~8w_pP#fG6HZoC`$1DOeki>l?BcTWGT?`@B-z zb2Sd^8|NnAOW5GQ+hKU3Jq*nM>Oub|%G2OJvvYwyvXqDDkNp(zTtbGH*x|&(^H2T#m)rWImK)3@k6F zJBhn~%sCi;R^#c-C7zAwkxt3%f_qugyvta_?sjz-y7wbwm&hwfW1MG3dN+_?pufLg z^1ckk9}2_>dP`$HENLxKgO8oLIjp?edIyZja$Q1y=PX#ue$nNrkT^hE-5Up87wmWb z!T%n~F)0>Ixw8vf>`6%HZM~SIlIyI*-sO0CHl*esi=m^<^QYh&^8tOhWVUI=VSCLO zADUknN3A*djCJtUBlPvH_^hrCB=74Y{=ojYp}cg?zZ02%Bk2@mT@%--DCMAdbG#Jq zdM+=*diiQFz6h6Lbs5t%cgoiVJu)h@^ME`qPk)EiZ1nSvYzu_tWbiY~YeAowe@t~a z#a>&)K9ihV1@LBvi=s2?u5Ecg?9az>7@picVcgTgII54orG4}#;CaTr){e=4Zr43A z=EayN&q3+qe*WS{;uXH`Jl90AjXnNF9C4gCLe@&B{c6eyEg7>)uJBIvpD*u`KTR)k zJW0;0pgakgf5*%5E4j3?jAPCM-#?FRtNJ36P4nl`-81Qh+Z@$Ih|VaaAB=+04m_97 zJxF&@)L5(w&w61#?+Ww6+;g~Gr_uh&iJh;YGh8X8dv@mz%G^;Yf&S2}U&_oZw&%01 z1#C(@7teAqp^q&)$LXHGpd2u|r>3*Uxt|psM(^Pn(<0`0vvXYe3O}EPf3E|$<$uFk zrcstHg81O?wz9ppeo)VS^LtCe-e67*DUKHoQ4-|Vs-?zLKd3o;}bk=~=`)sw8@;w#bx|)hRv_APY#T&xL z(m)PyT2S(1`QGMy(3Q?sVP0<6NcKD63oP2w8Ts2K*H2!KQ_I|i(IMN9%%I(A*Vy?W z9y2`fxGtU7n+QA0pSKHgQQ*Og;g@z<{>GUYyhW=*vjpQ={{&DA2R_4Ucsl&STI#q|o#%&y*=Ma%TbY%<5 zd?n7p^0Pwb9G;`a$EQ1%Fvl;rH!Ghj;_-66kD{J!@MLR`>0(jyyWIi(LyR(}cS@!M}Lt5|C8C;YBb)F+(^F4Ib!6CUL zY_9osq1e{r>1>BZ5obrF1ewW%jFYon~R?dq743&Q8ctAgM$j;M}zlwP_cbD5b7yLJ{!>mKC zQ{*~3;lSGAo*?+7*-ihHcGtou4FXOnPcZ=!u?8a%a*GJ;JXR! zvEUh(e1vaqN5wKO=RSCHh@BVwcf*-DL&(l>&m+$cJgIAbUp#}y)U;rJp?qHu-R%JW zREW+5S+Y=K>UL01dU)e|9|2e?m*;&r{qp)FN6nt`wsE+1n;$bqQ85u5HQrIHQKX+dwt zwFk;&4fgHcyA;kh!ne?LcGeW&#Ju5d7V{8i-2U66e-=E$8F~g%v6a|wlDrDx>#)5t z*H;YVnPl33Hd8(`C;4_4^_o2_^+NNCeX$dY2}^qyUR>CY=$q%r%YK`5uN8-l?qlKi zNMO#bPnYEUK8bselj46xwLzSce}nO9lv~WNT=TqMloObT?~{At9vA<;Flrp-&bTyh z%wu5Z>`k6if_G^RQ+Ur#Q`~DAX7`X!0Xod-PoL>OT{u_x)EdisQLYRtNAHz|om;f% zUfx^f{O$dTowb(F2n1smDt`Sw=q20SCyPWL(|ciy_gjgHxA&v&`-Go~x?M@~8P`nQ zE3>{tTjGuu`OdCU2V-~tg7x=u1}~gt756Gpe_{KGk_=&Zd?^ih`-a}V5f|xEo~K8D z%%8cm?-<5s%6^`DALPCLf__TIO>G)Yo2X++_CGl#QSeR zpIMRjpjA_ei|g<-Zr!uO%xf2WLU`e(_?!msSZ`YrhSY?bAuf`YV@a(ma zV0X_#NA%6-c6=tD6}z7HZNVP#<6vhL?WSgA+Pd8@>UQ--eLuG5p?i)O<|y{dKRg#d zPw&CMO!n87lkG6?u=t5`HaA+ghsS*=?m>R!g)_zLm%{CxrFHEH&sJ)`tglDonQK#i z2Jb%Oo`5hpBkd>bC_efZ%R%+duIKWKY=0|ft)HVSGMDX}m*DMX@(c81z29!w*oK21mEez%EfQME#APX>evERX1htceHt3U%2m(HGNx47rWcYXD)n`fW< z48y(eUKh;0pu2+kIZfp}0_F0Gvx$5^nZ1j3Vj9ojFXUTsPbS@)%wsLjk+&*e`f&b) zUy-+YC!aQsR>Yzek?mD;Mb>g3ZC~uZPxC_E#lx-F-PaOxEP0a>Mk9 zT*3I$@iG=`b?;^lT}NAq6D#X@$-lbb=gpMd;`Zu2@Psa4xXal}&d(ph4W3DNzT=O>P7gz8SYSF?M#sJPk=k`}Tw=@0{J+CvyGW z{iE9zvmxz}J<*FftafPrFVP#_De1yK?2^2hVm$zLeqp(PK7Cb=%w_%q`FcEtwdD6| zEsPsp=gd8)8FD@caWL(+4pVV1USDMPR<82CGOcEQUcP(xA2DaO+n6I=tNnNw4c7y6 z{{3{h9c`8a`{TQJ@2=lD8}nUjwAoM1k@GIMS}aye{`Gq1{Jebq=F>Ody!-CE@7~3} zzIiMDd>v@Fe4LK?2efK|y;k@f|NJ@j zV;G!Qh>7d#ckqAe@|~|s9Pnqptf4O;HN1Wfto4!O48|iz8!^&zqM=PZ8`?mpL3jhN zJOg5d-lO46J_V=Jj|^HgXFUNK$GX0;pM);;6m)^ULLm&i^(_1$XI4<4JPt0wcyk%X zcfO7yP$)?Q_f;24!NRf6+tYfqdc0ZzZ$dBsIUEc}_Pfc*UXM0T?E4t|`RCW4Vw=%+ zw{aT)fIq($z5M(-_T!KI)mZDa7_RKt|N39>f-@!B+{B ztHbhcbaJjh9&QjuT=OlU>3%pHncM3*{RVBOkFhKMY&_cDAC?cB6(D&=^D_&puQe0cMDjTp*@1Ry?OICw!L2O zoXPcIy|zzR+qW^Aw7Wzq0zR*3jMjQH8dv}w4E_iRzrx7?-eU;__kYI*n=uTs+&b6x zXgS_a;OXD~CL?UQvu#)w@5P@szrczpUq8nF@fExKe_~1aNuZuh@@fl!zly)PhS3WH zbK=LyXV7TV z$yUn}xY&Tz@FVqdZ4PW(h7tkz`878S2`4hl(9jRD3m^RUDYl(#R)^SfbcnT~MPai6 zDh0*!pAvMj#m?D^MgxL^J*UOJrZL?Gz9N|T67Y3`C1A*hRcP!M!_npqM4p|p29`5MlpNfQKooi+Q0qk#7e*Yx zI4JoRBmBMEx^K8W{->mg*n`n=J6c*!>>s7|wNT#Iiv9DIy*RL^0~kkn3qfJOt_PdJ zBK8l)d0%6zHG+rwTm0p~M9k^q^vezwcCd>%+_<^=Tg-+h;Lxa_xIVGWgjTU)@T z+byVrDX5zTGQCt-Z|6J4rC}H?rqHZ?N=CN zw27IMfw^0bV(=}7pZh5Ye0!w8kzK9q(O~&C_LBg`IW5f}9|s@?egSv@>o6x92xtYU z$KQb1mLuO>Hp*m7ptaS4A+tDzwlJ;9Xfegv0GPXF>~U&NrT`(XwzB+aBdwO;9Zq2u zFg>uO!S)*y1T@-j|GnLeVhml^9u@LlR$WNwVg~IkU-9Mur$$rVz0j8@5DkS!SC{mev-t|FQ^N7bC4^! z+HI@#Id|V^wKYB0zSjVIfKSdluiv0C9Ah#e7Gts?2D5Ff7J}hXEC8PnXF#8C*cw3EZTOVHfDJR4Ya2!W} z%w4KqSW}w#yV!q({l|YB0EwR*6lboaxZH~W3Jb`@yu=iM=L#^a5FvUagpl4}Lv|0h+HL)Fz0zt`8YM<@E~r;; zWV+)p`a~8c0i(nS^!erPJa7u&^SWQ|Mu%!6v!L+20HA&fw#A-9f%N; z_8mhk{hC*|o6X>KJ$2~wN=5z~X#K)yhf1V8ItcUg^?dED?dkRkb<1mV zPyU)=knF!IW|vLo4~ryzWbOWg>logP=a#z;u?a5bc69ZEkdz9a+vQuvOF#+Rm9=t- zVhfJ+JBL01UM3|4#EMM4BD3sG1i)(Gfisob88E19USg={xBs&pdA0(#T8dn-fy;ve z3)u2|Po^TN!ecb6A{sfI_q;~z#TD2%_G(~7O<=g2+Lks#s}WsupLOt7^!vs|Bk}=L z6g%XDi%bNLpD>TP`tmc;1s3zfdq`7PL=u?HgTdF{N+SQ~*U06=lN;b(uC`!6f+rMv z`;H^o|Il%*BYeD>?gva70OBZ$ z{5b+!$`9eFqxNK!GtT-H;8`#XfD;B=auLym9c-gGRHIk1tDk=H^ywDm1abEM8W_qN z&A?&=8xO242W2S(qBz=`6CUYv`IuXFhw0J+(~OyOZdd|?2z-sO1MK;ccM=sR$9KMG zFHwNp`!0;bmplx6m0ZM&GYC)A1B6UiQw{H`f5p@+#Ep6Wt)b#pCPM zT>2#@#cJ5kGjMUQ0-fShr5PcjeV^xYQF@3p0S=H&l5sm)?igx(<6(!Nyysuv{DfXF zt=2DBL9bNq!Eem}{JL;7MLLpK-0jYR zC-C@+e=&iu-jF`=MiT4vya{sjARG^y)ne+5)TLe7dyE8+&@NK&0+=5;_H?=Z-kLgS z*?tdSMnLM{@0L4fWPJ~`>B!4YVQ3$YTnzC)zIv?gQ**RsjNmzpum$zIPr0Cod7A>j zP@^L}kALES{_ilo=57 zUrk9t_PaFBzl%>pA=C3n^OpT--}!O1be+b< z2=@^v;7TD6$K`gUCi<1fbETf8$5*_WEKyl#kD-rygFACFay%Y`Db@xj;61l*9?FYo zk6SoOYuwR(UfXuPrL=_aYD2H7yW}Gly@WwY7P2?OgchHCsGt%7SM~}>rt9%&Iob^D zdmg|1=RafeuQnkh#6%=+$fayx^7^X=A1nhSM?1 zg};$-eKOERfmSiEsYoMp_iifgy5Z0-%5YNxvRr@TR?}>?+xkX}4fZ25xcM&d%45O< z$C-|oR~)3b5~`(LF6*~nAE(Qy6mf-VOwl`vjqTNN0H5B@8lR+Nt|<1b1}I+n0~E2p zi=RFU$wv!E&96&qPs8#Do`m%9Jz8!?W1xZ!MFmA4q6G)c?Ma=v@2$6Db>4VVnC=ng$ z@O9%getz)vTY0C_)f3M1Bdi=OC)zu9_NSz2~)i8uKx)-lrYE&WYZm!$9f)DHGJZOc_`r@o56@SWe%jqi$^@bK>$ z-tIe0Cir}<(x7v+dHWJp?w}j&;k%i#cRifb;ghJ4J?f-q*he>!345PTg0Qu;&laB8SoGKZ z1iv-ET*q-rKnJq{&D&ZJ7cg&vgDOfbyx-_H>9x6_IeO0*eH$x@X^Y~_DrHWimcS9+ zPP7J?XndOMk2o+4{DUreA~h6{e10{pF)t9!g%l;(o%k{QQh<3s;zyO(O> z-*|)BmMXpy+*swxxM6cPcKwvLqJE)I1}~nF5pcLTz>|JOywQu^SEyr~rXNW$1S4&8ckLvXSazbXz4s;oh9g;YYo=Ly?fShm93 z$?6xZ>cHj;^C=uBc#De}=j-b}-`b;YL&y-~xnb$3w+-bP-t+}y6rHv#GZws0k{=m5 zH3jtCHp^AJ*J(=pYxDKBoxYx!;OXNL&?m<$$R_MxlgAT0OSiXR+m!xt)Ky{d>0?JsuqrmH(?Dr=_SDbzA|$@+@Ga?@nW{w zu?zGWAAe}-#k`i^W}A9LW6uusj@Fs*cM9}QvrX@0|1UptbokWav#l4iZN1<$5mvqK zwBfUTIu@Z#@jh;3n<*_?r89?);d<0cPWUbIRvMeK+y~b`9|ouRHez&6_8D zm*-L|LVt$Iemi4-^)rkm_g7Nz6gQm~e6~dUl8v8hfs1?U!#Dsv6}`C>+n|vKS zystN)L5AgZGVK8b%_%!NbYz`k=TUz%-Ppm(|VYCFk5T}k~0KN>4OM>ZKEQ$7P zUQO|iM+eCYqcILI&`%9MYaAxMRH-%24$%{%=k7Ys>05!fufn?oyv*SHjP-A?n(FTpprago z$M?#JM=i(a68#>hBMa#`$A1^FxqL3qaaf32f3}W*OTc^ep_b1Uh@bfwX2InF_FbZl$IaqhhIKo@t-^Ze@tbYnZ{xwlw&^XB3jQ>f;>b(#hS4{fm zo`COMp7FKja+}t|(^ss|ZZ-chom$K)b4wXH!DDQ0j?)47VQm@yNzNI0v9_dJ!}V_= zj6Zq`KbXpI10Oy0;}xd|-+N52Aa6)AMwJtQU*4}L|Exl_ukwYiv88B%xZy+r7=2F^d8Cf&NipWlz9C~82CERYbE&X)Mc7JOS%@m8!xoc zieH|ft+qm2Tt~NZLiZtVaqZcB2xd0tleadKtUX(~2ze^$*>r9Iyf+}b$>o1lKf5}g z#xF(Co~PfFlY*cTuG^}}dob<<-kErM_79A4HaMTH_*|K+;kNX%?OFzdU9FXhBu_Zr zaZOgud4bsu+|KRk2SJ;JKY*FbKt}T#lQTFEdsM7p6ab zwt(&NJbRb$#qpg}?6G)V$W}%-f~FX~K)d>0*bAy{Yk^If$a!)d?N^`+L(mhg;|b+0 z#{{@0o+%$ds?9QKjhq=5)3&3|DKKo3*7pvx6!DWqT zJT>8bkU{+|+mS0zudy{mn6)m*bQxzfZ#TD=8)S?0J{0txwAJ6wH1l*4Zksu@fuLwhh`e zt*O%gzIjsd#q5-ZkIziM%|tSW_i<8fVZ{$Suumh~@YzzT?*{ZFk4Nu-e6TBFvScFb z`xcYI3)O!v`0T#~t*z|0HsW>Ft}5Fo=hMQjVmP%qtrU_TO$r$mO1IKlIYfJ-LWMp- zb|d{~;X4~QMCUP^B#~3+GFSWpCcpdn5M18}<#D6XpQ<)$$J0Tre$GE9bzBZ7)9p-m zdU2f+;cM;T%OHF`DHl?fs}H61>u@}?_&_U@yJRP~Tv&)F(tcYQ?OZFs^F@Wff4^-s zKf`!_I|X&`0qrAUH*)JYW9Qyk60xV1k0x0=C4QFk_rJ~ga3Rqu^P9~% z*uc{ZvP!Y(e6qqnpEKvVlWITVIIZHX0z-gaBwvxQ$IfqKsdJFz5zsWJ|3Bg{4=%<= z&J&Q!fP;>%_{*b0{V6}qjU9;CuLZPZKpR8QCXUn5vdj;#m<;I@{qn3zw$NGTTiXv) zFm3^~-cn=n+%HyQ@e;jhIj%4Go=9Dd2`RF`!M=;&2Z=FcJ8k-GIhoKES%Nkt*UN;{ zwo11G9}TjPR30EX0W zwrR3o7dYeoHTk@n!lzc9z1x)JccY*w`q{eUyvB7%^+D-3e&F)7BI_uQ&y3Iys{Iu1 z3%UDCj5o$YRs{86@)&L_rm_W9U-rE|Jy|j}3(Y?)ldU*>cCCDfjd0@r+a2F4%qnrI zZlf4sbELFFG20K>LmSTPTn9GPJ>9dWevkJQ9|e4TdEb`p>2!{2oJ^nl>;-~t@7ZX4 ze^HX#P2b*Hz~@c%)pa;+^Zvb?fUTF96e8Y<-j559VMX=B_CN|fMaFVFGiSxsy^;pd zi2PmkX}x$7)0tXHjwfiHtt!(PT_imnCfU{S$!#B^1JAzl?6$gIEkAQke4nT1+mol* zOkK4zouJJH_BOY<#G2ANGrc$|Jrf36uYsUNW*eoNm-Y|3*}}8;54w%QOK?Fpj_2Ew zkJba)H+95soN|LG7j3qh)~1=Wxv1~m9II~K%gb|fZ_-~(`bT*xcsoAkzUAFp>oNCl zVQ=|ux^;fT@wmUN?uS?UeIY1!tyn)Y(o4pY1lc+kNLP1Sg% z_``+v39LFi=_idd-jpwL5W6|NSv|}Oc{#bT_c~y8@acz3D5BzTU zU?{MvDZ{dcxp-}_8eso4Ok!n%$`0^X5Vr?owae(f!g7FQctl>LRmEHC%|(BL6>BRq zR^6?3T7AJAlJS=8Uh+7B`OjeuX7r41+g^=z%;)Ro^Iy7Ee|5td?>k{GigCB%JuOmZXIfF z9-(or1#%0Gj60{!agCJ}wbboSqQ#w{Me&|@LpaZ0EXU;vrrS!%txPdCQ-F(311ptM zjv}iFCRLNmIe6RsS#C3cwHb7=QoC_x)#a4i#oO@SuAh>}^r|1%5YP4d^+*%k|O?2PG>H`a#RsJY(dO+G`l?`{5B303JtS-RZrK)(;pLsfr%^&c_^x~;c z)!-+SUW#t*r|NF3;%9$tF090mRno-u!Q8wF@Xv?lBD06*6TA_eqm;^l;Hw0iEvpVfbK`IWiIscL3YjDrL4}?X-mr{m~8Vt9~c3 z2D+p?VydcM!nK&JNnQY*^>`c0qhZW}I|Hp@F5w#SP@87kD1!!wkEB;cwbx1Izm&BT z-h9s2WGC|n(k50Qb#dfYH1yX0f!}(5Hw~$L%_=dRfWFT)ly#-aUR0uV-zR)gRZNCg zR#oDQR58-a9roWY@2lYU7;Nk14M*He?{D|WZa?R;BVz*1c@-*!Ogi1lxB7b(DyZ7b zc*1Xa9}hZI`D+J!i`800{^L4uQ#`y6u%viJAFAf5iQDc^X(dM+D;4k@?Z+lo5KL$- zLvQHq1Xd`gYT`mJs#Oe>s?+|818LM7p6n}Oo+Va~oPb=l<20^U`QS^Ht@ONNt9UmZH%T`@8+)6VWGq$Z zaC2sJ6SwNmosr;`BixFH``YPtRyoxp{xzicvQm{ss&3-;E7lY%4n+4=pQ+S9(ke(anMR!#Mr6c1pA5Q$$f{{i> zsrZMe-)jo4Z!=M}aqr`Oh32G6J^-K6w_ANjslJPqb`pE48jQL%y6-ccamXun1bZe` z*OsfXAP=IwE9|-|=zr*U(pwzuUKeb%9NKmVtn_;JbZYhNR{l_IjkHhpNVrkXR2ZjW z8FiwpA0lW@tyuQ1Qryawof9V5h(nPRAMdY$UMz)1L7!E0cDALqu+RL=%PNFc!m3TZ zi?Y>SnR`kje!}_#J1FZ6y3G~oa^%U7>T96S!|nW5TIj(Y@PuXhsI~gm7W5wHh7gmzbq?cS@OgX;;^jr|Q9#vpl+!*I?IM8bJG6%RP4kGT|BSk@+s%Igzs{>B z&#SGWu1%3m1%4UuY0219tfYPq_Qqj}XLG>pT|>bbv&e7wdx+DBS#ujqC-Zr0sCP|eq4ZF17{Kqde6T`97hMK0-0Pb zExg)q@Vuk1%2t?cP^(*s3U2$mDUZ_>CE7Y=sk#{X_23hsy@59Ea1kL(PwR{rGxRqX zpWa%7f0YDUvfVXXl70W!O_Cqr#nAq++~a2*OT{?M3oD&r>|)#NHlHEi+;fshE5oke zhC|(#VzC?G*<@{sRed#kfVOR_g4OHy7Vx$y+LVrH>+&3AT7CvS@qN}lx@u75cq4I9HPoJw6M@qj{>Leg>JpvvP^~pxYonxz;(Zsbc2hhb_q5gqbwv zwJzwV<>d;`?${#6dI3)n6=|ioW!x91Q}$6j+pG+JQ!=qOlVsO3xh~62`FGHzorD() z!F?N8W2XVAKy${WXRR zhKc3VNzxq$>4Vh;nhEFwrV9cUJlWq((Y{9aA55hFRN0}*chdXOa)QSK#eE6EIN)tm zoSWZ8GBKrl7~K5~pvNu9lXN9lco$Wz`7wl_JUG(seGb4|s6P_Ja`P#9hxDbl;Jhb7{J5U-EzKn#WA42Sn?ir=E| zkFlnHEBk-d_SfmY8?;5Gy(m{-C_a;c+6I0BSy`N845^m8 z-PNXPg)Uhfq{-rNbng%O6e$0CZT(oW%G$xZ6KL%BL)`mjFs6hu8EmbxW@xn6hw)Pw zpYNLnV>$dznjO1`X0o%;H}>(bYnO|6#oar!2XuR?=Wo~H@-h-vVRrC@;GqiU;dU_7 z(Q+m6IP*)VX?|zU#KT44?wl~2@iHCPmRYc8n9aoDimb5h=^2tsfvV`-U%e>T-Ft{~ z1;pzixCi`4<#D7>8eW0iuY)mX$W~*5IPVY{nf3NRjX22THC3tySt;kgs8#Fv?@NR3 zLWA~TX95p(>%sg59tZm$7gOt`C&RM+zHg{B{L+{W;Be>JwK`U9r<@HoFOkDj_r+{T zZ?Joo+u=Y%=Bw?}w~S7~S4qh)KBXjB&|;9I(RR4OyQoUk4iNnQMx%p`+afn;2~K8$D^n zT^MAU;jVe7rCdjV_=qGD;=fUH6 zdCqi4jmGa`ux)&@V;wNy=s}?c)2RnuKs4>5A znCy+MB;J#mNimx=YgWKk!M%<_CvEpJ?wS9=dndnA^g7SEI)iO)Ll1da zw!o$;aeg^71_K5IHYah&%qJfq$si*Rg}@lPYhTO$Ikj)2Zfvi$B0`Fg#KF$Y?&^7_ zX0kCzv0_EUiWMtP?`tD6zhf?6z5kQ_Xt=Lm#k_m6cpW45&3l>9h_j3^;swHO|J#4L z&U7q@RYh(6KSP@{3@B9c!LP61{F-p4k26jlwI1110epVHa!(*D({>(hD`9vO3mel1b3U21a$TU zlD^4&r^{JlxiF@l3kAmVb*mMq`DMX2kPx6Wy`KfFMc^Q2_|A0;UZRRPx_Bddf?D{w z()ZV#j*8lKjWzb4Z^8l@5%T{nxHDt<9}&6hq4(|_dAi+|Fq@%08!n9b$N}@CMiP%m z5@lr@<|y%TJDW`suKj4c*qms_MSF(*3T+Om1IaNy^A0pxF6ZDD!5&VW;q>Hwak{k4 z(T~>5^nQHsPNAtL1~NaLGPaSE(Q@McA79)TNsV6<_Y25Z!-`KOPZIg3ITCS0qc})L zFZr1+gmk@BbZx1xN?Jxc)yoxDa^Z?I<)_933>-!a_LaDt z6$wS*7yWUC^F8^LOQFZFC6?Mh6G;R#uD3L%CQ^rlUValpN8j4aZ9(A@dOabtNt?zL znOp`o`C8_W4awcUdJ|%24>?(%X~!qi`I{ilA%}E9AO0%%wSv)I<^*T-S%0CNC3^0e%+8&lR!hiLcoA+6#uD-uU(m>g z0Sp?FlQlw9BH}=-R z#uSEQ4z`q#5^NC>oSBT%={%aAi5~U1A1rEY^-^OO+84d=U_dg`T_? z?DI0;W$3pME7q^Un=$4m#@~=6avUi3Y~|0be38VVm8KVRgzmy`Ze5Y zqGk^_$KL8iQ*$g-)CgBE^VJUYT=c9^n-+cHq0Ii8Bmp&pVg*Xgt(pmbZ9knPKE1ka zw61SU)yrbO(L13pch|SA+a|cX9b!col?aIyzjMKzD#%F8R`h2}mghH^kXW*wrP{w0 z^S4NTby=!h+!k{eig=|VW7`p$(XW}eLTj}n1~rGwb>Uay`z4Y(xlDe*!|l^V(G&k0 z+B7(DKbz10_K}F3pO*G#D$+-u=Vw2O{Y31@&#Mzj0WR<;72fa2{%+YbzMb-gXW|;KPuQ1PNIHhksW1i2IMQ(VSh@lNc=^{!r zyxaBkjt5T|^t=g?S`+P-v7k{9-HkgSxFebhdOB(hi8!({X! zCp%+xd53S20VagJ51qpnjX?op@b7z&f0URw4C8VuoY8? zgk;xHZ||ee2QWU4BftN8NFS<=kEwr(Hp*A&%dcTl@vvJcSqB^e9~Ah@2glXOv?Fee zRrwE}HOwYT_lfCDgfiaTHgVjuh+$HQr&*Lb|2GykFNtk^uK_zU2jeRTYnX42=^Q3xtw?7yVwiYrq$h8tJMT|A=Feb94urnYJ z5kJ!H@e)d7F^Tc9BFvkq$5K7oOSIXkZR6wx`kLjyIA9=WBSc*ZFgUCQUe=&#rWEi< z;Q&-XtG}ZkP9B5aZ^oyrR)eT6 zF05tpPLRT#|Mz2}y>P=BEOAi~7ty4K^egv}a16Q7G)cJ5zo;1;65-+MgU9u|;%kcZ zqteWW#Gr>amLW0x$LGiaw~q~j&0V|n(soc=8az4-0e((?&0m+smyCACDu z`g39Nv%fM=9^_b|Y-wFsb1m!(-l8d6ME*NKcQjf}jOhW9mhG7fXYRLn@a;Kf^RZQJ zR-Ebha}d@2C`~MJ#WKOx!4geyrLW=jH+}`1hDYTH+-6+c-OZfoGRSa3(ry>d(3yUw z?AYHtM_hPIuy<*e4$$0@~%(n{cGzjejBuC!8*vdOt9YxA;h zp1u4EZJ3af<$ac_J)}+P>f30c49$0>K+NFG9_*Xq^LZfpdMWI~@mtJJXhI?ep1=QH zutMWP`sm!Ztl@`# zeu%2fU!ob)5-wLi6pD(_C!Dhq4!u_sVFiTWhao!db<_}F7gh8jR7H_UibqqCvhcEd zypeANi6xS{|&M6yD?FEkDIFT|Q*)~(au6@BwegXp)t^K`CtnI`I-eW^N zSc{E+^L6DF-=-2HHIpnhe`1#-FrSlP0!@RrNcj;90uzJiDufhfF?wHnTaVVhLe%m)S)e7@M2~H z{|I*mNVzX#c)iMhfBoitT(TJjP1tN+IOT2dXh-5-R*pG#XR~oTkGjU|oRvqwqvh?^aPkal+$WnBZ1jN1jKD=hlBimzTOvjPMY%XEf&=6$6 z{|YUhq7uuA7aIHFT^jj?@K7SCV_dV~@f~YrsBjTSgCG`U{O#$2&ZE3dY}g;aM&$VZ zAPBfo52g{RGMiT*y3SE>{W`3PlDtHHSqaa$9KRYNbl4$6enrwi{yAC;!TF%KiMeO5 ztXX1WFHD*)N@rPOGmHfLQm)Zw5UGY6=hLgZDtL_)Gm|8m*s3>}umZ0&h zmpacht=oBcS$ z*t6*zI{}G*b?1ZxHS!NWWj9Q(J%V=b+NnY!3*7!=vDB`dP`8w=bshboV|Ytk@gOChx0aQxPSn(!mZ-@U=WVq!VIS59WJO_PfRi>BWu zL=+Ey@gV%Iv{v~Ca_-UP{vU&VEM+Ql?83A-d&{JR3w`8@G)p{*TbF*;QZ$znw;=tj zHE1S>|67emvjkavhYjvWHySLLEETA7xr`_?mMTfar)pvBbcC)XD>gjmiIrtdp|Hd`=|4__NGi!3Up2H zVYaR0%03+m(Xvb}w>Qlql)z7wP3GFny<1hzYMb6B*eOR4hVPjp_Sl$j%^$41kdJklnNgpDW z>Sd7B@%q`Oo+@maE<{-%T`%uRby+L-^9-Jw>W1mguKwrf@3bhdR3}t-q2KBRUD2hs zSxbM5>yEr0m`x0J%c=0XQpyi?ybbDD-yl>s*_QZBCAVaodf5e8=gjU9s)p)IvpabG z5zCVv4LVd$LI1-11;mi_w{K4=f<(Y;t%?mJq#a#ZC)g*HotzKc8eZRXS((^%R{^Wt z>mY2M`d*``uMqAH`kpp8E1~>luRCfXR0wOkzdjV zApqcedcpg)dQCr%P<$Sx(L6xL3o+YlB2lgXu z1tFsZeO1mTN(Gcj>FC;{sRcHU?c3-S9+-Wz-?{CT`(!T!xg+{~JKoPUmZs+BMcEp0 zZ4LEBezk+wL6Keve5+Fq=t|qi(wctNZ(bWd+wj?M7qWdpA;~D?%8cS}lv8NQ1ce~c z9lBXTPs(Z30;;*QtWP~Js2eFSL34Q3&qEngjhsxU*C-NopP+jTDCsy&G12gGn&Yxc zpBh7r+8HaIR}WFIA|0T9MQw4T z(A6pwmbIQrms(Y5W_4etM7tf(%5wU_pk4b9g0_&^6}3O3V4TVHn~iooRF`q}6H~v8 z>Kyx5AL|8dKTYo=> z%b|W9p@0;0#?6Ni4RQ>X=q=Gq>K>WOWZf+6)MM0Q=yU1hv-L{k4=J{tr<{%o?1`w8I6rf z=_)^Cas(B+d+WCo+P>z+QF4d$aHTQA%_@|Yp>*6n9vB5M*E^uMCBN7R(a*-v6JLe$ zkp1b;J*{w66||b|wl`>_pGF#Xq6RJP(=Uz&Ua9*n>JEO9w<(N;OQc612zvC8Jd%^V zRQhV0^`UNTU8c}q*1Sf+Ps399Vl zlfO^$?A#i~X8Y!MYE=oM7ylsI1I9u=KOp-H#|BN=4k_;DwyVX){)N68 zOJn@TcOLYoXc-#H*i~Bv?aOR{#aF^!+?+ZWI~VP(#zm}5 zI>~#WvLUs7gQ)FA86~?BbJw`|tgcd$-|fg>(AUfDDeK{Z-_oTxxFPD6$!UwROxP`t z%c)Lolsq90*%OoX$yYWoVu>kvg^wH z!K$lu_)d8@F6I^G;bmuiq+RH#x{j3?P0uN9Q4leNpC^l@8Z5q>DLV92eLIT2NmJ>s zar%O93G_XiUj_3X(#7@XmDmo+nX)F-3u4%xshrKs6>IClO!bR3^bMeYp~3YWD|)8d z()x^8OG)B9W6AsVtkFrUF-8i;(E^U`JZ4MHa|dKzM`U)(F>#ADPNmX^WLCs_M4N09 z=Fw`o&jLS3<=((|xvihXbE>!06V9iV_N{3pC5G#3>be}Q%dmBi2E{ZF{ZN^}mx?tF zEEC3Ca+$Eq>^YX9P!;26cYdX;tN3%$pbrkleDT zr?L@WPI~o2`dc|=&4&5mRQ;i**25OcE!v;YUF~s6sY?s$T8Hm?(3i!0k;-f3+kOl$ z_g{=L_Q?VN<@XbmV~*=wPF=_e=H|)zS*T7^AsZ6wT{MTY{WXcUqEmP+6Y|aKK|G<1 zy&WnW`>fO0Qp=*<$#!T2>%k-+?QTyDmQu%e=zDS;v86oLjpEal+NYOS$~dA875@eG zi0g2Ds;4c+9~g%hyt*2%E$cyjb2&3bjy(5{S)(iopBEGF@%l79gVrhB9E~NZ^!2_u zH07O2Uww;tPScO0*cy17?LE+#s*{h5%yZ5}Ts8oEgZ`Cm`(vcEzB`Vsi&ev4+lsEk z)zx*cz+cciOSS)LYFw_^XKH@6Z@pCVEpahB-@|~swidU0Hyzr8Q1UjRAIozBF?S&u zsZm~;uamErWOR~wWnR?c^JcOBsN`$qm2#!h`Ox|l`nhu$%kq26Pxhz>eZ%*2F#p*2 z>z>p%nC{C|c&(;GbD{DQe&_yK8NawM?T7W#Y2MCb>(F`u&gpNNjnCNHZIk6`Xxz@2 z&8}X!7GIOr8bfpXWsW|vZ2EZLI=mmYKJVOZ@99Fw zhHAW?53esM_LMAy)>#UCujEDRZ9B^kZ9bs5CzA{N9TWYa-rk1ot;xm|-e=nT_R?^j zf5Q9iB;>zpG+)Jj`7P$FAkH~i8H-7tkNk56gxvfmB1jfvp?61bgm(wbaw+i?&*Au(1oDQ zr88J*JVW5ay5Hp73_-L{GCn1nl^P*^uTQnopXy!(DZU`R(e1naTy|t~`qf^yJheJW zJo7O`XmpU<66q9}X^B#$LgkxFbY9}@QTFE+FXw$Ti)Til?h0OT7UXhS%3JPW0(I9} z56$cHBc3a=iY~&~PmnTKf}CFVx|dO!97c)C&t_CtK3$HGbv+*1nxKBrhI{EWNFV+# z(G3+eq&qfKnFpg&&=}l3Kf{$9A+5-n(QVA&ofZ6J=Rb;>3DGx+b0M2-xj{5z{gKgm zB05RFF+@nr_T3q*l#oL!GD+%bwkF zS70M&{SHFii}PaHHsl9(o{nv!_8FduNl)Y3D81`U9a07L+S+=k>*Z?cTHp3N^)S`C zHUPTGT8Q`LVHCt1MlelW}#7Qp^Z+}x6;*@n>}T8}BTH=Z3`8(paXT>6mT@aapy-m>Od?Xj0~*}1Kz zunF`H*)_I*sPB!eNnt)HB0Yq@E#=)j)c?$&zCK1u2hE^Sl!;#KJC!w}$9;3me6T2c5zj;7xL0`S z>*BWp$SrK6a;0%jlW0a*y2oxYJ+V4zL4z4LCd2qA(P3~p7fyA6l(tA;yn?*2@5H5_ zN9pJks@67AhDdbJu{!kl89k(WA=>v;VKta!kSfFFW2hK&N9s5#QzrKD zp4SSY^OYd0lT7;Ml&M}ARcYGq^FGy?Pw~d6e4_MC(z{bes}g%AT{*waDX;Wf7`hV{oT%A3kq@L*gR^&wsx@H6uP zrDygL?aZ87NLwA07ikEY4aMdSHYxdw%bAGXqExBOPwafI(pg0*!6G!G%trT9w=G3K zwGQMrM2heJE=rrwyWlU8`ZA!aX+A0Tt=LF`Q>a5f>ygjr;|#?8N=#7{aX@z7$GHvE zmqFjxXr~)N9olDO6UKZau+3~cKPEc{{YSksInHJIE4F_PwmB&*)tI-iHt4K1#^nW0 zUxPLeV>iTxJL4WjZcs*>pV1Ebfy>9+pxpgq%AJhs|MDFOcTBOQLU}355}|7f+L`&j zxcJrAx0B*>B+A}n+Zg*0*!q~}D8+ni8$;|1lJD+Ll`9isMHNR_U)t^A0b~_1ifxh47nlb)PzCVOitD^08`9I~p z(e=~2Qm(K&%`Hz*?ZC7$q)QgDlA!SFs8WDDi@YWI|t+INbBp` zPc6;5x^G@2noVNJ!Y`U%Gz_&>~8Ib`tifvpUoYm&k z#^cO{#}-IgJtqCenR=t0uC}+!Ce9O0m`h_n2R}US>mi+~-A95}nftnNEOn*ahUP}5 z6K8kW;^!ApL8uF2*5>2UdE$~~e_4&Mv(*BbZa^Rvk3*z#~X!yWewb(BB6YiXIF%xxHdGrD;V z^XPGH1ToI+=E!=FP@&>|LnsT{(CzcmI~b!H+nuzz;rBCNRUf>4JKM6wZ7vvpr;SIw zo5eZ&Rj*5wo%20(zOnxX{+%?WOa=eidS3e8wCwge-qAK3N2mO}cXrojT)I$nxV>@aa@^AN=TdA9*a8_SkQxrxhn_ zmc|h8YE~0`M5)=XWm|cx*=#pj9lh3Ww3DsMIGJr1j-RIlYenbE9-Pnv^sDZw52>7w z;_nDPKxB^Xmpx*0oTmAxSofJeKVolU4CuCwvlocZHKJC}@in`St}%a;cKdAI4}IR) z=+IM#qnW@q4sp5vF5I5=ibE%dl4>gUX+ z*qo}_PG-Swnw@5v&4ZI!_}93Lv6;Aa%RqOmKbSvK{yW=`R_R&I0 zZ!vE>V%kohGKFW7ZG#@VIa$Z*fH4Bbw>S>s-+i!a99!+C+_vSN zW31F(qO2>#(lApr?qQl`sX%j5>aS59^k>O7X&)N*uej`du(xaSJ?ij!%(LolLNUe2 z3hFK|_QFd=@hoin&#NC(!T1Q3L3wt3KCP*~>_NTD`3ySls-42Ur#7#voFL3{p z;z7bJ3H%82-R{o5&GzNHa{f;)t@DE~Wogv)~|5(d*s^GpHUxz`g638DQc1sJ- zDkL>!EQUS@bF-jaI_~>5vwY8dIK(|?@cHeQUY$b>H6QTzdW20x>ByfR?Ef0>MQ0zO ze`>NVcTxgJCIfxfnh#u!+Zq2p@yktkQKce(KX*B^ikWo@_j;#w+9$!i+neT^&OtDr zMC%x2Clo(zUSJFEa>dRG=;}EWs7E?4!Olnc=Z!#5<=h6_3t&DUY!zY$d2GP*3GLy4 z@9(3ZwsPNG|0O^FQ0`yXtWev>>0fRzdjPwx&9HuvUC?mp+w zTUYEX3tz*H;wo)#nrRRG&lLA`O1PeObvZBPdXwOsTbeMlZbIw1vFT#xakw@QbIzRN z!<9Z8uHV@CE?<-L_rN49v>RprXf5sA;G8xcl`GF}G5wx(R$5m_A0qoMem2Cfqr#5) zr=mZb>&MN*877sak9?jXUM9mai>(iw%ZFq+yVtFmeFSZJx3?`1&4Dh}x$>?u1U9h^ z&Z!EYTHB@Xo;3zK)AWpWg`jPr9X;?L&^BVfk7K*xnS<-v2)>WWH{e+$|6CLFalQ{a zz_T!X@3n&GS(@2d57*{s{KoO4JnysbXg_Rk8vILN8jF;CrL$mr*G&~0CfiyCdqe)X zN%af=Af|sB80=iZysK-+tpx|;ZxZJO{`$-F^V`1$99maV=hW$4&u~p(3pR8HHbdvG z+7pPSV9dX3UOsjU>qpCdGNFz4_HCLcU-xl7hOy?>x~BMHG`O~49I6ico#YzN2;UUb zj}~h)I#1o}Ue0&PWoz};(o8neW)a5Sjs(f+=eg+24bC;(m47x9{9qmCzAw;MwHrP!>uj@D zh2bIoyl>rp*Rvqr4d#qT*r<=YxZ8L6@6ve@I_n#f>ti(1{$85a8;+2t&MU6`^%5FS zDiblcYt-fU_U)Vb@jD#4=usC-alEHsJLXYqq%wOwe@kQwQ!=4y}jV)VgUpI5d*T`r+?s%WI1YbGo7Ykai z8PO+rwmU}Ia4L0}`~qzfOYl$3WL(WYAulRZMPK{|wIXsMxuZ zZbzL5ct_`k+5IfGCL`=0_h)d;u3gN`xnCA*<3HP1^CF(}#q|Wc#sA(JCx-Hq{13N} zJMeo`jA3y8C2)aRUx5CV$2FM773j6W>|1NQ@h^|d*>uU&R2 zPTF&aW7k;|J?4&C_$*iS3|Ht}NX(l2^XohxyYB^ao#&k+a?;PaD~54Rxj}pOF>RVt z>l4piR3;|HeBE5R-qMdd3lxc=cjtHX8KEGSjqKI%GDYs-&{}z^yYp^gysr>#{czmf zEbe!syfVop)2ndgogNl%Pa$S@aBT0XoDj@UgUyJuKrKG@gYAkn60cMY)`BV&y9-W` zwR-O0Uq1fWc_wEWtf}oYT}O_t zYwnvv(z{b`XA}LL?qud9KN5$DKrwOIlCX!GgH%Q6Qq500WbggFUSA)=f8aVQzC&W5=V$nUd6W3tpZ@e}<=F`jnXi|x-v7ydG~Cy(V%|Mj zyp9ozoQtQY3DaIK?S$zXp2ygu9i%Hnu6bxw4;cuV+DrKG5+1Lr6H1$iR@kMxbWTJGiTP}*N=U#Fn4jAuUTi66u6Jt89q-g+vWdx-IU?jkHDFNi5^M;uVOT&0+3VY8 zt9Dt_^pxeF!&U-Z?pdsa0#CM=;tyPUxn z+T?;IkyxSsl0YWa1k^pI^Gos?8_-WbF{Z}Qo`BDO!_tJQp6AALl=zW8_zMw+-OL4V*TEzuPFsmXA7zay(5qTPgzneKVpQ(jki zd4re#8kpx_sgk4Y-n<>B_WH+va9cu_ZKXNc57eS>6Qh~8#18PkZM(B=MHTIATWEv4 z@Yb@!;jTs{VV~GYBJPu+``qk{+1y?%H;KO$cso%uCTIkQ=5Fvd_J;*O6A@3s+g@Vr zfN{(g^a z=l;(SE#uE6TR~0L}EC{xZpyx zCm8V;D9eRHNR9)i_!?E=0)C?b77Dy@?9=3lb}&eI^)^l(>Gn)R?ESI-{)qqUzp%^ui*B=f1OQhWqnfW5L|GAS4rdk( z9VCyF6&(^#?sDXKCupM|qiH_Bc^fa1H}!KQQj(Cskm(&3rzD6McC>2p z`=8$kNx#YiS$KRB)7S4kJUQOXqV=nf88{F{A-&6W|rw^^Gkmv3y; zlBuy`_!cG%M?|R$V|_9N`Ktlg@&Xs=z{F1=PCqRbYX#q~+#i{us|9(kQ$E``wHz?9 z9X9nX2bySOQ$5NN1d5%kV6rfPhJqSdEQ}4#hQR2t5;F7kDq@reV!YwzLX|B@oEJsrYqA>sV>uZpT5;G^>y-t`R}CKl+};m5y1 zn=@13u}ZWAyw8A?ecb{VZi2;?@7+C&Ah+-D`I+@869Z|LD%MF4Y26g2)$)SV5l%Wt zM^0KhNyZ8I2m5H*7;E{?m&O{N zzZCOewpZV+TkOi_JNArk+bxR!sP6F3>;}i#zh@f@bM!*<4<-I5TmN^q`hQt#$8FJn zgzM+o{Bfti${>Mz#fPT0Sft~owNjd3UaKbm-#KmAPCrd?@#gd|iIK6G%%=X{E!0v%7O)a-K&5n90@2AQpb8Y6{ttw}= zO>dKtIK?tP&K2G0iw4yKS$P9hY3qD@_=;3&|ai?%K)5ZM~f=Ag@}(KTD=> z1_d7zg}Bnp)EYnWems7zdx-4S?c=&xV(a-3PBm8X?Gh2({*Jr1le^z-Pcli=t=n8XK8Mg*)wy-b z#9evIcoUE2UyS<=KO0{uL8;t!O32AIs`l*iw=6 zQ_`~@=htmIflUamT;7hHgO$~<#2@+#@-?gV6v(v&4>RYGW?ZAAY=~o2N1j(|_iZ7E zpABBVmZr7=)P>9iS`r+Z4bF%9Le6K-aZ2?|dN=b`nLGTN>3vRi0c}0SI_hgB!B;zP z7PMxT5+(&fF1vABpxf+l_3!TgX!$XXS#zL(J?`;`qhB z(NOyj;|eYb9@l_pl*uykJBgbZ+xyB4 zxV|wT*6zttoXnDUE^t>^QUb57TS!tbnd=iVtC#hXAD z|IXSM^Fteu+bCK8ntWX3hYfK8H#qmWWQSHe>{A;dK4F<}xfSAV=QbnriBp|bv^sI8 zcep+2xv+m}3m*{Wan|0c9M3ApJ>%hR%Kc)^#vX|eyRIG0hppB*<4qnn72ajjv#=ey zI`dJT`BhN&?D+uuawnOm=dHp%TfBLhee2)Uz8lWV+k^S*8n5S>%#nSx?`>?9v5kB~ zD?gOSv}?w3oImGr!lvcbe9gm0Jo(v`yh9pa6Lx>Nc`z*k?} z)W?2|M(@;>zErzbq=%j7`mixpjM-zqTtRHb;+y15#5|;b-|vfxpP={a$}{Um zc}MdEmpF?ja^hX8E4hrn)KfjhR{CoHkK+$-`r{Uli{$jp`1ItXsEnJ;l^Elw9Yp@j z?~lL64$=N)KgH~5)KmD&CC@`n_1T*ecEr+m_BXFaZaHlX5YMs#trbdJ^0?+NH&lvJ0Tl*#QGVq zn7VM=E{AMjy+D0#G>UTy5cz#m8^AWL<)MyR4Zof#)};4zufhGgm5+)JD zW2Y+R5yWg27#ofphtLLWmvO16Rd;i?F?}X!hj3?5QP}?u5?Ro#N zX_2-+M}2PdtnJNj-2Wk8Z$PnqCZ_G%Pf$nH_V!n`J*zaZH{VMqLq zez<|Qw{z~VmTk;^R`DxhPc|Rds$UcPO(9=Czm?{IlX>oW?f*1I|KI2S-}>72r}9E9 z;T-9E+rxiey)%9MzK3H;59Td>txtA{Yj^z#;y#pqDmmwm=2`inl9c$eH6KqB@mT%! z+sb6V#ebMSz*%8Dg9B)_Ti0_C^9^KZ7Gb47A?A+Dd7*N#MwYRNGLDhE(qx}E_haPyt2AwkNC-(?x5d6+-{Cp(V1@tskGHCoD0 z*UHd7R~BOGD)J7NA!!veSA$e?4dvIKmDVl0jFUr0e1?ZXs^Kz@5Qax{sO-VI^Rx1N zw7TJZ@P0I6$LZ(24wj=myd^uz@ZXPUznnF~eSq?2zda4kbj`d*EG`MFBB%YeR2*s6 z^(F3uoY~jamC>)hO= z=l#_Asy{6~igH#`)LxH>?O^3HQh!Y&#-RHxbwgZ4sPFSZ=SglC+;1B8rsIIyKBu%> zaR7d`&v@llgERDR?}pGfz0%cuzb#H{+W~PW_Cco_VYnV)zp;I{?3d5veK3oCW{v(f zz{`2^?U&p3^3KW5tn0?w-0o|GjAw2#i0!qlAm3~^>-D=Fi-h}bjv+I`F#`Fn>2s2H z5hsbTDDu*t(iQO$DD6WWpsY`GteRQiLvkt>jFr+IdHg69^kxe&qBzeV!@MIbB*ZTv z>}B%|_bhes8`PCM0zI$ITw2<_tJNhT_FsN8N4&nh3Zv^9BM@*cF z{$zFBO`mfiS%O1?>@~Y(xKn)ZQolaFiNts*bz7P-M- zjL~qfaDaF{o%E=m(w8_^2e>yoaCzW2#Ik1`RE?R?Z4W;Y=mg#RL%wqx((-u3 zE2lC73wet5T;5#HKrZ2;-wEH8bE7zag-lSFS1~+s2l_kWzwvzHv0r5Q=pPDe$M=)T zwG+k)*@xw>?1{5}7xecSSvzq@RGk(|f6jS`v!WSShjA^zW*o+!l6I|4@{et=sAF=s z%~o>R+2E|EF%G*3jvw0K1Nmw2TYd0BhzWyuG^Jwe>K7gh`*wC+i|}=uDR%{NDRND~ zKOFzE6QlcZ^-GiWgF()EWEhX3s>wNg1rA&f@erFb$7Biog3k#> zc^K@SUwWX6;P>)zs&XQ4#Bb|Ed_X=O``*^at-aQ_$R`oB6+Fw0z<%WNC4Yf=&#H@O zYQP?p__B-fC7ufcn(Pu&5 z$2!qs`o^xZpe(cGu=o_~7h-s~vdyomxeVe~Jy@OfV~^&J8IoN|$#T+uog9%T#keKJ zH^jQ47~4g>eej3v$7=I@eS9nr>0|K6}DotPJ1}iTkGc?y2%{`RsVV z%E+*}pnQGCe5X&rZNTKzE#5?ki(FPNv1@VbZ&gsvdFi z*>FGJsPBdyi{von-uYc_81|KE7*>kJi>W)+C*+)t512aoM_QKJCKgmfsKj)${5% zG{!@IdbCaNTRX6KCHoHJ@=IrdLu(Oje+^<6HZ_dvgwZNv%7$=peSSB1r|9>=DeDU* zzW#|gs}fKA9PzZ-I`IF**w5V#Hjx+(%KUDB{8ortCr56+Ft-u;J?bA~Y%#Ep5sp5t z*<`4G4bTgIW8;*XUP&8_OO^|5iR%|5utSiEyaXfA3C1Ko&Qh!ev55SPjpONqW6I0N zlNb8ho%7+Szg6c?QG9aVA80<)pF+Jhv$!4@%%i^Dn3gj z&mRR(_Sk6kSF~@!xjiq$;m2V0amVUqWu9d{qg$U*or5or!*RaXcf{_K42&_O$3Z7Ud?bT2+*{_{ zt1Pa^@x}MU1C>*j_NQa~0OPvi{Adv#mt**51ODTmOU3cxX0wOqgY0NI?=}OBZsuDq z7c9P~XA6uyMIZ6!OtDzh$$hae`hgetEZTQ^5c^K#_pdFtr>r&c{-4}|`Cm-BgH9Q- z%!9p36>}eBwl&DpZ0J7?->%ac9_O?DVx0FBf-wyIG+Q5J`%nJl61S1KKy` zLd=-Ky;Ipg_%R%7N1qP^_lrgXe;e~Lo%5kiJm)x;Qyz1AN9@0D(s7*N;X7Z4)|YS% zV9NK}NBvYA*YbHmb-$D>7xb~-Y-{>G^3>F| zO#Ywln-1#qNA*v`f2wa1=iD%s|D(i7eMP4~bd2PmEsU89M%HRXxq2PTt(?_d@PQ9T z;XC-Aln&*p&Hg8>&q!wh2s7Xh<8L(N@v7Z5^7?% z1v(e|hl+Xdtn44czZB;qYf{+u&dPHWVxK|4^GJC^EH>#w`RS}WwmtIR@mLDa=JnON6&~QgrBv}M)KW)@4MEvgS*u~Gk5fU)p#B~hj;GB8nj0R?S>q8Xan-RVTXUg zdL+CSaeo7B_0h`VJ&9b7+*!xcdU2Sx)52^qF_!-KhV9K~Q_sFb6r#mTsJ@;@ z|8=YyFQEkc*QN;z;HjL6fTbc5kM`1Wy)RYU^NgYGK~0g#K(bCgdv}?;`BJLh-8NeJ zt1s2tt9B*-Mf>t4@gYvr*H{-PC#UTHN$zPxF6R4*ThESH(Cl9AS33V>+Qd=feaSBt zvjsPR-AX5qQ#z1)D$A9X-to#2N((Fe0w!R)UqZIITldr<-Gzu#5*#*qS@}pu*`M^q zg|aF$hC;TxRA(|u6uB@o+)w@Un<;IAso zIH=shUVmmp zF$G97SM%S0TYz+zNk^nY@SvhB@WTmX*kb-G5$joZac~LhJMNZG_9UJ!oJV76bFQwS za{r6?4Wa0!&;6BSjEB6A45f}%Q`@g2)V18atp%iEL{zp|naf#N<%1f=Y3ZX0#-{i4sz&5~eXlsPusif4Q!0 zF+574=!t+=NASW=)A&)604JA_tHg~a&@^3pYIzA}3KzTTD#4o&QwD(lOhtRONW7+6 zea*c@C%%fU82^pFYkuzyC(P$$weKAEn+V!D-U>*I04B z1>-0Yst_wHnTs9KoRvJLM*XQ_c2-Fq}h^~+K+cu6;U*(bGT`!9iNIGu| zl|V2QeO~yAkjMG;8$hbZ&#nIGu<8Niiq?NLC&`g@U48T+Rdn0}$vzIIHMdk>Ipo8}>eRHsS&2ij z<8d5>I>+OQ=lGl0PIcQ8eQOpW4TEvN-tqfmZ!*Kro3@s@#e6K(qv^w^Px_q#F0Vs< z;BQavU}9-Tj^Nu_{_Vcoqpb;&cW<&X70hY*(R45k!a)$cd#z31E!WE9Z#CTV#ozJW zmO1U=-%H$v!mVYhlY(1s=o!5=UKZLem3eCwQJ<=!8$rt#GY|Z#j#A!!{t2%Lu&r5y zXo7a2>z-38-+FLXo3kwuDj)x>Jr2&wxOInv^=f&I@Mf-59=Fa=IN?zbyLK#VasF`dD2 zwHbtb=c({dgP!MbEjTz8^O3; zRSFiQ=g^bd(3ekXI_aw;;6P=0Wd-g$fU-o$T3vjhXChrY6RbURk_v+ zF>uUfg70VYY5^Q9!Lx?oI@bc`RlwedA=wJGw$Q;;;8hzwv@I*sfFJ^sIT?y`kgqB* zvh~f;FtQ~TMt1DAL5FtJ*HeP|P<&nHp1{w4phs<{yDikl+tH#}HeuBeI25<5q!JObQ(}znyfX zKwxm@Kh?)o1yYfZZM$Fau`kYiBI(qlp*uU^>0S=!R)Els1)H@r@;NP z-cn&W=Q#zAT=;9=FAc3E`a#IQP#sSLI*R}b)f{s;N9cD7jI~c0K{8504*?G>_cufM zH_H1u>%<{SWn15XGlvl8v(R=xX;#Rfj^afRDNHZH#mLD-tq~bqQLo!aJ$xwWHbJ&mc(Q!5XYB+`eThj;9`6x zQ_k#_6WCXbUC`J!y6WT<-TO+sm@4hF_nL3hSjU=j!nU}6QCsvWg|Lq@ zKe*y_KQ}Cv%p;t#M8#2?*L^yonEsd=<&^d&il=I_zEx?VzQH)uX1>tk<4}98LLs-w z5848voy9VxfL4U4L-JI{vj8r<&U`11YpxCB&H!P6Ar3zb1MFY*cx=$Izk(*OH3ai> zy-xG%ZfRvqtN726*D>n;)!WifolOZLZ{`fXuRd%QGt)kSL<|`lbpXr`Cjj zk1!v{qoiRuVvaAapPNuOtICG|)AVyF6N3kwRv#PPGR&#V{#p!&tMtnkx0a%oHG{gW zajx8NW|mm5gIsJKhxLqKH+Y6@IbAHw<|N}EX~d(8*q(z)f#4YiPWBOx2gBbWE3NfA z=@G)%5rlKG=B8;hsSTuDJ|vuFGz((*XOb&KZQJIL=u}8qF+TTfn2c8iR?( z>zdgSUXvn-=x%jrdbe|47u!-{RBPq3V=Dw}Q7YbF{SqA0$K$*kI^J7sBujaE<{y_; zbSM@kM(2Ep*P1Y&-kH9JGHmcl{eWPpD_6hJb*Toftp)XgI3(*Sv2Jtxnoy^}y{o4?1b{R!d9E zvM$y2zj7S3>NCpa>%KN8E<)V6KK$xLy2_B>BPVo(m|aiL^Q$}vNm~PZNIyWonCzDm zz19dap#Pf$<5Vg%(olbVJ#l1~_La?{ezQgRR_Gs(_#Jd0m|(hopDK7@cVnJMO_No*5t|MR#b^r1CmJQBWd-0_rr9py?x4f-)&B_LZCKBgypOz~+nm{5Coy(X5s z#@1)PWtRt+44b&MQHv-)xn6zK~Bkg#Md_!r(^`&w7 zOkZ($A1$^&HP^$zSsVPxIlF$*MSWb&s)8?_;8j*>jCH}@*m$=!uzeJNpC1xj&?J*y z|1@U)Nlxp;ULoUq5s_=l1S1r^YCu<^;`S;KrUKzXVtxHhZv1ojiUPA~cI5sJu3_0Jl!+s)G%`yxzk7aR(5KUE*9v%Lx1G%1wLsUdR=BOVpZaYLVXM|d$-ZJ?R+Mor5Bj>bjpdAX!sQJ_ ztWEul_SJU6$nm!PDUh3Pcl0ditKT*?z1enl!oi6>HW(i+H`S|bj4f&NqoJ&eF}|u5 zKvzS$%xxs5Is>2Hn9-Hg>#Pg@9DH_z$HMKQDfUgT(I*Pq)0KG1ye`iXc8^`93gR6B z7bN+9zfbvT#dzbxK54Q2jNTVI+FKo#9hmD0-^Z@A66CGj4EOQuqXBV4oR5+A zbXVX*wg&qf$B4Lo>)|uJ<|f(``|Th_Ftq7PXivAZ&028~rL@nBSI^>ghx*8D5LyCb zW;5wMb#=8LC^4iHj5U%x|2nw={W&r=V*CQ{6ZAb@3&naqA0C}v8sBKII_LZIdzhc# z^~Ie&l;t0^b!Ad`=;3-prEzBW|G!2YKGwca_%AnGEsp!u-| z*z|mV*`xiypKCz+w%;excm1)8>p=|m_`B#@z;!3@YxJ$B3gccEWB7vC4&?3DRo`Pz zyX{48(>3(xhkhH%2;)I-icl?5*(Be;qx^AwD-(Zp{4&-js^>-0_n{bTB-vMdy(;|? z<~7CIOc!;!JD-)sp$kjcelSkrwQ#(~+|ON3%FeEGLyRiUpycw{pFqx&SGszKx^7vY zfLNQqp?roHWI)dgdjUyy9jv_ zRYe+fVQZ$)PA~pAU`&Ov~Q#5DZ?~lGdY}FfM9%wx~4KKD^+{^Rf4Z zpL-2jTzGr-h3CUpn*-6$zr_4M=DKp|Lgv?9R*t>n8NH_*df|w>vCqE#k~~`5Kgzx8 z)Daqg*Gtv8*#v$*sOQ1k#)_QSyT!^IM`#v-Q`oKD`62BhvSKxi1#mccfBTn}?Ja}L zcl5Pj;2q4(ZjICXH9qBXPGiL$xVpV3<#R5ihkW_LBK>r*Nc>KDyx`;RqsOQ9ixnK9 z$14r9``0t@ry%yf2FAd4Pe-;pw-;XG#{_%)>D7Dxb{_kMZfgiBpI#+CeBiGpnw!aB z=HhjRPp>@sJLd6;14E^O7l{8exYWs%;Q8>^XYUigCN6foGh?|NP-Au?Us%T58`3kn zS;2J*E+YS@towzm%Uh|&-Y0&Quji|m^woRhiOc!icAt5FK5^mSpvMccj<~7|_VWAx zx3tAAW~fS#>O$q<-CnwM@%w)-7x1?YRm8mATVK-ezdhR1<;r$ldxF>f@d|}A9VYB$ z!hqOi0|RR4N^p>t-O&%H~;-N)46xB%j0!x(I~I~N_8k+8`%qI`TK7+LrYL(v%A}W4`p!z z0-=Zgn5fMrR1-fKbV~^08fe-jH0*RU!7un|HAUeG!oktsQP_rszccxst zSkLc7L7m$s=wyySr<0w<{V0^VcU zWk+v@*LUc{|0;TR`a?0`)_D#1{gVH z3>Jj%FWAL-Q6yWvWgcKh&~M1MZ>0pg(I_dApF+LAP3)`wcSerk4E_cOetapYHxqFK7KK=(t~HaeilE;4D8xFKGV2I+!I}!CUsS zqUH~Q8h(PP4U;p1q@in>QYNu2Etl~JR!={Oi-tcyA%+X+&NhdlfTvOIa5#!9oh13{ z2V+H}99pMG8ZFR!LAM4sv*7*R6TaaG82D!HiUy@%7?$Kg(a52I)VB%IxFNMp4vjIv zed!+)LVe6`j`yoM0?s|+-%L&J3dzB{=E|kpm5bSvGofJtrl|{O0**dm888$fUdF}) zmpZY-V#HtuiRK0g^cHdx2vrO2%!twS#3gMjv+2-Tt}OdS>OLnsV~N>;F??NaN;A~x zF09l$CkDK`nuz$920<8<2MbYs9My>4Gu#9W+}K&CI0}sn45^^6*${Ls6ceH0k`F-h zz+j|znm)D(zJp;7%#^S_y(NsZ?#c=E?zcD`MJ1vHBVj=pm0(eT6gna{L$nIAvzcof zQ>hMEl-ydZ?4p1H_>j0aT+hbZ!1uwtrfBOB2;u!+#AQ+IK*nn_$VGukf+vJZSQw5? zE?`Doz@w+w%U#FwQJfgI31%6ouAl(+lQDtOohKk{6&`>w&;bD=HFs|84U`@)LI*)9 ztLp_!M&Z#9qvdjbae7L6jKGbZ@=81XK}vy^v}rdgQCUl8V&AS1IVY*Xe{U0~r-_Ld zJYN`VA6({w6^!12P}crCeU5q>%j7nq7>ywic0XarE4{>l-uX(e7IR?mTKXlcLmc;fT!sIHK&E}WfZLQgAv~w*4 zuEBUg%sgJb@nNo1+$b>*FcKyM5qnK@3J}WSs1k)zx0?6Mha)b3^FJl{BdmiH(xG+< zZ-0=pe(%5FGHAIEFIl{dl$|9;46vA)7Dx4xay@~O-^7~ws6cP=1PRf!Z$68(YBwiI zb3{$JrQbjZ^ywuc012D$u}%Ig{F~qLeN%`$!OD2v`j}b~Vi6py3(~(<;GKA0GuPs8 zaq$u$#COwYB`Nc(Yi;dKL}?i14#1bG#9q9v|qp2%lRVTa!5*u-e%T}|2agc)CGi=_yHQf;fQAp zEi@i_GFD-AWm=4u3Vzxh4vKs>WS~#Sagk<~lDB%q#d??|OlPY{Tfj#`96qrR&RD-l z%c7PVEJgs){5N-&CvFHw9}q0xt0A5m1&D|5!|p3Gn26N`bvy~8k+rdy!fUOO&DN%E z^mNi1go6{gIZW}uN-PnQguF4i@|eLq?DB|-+6tK6wcBqKyc7U$MrjU&<(rv^< z)-Ori!xOonhl?2`+fzKn80CdDrA}j4+CD^oeu}nPs4gO}{<^2Uo0pY$^ZfD}%LC;# zmT~3X9ADl|1kX+`G8>-?5QN~ls%Q93HQ~;JhqO{t#hawJc#i*uw~x&nUJY^-``>=& zP%&3?i{F1Uc#xp%7{8vuki5pdz37f+fsfG~s1G#wkubdnhB>BSgW>&oI}&+(F)K*4 zGe{V$9M|IKEtKGZGJY#W#fAvHYH^vbY9m15g&J`N4>$rTPB#2Go$XKQlu#$(!z2os zxJP6x%n?i**>f87FJk6?{5d)FiL5j=sQCioOtfU;ND9f^Zr`>5KjG zH-DKsQ=;W9^%zrXe3L;x{eZ|9q>FWGjfa)r_Co5Y3a0CF+pV!nxV z_)C6rLv(kxK>f$)?R2VSD`T=B=2JC*Eq$Lh@D`z(FGJ6z8%-_#8=)Fa@D>wCK_&zjeS;*X_k)eIWHd6h%-O(|h&eI;pnjgLj=o{< zx_G3 zQlQ_BZY^t0%OjR=a%30XrPWCWH*}a>My5$Js9X;w-k#)ts|YDrC)UWE5Nfh?<4V$h zoDs-O_)dUGJt;rhIcmd4lSncd!ZQ6Pkdzt9ve)a@@l%jk7V)+ipeHV2-|gPUr+w zhO%pRb=N$rhtaZ`F8Th5>Wh`fu{y5TC;gB#bS+SXu4N2-=xdTQ2*w_JB4?_84<3y)h{~VE?h3)c=>gZg!2to9F{d58ltWTmBCb z(>iXRA*T%q(M%^4wwiIv(Cg^8K0{NxzNKe+s__kw+5Y#p@Aex*{ew?Jv(p&5UZY)A z(KQLpZj@8dX9Y5E0e;inynaxE};}w!>G(Es?>DoV(VwJQZJk)scij8-A1qD=c}nuIP{->lCYdHODNmXHgpArx<+UtK|x zY&ZfHlOwQllt*5F3;Z-R9}yesQ{OalJ`yTNXJjagvfO%r!pTu3dkXq2wPk9aSIU>H zs_3vyQ63q|yIfR}aQ(Irb+X1fF$6k#2z|1*k;^M1eb+QmuBM7QS@BUk9SQYvTg$an zR8 zqr_4jFhtLMot2a8(@|}46oc&ii$M7e5N-uReNsZ@R?&44F`C+^8Ld8qa82zp7(ZXX0C7GTTiCc=O*h(Rm^nd~r#(+!j@FFz*-1aEotV6O z2vN8u?DMJy<4>E7Nn9Tp75M2nc`;=4d{rPZ`)I_C0MVP$h3ooApThi@cU0>xVD56QM@16Bvn zACxgK1>>p8{7@itdyWXtSzz$pt0wm|d=5~Ii$9TBL#|^(QyEjBy}R()<+`p#S;V}8 zAwVAy@3!-M^Rb|<2O7qh89y$daZ>Na#K0nMN(Sr%ge+edNY^;NpNqC?tM%Wi6ydYu zqoONut~9QM;{!)&r_E9w|29u&_-Sbhd&-lDskr=Ys6TfVCKoma%*syF%=m&ENpW+dr62G^f!<=i&10^B@dV<9 z!2$h4@w^v`38rH!4BT3f%KTpB;fYjEszo%#4UnAa)2I5?zV9;NcI#CT4tRs3Y~vi8iR!J!pgWIKrS|f2#8ww$GRI zR-uqMVt>(5bBiMd;@Gxv9%zV61ykR6&X)Ed-wfr&wC8{hj_k(j&}_b8wzQCYccRNY zi)^O@ZO$Lq{=Ss)pb6@77`(?~^8Q$xIk@iNzUZEx4SM=!dHPmY<=NV@t>+fHeP8gP z&4kTAF7KZ6AQSN?;nA`BK9Ae6)pq#z-t$U!23Zm3x$F$lTsz{fIsQ>Rue5X|$&6vc z#mDA(y*QJb*4UYx=UkJO8S8CiTGMmm{Ghc9u=DudNusea#Jir*HK3Odp8Y#?j&7w5 zdrU`QOe}L(9(%OaI7Wv!yEOMY*K$rg2jwnzUQdVZwW+?HLOas;n4_a}yuxYl-e-LI zJrEmnbtj^qsoI{sFX~~Agw;u9J-P<>j_pCT7CxWwo{8=Ks!KAi#XY8#+W;Z{Ka$w);;SPcNfl7=x;*voR(Ze=P*6l*U>`jpfeqsI|41T+B!UU zXzhLH-5-!0TX4*I7xN;m`R~)jeOQ~98G?>Kc#dD7^Pz+X;ZQ%rPx3q1D-De**NrZi zj%blT$E@FebTK1md2+G0XO#yH4M(9^H#8rT*>aEnnBT=k%ti!{C?bs1-NC#@DAxUU zjG-TeqtPehlh#V^(aMEsC`BPNZ$ z_ZG`~t9T>Pv@Cn}*i^_G28xvA3Hr8#*QIA+&BZXgv%25c>AH~bl`l}hHwWwIJ_#-9 z>!9=ULGxjFIOuo4+c<`jRLthKcHUYMic~=xzdZbVf4yXMq2Ezz+V7OyZlX5o6$2>^gj})|C^SXP1m5XnKF#rOiI%f;Fk^7sqKxqjiHc?X-M$-R zCgVNUQ_M@h7X#I5`_7FcnwHbH5KU-J$XX0lYdM(NBg~N8MMRi_i-;)Hp8=w(NTjWn zQJ+A)3Pi_2It@=l07rFd?NvVh~o zWEAEEjNh;wbIWO7CSh%;?M7$M*dZRf7ru8(m% zx~QWO!7V;^LEkPww%oFN6tQBU(T;jPioS#$qW=-bE=3vg?b#gU2xvo;w>+!?ad*Oa zM{@yDCIs5V9#M>ndE{Xgc!@~$sk?pyQR6`t3zdy;EHxyic3h6dM)|)bc?R{EQ%pxk zU;`|j%Jl-}*G^b4@AuGF4AvEx!-x!30A6*9Bl;faEJKb$lsU|Neb=Y?>On=aw0WNv z2uZk35TeoDpmMz|Cwk)nA!B7S3n&Bp#VqJcsDBS*ftj{fJ&ixW%OxQu?Gy@LuY+?l z_X*}`6cLfO?=IPVM&B^|`V;7qje&ZX#W6js&!FxC(DFcQSU$HLqy>r=Lpag-fb@a9 zP?mT>D}2MAcY1Dj$NPZ%E|ivt%tc6n87@NxVh^DX(Dyac-{`xBs0l72Ub*J8>e4B= zp!<_XJq^&gBHMZqc-4yoEi{(Fw8NT!>q>IK<}>KdiqN^}Te<6F7I)(L-!nf?6?+Gj*x zw%5V+0d#E})~B50FTNu^i+aC<{)F&u0Bbtg7#*P73NBk~m-eDOt-~$!5xv;-@-E0R zTa(0l_?u;wcST*v7|^jB#Khk{7yTIr#K&Z??hcvnFqfvi&S=EZnivW|Rzu)$qoZ;o zMZU#M?`-D+oeav}q3-U+??8W=GS+14v#`HVht6@nU|+j!#|=WBlt@8LH*2~B=P&BC z%Xt`LMhSE#TZ2jWMF(WlxF9E$mHZa;bq{2|)~>U4Vdoe$!@PZ5G1gyLH z7@Hrs-nIv@W|v$($!#mJ4cnz1*GCG?5$AO~hwY7_eXu24gb)d` zgE1Wo&`nXUk6hfF*q-&YMQEfr_QF;{8g*Isl#fqG1F0XWJoD)XI}l|A=PBBEgMzgT z(vzU`(T0kn9zk8hWD0FR*pH%KhI--s6zaUAdWgT~9*vOU(jjX_6y|>X(FGa5DCX7= z9EoIKo^$jQ7xy7nL7{39lFb-VeHfqdd$bSHp2OG*+zSw@3!zn(U@rr-JUH#~7;RNH zXR0xqkS<9c#vHMDjkXZ1TgY3W&2_ncf8aV`&&yHV!vNM!)K4D0GwU*>z`!vv(O|6e zF7B)O{)bTb5XDQ|s|e&W4Iz2kZ>`-SA^O3(oZp%V%8ci(?PA;tlu0`ar%>NsPu@R} zo^L-cU=Bsg2{|?orQM^sF5&zvxK?YrMHCo9^kK+nvX3D9F}Df&8IjK_&C6{ibGa&} z-#--dvAs!;Csu)w(sC=>BVqXhjqQ8(%rfaf^s#(P(U87G)beN__-^t) zyF_&5{kA>>dzz5KeBUwzoJqiUM7z?p7z<+VJuUBAFV_p`&kwksT_fUSJ{P^7duihF zLBOk0%xfc6=AN+-dr=r``>~Qv?NFa^-Hdaf+6B9&-#%Z1Z3H%3Yi{;qv?)){6%u$M z`om#lXG9AW@>#uoI-+xH=|^|1!#?jK!BGVDxUxlOmz=|#ucEDicH9-Bf<+%wtyuN8 z7QMJ`#p(^KRc$e(PqOLd`6MD_U75&{Vd%uyc+MuyNxJbzu$w?u(_^#;VZFgUn5&o1 zH>`2B-q8BU_U?BA!TUxbED-{@=x4uE*>L)=Ypqz0qsQqqYlyW>*2^+x4$(!$@5C2a zj~)0~M1)cAd5pn_YYzg%@m1*MD|l6$=*YSp0acyRT!?l+ z$49&I@eThL_9ID*V?;FRg%(e!=p&T5(O6qw`JTFjv3h>Q$KZ0PH-pbh8%gc_8ssg8 zdUE7NCuL~As_u~Zz+kk%FQRE4NRNSvCVnsP-j6U=tA}<~p=F?T(-{QXQj?UDVS%WY z^~Ex7u%1C-%IEG@+p|?20}a_fK8tRrdgH{CHG#4?Y>Z(Kj_1gwB+bFY^Iagd-v*%O z)@oKM)wC|E4XfI0w2}q6N5$B?Ii594O%!&8rv4z#V8j|OVc;$MAsPb2=t|judl35`t_Ip@| zc`R&l1-AR#$&U~v`~GSdJm;9*M0U}I{MKDBJ3+|SVtfi<0~S&{v}O2Sm-<8J`GwvR z_tarXskC>+buAxomKj^$_d2dZ7@ccqiXgki!sGie1k0;}h~rHK@UJ>R-gXokq_9h2 z9uP|731cAYm`ZeUM(5=g#`yhhE)4y2OlM_-cy|;eAMH5s-qO%N`T02_J|eR3fp4Bl z2ajh?F6}6bbG|w-23HN@%K<(}`C_zZE|&pga|msA+QWSj*bY8@;ce>_lyxgWmpyUL z-xjt<5o!Ij2F8Ztygph6+pFAN1|n|OU|!LEQ9kz2D_E;ubE#~Km_)MF);~Natv^T< zSaJW7PKucHh5x=asmHIcw6UW70@VAUubG&m0A&RCKo04N$IWd+*fa0N{xqY-z0o=9}!ACRK zGb_GN**NhW$Pn<|tuHv@?ilZd(1rj@*<0Tn+N85Co9;Yw(O$dm*?U}u*iXvlIL1eH z2Wje4@m%B@vG?Aw(-E8l?=)%63`Si4D*WMS*#~6p07AMhbA0VMiquVg&9ZeDY}9=X z_UYZuG|*;*y(P~3Wij0iwv#x2K<;3TaH9S6<@dP$9;3lKewwWtH2#c7)@s{n928q#uxgI=s zK;Bn9JkJf5tx0!waef^@v&rjI^rCOx{SdSt_v!)d%+Dv&2g+{3c>N?@kx)5y%Jb35 zdNgE@@4X8;WDjfmWsL^P?{gV;hqf7Jj@!ne<1;t<>RG>If$MEZ-;%+)+ItR{OaQMp zcxGnh$FA_VLRkb`Z*KIfajG2>Uuc5`TQteGBZhN_+nup}LEJb$Ty+7tvP?__7-0OXF^QeRL1fom0f4;!qJ$lwGX6FRkw+FE6-*Lb#pJ_AvdW0?DN*G)cC;s3$erihx8A9b(FdS10iBTz_tg)f0rPXZ=;PxsAD<}dNcg+k$Q40$@otFM znI5xy8PIQb+}iYDPI%>!{fmBY`j2?|qxs@zm(6DM9PEnRM*1Pg#Ti!$@84qGcopyT z!RDKet`sjs+(amE`!tuK&Fr{kFh-@Q`}b2p9K1derDvCnwI0L_iM`iy;j{>?yiqIYT6sao-c-e zebWCpguW1Y+><;8%w_3Q)ks~nq8HaNj>wx`x8o>1&hJaO-^u983huXlmx}Wi&p?HL zCHl5?6V{e|$?&cl{og>o9p;m6%1PFWcF}(_Lu+t_`9LUtXKyS9K2thiWyEGEA7UdO zgvYS>`_OQ!H%-{z;245zCbSqFcE3UXHlcEbJ`6H1YA>tK1Lc~=&b^H@R;7zIKO6Jx zF~C0{XuoIr3Hj@N4Eo0BU*xw5%rfPGyCs!B6=j_3&){-uY@jWbV>XC3o_AHyfU}Upj6-T9NgmP+1=`w`HR;d|MaJ~ z-+lMp+sNnFZ^W-JLcZkq8*c;QIH0~4AE1IifA?ko{rS6J{uGH|Es3onW(5V3O>y^Nlc*XLWzX{5Tu0KS4hspi$Hw2~o)1O{!R>KG) zINIwMAOAFb=)1381e86ye-%*eYcoCjWG2$GV|xB)!15yOiofkw$ceMFx9tB^>swE) z*yb->asmsWz`Zz3t~sK0gef_c*!~c$Z~b-Y6rLzl_?e`e{ZBz24LOd+%gubKLw0-@ zdBufMLqTDZ5ebx8R)T;VBLU#YXT0>;fsdE>lZQTQ{p~MvWM*Jt0o0)IqDf)g_U&P0 zGe@8z_L#r?+l4aK_H#ssm|*$%3L_XNrDM2%yjafrqY z*h{J&(TEV0gxAZ4=GAKhC(p#9{^bSzjPMV|C`Ml0BmPq4&x${vRaX>L7HjohZ!U

lTHI;4e_3%Lb)9d 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 z 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

mc25@d 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

(back to top)

- -## Utilisation - -Le chargement de la bibliothèque d'accès vous donne accès au namespace [Gp.Services](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html) à partir duquel vous pouvez utiliser les différentes fonctions proposées. - - - -### Géocoder des adresses, toponymes et parcelles cadastrales - -La fonction [Gp.Services.geocode](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode) permet d'utiliser le service de géocodage de la plateforme Géoportail pour obtenir la position d'un toponyme, d'une adresse ou d'une parcelle cadastrale. Elle prend en paramètres : - -* une (ou des) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources de recherche OpenLS du Géoportail. - -* le **localisant** dont on veut obtenir les coordonnées ; - -* le **type de localisant** : adresse ("StreetAddress"), toponyme ("PositionOfInterest") ou parcelle cadastrale ("CadastralParcel"). Choix multiple possible. Par défaut les adresses seront utilisées. - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.GeocodeResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.GeocodeResponse.html). - - -``` javascript -Gp.Services.geocode({ - apiKey : "calcul", // clef d'accès à la plateforme - location : "tour eiffel", // localisant à géocoder - filterOptions : { - type : ["PositionOfInterest"] // type de localisant - }, - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.GeocodeResponse - ... - } - -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/saye4oaz/embedded/result,js,html,css/) - -

(back to top)

- - - -### Obtenir des suggestions d'adresses ou de toponymes à partir de textes incomplets - -La fonction [Gp.Services.autoComplete](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete) permet d'utiliser le service d'autocomplétion de la plateforme Géoportail pour obtenir des suggestions de loclalisants (toponyme ou adresse) à partir d'un texte incomplet. Elle prend en paramètres : - -* une (ou des) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources de recherche OpenLS du Géoportail. - -* le **texte** pour lequel on souhaite obtenir des suggestions - -* le **type de localisant** : adresse ("StreetAddress") ou toponyme ("PositionOfInterest"). Choix multiple possible. Par défaut les adresses seront utilisées. - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.AutoCompleteResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.AutoCompleteResponse.html). - - -``` javascript -Gp.Services.autoComplete({ - apiKey : "calcul", // clef d'accès à la plateforme - text : "23 rue des et", // texte à compléter - filterOptions : { - type : ["StreetAddress"] // type de texte - }, - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.AutoCompleteResponse - ... - } - -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/jsjqk4wq/embedded/result,js,html,css/) - -

(back to top)

- - - -### Obtenir des localisants (toponymes, adresses, parcelles cadastrales) proches d'une position donnée (géocodage inverse) - -La fonction [Gp.Services.reverseGeocode](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~reverseGeocode) permet d'utiliser le service de géocodage inverse de la plateforme Géoportail pour trouver des toponymes, adresses ou parcelles cadastrales proches d'une position donnée. Elle prend en paramètres : - -* une (ou des) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources de recherche OpenLS du Géoportail. - -* une **position** donnée - -* le **type de localisant** : adresse ("StreetAddress"), toponyme ("PositionOfInterest") ou parcelle cadastrale ("CadastralParcel"). Choix multiple possible. Par défaut les adresses seront utilisées. - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.GeocodeResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.GeocodeResponse.html). - - -``` javascript -Gp.Services.reverseGeocode({ - apiKey : "calcul", // clef d'accès à la plateforme - position : { // position de recherche - x: 2.29, - y: 48.85 - }, - filterOptions : { - type : ["PositionOfInterest"] // type de localisant - }, - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.ReverseGeocodeResponse - ... - } - -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/4t0wfey5/embedded/result,js,html,css/) - -

(back to top)

- - - -### Obtenir des altitudes en un ou plusieurs points ou calculer des profils altimétriques - -La fonction [Gp.Services.getAltitude()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getAltitude) permet d'utiliser le service d'altimétrie de la plateforme Géoportail pour obtenir les altitudes de une ou plusieurs positions données ou calculer un profil altimétrique le long d'une liste de positions. Elle prend en paramètres : - -* une **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources altimétriques du Géoportail. - -* une **liste de positions** données - -* un éventuel paramètre (sampling) indiquant le **nombre de points intermédiaires** à utiliser dans le cas du calcul d'un profil altimétrique. - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.AltiResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.AltiResponse.html). - - -``` javascript -Gp.Services.getAltitude({ - apiKey : "altimetrie", // clef d'accès à la plateforme - positions : [ // positions pour le calcul alti - { lon: 2.29, lat: 48.85 }, - { lon: 2.3, lat: 48.9 }, - { lon: 2.4, lat: 49 } - ], - sampling : 50, // nombre de points pour le profil - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.AltiResponse - ... - } -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/owxffaf3/embedded/result,js,html,css/) - -

(back to top)

- - - -### Calculer un itinéraire piéton ou routier - -La fonction [Gp.Services.route()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~route) permet d'utiliser le service de calcul d'itinéraires de la plateforme Géoportail. Elle prend en paramètres : - -* une **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources utilisés par le calcul d'itinéraire du Géoportail : graphe routier ou piéton. - -* des **points de départ, d'arrivée** et éventuellement **intermédiaires**. - -* le **graphe** utilisé pour le calcul correspondant au profil de véhicule (piéton ou routier) - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.RouteResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.RouteResponse.html). - - -``` javascript -Gp.Services.route({ - apiKey : "carte", // clef d'accès à la plateforme - startPoint : { x: 2, y: 45}, // point de départ - viaPoints : [ // points intermédiaires - { x: 3, y: 46 }, - { x: 3.5, y: 46 } - ], - endPoint : { x: 4, y: 47}, // point d'arrivée - graph : "Voiture", // grapĥe utilisé - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.RouteResponse - ... - } -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/prvrjd93/embedded/result,js,html,css/) - -

(back to top)

- - - -### Calculer des isochrones / isodistances autour d'un point - -La fonction [Gp.Services.isoCurve()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~isoCurve) permet d'utiliser le service de calcul d'isochrones / isodistances de la plateforme Géoportail. Elle prend en paramètres : - -* une **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources utilisés par le calcul d'isochrones / isodistances du Géoportail : graphe routier ou piéton. - -* une **position de référence** (départ ou arrivée) pour le calcul. - -* la **limite de temps ou distance** pour le calcul. - -* le **type de calcul** (isochrone ou isodistance). - -* le **graphe** utilisé pour le calcul correspondant au profil de véhicule (piéton ou routier) - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.IsoCurveResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.IsoCurveResponse.html). - - -``` javascript -Gp.Services.isoCurve({ - apiKey : "carte", // clef d'accès à la plateforme - position : { x: 2, y: 45}, // point de référence - method : "time", // méthode de calcul (isochrone) - time : 1000, // limite de temps (isochrone) - graph : "Pieton", // grapĥe utilisé - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.IsoCurveResponse - ... - } -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/x1hcak86/embedded/result,js,html,css/) - -

(back to top)

- - - -## Obtenir des informations relatives à un contrat d'accès au Géoportail - -La fonction [Gp.Services.getConfig()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getConfig) permet de consulter les ressources disponibles pour une clef d'accès à la plateforme et d'avoir les paramètres permettant leur utilisation. Elle prend en paramètres : - -* une (ou plusieurs) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) dont on veut consulter les droits. - -* d'autres paramètres éventuels à passer au service... - -* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.GetConfigResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.GetConfigResponse.html). Les informations portées par cet objet sont aussi enregistrées en variable globale de l'application sous le nom : Gp.Config. - - -``` javascript -Gp.Services.getConfig({ - apiKey : "carte", // clef d'accès à la plateforme - onSuccess : function (result) { - // exploitation des resultats : "result" est de type Gp.Services.GetConfigResponse - ... - } -}); -``` - -**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/0hsanbv2/embedded/result,js,html,css/) - -

(back to top)

diff --git a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js deleted file mode 100644 index f33b7d72..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js +++ /dev/null @@ -1,836 +0,0 @@ -/*! - * @brief Geoportal resources access library - * - * This software is released under the licence CeCILL-B (Free BSD compatible) - * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt - * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt - * @see http://www.cecill.info/ - * - * copyright CeCILL-B - * copyright IGN - * @author IGN - * @version 3.4.0-beta2 - * @date 27/10/2023 - * - */ -/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE - * @version v4.2.4 - */ - -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("node-fetch"), require("xmldom")); - else if(typeof define === 'function' && define.amd) - define("Gp", ["require", "require"], factory); - else if(typeof exports === 'object') - exports["Gp"] = factory(require("node-fetch"), require("xmldom")); - else - root["Gp"] = factory(root[undefined], root[undefined]); -})(this, function(__WEBPACK_EXTERNAL_MODULE_node_fetch__, __WEBPACK_EXTERNAL_MODULE_xmldom__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./node_modules/es6-promise/dist/es6-promise.js": -/*!******************************************************!*\ - !*** ./node_modules/es6-promise/dist/es6-promise.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(process, global) {/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.8+1e68dce6\n */\n\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\tundefined;\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && \"function\" === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n var then$$1 = void 0;\n try {\n then$$1 = value.then;\n } catch (error) {\n reject(promise, error);\n return;\n }\n handleMaybeThenable(promise, value, then$$1);\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = true;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n } catch (e) {\n succeeded = false;\n error = e;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (succeeded === false) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = void 0;\n var error = void 0;\n var didError = false;\n try {\n _then = entry.then;\n } catch (e) {\n didError = true;\n error = e;\n }\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n if (didError) {\n reject(promise, error);\n } else {\n handleMaybeThenable(promise, entry, _then);\n }\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ \"./node_modules/process/browser.js\"), __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzPzEzNjgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLEtBQTREO0FBQzdELENBQUMsU0FDK0I7QUFDaEMsQ0FBQyxxQkFBcUI7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnRkFBZ0Y7O0FBRWhGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHNCQUFzQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQyx5Q0FBeUMsVUFBYztBQUN4RDtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxVQUFVLElBQUk7QUFDZDtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQix3QkFBd0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQiw2Q0FBNkM7QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxNQUFNO0FBQ2hCLFVBQVUsT0FBTztBQUNqQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLE1BQU07QUFDaEI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxxQkFBcUIsWUFBWTtBQUNqQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLFVBQVUsSUFBSTtBQUNkO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsVUFBVSxTQUFTO0FBQ25CLFVBQVUsU0FBUztBQUNuQjtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxVQUFVLFNBQVM7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUIsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLFlBQVksU0FBUztBQUNyQixhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLENBQUM7Ozs7QUFJRCIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3N0ZWZhbnBlbm5lci9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICB2NC4yLjgrMWU2OGRjZTZcbiAqL1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuXHR0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG5cdChnbG9iYWwuRVM2UHJvbWlzZSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHg7XG4gIHJldHVybiB4ICE9PSBudWxsICYmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuXG5cbnZhciBfaXNBcnJheSA9IHZvaWQgMDtcbmlmIChBcnJheS5pc0FycmF5KSB7XG4gIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbn0gZWxzZSB7XG4gIF9pc0FycmF5ID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xufVxuXG52YXIgaXNBcnJheSA9IF9pc0FycmF5O1xuXG52YXIgbGVuID0gMDtcbnZhciB2ZXJ0eE5leHQgPSB2b2lkIDA7XG52YXIgY3VzdG9tU2NoZWR1bGVyRm4gPSB2b2lkIDA7XG5cbnZhciBhc2FwID0gZnVuY3Rpb24gYXNhcChjYWxsYmFjaywgYXJnKSB7XG4gIHF1ZXVlW2xlbl0gPSBjYWxsYmFjaztcbiAgcXVldWVbbGVuICsgMV0gPSBhcmc7XG4gIGxlbiArPSAyO1xuICBpZiAobGVuID09PSAyKSB7XG4gICAgLy8gSWYgbGVuIGlzIDIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLlxuICAgIC8vIElmIGFkZGl0aW9uYWwgY2FsbGJhY2tzIGFyZSBxdWV1ZWQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBmbHVzaGVkLCB0aGV5XG4gICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgIGlmIChjdXN0b21TY2hlZHVsZXJGbikge1xuICAgICAgY3VzdG9tU2NoZWR1bGVyRm4oZmx1c2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZUZsdXNoKCk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRTY2hlZHVsZXIoc2NoZWR1bGVGbikge1xuICBjdXN0b21TY2hlZHVsZXJGbiA9IHNjaGVkdWxlRm47XG59XG5cbmZ1bmN0aW9uIHNldEFzYXAoYXNhcEZuKSB7XG4gIGFzYXAgPSBhc2FwRm47XG59XG5cbnZhciBicm93c2VyV2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG52YXIgYnJvd3Nlckdsb2JhbCA9IGJyb3dzZXJXaW5kb3cgfHwge307XG52YXIgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBicm93c2VyR2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGlzTm9kZSA9IHR5cGVvZiBzZWxmID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuXG4vLyB0ZXN0IGZvciB3ZWIgd29ya2VyIGJ1dCBub3QgaW4gSUUxMFxudmFyIGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuLy8gbm9kZVxuZnVuY3Rpb24gdXNlTmV4dFRpY2soKSB7XG4gIC8vIG5vZGUgdmVyc2lvbiAwLjEwLnggZGlzcGxheXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gbmV4dFRpY2sgaXMgdXNlZCByZWN1cnNpdmVseVxuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N1am9qcy93aGVuL2lzc3Vlcy80MTAgZm9yIGRldGFpbHNcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gIH07XG59XG5cbi8vIHZlcnR4XG5mdW5jdGlvbiB1c2VWZXJ0eFRpbWVyKCkge1xuICBpZiAodHlwZW9mIHZlcnR4TmV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmVydHhOZXh0KGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbn1cblxuZnVuY3Rpb24gdXNlTXV0YXRpb25PYnNlcnZlcigpIHtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpO1xuICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBub2RlLmRhdGEgPSBpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMjtcbiAgfTtcbn1cblxuLy8gd2ViIHdvcmtlclxuZnVuY3Rpb24gdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZmx1c2g7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVNldFRpbWVvdXQoKSB7XG4gIC8vIFN0b3JlIHNldFRpbWVvdXQgcmVmZXJlbmNlIHNvIGVzNi1wcm9taXNlIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuICAvLyBvdGhlciBjb2RlIG1vZGlmeWluZyBzZXRUaW1lb3V0IChsaWtlIHNpbm9uLnVzZUZha2VUaW1lcnMoKSlcbiAgdmFyIGdsb2JhbFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnbG9iYWxTZXRUaW1lb3V0KGZsdXNoLCAxKTtcbiAgfTtcbn1cblxudmFyIHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcbiAgICB2YXIgYXJnID0gcXVldWVbaSArIDFdO1xuXG4gICAgY2FsbGJhY2soYXJnKTtcblxuICAgIHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgIHF1ZXVlW2kgKyAxXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRWZXJ0eCgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmVydHggPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpLnJlcXVpcmUoJ3ZlcnR4Jyk7XG4gICAgdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICByZXR1cm4gdXNlVmVydHhUaW1lcigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbiAgfVxufVxuXG52YXIgc2NoZWR1bGVGbHVzaCA9IHZvaWQgMDtcbi8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG5pZiAoaXNOb2RlKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VOZXh0VGljaygpO1xufSBlbHNlIGlmIChCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTXV0YXRpb25PYnNlcnZlcigpO1xufSBlbHNlIGlmIChpc1dvcmtlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTWVzc2FnZUNoYW5uZWwoKTtcbn0gZWxzZSBpZiAoYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSBhdHRlbXB0VmVydHgoKTtcbn0gZWxzZSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VTZXRUaW1lb3V0KCk7XG59XG5cbmZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgdmFyIHBhcmVudCA9IHRoaXM7XG5cbiAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaWYgKGNoaWxkW1BST01JU0VfSURdID09PSB1bmRlZmluZWQpIHtcbiAgICBtYWtlUHJvbWlzZShjaGlsZCk7XG4gIH1cblxuICB2YXIgX3N0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuXG4gIGlmIChfc3RhdGUpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbX3N0YXRlIC0gMV07XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaW52b2tlQ2FsbGJhY2soX3N0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHBhcmVudC5fcmVzdWx0KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAgYFByb21pc2UucmVzb2x2ZWAgcmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSByZXNvbHZlZCB3aXRoIHRoZVxuICBwYXNzZWQgYHZhbHVlYC4gSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHJlc29sdmUoMSk7XG4gIH0pO1xuXG4gIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgLy8gdmFsdWUgPT09IDFcbiAgfSk7XG4gIGBgYFxuXG4gIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKDEpO1xuXG4gIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgLy8gdmFsdWUgPT09IDFcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgcmVzb2x2ZVxuICBAc3RhdGljXG4gIEBwYXJhbSB7QW55fSB2YWx1ZSB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aFxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIGZ1bGZpbGxlZCB3aXRoIHRoZSBnaXZlblxuICBgdmFsdWVgXG4qL1xuZnVuY3Rpb24gcmVzb2x2ZSQxKG9iamVjdCkge1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcbiAgcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxudmFyIFBST01JU0VfSUQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMik7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgUEVORElORyA9IHZvaWQgMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcblxuZnVuY3Rpb24gc2VsZkZ1bGZpbGxtZW50KCkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG59XG5cbmZ1bmN0aW9uIGNhbm5vdFJldHVybk93bigpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VGhlbih0aGVuJCQxLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gIHRyeSB7XG4gICAgdGhlbiQkMS5jYWxsKHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuJCQxKSB7XG4gIGFzYXAoZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICB2YXIgc2VhbGVkID0gZmFsc2U7XG4gICAgdmFyIGVycm9yID0gdHJ5VGhlbih0aGVuJCQxLCB0aGVuYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoc2VhbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICBpZiAodGhlbmFibGUgIT09IHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKHNlYWxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgIH1cbiAgfSwgcHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IEZVTEZJTExFRCkge1xuICAgIGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBSRUpFQ1RFRCkge1xuICAgIHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcmV0dXJuIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbiQkMSkge1xuICBpZiAobWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3RvciA9PT0gcHJvbWlzZS5jb25zdHJ1Y3RvciAmJiB0aGVuJCQxID09PSB0aGVuICYmIG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IucmVzb2x2ZSA9PT0gcmVzb2x2ZSQxKSB7XG4gICAgaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoZW4kJDEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odGhlbiQkMSkpIHtcbiAgICAgIGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuJCQxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkge1xuICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICByZWplY3QocHJvbWlzZSwgc2VsZkZ1bGZpbGxtZW50KCkpO1xuICB9IGVsc2UgaWYgKG9iamVjdE9yRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIHRoZW4kJDEgPSB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIHRoZW4kJDEgPSB2YWx1ZS50aGVuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCB0aGVuJCQxKTtcbiAgfSBlbHNlIHtcbiAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgaWYgKHByb21pc2UuX29uZXJyb3IpIHtcbiAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX3Jlc3VsdCk7XG4gIH1cblxuICBwdWJsaXNoKHByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRDtcblxuICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7XG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHJldHVybjtcbiAgfVxuICBwcm9taXNlLl9zdGF0ZSA9IFJFSkVDVEVEO1xuICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgYXNhcChwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gIHZhciBfc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICB2YXIgbGVuZ3RoID0gX3N1YnNjcmliZXJzLmxlbmd0aDtcblxuXG4gIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgX3N1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgX3N1YnNjcmliZXJzW2xlbmd0aCArIEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICBfc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVKRUNURURdID0gb25SZWplY3Rpb247XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwYXJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkge1xuICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gdm9pZCAwLFxuICAgICAgY2FsbGJhY2sgPSB2b2lkIDAsXG4gICAgICBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPSAwO1xufVxuXG5mdW5jdGlvbiBpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7XG4gIHZhciBoYXNDYWxsYmFjayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLFxuICAgICAgdmFsdWUgPSB2b2lkIDAsXG4gICAgICBlcnJvciA9IHZvaWQgMCxcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG5cbiAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gY2FsbGJhY2soZGV0YWlsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGVycm9yID0gZTtcbiAgICB9XG5cbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJlamVjdChwcm9taXNlLCBjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gZGV0YWlsO1xuICB9XG5cbiAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgLy8gbm9vcFxuICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkge1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKHN1Y2NlZWRlZCA9PT0gZmFsc2UpIHtcbiAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IEZVTEZJTExFRCkge1xuICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKSB7XG4gICAgcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplUHJvbWlzZShwcm9taXNlLCByZXNvbHZlcikge1xuICB0cnkge1xuICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKSB7XG4gICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikge1xuICAgICAgcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZWplY3QocHJvbWlzZSwgZSk7XG4gIH1cbn1cblxudmFyIGlkID0gMDtcbmZ1bmN0aW9uIG5leHRJZCgpIHtcbiAgcmV0dXJuIGlkKys7XG59XG5cbmZ1bmN0aW9uIG1ha2VQcm9taXNlKHByb21pc2UpIHtcbiAgcHJvbWlzZVtQUk9NSVNFX0lEXSA9IGlkKys7XG4gIHByb21pc2UuX3N0YXRlID0gdW5kZWZpbmVkO1xuICBwcm9taXNlLl9yZXN1bHQgPSB1bmRlZmluZWQ7XG4gIHByb21pc2UuX3N1YnNjcmliZXJzID0gW107XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRpb25FcnJvcigpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG59XG5cbnZhciBFbnVtZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICAgIHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG5cbiAgICBpZiAoIXRoaXMucHJvbWlzZVtQUk9NSVNFX0lEXSkge1xuICAgICAgbWFrZVByb21pc2UodGhpcy5wcm9taXNlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgdGhpcy5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuXG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICAgIHRoaXMuX2VudW1lcmF0ZShpbnB1dCk7XG4gICAgICAgIGlmICh0aGlzLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICBmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3QodGhpcy5wcm9taXNlLCB2YWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgfVxuICB9XG5cbiAgRW51bWVyYXRvci5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uIF9lbnVtZXJhdGUoaW5wdXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgdGhpcy5fc3RhdGUgPT09IFBFTkRJTkcgJiYgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9lYWNoRW50cnkoaW5wdXRbaV0sIGkpO1xuICAgIH1cbiAgfTtcblxuICBFbnVtZXJhdG9yLnByb3RvdHlwZS5fZWFjaEVudHJ5ID0gZnVuY3Rpb24gX2VhY2hFbnRyeShlbnRyeSwgaSkge1xuICAgIHZhciBjID0gdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvcjtcbiAgICB2YXIgcmVzb2x2ZSQkMSA9IGMucmVzb2x2ZTtcblxuXG4gICAgaWYgKHJlc29sdmUkJDEgPT09IHJlc29sdmUkMSkge1xuICAgICAgdmFyIF90aGVuID0gdm9pZCAwO1xuICAgICAgdmFyIGVycm9yID0gdm9pZCAwO1xuICAgICAgdmFyIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBfdGhlbiA9IGVudHJ5LnRoZW47XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoZW4gPT09IHRoZW4gJiYgZW50cnkuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgICAgIHRoaXMuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgX3RoZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nLS07XG4gICAgICAgIHRoaXMuX3Jlc3VsdFtpXSA9IGVudHJ5O1xuICAgICAgfSBlbHNlIGlmIChjID09PSBQcm9taXNlJDEpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgYyhub29wKTtcbiAgICAgICAgaWYgKGRpZEVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIGVudHJ5LCBfdGhlbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHByb21pc2UsIGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG5ldyBjKGZ1bmN0aW9uIChyZXNvbHZlJCQxKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUkJDEoZW50cnkpO1xuICAgICAgICB9KSwgaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dpbGxTZXR0bGVBdChyZXNvbHZlJCQxKGVudHJ5KSwgaSk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbiBfc2V0dGxlZEF0KHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgIHZhciBwcm9taXNlID0gdGhpcy5wcm9taXNlO1xuXG5cbiAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuXG4gICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgICAgIHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiBfd2lsbFNldHRsZUF0KHByb21pc2UsIGkpIHtcbiAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICBzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcmV0dXJuIGVudW1lcmF0b3IuX3NldHRsZWRBdChSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRW51bWVyYXRvcjtcbn0oKTtcblxuLyoqXG4gIGBQcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaFxuICBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiBmdWxmaWxsbWVudCB2YWx1ZXMgZm9yIHRoZSBwYXNzZWQgcHJvbWlzZXMsIG9yXG4gIHJlamVjdGVkIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gYmUgcmVqZWN0ZWQuIEl0IGNhc3RzIGFsbFxuICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlc29sdmUoMik7XG4gIGxldCBwcm9taXNlMyA9IHJlc29sdmUoMyk7XG4gIGxldCBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdO1xuXG4gIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5KXtcbiAgICAvLyBUaGUgYXJyYXkgaGVyZSB3b3VsZCBiZSBbIDEsIDIsIDMgXTtcbiAgfSk7XG4gIGBgYFxuXG4gIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBgYWxsYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlXG4gIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZXMnc1xuICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6XG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlamVjdChuZXcgRXJyb3IoXCIyXCIpKTtcbiAgbGV0IHByb21pc2UzID0gcmVqZWN0KG5ldyBFcnJvcihcIjNcIikpO1xuICBsZXQgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTtcblxuICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihhcnJheSl7XG4gICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlzZXMhXG4gIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgLy8gZXJyb3IubWVzc2FnZSA9PT0gXCIyXCJcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgYWxsXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBcnJheX0gZW50cmllcyBhcnJheSBvZiBwcm9taXNlc1xuICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS5cbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIGBwcm9taXNlc2AgaGF2ZSBiZWVuXG4gIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLlxuICBAc3RhdGljXG4qL1xuZnVuY3Rpb24gYWxsKGVudHJpZXMpIHtcbiAgcmV0dXJuIG5ldyBFbnVtZXJhdG9yKHRoaXMsIGVudHJpZXMpLnByb21pc2U7XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yYWNlYCByZXR1cm5zIGEgbmV3IHByb21pc2Ugd2hpY2ggaXMgc2V0dGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlXG4gIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIHNldHRsZS5cblxuICBFeGFtcGxlOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UxID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDEnKTtcbiAgICB9LCAyMDApO1xuICB9KTtcblxuICBsZXQgcHJvbWlzZTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlc29sdmUoJ3Byb21pc2UgMicpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIFByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIHJlc3VsdCA9PT0gJ3Byb21pc2UgMicgYmVjYXVzZSBpdCB3YXMgcmVzb2x2ZWQgYmVmb3JlIHByb21pc2UxXG4gICAgLy8gd2FzIHJlc29sdmVkLlxuICB9KTtcbiAgYGBgXG5cbiAgYFByb21pc2UucmFjZWAgaXMgZGV0ZXJtaW5pc3RpYyBpbiB0aGF0IG9ubHkgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICBzZXR0bGVkIHByb21pc2UgbWF0dGVycy4gRm9yIGV4YW1wbGUsIGV2ZW4gaWYgb3RoZXIgcHJvbWlzZXMgZ2l2ZW4gdG8gdGhlXG4gIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQgYXJlIHJlc29sdmVkLCBidXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlzZSBoYXNcbiAgYmVjb21lIHJlamVjdGVkIGJlZm9yZSB0aGUgb3RoZXIgcHJvbWlzZXMgYmVjYW1lIGZ1bGZpbGxlZCwgdGhlIHJldHVybmVkXG4gIHByb21pc2Ugd2lsbCBiZWNvbWUgcmVqZWN0ZWQ6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlc29sdmUoJ3Byb21pc2UgMScpO1xuICAgIH0sIDIwMCk7XG4gIH0pO1xuXG4gIGxldCBwcm9taXNlMiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcigncHJvbWlzZSAyJykpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIFByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zXG4gIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICdwcm9taXNlIDInIGJlY2F1c2UgcHJvbWlzZSAyIGJlY2FtZSByZWplY3RlZCBiZWZvcmVcbiAgICAvLyBwcm9taXNlIDEgYmVjYW1lIGZ1bGZpbGxlZFxuICB9KTtcbiAgYGBgXG5cbiAgQW4gZXhhbXBsZSByZWFsLXdvcmxkIHVzZSBjYXNlIGlzIGltcGxlbWVudGluZyB0aW1lb3V0czpcblxuICBgYGBqYXZhc2NyaXB0XG4gIFByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24nKSwgdGltZW91dCg1MDAwKV0pXG4gIGBgYFxuXG4gIEBtZXRob2QgcmFjZVxuICBAc3RhdGljXG4gIEBwYXJhbSB7QXJyYXl9IHByb21pc2VzIGFycmF5IG9mIHByb21pc2VzIHRvIG9ic2VydmVcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2Ugd2hpY2ggc2V0dGxlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0IHBhc3NlZFxuICBwcm9taXNlIHRvIHNldHRsZS5cbiovXG5mdW5jdGlvbiByYWNlKGVudHJpZXMpIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkoZW50cmllcykpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gIGBQcm9taXNlLnJlamVjdGAgcmV0dXJucyBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgcGFzc2VkIGByZWFzb25gLlxuICBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1dIT09QUycpKTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZWplY3RcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FueX0gcmVhc29uIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCB3aXRoLlxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC5cbiovXG5mdW5jdGlvbiByZWplY3QkMShyZWFzb24pIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG4gIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNSZXNvbHZlcigpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xufVxuXG5mdW5jdGlvbiBuZWVkc05ldygpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbn1cblxuLyoqXG4gIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gIFRlcm1pbm9sb2d5XG4gIC0tLS0tLS0tLS0tXG5cbiAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgQmFzaWMgVXNhZ2U6XG4gIC0tLS0tLS0tLS0tLVxuXG4gIGBgYGpzXG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgLy8gb24gZmFpbHVyZVxuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBvbiBmdWxmaWxsbWVudFxuICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAvLyBvbiByZWplY3Rpb25cbiAgfSk7XG4gIGBgYFxuXG4gIEFkdmFuY2VkIFVzYWdlOlxuICAtLS0tLS0tLS0tLS0tLS1cblxuICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIC8vIG9uIHJlamVjdGlvblxuICB9KTtcbiAgYGBgXG5cbiAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICBgYGBqc1xuICBQcm9taXNlLmFsbChbXG4gICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9KTtcbiAgYGBgXG5cbiAgQGNsYXNzIFByb21pc2VcbiAgQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZXJcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAY29uc3RydWN0b3JcbiovXG5cbnZhciBQcm9taXNlJDEgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICB0aGlzW1BST01JU0VfSURdID0gbmV4dElkKCk7XG4gICAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgIGlmIChub29wICE9PSByZXNvbHZlcikge1xuICAgICAgdHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nICYmIG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlID8gaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpIDogbmVlZHNOZXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gIH0pO1xuICBgYGBcbiAgIENoYWluaW5nXG4gIC0tLS0tLS0tXG4gICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgYGBganNcbiAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gIH0pO1xuICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gbmV2ZXIgcmVhY2hlZFxuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgfSk7XG4gIGBgYFxuICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyBuZXZlciByZWFjaGVkXG4gIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gbmV2ZXIgcmVhY2hlZFxuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgfSk7XG4gIGBgYFxuICAgQXNzaW1pbGF0aW9uXG4gIC0tLS0tLS0tLS0tLVxuICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gIH0pO1xuICBgYGBcbiAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuICAgYGBganNcbiAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgfSk7XG4gIGBgYFxuICAgU2ltcGxlIEV4YW1wbGVcbiAgLS0tLS0tLS0tLS0tLS1cbiAgIFN5bmNocm9ub3VzIEV4YW1wbGVcbiAgIGBgYGphdmFzY3JpcHRcbiAgbGV0IHJlc3VsdDtcbiAgIHRyeSB7XG4gICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAvLyBmYWlsdXJlXG4gIH1cbiAgYGBgXG4gICBFcnJiYWNrIEV4YW1wbGVcbiAgIGBgYGpzXG4gIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8vIGZhaWx1cmVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH1cbiAgfSk7XG4gIGBgYFxuICAgUHJvbWlzZSBFeGFtcGxlO1xuICAgYGBgamF2YXNjcmlwdFxuICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyBmYWlsdXJlXG4gIH0pO1xuICBgYGBcbiAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgLS0tLS0tLS0tLS0tLS1cbiAgIFN5bmNocm9ub3VzIEV4YW1wbGVcbiAgIGBgYGphdmFzY3JpcHRcbiAgbGV0IGF1dGhvciwgYm9va3M7XG4gICB0cnkge1xuICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAvLyBmYWlsdXJlXG4gIH1cbiAgYGBgXG4gICBFcnJiYWNrIEV4YW1wbGVcbiAgIGBgYGpzXG4gICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG4gICB9XG4gICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuICAgfVxuICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgaWYgKGVycikge1xuICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgLy8gZmFpbHVyZVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICB9XG4gICAgICAvLyBzdWNjZXNzXG4gICAgfVxuICB9KTtcbiAgYGBgXG4gICBQcm9taXNlIEV4YW1wbGU7XG4gICBgYGBqYXZhc2NyaXB0XG4gIGZpbmRBdXRob3IoKS5cbiAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgIC8vIGZvdW5kIGJvb2tzXG4gIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgfSk7XG4gIGBgYFxuICAgQG1ldGhvZCB0aGVuXG4gIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuXG4gIC8qKlxuICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gIH1cbiAgLy8gc3luY2hyb25vdXNcbiAgdHJ5IHtcbiAgZmluZEF1dGhvcigpO1xuICB9IGNhdGNoKHJlYXNvbikge1xuICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICB9XG4gIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gIH0pO1xuICBgYGBcbiAgQG1ldGhvZCBjYXRjaFxuICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG5cblxuICBQcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIF9jYXRjaChvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgIGBmaW5hbGx5YCB3aWxsIGJlIGludm9rZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJvbWlzZSdzIGZhdGUganVzdCBhcyBuYXRpdmVcbiAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzXG4gIFxuICAgIFN5bmNocm9ub3VzIGV4YW1wbGU6XG4gIFxuICAgIGBgYGpzXG4gICAgZmluZEF1dGhvcigpIHtcbiAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3IoKTtcbiAgICB9XG4gIFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZmluZEF1dGhvcigpOyAvLyBzdWNjZWVkIG9yIGZhaWxcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmluZE90aGVyQXV0aGVyKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGFsd2F5cyBydW5zXG4gICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIGBgYFxuICBcbiAgICBBc3luY2hyb25vdXMgZXhhbXBsZTpcbiAgXG4gICAgYGBganNcbiAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIHJldHVybiBmaW5kT3RoZXJBdXRoZXIoKTtcbiAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCl7XG4gICAgICAvLyBhdXRob3Igd2FzIGVpdGhlciBmb3VuZCwgb3Igbm90XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEBtZXRob2QgZmluYWxseVxuICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgQHJldHVybiB7UHJvbWlzZX1cbiAgKi9cblxuXG4gIFByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgPSBmdW5jdGlvbiBfZmluYWxseShjYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gdGhpcztcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihjYWxsYmFjaywgY2FsbGJhY2spO1xuICB9O1xuXG4gIHJldHVybiBQcm9taXNlO1xufSgpO1xuXG5Qcm9taXNlJDEucHJvdG90eXBlLnRoZW4gPSB0aGVuO1xuUHJvbWlzZSQxLmFsbCA9IGFsbDtcblByb21pc2UkMS5yYWNlID0gcmFjZTtcblByb21pc2UkMS5yZXNvbHZlID0gcmVzb2x2ZSQxO1xuUHJvbWlzZSQxLnJlamVjdCA9IHJlamVjdCQxO1xuUHJvbWlzZSQxLl9zZXRTY2hlZHVsZXIgPSBzZXRTY2hlZHVsZXI7XG5Qcm9taXNlJDEuX3NldEFzYXAgPSBzZXRBc2FwO1xuUHJvbWlzZSQxLl9hc2FwID0gYXNhcDtcblxuLypnbG9iYWwgc2VsZiovXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgdmFyIGxvY2FsID0gdm9pZCAwO1xuXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gc2VsZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gIGlmIChQKSB7XG4gICAgdmFyIHByb21pc2VUb1N0cmluZyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2VUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2lsZW50bHkgaWdub3JlZFxuICAgIH1cblxuICAgIGlmIChwcm9taXNlVG9TdHJpbmcgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbG9jYWwuUHJvbWlzZSA9IFByb21pc2UkMTtcbn1cblxuLy8gU3RyYW5nZSBjb21wYXQuLlxuUHJvbWlzZSQxLnBvbHlmaWxsID0gcG9seWZpbGw7XG5Qcm9taXNlJDEuUHJvbWlzZSA9IFByb21pc2UkMTtcblxucmV0dXJuIFByb21pc2UkMTtcblxufSkpKTtcblxuXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzNi1wcm9taXNlLm1hcFxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/es6-promise/dist/es6-promise.js\n"); - -/***/ }), - -/***/ "./node_modules/loglevel/lib/loglevel.js": -/*!***********************************************!*\ - !*** ./node_modules/loglevel/lib/loglevel.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = level;\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n self.setLevel(defaultLevel, false);\n clearPersistedLevel();\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwQztBQUNsRCxRQUFRLG9DQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxvR0FBQztBQUMxQixLQUFLLE1BQU0sRUFJTjtBQUNMLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QixTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRCxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcyhsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBsb2cubG9nIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWdcbiAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmRlYnVnO1xuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSwgbGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHRoaXMsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGRlZmF1bHRMZXZlbCwgZmFjdG9yeSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGN1cnJlbnRMZXZlbDtcbiAgICAgIGRlZmF1bHRMZXZlbCA9IGRlZmF1bHRMZXZlbCA9PSBudWxsID8gXCJXQVJOXCIgOiBkZWZhdWx0TGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbGVhclBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudExldmVsO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUobGV2ZWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYsIGxldmVsLCBuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgXCJsb2cuc2V0TGV2ZWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGxldmVsOiBcIiArIGxldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgZGVmYXVsdExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXRMZXZlbChkZWZhdWx0TGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIHJpZ2h0IGxldmVsXG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxMZXZlbCA9IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIgJiYgdHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHx8IG5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICBuYW1lLCBkZWZhdWx0TG9nZ2VyLmdldExldmVsKCksIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/loglevel/lib/loglevel.js\n"); - -/***/ }), - -/***/ "./node_modules/process/browser.js": -/*!*****************************************!*\ - !*** ./node_modules/process/browser.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanM/ZjI4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n"); - -/***/ }), - -/***/ "./node_modules/webpack/buildin/global.js": -/*!***********************************!*\ - !*** (webpack)/buildin/global.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanM/Y2QwMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n"); - -/***/ }), - -/***/ "./package.json": -/*!**********************!*\ - !*** ./package.json ***! - \**********************/ -/*! exports provided: name, version, date, description, module, main, homepage, scripts, nyc, repository, keywords, author, license, dependencies, devDependencies, bundledDependencies, peerDependencies, optionalDependencies, default */ -/***/ (function(module) { - -eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"geoportal-access-lib\\\",\\\"version\\\":\\\"3.4.0-beta2\\\",\\\"date\\\":\\\"27/10/2023\\\",\\\"description\\\":\\\"French Geoportal resources access library\\\",\\\"module\\\":\\\"src/Gp.js\\\",\\\"main\\\":\\\"dist/GpServices-src.js\\\",\\\"homepage\\\":\\\"https://github.com/IGNF/geoportal-access-lib#readme\\\",\\\"scripts\\\":{\\\"clean\\\":\\\"echo \\\\\\\"Warning: no yet implemented!\\\\\\\" && exit 0\\\",\\\"setup\\\":\\\"npm install\\\",\\\"cover\\\":\\\"nyc --reporter=lcov --reporter=text npm run test\\\",\\\"eslint\\\":\\\"eslint src/\\\",\\\"build\\\":\\\"webpack --mode=none\\\",\\\"build:prod\\\":\\\"webpack --mode=production\\\",\\\"build:dev\\\":\\\"webpack --mode=development\\\",\\\"test\\\":\\\"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\\\\\\"test_*.js\\\\\\\" test/spec/\\\",\\\"test:serve\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js\\\",\\\"test:serve:docker\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js\\\",\\\"test:end-to-end:serve\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js\\\",\\\"test:end-to-end:serve:docker\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js\\\",\\\"sample\\\":\\\"npm run sample:serve\\\",\\\"sample:serve\\\":\\\"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path '/dist/' --port 9001 --open\\\",\\\"sample:serve:prod\\\":\\\"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path '/dist/' --port 9001 --open\\\",\\\"sample:serve:dev\\\":\\\"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path '/dist/' --port 9001 --open\\\",\\\"doc\\\":\\\"npm run doc:serve\\\",\\\"doc:serve\\\":\\\"webpack-dev-server --content-base jsdoc --port 9001 --open\\\"},\\\"nyc\\\":{\\\"include\\\":[\\\"src/**/*.js\\\"],\\\"instrument\\\":false,\\\"sourceMap\\\":false},\\\"repository\\\":{\\\"type\\\":\\\"git\\\",\\\"url\\\":\\\"https://github.com/IGNF/geoportal-access-lib.git\\\"},\\\"keywords\\\":[\\\"geoportail\\\",\\\"webservice\\\",\\\"javascript\\\",\\\"es6\\\"],\\\"author\\\":\\\"IGNF\\\",\\\"license\\\":\\\"CECILL-B\\\",\\\"dependencies\\\":{\\\"es6-promise\\\":\\\"^4.2.4\\\",\\\"node-fetch\\\":\\\"^2.6.1\\\",\\\"xmldom\\\":\\\"^0.1.27\\\"},\\\"devDependencies\\\":{\\\"@babel/core\\\":\\\"^7.12.10\\\",\\\"@babel/plugin-transform-template-literals\\\":\\\"^7.12.1\\\",\\\"@babel/preset-env\\\":\\\"^7.12.11\\\",\\\"babel-loader\\\":\\\"^8.2.2\\\",\\\"chai\\\":\\\"^4.1.2\\\",\\\"clean-webpack-plugin\\\":\\\"^3.0.0\\\",\\\"copy-webpack-plugin\\\":\\\"^5.1.2\\\",\\\"eslint\\\":\\\"^7.18.0\\\",\\\"eslint-config-standard\\\":\\\"^16.0.2\\\",\\\"eslint-loader\\\":\\\"^4.0.2\\\",\\\"eslint-plugin-import\\\":\\\"^2.22.1\\\",\\\"eslint-plugin-node\\\":\\\"^11.1.0\\\",\\\"eslint-plugin-promise\\\":\\\"^4.2.1\\\",\\\"eslint-plugin-standard\\\":\\\"^5.0.0\\\",\\\"glob\\\":\\\"^7.1.2\\\",\\\"handlebars-layouts\\\":\\\"^3.1.4\\\",\\\"handlebars-webpack-plugin\\\":\\\"^1.4.1\\\",\\\"html-webpack-plugin\\\":\\\"^4.5.1\\\",\\\"istanbul-instrumenter-loader\\\":\\\"^3.0.1\\\",\\\"jsdoc-webpack-plugin\\\":\\\"^0.3.0\\\",\\\"loglevel\\\":\\\"^1.6.1\\\",\\\"mocha\\\":\\\"^7.2.0\\\",\\\"mocha-loader\\\":\\\"^5.1.5\\\",\\\"mocha-webpack\\\":\\\"^2.0.0-beta.0\\\",\\\"mochawesome\\\":\\\"^6.2.1\\\",\\\"nyc\\\":\\\"^15.1.0\\\",\\\"path\\\":\\\"^0.12.7\\\",\\\"replace-bundle-webpack-plugin\\\":\\\"^1.0.0\\\",\\\"sinon\\\":\\\"^9.2.4\\\",\\\"sinon-es6\\\":\\\"0.0.3\\\",\\\"speed-measure-webpack-plugin\\\":\\\"^1.4.2\\\",\\\"string-template\\\":\\\"^1.0.0\\\",\\\"terser-webpack-plugin\\\":\\\"^2.3.8\\\",\\\"webpack\\\":\\\"^4.46.0\\\",\\\"webpack-cli\\\":\\\"^3.3.12\\\",\\\"webpack-dev-server\\\":\\\"^3.11.2\\\",\\\"webpack-node-externals\\\":\\\"^2.5.2\\\",\\\"webpack-shell-plugin\\\":\\\"^0.5.0\\\"},\\\"bundledDependencies\\\":[],\\\"peerDependencies\\\":{},\\\"optionalDependencies\\\":{}}\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIuL3BhY2thZ2UuanNvbi5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./package.json\n"); - -/***/ }), - -/***/ "./src/Exceptions/ErrorService.js": -/*!****************************************!*\ - !*** ./src/Exceptions/ErrorService.js ***! - \****************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Errors raised by API for one among three reasons : wrong API usage, underlying service error or unknown reason.\n *\n * @property {String} message - Error message\n * @property {Number} status - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} ; -1 otherwise.\n * @property {String} type - Error type ({@link Gp.Error.TYPE_SRVERR}, {@link Gp.Error.TYPE_USEERR} or {@link Gp.Error.TYPE_UNKERR}).\n *\n * @namespace\n * @alias Gp.Error\n * @param {Object|String} error - Options for creating error object. Can be a String (message) or an Object.\n * @param {String} error.message - Error message to return to user.\n * @param {enum} [error.type=TYPE_UNKERR] - Error type\n * @param {status} [error.status=-1] - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}.\n *\n */\nfunction ErrorService(error) {\n if (!(this instanceof ErrorService)) {\n throw new TypeError(\"ErrorService constructor cannot be called as a function.\");\n }\n var e = error;\n if (typeof error === \"string\" || error instanceof String) {\n this.message = error;\n this.status = -1;\n this.type = ErrorService.TYPE_UNKERR;\n } else {\n this.message = e.message || \"undefined!?\";\n this.type = e.type;\n this.status = e.status || -1;\n }\n this.name = \"ErrorService\";\n this.stack = new Error().stack;\n}\n\n/**\n * Error raised when underlying geoportal service answers on error.\n *\n * @type {String}\n * @constant\n * @static\n */\nErrorService.TYPE_SRVERR = \"SERVICE_ERROR\";\n/**\n * Error raised when funcion use is inappropriate\n *\n * @type {String}\n * @constant\n * @static\n */\nErrorService.TYPE_USEERR = \"USAGE_ERROR\";\n/**\n * Error raised when API can't perform the job for a reason other than the two other ones.\n *\n * @type {String}\n * @constant\n * @static\n */\nErrorService.TYPE_UNKERR = \"UNKNOWN_ERROR\";\n\n/**\n * @lends module:ErrorService\n */\nErrorService.prototype = Object.create(Error.prototype, {\n constructor: {\n value: ErrorService,\n writable: true,\n configurable: true\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (ErrorService);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9FeGNlcHRpb25zL0Vycm9yU2VydmljZS5qcz9mOWI2Il0sIm5hbWVzIjpbIkVycm9yU2VydmljZSIsImVycm9yIiwiVHlwZUVycm9yIiwiZSIsIlN0cmluZyIsIm1lc3NhZ2UiLCJzdGF0dXMiLCJ0eXBlIiwiVFlQRV9VTktFUlIiLCJuYW1lIiwic3RhY2siLCJFcnJvciIsIlRZUEVfU1JWRVJSIiwiVFlQRV9VU0VFUlIiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsInZhbHVlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsWUFBWUEsQ0FBRUMsS0FBSyxFQUFFO0VBQzFCLElBQUksRUFBRSxJQUFJLFlBQVlELFlBQVksQ0FBQyxFQUFFO0lBQ2pDLE1BQU0sSUFBSUUsU0FBUyxDQUFDLDBEQUEwRCxDQUFDO0VBQ25GO0VBRUEsSUFBSUMsQ0FBQyxHQUFHRixLQUFLO0VBQ2IsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJQSxLQUFLLFlBQVlHLE1BQU0sRUFBRTtJQUN0RCxJQUFJLENBQUNDLE9BQU8sR0FBR0osS0FBSztJQUNwQixJQUFJLENBQUNLLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDQyxJQUFJLEdBQUdQLFlBQVksQ0FBQ1EsV0FBVztFQUN4QyxDQUFDLE1BQU07SUFDSCxJQUFJLENBQUNILE9BQU8sR0FBR0YsQ0FBQyxDQUFDRSxPQUFPLElBQUksYUFBYTtJQUN6QyxJQUFJLENBQUNFLElBQUksR0FBR0osQ0FBQyxDQUFDSSxJQUFJO0lBQ2xCLElBQUksQ0FBQ0QsTUFBTSxHQUFHSCxDQUFDLENBQUNHLE1BQU0sSUFBSSxDQUFDLENBQUM7RUFDaEM7RUFFQSxJQUFJLENBQUNHLElBQUksR0FBRyxjQUFjO0VBQzFCLElBQUksQ0FBQ0MsS0FBSyxHQUFJLElBQUlDLEtBQUssQ0FBQyxDQUFDLENBQUVELEtBQUs7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQVYsWUFBWSxDQUFDWSxXQUFXLEdBQUcsZUFBZTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBWixZQUFZLENBQUNhLFdBQVcsR0FBRyxhQUFhO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FiLFlBQVksQ0FBQ1EsV0FBVyxHQUFHLGVBQWU7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBUixZQUFZLENBQUNjLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUNMLEtBQUssQ0FBQ0csU0FBUyxFQUFFO0VBQ3BERyxXQUFXLEVBQUc7SUFDVkMsS0FBSyxFQUFHbEIsWUFBWTtJQUNwQm1CLFFBQVEsRUFBRyxJQUFJO0lBQ2ZDLFlBQVksRUFBRztFQUNuQjtBQUNKLENBQUMsQ0FBQztBQUVhcEIsMkVBQVkiLCJmaWxlIjoiLi9zcmMvRXhjZXB0aW9ucy9FcnJvclNlcnZpY2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVycm9ycyByYWlzZWQgYnkgQVBJIGZvciBvbmUgYW1vbmcgdGhyZWUgcmVhc29ucyA6IHdyb25nIEFQSSB1c2FnZSwgdW5kZXJseWluZyBzZXJ2aWNlIGVycm9yIG9yIHVua25vd24gcmVhc29uLlxuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHN0YXR1cyAtIEVycm9yIHN0YXR1cyA6IHdoZW4ge0BsaW5rIEdwLkVycm9yLlRZUEVfU1JWRVJSfSwgZ2l2ZXMgdGhlIFtIVFRQIHN0YXR1cyBvZiB0aGUgdW5kZXJseWluZyB3ZWIgc2VydmljZSByZXNwb25zZV17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9IVFRQX3N0YXR1c19jb2Rlc30gOyAtMSBvdGhlcndpc2UuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdHlwZSAtIEVycm9yIHR5cGUgKHtAbGluayBHcC5FcnJvci5UWVBFX1NSVkVSUn0sIHtAbGluayBHcC5FcnJvci5UWVBFX1VTRUVSUn0gb3Ige0BsaW5rIEdwLkVycm9yLlRZUEVfVU5LRVJSfSkuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLkVycm9yXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGVycm9yIC0gT3B0aW9ucyBmb3IgY3JlYXRpbmcgZXJyb3Igb2JqZWN0LiBDYW4gYmUgYSBTdHJpbmcgKG1lc3NhZ2UpIG9yIGFuIE9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvci5tZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byByZXR1cm4gdG8gdXNlci5cbiAqIEBwYXJhbSB7ZW51bX0gW2Vycm9yLnR5cGU9VFlQRV9VTktFUlJdIC0gRXJyb3IgdHlwZVxuICogQHBhcmFtIHtzdGF0dXN9IFtlcnJvci5zdGF0dXM9LTFdIC0gRXJyb3Igc3RhdHVzIDogd2hlbiB7QGxpbmsgR3AuRXJyb3IuVFlQRV9TUlZFUlJ9LCBnaXZlcyB0aGUgW0hUVFAgc3RhdHVzIG9mIHRoZSB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIHJlc3BvbnNlXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX0hUVFBfc3RhdHVzX2NvZGVzfS5cbiAqXG4gKi9cbmZ1bmN0aW9uIEVycm9yU2VydmljZSAoZXJyb3IpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRXJyb3JTZXJ2aWNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXJyb3JTZXJ2aWNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdmFyIGUgPSBlcnJvcjtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiIHx8IGVycm9yIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9yO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IC0xO1xuICAgICAgICB0aGlzLnR5cGUgPSBFcnJvclNlcnZpY2UuVFlQRV9VTktFUlI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gZS5tZXNzYWdlIHx8IFwidW5kZWZpbmVkIT9cIjtcbiAgICAgICAgdGhpcy50eXBlID0gZS50eXBlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGUuc3RhdHVzIHx8IC0xO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IFwiRXJyb3JTZXJ2aWNlXCI7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG59XG5cbi8qKlxuICogRXJyb3IgcmFpc2VkIHdoZW4gdW5kZXJseWluZyBnZW9wb3J0YWwgc2VydmljZSBhbnN3ZXJzIG9uIGVycm9yLlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAY29uc3RhbnRcbiAqIEBzdGF0aWNcbiAqL1xuRXJyb3JTZXJ2aWNlLlRZUEVfU1JWRVJSID0gXCJTRVJWSUNFX0VSUk9SXCI7XG4vKipcbiAqIEVycm9yIHJhaXNlZCB3aGVuIGZ1bmNpb24gdXNlIGlzIGluYXBwcm9wcmlhdGVcbiAqXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGNvbnN0YW50XG4gKiBAc3RhdGljXG4gKi9cbkVycm9yU2VydmljZS5UWVBFX1VTRUVSUiA9IFwiVVNBR0VfRVJST1JcIjtcbi8qKlxuICogRXJyb3IgcmFpc2VkIHdoZW4gQVBJIGNhbid0IHBlcmZvcm0gdGhlIGpvYiBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiB0aGUgdHdvIG90aGVyIG9uZXMuXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqIEBjb25zdGFudFxuICogQHN0YXRpY1xuICovXG5FcnJvclNlcnZpY2UuVFlQRV9VTktFUlIgPSBcIlVOS05PV05fRVJST1JcIjtcblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOkVycm9yU2VydmljZVxuICovXG5FcnJvclNlcnZpY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvciA6IHtcbiAgICAgICAgdmFsdWUgOiBFcnJvclNlcnZpY2UsXG4gICAgICAgIHdyaXRhYmxlIDogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBFcnJvclNlcnZpY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Exceptions/ErrorService.js\n"); - -/***/ }), - -/***/ "./src/Formats/WPS.js": -/*!****************************!*\ - !*** ./src/Formats/WPS.js ***! - \****************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Standard WPS\n *\n * @constructor\n * @alias Gp.Formats.WPS\n * @param {Object} options - options\n * @param {Object} options.data - objet\n * @param {String} options.method - POST|GET\n * @param {String} options.param.service - \"WPS\"\n * @param {String} options.param.version - \"1.0.0\"\n * @param {String} options.param.identifier - \"gs:WPSElevation|gs:WPSLineElevation\"\n * @param {String} options.param.rawdataoutput - \"result\"\n * @param {String} options.param.request - \"Execute\"\n * @param {Function} options.onsuccess - function callback success (TODO)\n * @param {Function} options.onerror - function callback error (TODO)\n * @private\n */\nfunction WPS(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur WPS()]\");\n if (!(this instanceof WPS)) {\n throw new TypeError(\"WPS constructor cannot be called as a function.\");\n }\n this.options = options || {};\n\n /**\n * Objet DATA\n */\n this.DataObject = this.options.data;\n if (!this.DataObject) {\n throw new TypeError(\"This data object is not defined !\");\n }\n\n /**\n * param service.\n * Par defaut, \"WPS\".\n */\n this.paramservice = this.options.param.service || \"WPS\";\n\n /**\n * param version.\n * Par defaut, \"1.0.0\".\n */\n this.paramversion = this.options.param.version || \"1.0.0\";\n\n /**\n * param identifier\n * Par defaut, \"gs:WPS\"\n */\n this.paramidentifier = this.options.param.identifier || \"gs:WPS\";\n\n /**\n * param rawdataoutput\n * Par defaut, \"result\".\n */\n this.paramrawdataoutput = this.options.param.rawdataoutput || \"result\";\n\n /**\n * param request\n * Par defaut, \"Execute\".\n */\n this.paramrequest = this.options.param.request || \"Execute\";\n\n /**\n * methode.\n * Par defaut, \"GET\".\n */\n this.method = this.options.method || \"GET\";\n}\nWPS.prototype = {\n /**\n * @lends module:WPS#\n */\n\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: WPS,\n /**\n * Template de la requête.\n */\n template: {\n get: {\n value: \"service=__SERVICE__\" + \"&version=__VERSION__\" + \"&rawdataoutput=__RAWDATAOUTPUT__\" + \"&identifier=__IDENTIFIER__\" + \"&request=__REQUEST__\" + \"&datainputs=\",\n input: \"__KEY__=__DATA__\"\n },\n post: {\n value: \"\" + \"\" + \"__IDENTIFIER__\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"__RAWDATAOUTPUT__\" + \"\" + \"\" + \"\",\n input: \"\" + \"__KEY__\" + \"\" + \"__DATA__\" + \"\" + \"\"\n }\n },\n /**\n * Namespace par defaut de la requete POST.\n *\n * @returns {String} namespace\n */\n namespaceByDefault: function namespaceByDefault() {\n var ns = [\"xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\", \"xmlns=\\\"http://www.opengis.net/wps/1.0.0\\\"\", \"xmlns:wfs=\\\"http://www.opengis.net/wfs\\\"\", \"xmlns:wps=\\\"http://www.opengis.net/wps/1.0.0\\\"\", \"xmlns:ows=\\\"http://www.opengis.net/ows/1.1\\\"\", \"xmlns:gml=\\\"http://www.opengis.net/gml\\\"\", \"xmlns:ogc=\\\"http://www.opengis.net/ogc\\\"\", \"xmlns:wcs=\\\"http://www.opengis.net/wcs/1.1.1\\\"\", \"xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\"];\n return ns.join(\" \");\n },\n /**\n * Schemalocation par defaut.\n *\n * @returns {String} schemaLocation\n */\n schemaLocationByDefault: function schemaLocationByDefault() {\n return \"xsi:schemaLocation=\\\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\\\"\";\n },\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out :\n * // service=__SERVICE__\n * // &version=__VERSION__\n * // &rawdataoutput=__RAWDATAOUTPUT__\n * // &identifier=__IDENTIFIER__\n * // &request=__REQUEST__\n * // &datainputs=\"__DATAINPUTS__\"\n * // avec __DATAINPUTS__ = __KEY__=__DATA__;...\n *\n * // POST out :\n * // \n * // \n * // __IDENTIFIER__\n * // \n * // \n * // \n * // \n * // \n * // __RAWDATAOUTPUT__\n * // \n * // \n * // \",\n * // avec __DATAINPUTS__\n * // \n * // __KEY__\n * // \n * // __DATA__\n * // \n * // \n *\n * @returns {Boolean} validation de la construction de la requete\n */\n processRequestString: function processRequestString() {\n this.logger.trace(\"WPS::processRequestString ()\");\n var template = \"\";\n if (this.method === \"POST\") {\n template = this.template.post.value;\n } else if (this.method === \"GET\") {\n template = this.template.get.value;\n } else {\n this.logger.error(\"No other method supported by the service !\");\n return false;\n }\n template = template.replace(/__SERVICE__/g, this.paramservice);\n template = template.replace(/__VERSION__/g, this.paramversion);\n template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput);\n template = template.replace(/__IDENTIFIER__/g, this.paramidentifier);\n template = template.replace(/__REQUEST__/g, this.paramrequest);\n\n // ajout +\n if (this.method === \"POST\") {\n template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);\n template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);\n }\n\n // ajout des datainputs\n template = template.replace(//g, this.__addDataInputs());\n if (!template) {\n this.logger.warn(\"traduction tmpl : empty request !?\");\n return false;\n }\n this.requestString = template;\n this.logger.trace(\"traduction tmpl\", template);\n return true;\n },\n /**\n * Ajout des données\n *\n * @returns {String} Données concaténées dans une chaine\n */\n __addDataInputs: function __addDataInputs() {\n this.logger.trace(\"WPS::__addDataInputs ()\");\n\n // c'est un peu grossier...\n var tmpl = this.method === \"GET\" ? this.template.get.input : this.template.post.input;\n var sep = this.method === \"GET\" ? \";\" : \"\";\n var result = \"\";\n var that = this;\n var map = this.DataObject.getData();\n for (var i = 0; i < map.length; i++) {\n // FIXME closure ?\n (function (j) {\n if (sep) {\n sep = j === map.length - 1 ? \"\" : \";\";\n }\n result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep);\n })(i);\n }\n return result;\n },\n /**\n * Ajout d'une donnée.\n *\n * @param {String} tmpl - template\n * @param {String} key - clef\n * @param {String} data - valeur\n * @returns {String} chaine avec les substitutions clef/valeur\n */\n __addDataInput: function __addDataInput(tmpl, key, data) {\n var tmp = tmpl;\n tmp = tmp.replace(/__KEY__/g, key);\n tmp = tmp.replace(/__DATA__/g, data);\n return tmp;\n },\n /**\n * Definir le mode de requête\n *\n * @param {String} method - GET|POST\n */\n setMethod: function setMethod(method) {\n if (method === \"GET\" || method === \"POST\") {\n this.method = method;\n } else {\n this.logger.warn(\"support only GET and POST method !\");\n }\n },\n /**\n * Retourne le mode de requete (GET|POST).\n *\n * @returns {AltiRequest.options.mode|String} methode (GET|POST)\n */\n getMethod: function getMethod() {\n return this.method;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (WPS);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Gb3JtYXRzL1dQUy5qcz8xODQ0Il0sIm5hbWVzIjpbIldQUyIsIm9wdGlvbnMiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsIlR5cGVFcnJvciIsIkRhdGFPYmplY3QiLCJkYXRhIiwicGFyYW1zZXJ2aWNlIiwicGFyYW0iLCJzZXJ2aWNlIiwicGFyYW12ZXJzaW9uIiwidmVyc2lvbiIsInBhcmFtaWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJwYXJhbXJhd2RhdGFvdXRwdXQiLCJyYXdkYXRhb3V0cHV0IiwicGFyYW1yZXF1ZXN0IiwicmVxdWVzdCIsIm1ldGhvZCIsInByb3RvdHlwZSIsInJlcXVlc3RTdHJpbmciLCJjb25zdHJ1Y3RvciIsInRlbXBsYXRlIiwiZ2V0IiwidmFsdWUiLCJpbnB1dCIsInBvc3QiLCJuYW1lc3BhY2VCeURlZmF1bHQiLCJucyIsImpvaW4iLCJzY2hlbWFMb2NhdGlvbkJ5RGVmYXVsdCIsInByb2Nlc3NSZXF1ZXN0U3RyaW5nIiwiZXJyb3IiLCJyZXBsYWNlIiwiX19hZGREYXRhSW5wdXRzIiwid2FybiIsInRtcGwiLCJzZXAiLCJyZXN1bHQiLCJ0aGF0IiwibWFwIiwiZ2V0RGF0YSIsImkiLCJsZW5ndGgiLCJqIiwiY29uY2F0IiwiX19hZGREYXRhSW5wdXQiLCJrIiwidiIsImtleSIsInRtcCIsInNldE1ldGhvZCIsImdldE1ldGhvZCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsR0FBR0EsQ0FBRUMsT0FBTyxFQUFFO0VBQ25CLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FB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QUssS0FBSyxJQUFJQSxNQUFNLEtBQUssTUFBTSxFQUFFO01BQ3ZDLElBQUksQ0FBQ0EsTUFBTSxHQUFHQSxNQUFNO0lBQ3hCLENBQUMsTUFBTTtNQUNILElBQUksQ0FBQ2xCLE1BQU0sQ0FBQ21DLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQztJQUMxRDtFQUNKLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0lpQixTQUFTLEVBQUcsU0FBQUEsVUFBQSxFQUFZO0lBQ3BCLE9BQU8sSUFBSSxDQUFDbEMsTUFBTTtFQUN0QjtBQUNKLENBQUM7QUFFY3BCLGtFQUFHIiwiZmlsZSI6Ii4vc3JjL0Zvcm1hdHMvV1BTLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogU3RhbmRhcmQgV1BTXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuRm9ybWF0cy5XUFNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9ICAgb3B0aW9ucy5kYXRhIC0gb2JqZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMubWV0aG9kIC0gUE9TVHxHRVRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMucGFyYW0uc2VydmljZSAtIFwiV1BTXCJcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMucGFyYW0udmVyc2lvbiAtIFwiMS4wLjBcIlxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5pZGVudGlmaWVyIC0gXCJnczpXUFNFbGV2YXRpb258Z3M6V1BTTGluZUVsZXZhdGlvblwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLnJhd2RhdGFvdXRwdXQgLSBcInJlc3VsdFwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLnJlcXVlc3QgLSBcIkV4ZWN1dGVcIlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vbnN1Y2Nlc3MgLSBmdW5jdGlvbiBjYWxsYmFjayBzdWNjZXNzIChUT0RPKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vbmVycm9yICAgLSBmdW5jdGlvbiBjYWxsYmFjayBlcnJvciAgIChUT0RPKVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gV1BTIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIFdQUygpXVwiKTtcblxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXUFMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJXUFMgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLyoqXG4gICAgICogT2JqZXQgREFUQVxuICAgICAqL1xuICAgIHRoaXMuRGF0YU9iamVjdCA9IHRoaXMub3B0aW9ucy5kYXRhO1xuXG4gICAgaWYgKCF0aGlzLkRhdGFPYmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoaXMgZGF0YSBvYmplY3QgaXMgbm90IGRlZmluZWQgIVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwYXJhbSBzZXJ2aWNlLlxuICAgICAqIFBhciBkZWZhdXQsIFwiV1BTXCIuXG4gICAgICovXG4gICAgdGhpcy5wYXJhbXNlcnZpY2UgPSB0aGlzLm9wdGlvbnMucGFyYW0uc2VydmljZSB8fCBcIldQU1wiO1xuXG4gICAgLyoqXG4gICAgICogcGFyYW0gdmVyc2lvbi5cbiAgICAgKiBQYXIgZGVmYXV0LCBcIjEuMC4wXCIuXG4gICAgICovXG4gICAgdGhpcy5wYXJhbXZlcnNpb24gPSB0aGlzLm9wdGlvbnMucGFyYW0udmVyc2lvbiB8fCBcIjEuMC4wXCI7XG5cbiAgICAvKipcbiAgICAgKiBwYXJhbSBpZGVudGlmaWVyXG4gICAgICogUGFyIGRlZmF1dCwgXCJnczpXUFNcIlxuICAgICAqL1xuICAgIHRoaXMucGFyYW1pZGVudGlmaWVyID0gdGhpcy5vcHRpb25zLnBhcmFtLmlkZW50aWZpZXIgfHwgXCJnczpXUFNcIjtcblxuICAgIC8qKlxuICAgICAqIHBhcmFtIHJhd2RhdGFvdXRwdXRcbiAgICAgKiBQYXIgZGVmYXV0LCBcInJlc3VsdFwiLlxuICAgICAqL1xuICAgIHRoaXMucGFyYW1yYXdkYXRhb3V0cHV0ID0gdGhpcy5vcHRpb25zLnBhcmFtLnJhd2RhdGFvdXRwdXQgfHwgXCJyZXN1bHRcIjtcblxuICAgIC8qKlxuICAgICAqIHBhcmFtIHJlcXVlc3RcbiAgICAgKiBQYXIgZGVmYXV0LCBcIkV4ZWN1dGVcIi5cbiAgICAgKi9cbiAgICB0aGlzLnBhcmFtcmVxdWVzdCA9IHRoaXMub3B0aW9ucy5wYXJhbS5yZXF1ZXN0IHx8IFwiRXhlY3V0ZVwiO1xuXG4gICAgLyoqXG4gICAgICogbWV0aG9kZS5cbiAgICAgKiBQYXIgZGVmYXV0LCBcIkdFVFwiLlxuICAgICAqL1xuICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiO1xufVxuXG5XUFMucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpXUFMjXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiByZXF1ZXN0XG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICByZXF1ZXN0U3RyaW5nIDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBXUFMsXG5cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZSA6IHtcbiAgICAgICAgZ2V0IDoge1xuICAgICAgICAgICAgdmFsdWUgOiBcInNlcnZpY2U9X19TRVJWSUNFX19cIiArXG4gICAgICAgICAgICAgICAgXCImdmVyc2lvbj1fX1ZFUlNJT05fX1wiICtcbiAgICAgICAgICAgICAgICBcIiZyYXdkYXRhb3V0cHV0PV9fUkFXREFUQU9VVFBVVF9fXCIgK1xuICAgICAgICAgICAgICAgIFwiJmlkZW50aWZpZXI9X19JREVOVElGSUVSX19cIiArXG4gICAgICAgICAgICAgICAgXCImcmVxdWVzdD1fX1JFUVVFU1RfX1wiICtcbiAgICAgICAgICAgICAgICBcIiZkYXRhaW5wdXRzPTwhLS0gX19EQVRBSU5QVVRTX18gLS0+XCIsXG5cbiAgICAgICAgICAgIGlucHV0IDogXCJfX0tFWV9fPV9fREFUQV9fXCJcblxuICAgICAgICB9LFxuICAgICAgICBwb3N0IDoge1xuXG4gICAgICAgICAgICB2YWx1ZSA6IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cIiArXG4gICAgICAgICAgICAgICAgXCI8d3BzOl9fUkVRVUVTVF9fIHZlcnNpb249XFxcIl9fVkVSU0lPTl9fXFxcIiBzZXJ2aWNlPVxcXCJfX1NFUlZJQ0VfX1xcXCIgXCIgK1xuICAgICAgICAgICAgICAgIFwiX19OQU1FU1BBQ0VfXyBfX1NDSEVNQUxPQ0FUSU9OX18+XCIgK1xuICAgICAgICAgICAgICAgIFwiPG93czpJZGVudGlmaWVyPl9fSURFTlRJRklFUl9fPC9vd3M6SWRlbnRpZmllcj5cIiArXG4gICAgICAgICAgICAgICAgXCI8d3BzOkRhdGFJbnB1dHM+XCIgK1xuICAgICAgICAgICAgICAgIFwiPCEtLSBfX0RBVEFJTlBVVFNfXyAtLT5cIiArXG4gICAgICAgICAgICAgICAgXCI8L3dwczpEYXRhSW5wdXRzPlwiICtcbiAgICAgICAgICAgICAgICBcIjx3cHM6UmVzcG9uc2VGb3JtPlwiICtcbiAgICAgICAgICAgICAgICBcIjx3cHM6UmF3RGF0YU91dHB1dD5cIiArXG4gICAgICAgICAgICAgICAgXCI8b3dzOklkZW50aWZpZXI+X19SQVdEQVRBT1VUUFVUX188L293czpJZGVudGlmaWVyPlwiICtcbiAgICAgICAgICAgICAgICBcIjwvd3BzOlJhd0RhdGFPdXRwdXQ+XCIgK1xuICAgICAgICAgICAgICAgIFwiPC93cHM6UmVzcG9uc2VGb3JtPlwiICtcbiAgICAgICAgICAgICAgICBcIjwvd3BzOl9fUkVRVUVTVF9fPlwiLFxuXG4gICAgICAgICAgICBpbnB1dCA6IFwiPHdwczpJbnB1dD5cIiArXG4gICAgICAgICAgICAgICAgXCI8b3dzOklkZW50aWZpZXI+X19LRVlfXzwvb3dzOklkZW50aWZpZXI+XCIgK1xuICAgICAgICAgICAgICAgIFwiPHdwczpEYXRhPlwiICtcbiAgICAgICAgICAgICAgICBcIjx3cHM6TGl0ZXJhbERhdGE+X19EQVRBX188L3dwczpMaXRlcmFsRGF0YT5cIiArXG4gICAgICAgICAgICAgICAgXCI8L3dwczpEYXRhPlwiICtcbiAgICAgICAgICAgICAgICBcIjwvd3BzOklucHV0PlwiXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTmFtZXNwYWNlIHBhciBkZWZhdXQgZGUgbGEgcmVxdWV0ZSBQT1NULlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gbmFtZXNwYWNlXG4gICAgICovXG4gICAgbmFtZXNwYWNlQnlEZWZhdWx0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnMgPSBbXG4gICAgICAgICAgICBcInhtbG5zOnhzaT1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMFxcXCJcIixcbiAgICAgICAgICAgIFwieG1sbnM6d2ZzPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dmc1xcXCJcIixcbiAgICAgICAgICAgIFwieG1sbnM6d3BzPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMFxcXCJcIixcbiAgICAgICAgICAgIFwieG1sbnM6b3dzPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L293cy8xLjFcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOmdtbD1cXFwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWxcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOm9nYz1cXFwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2NcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOndjcz1cXFwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93Y3MvMS4xLjFcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIlwiXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIG5zLmpvaW4oXCIgXCIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTY2hlbWFsb2NhdGlvbiBwYXIgZGVmYXV0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gc2NoZW1hTG9jYXRpb25cbiAgICAgKi9cbiAgICBzY2hlbWFMb2NhdGlvbkJ5RGVmYXVsdCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwieHNpOnNjaGVtYUxvY2F0aW9uPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMCBodHRwOi8vc2NoZW1hcy5vcGVuZ2lzLm5ldC93cHMvMS4wLjAvd3BzQWxsLnhzZFxcXCJcIjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0aW9uIGRlIGxhIHJlcXXDqnRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHRVQgIG91dCA6XG4gICAgICogLy8gIHNlcnZpY2U9X19TRVJWSUNFX19cbiAgICAgKiAvLyAgJnZlcnNpb249X19WRVJTSU9OX19cbiAgICAgKiAvLyAgJnJhd2RhdGFvdXRwdXQ9X19SQVdEQVRBT1VUUFVUX19cbiAgICAgKiAvLyAgJmlkZW50aWZpZXI9X19JREVOVElGSUVSX19cbiAgICAgKiAvLyAgJnJlcXVlc3Q9X19SRVFVRVNUX19cbiAgICAgKiAvLyAgJmRhdGFpbnB1dHM9XCJfX0RBVEFJTlBVVFNfX1wiXG4gICAgICogLy8gIGF2ZWMgX19EQVRBSU5QVVRTX18gPSBfX0tFWV9fPV9fREFUQV9fOy4uLlxuICAgICAqXG4gICAgICogLy8gUE9TVCBvdXQgOlxuICAgICAqIC8vICAgICAgPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cbiAgICAgKiAvLyAgICAgIDx3cHM6X19SRVFVRVNUX18gdmVyc2lvbj1cXFwiX19WRVJTSU9OX19cXFwiIHNlcnZpY2U9XFxcIl9fU0VSVklDRV9fXFxcIlxuICAgICAqIC8vICAgICAgICAgX19OQU1FU1BBQ0VfXyBfX1NDSEVNQUxPQ0FUSU9OX18+XG4gICAgICogLy8gICAgICAgICAgPG93czpJZGVudGlmaWVyPl9fSURFTlRJRklFUl9fPC9vd3M6SWRlbnRpZmllcj5cbiAgICAgKiAvLyAgICAgICAgICA8d3BzOkRhdGFJbnB1dHM+XG4gICAgICogLy8gICAgICAgICAgICAgIDwhLS0gX19EQVRBSU5QVVRTX18gLS0+XG4gICAgICogLy8gICAgICAgICAgPC93cHM6RGF0YUlucHV0cz5cbiAgICAgKiAvLyAgICAgICAgICA8d3BzOlJlc3BvbnNlRm9ybT5cbiAgICAgKiAvLyAgICAgICAgICAgICAgPHdwczpSYXdEYXRhT3V0cHV0PlxuICAgICAqIC8vICAgICAgICAgICAgICA8b3dzOklkZW50aWZpZXI+X19SQVdEQVRBT1VUUFVUX188L293czpJZGVudGlmaWVyPlxuICAgICAqIC8vICAgICAgICAgICAgICA8L3dwczpSYXdEYXRhT3V0cHV0PlxuICAgICAqIC8vICAgICAgICAgIDwvd3BzOlJlc3BvbnNlRm9ybT5cbiAgICAgKiAvLyAgICAgIDwvd3BzOl9fUkVRVUVTVF9fPlwiLFxuICAgICAqIC8vICAgICAgYXZlYyBfX0RBVEFJTlBVVFNfX1xuICAgICAqIC8vICAgICAgICAgICAgIDx3cHM6SW5wdXQ+XG4gICAgICogLy8gICAgICAgICAgICAgICAgICA8b3dzOklkZW50aWZpZXI+X19LRVlfXzwvb3dzOklkZW50aWZpZXI+XG4gICAgICogLy8gICAgICAgICAgICAgICAgICA8d3BzOkRhdGE+XG4gICAgICogLy8gICAgICAgICAgICAgICAgICAgIDx3cHM6TGl0ZXJhbERhdGE+X19EQVRBX188L3dwczpMaXRlcmFsRGF0YT5cbiAgICAgKiAvLyAgICAgICAgICAgICAgICAgIDwvd3BzOkRhdGE+XG4gICAgICogLy8gICAgICAgICAgICAgIDwvd3BzOklucHV0PlxuICAgICAqXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHZhbGlkYXRpb24gZGUgbGEgY29uc3RydWN0aW9uIGRlIGxhIHJlcXVldGVcbiAgICAgKi9cbiAgICBwcm9jZXNzUmVxdWVzdFN0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJXUFM6OnByb2Nlc3NSZXF1ZXN0U3RyaW5nICgpXCIpO1xuXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5wb3N0LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUuZ2V0LnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJObyBvdGhlciBtZXRob2Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2aWNlICFcIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fU0VSVklDRV9fL2csIHRoaXMucGFyYW1zZXJ2aWNlKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1ZFUlNJT05fXy9nLCB0aGlzLnBhcmFtdmVyc2lvbik7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvX19SQVdEQVRBT1VUUFVUX18vZywgdGhpcy5wYXJhbXJhd2RhdGFvdXRwdXQpO1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fSURFTlRJRklFUl9fL2csIHRoaXMucGFyYW1pZGVudGlmaWVyKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1JFUVVFU1RfXy9nLCB0aGlzLnBhcmFtcmVxdWVzdCk7XG5cbiAgICAgICAgLy8gYWpvdXQgK1xuICAgICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fTkFNRVNQQUNFX18vZywgdGhpcy5uYW1lc3BhY2VCeURlZmF1bHQpO1xuICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1NDSEVNQUxPQ0FUSU9OX18vZywgdGhpcy5zY2hlbWFMb2NhdGlvbkJ5RGVmYXVsdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBham91dCBkZXMgZGF0YWlucHV0c1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoLzwhLS0gX19EQVRBSU5QVVRTX18gLS0+L2csIHRoaXMuX19hZGREYXRhSW5wdXRzKCkpO1xuXG4gICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJ0cmFkdWN0aW9uIHRtcGwgOiBlbXB0eSByZXF1ZXN0ICE/XCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0U3RyaW5nID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwidHJhZHVjdGlvbiB0bXBsXCIsIHRlbXBsYXRlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWpvdXQgZGVzIGRvbm7DqWVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBEb25uw6llcyBjb25jYXTDqW7DqWVzIGRhbnMgdW5lIGNoYWluZVxuICAgICAqL1xuICAgIF9fYWRkRGF0YUlucHV0cyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJXUFM6Ol9fYWRkRGF0YUlucHV0cyAoKVwiKTtcblxuICAgICAgICAvLyBjJ2VzdCB1biBwZXUgZ3Jvc3NpZXIuLi5cbiAgICAgICAgdmFyIHRtcGwgPSB0aGlzLm1ldGhvZCA9PT0gXCJHRVRcIiA/IHRoaXMudGVtcGxhdGUuZ2V0LmlucHV0IDogdGhpcy50ZW1wbGF0ZS5wb3N0LmlucHV0O1xuICAgICAgICB2YXIgc2VwID0gdGhpcy5tZXRob2QgPT09IFwiR0VUXCIgPyBcIjtcIiA6IFwiXCI7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuRGF0YU9iamVjdC5nZXREYXRhKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGSVhNRSBjbG9zdXJlID9cbiAgICAgICAgICAgIChmdW5jdGlvbiAoaikge1xuICAgICAgICAgICAgICAgIGlmIChzZXApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VwID0gKGogPT09IG1hcC5sZW5ndGggLSAxKSA/IFwiXCIgOiBcIjtcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGF0Ll9fYWRkRGF0YUlucHV0KHRtcGwsIG1hcFtqXS5rLCBtYXBbal0udiksIHNlcCk7XG4gICAgICAgICAgICB9KShpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFqb3V0IGQndW5lIGRvbm7DqWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdG1wbCAtIHRlbXBsYXRlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIGNsZWZcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSAtIHZhbGV1clxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGNoYWluZSBhdmVjIGxlcyBzdWJzdGl0dXRpb25zIGNsZWYvdmFsZXVyXG4gICAgICovXG4gICAgX19hZGREYXRhSW5wdXQgOiBmdW5jdGlvbiAodG1wbCwga2V5LCBkYXRhKSB7XG4gICAgICAgIHZhciB0bXAgPSB0bXBsO1xuICAgICAgICB0bXAgPSB0bXAucmVwbGFjZSgvX19LRVlfXy9nLCBrZXkpO1xuICAgICAgICB0bXAgPSB0bXAucmVwbGFjZSgvX19EQVRBX18vZywgZGF0YSk7XG4gICAgICAgIHJldHVybiB0bXA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlZmluaXIgbGUgbW9kZSBkZSByZXF1w6p0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCAtIEdFVHxQT1NUXG4gICAgICovXG4gICAgc2V0TWV0aG9kIDogZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiIHx8IG1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcInN1cHBvcnQgb25seSBHRVQgYW5kIFBPU1QgbWV0aG9kICFcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbGUgbW9kZSBkZSByZXF1ZXRlIChHRVR8UE9TVCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QWx0aVJlcXVlc3Qub3B0aW9ucy5tb2RlfFN0cmluZ30gbWV0aG9kZSAoR0VUfFBPU1QpXG4gICAgICovXG4gICAgZ2V0TWV0aG9kIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2Q7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgV1BTO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Formats/WPS.js\n"); - -/***/ }), - -/***/ "./src/Formats/XML.js": -/*!****************************!*\ - !*** ./src/Formats/XML.js ***! - \****************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* global require */\n\n\n// import __xmldom from \"xmldom\";\n\n/**\n * @classdesc\n *\n * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM,\n * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques.\n *\n * @constructor\n * @alias Gp.Formats.XML\n *\n * @param {Object} [options] - options du format XML\n *\n * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.)\n * utile pour interpréter le XML lorsque sa structure est connue.\n * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture.\n *\n * @param {Object} [options.writers] - writers\n *\n * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter.\n *\n * @private\n */\nfunction XML(options) {\n if (!(this instanceof XML)) {\n throw new TypeError(\"XML constructor cannot be called as a function.\");\n }\n\n // FIXME : notion de singleton\n\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur XML ()]\");\n\n /**\n * Chaîne de caractères contenant le texte XML\n * @type {String}\n */\n this.xmlString = null;\n\n /**\n * DOM Element correspondant à la structure du XML.\n * @type {DOMElement}\n */\n this.xmlDoc = null;\n\n /**\n * Objet contenant des fonctions de lecture des différentes balises XML.\n * @type {Object}\n */\n this.reader = null;\n\n // traitement des paramètres d'options s'il y en a\n if (options) {\n if (options.xmlString && typeof options.xmlString === \"string\") {\n this.xmlString = options.xmlString;\n // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document\n this.xmlDoc = __getXMLDOC(options.xmlString);\n }\n if (options.reader) {\n this.setReader(options.reader);\n }\n }\n}\nXML.prototype = {\n /**\n * @lends module:XML\n */\n\n /*\n * Constructeur (alias)\n */\n constructor: XML,\n /**\n * Méthode permettant de récupérer la chaîne de caractères associée au format XML\n *\n * @returns {String} xmlString - la chaîne de caractères correspondant au format XML\n */\n getXMLString: function getXMLString() {\n return this.xmlString;\n },\n /**\n * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString).\n * La méthode va aussi transformer cette chaîne de caractères en document XML,\n * afin de remplir l'attribut xmlDoc.\n *\n * @param {String} xmlString - la chaîne de caractères correspondant au format XML\n */\n setXMLString: function setXMLString(xmlString) {\n if (xmlString && typeof xmlString === \"string\") {\n this.xmlString = xmlString;\n this.xmlDoc = __getXMLDOC(xmlString);\n }\n },\n /**\n * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis\n *\n * @return {Object} readers - les readers associés au format XML, s'ils existent,\n * sous forme d'une collection de fonctions\n */\n getReader: function getReader() {\n return this.reader;\n },\n /**\n * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data),\n * lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)).\n *\n * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.)\n * utile pour interpréter le XML lorsque sa structure est connue.\n * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture.\n */\n setReader: function setReader(reader) {\n if (reader && reader.read && typeof reader.read === \"function\") {\n this.reader = reader;\n }\n },\n /**\n * Méthode permettant de récupérer le document XML associé au format, s'il existe.\n *\n * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe\n */\n getXMLDoc: function getXMLDoc() {\n return this.xmlDoc;\n },\n /**\n * Setter\n */\n setXMLDoc: function setXMLDoc(doc) {\n this.xmlDoc = doc;\n },\n /**\n * Méthode initialisant la lecture du XML, à partir d'un XML Document :\n * création d'un objet JavaScript contenant les informations du XML,\n * sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide).\n *\n * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML :\n * - soit toutes les informations si aucun reader n'a été spécifié à la création du format\n * - soit les informations spécifiées dans le reader.\n */\n parse: function parse() {\n // build xml document from xmlString\n if (!this.xmlDoc && this.xmlString) {\n this.xmlDoc = __getXMLDOC(this.xmlString);\n }\n if (this.xmlDoc) {\n var root = __getRootNode(this.xmlDoc);\n if (root) {\n var parserOutput;\n // call reader if exists\n if (this.reader && this.reader.read) {\n parserOutput = this.reader.read(root);\n } else {\n parserOutput = {};\n parserOutput[root.nodeName] = __readDefault(root);\n }\n return parserOutput;\n } else {\n return {};\n }\n }\n }\n};\n\n/**\n * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML,\n * en utilisant DOMParser () lorsque c'est possible.\n * For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface\n *\n * @private\n * @memberof XML\n * @method __getXMLDOC\n * @param {String} xmlString - xml string to be converted into DOM element\n * @return {DOMElement} - the corresponding XML Document\n */\nfunction __getXMLDOC(xmlString) {\n if (typeof window === \"undefined\") {\n // env. nodejs\n var DOMParser = __webpack_require__(/*! xmldom */ \"xmldom\").DOMParser; // __xmldom.DOMParser;\n return new DOMParser().parseFromString(xmlString, \"text/xml\");\n } else {\n // env. browser\n\n var parser;\n var xmlDoc;\n var errorMsg = \"Erreur lors du parsing de la réponse du service : XML non conforme\";\n if (window.ActiveXObject) {\n // Internet Explorer < 9\n xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = false;\n xmlDoc.loadXML(xmlString);\n var parseError = xmlDoc.parseError;\n if (parseError.errorCode) {\n if (parseError.line && parseError.linepos) {\n errorMsg += \"( ligne \" + parseError.line + \", colonne \" + parseError.linepos;\n }\n if (parseError.reason) {\n errorMsg += \": \" + parseError.reason + \")\";\n }\n throw new Error(errorMsg);\n }\n return xmlDoc;\n } else if (window.DOMParser) {\n // les autres (Chrome, Mozilla, IE >= 9)\n parser = new window.DOMParser();\n try {\n xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n } catch (e) {\n // Internet Explorer browser raises exception if xmlString is not valid XML\n if (e.message === \"SyntaxError\") {\n throw new Error(errorMsg);\n } else {\n throw new Error(\"Erreur lors du parsing de la réponse du service : \" + e.message);\n }\n }\n // look for parsing error in case no exception was raised\n if (xmlDoc.getElementsByTagName(\"parsererror\").length > 0) {\n var parsererror = xmlDoc.getElementsByTagName(\"parsererror\");\n for (var i = 0; i < parsererror.length; i++) {\n var content = parsererror[i].innerHTML;\n // except in case parsererror is just because of huge xml, but parsing is done.\n if (content.indexOf(\"Huge input lookup\") === -1) {\n errorMsg += \"(\" + content + \")\";\n throw new Error(errorMsg);\n }\n }\n } else if (!xmlDoc.documentElement) {\n // may happen in chrome browser\n throw new Error(errorMsg);\n }\n return xmlDoc;\n } else {\n // FIXME\n throw new Error(\"Incompatible DOM Parser pour ce navigateur !\");\n }\n }\n}\n\n/**\n * Méthode de la classe (privée) permettant de récupérer le noeud racine du document,\n * à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode)\n *\n * @private\n * @memberof XML\n * @method __getRootNode\n * @param {DOMElement} [xmlDoc] - a Document Node\n * @return {DOMElement} root - the document root node\n */\nfunction __getRootNode(xmlDoc) {\n var root;\n if (xmlDoc.nodeType === 9) {\n // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree)\n root = xmlDoc.documentElement;\n } else if (xmlDoc.nodeType === 1) {\n root = xmlDoc;\n }\n return root;\n}\n\n/**\n * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML,\n * lorsqu'aucun reader spécifique n'a été spécifié (parser brut)\n *\n * @private\n * @memberof XML\n * @method readDefault\n * @param {DOMElement} node - a DOM element node\n * @example final data object looks like :\n * data = {\n * attributeName: attributeValue,\n * childName: {\n * attributeName: attributeValue,\n * attributeName: attributeValue,\n * childName: {\n * \"textContent\": textContent\n * },\n * childName: {\n * childName: {\n * attributeName:attributeValue\n * }\n * }\n * }\n * }\n */\nfunction __readDefault(node) {\n var data = {};\n\n // if element node has attributes, set their values to data\n if (node.attributes.length > 0) {\n var dataAttributes = __getAttributes(node);\n data[\"attributes\"] = dataAttributes;\n }\n\n // if element node has childNodes, read them and set them to data\n if (node.hasChildNodes()) {\n var childData = {};\n var child;\n var children = node.childNodes;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.nodeType === 3) {\n // TEXT_NODE\n data[\"textContent\"] = child.nodeValue;\n } else if (child.nodeType === 1) {\n childData = __readDefault(child);\n if (!data[child.nodeName]) {\n // store childData in an object\n data[child.nodeName] = childData;\n } else {\n // in case several childNodes has the same name : store them in an array.\n // if data[nodeName] already exists but is not an array\n if (!Array.isArray(data[child.nodeName])) {\n var old = data[child.nodeName];\n data[child.nodeName] = [];\n data[child.nodeName].push(old);\n }\n data[child.nodeName].push(childData);\n }\n }\n // TODO : manage other node types (4=CDATA, etc)\n }\n }\n\n return data;\n}\n\n/**\n * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément\n *\n * @private\n * @memberof XML\n * @method __getAttributes\n * @param {DOMElement} node - noeud contenant l'attribut recherché\n * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs\n */\nfunction __getAttributes(node) {\n if (node.attributes.length > 0) {\n var nodeAttributes = {};\n var attributes = node.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n nodeAttributes[attribute.nodeName] = attribute.nodeValue;\n }\n return nodeAttributes;\n }\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (XML);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Gb3JtYXRzL1hNTC5qcz9mNTc3Il0sIm5hbWVzIjpbIlhNTCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsInhtbFN0cmluZyIsInhtbERvYyIsInJlYWRlciIsIl9fZ2V0WE1MRE9DIiwic2V0UmVhZGVyIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRYTUxTdHJpbmciLCJzZXRYTUxTdHJpbmciLCJnZXRSZWFkZXIiLCJyZWFkIiwiZ2V0WE1MRG9jIiwic2V0WE1MRG9jIiwiZG9jIiwicGFyc2UiLCJyb290IiwiX19nZXRSb290Tm9kZSIsInBhcnNlck91dHB1dCIsIm5vZGVOYW1lIiwiX19yZWFkRGVmYXVsdCIsIndpbmRvdyIsIkRPTVBhcnNlciIsInJlcXVpcmUiLCJwYXJzZUZyb21TdHJpbmciLCJwYXJzZXIiLCJlcnJvck1zZyIsIkFjdGl2ZVhPYmplY3QiLCJhc3luYyIsImxvYWRYTUwiLCJwYXJzZUVycm9yIiwiZXJyb3JDb2RlIiwibGluZSIsImxpbmVwb3MiLCJyZWFzb24iLCJFcnJvciIsImUiLCJtZXNzYWdlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJwYXJzZXJlcnJvciIsImkiLCJjb250ZW50IiwiaW5uZXJIVE1MIiwiaW5kZXhPZiIsImRvY3VtZW50RWxlbWVudCIsIm5vZGVUeXBlIiwibm9kZSIsImRhdGEiLCJhdHRyaWJ1dGVzIiwiZGF0YUF0dHJpYnV0ZXMiLCJfX2dldEF0dHJpYnV0ZXMiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGREYXRhIiwiY2hpbGQiLCJjaGlsZHJlbiIsImNoaWxkTm9kZXMiLCJub2RlVmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJvbGQiLCJwdXNoIiwibm9kZUF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTs7QUFFOEM7QUFDOUM7O0FB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cmMvRm9ybWF0cy9YTUwuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgcmVxdWlyZSAqL1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbi8vIGltcG9ydCBfX3htbGRvbSBmcm9tIFwieG1sZG9tXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICpcbiAqIENsYXNzZSBwZXJtZXR0YW50IGQnw6ljcmlyZSBvdSBkZSBsaXJlIGR1IFhNTCwgc291cyBmb3JtZSBkZSBkb2N1bWVudCBET00sXG4gKiDDqXZlbnR1ZWxsZW1lbnQgc2Vsb24gZGVzIGNsw6lzIGRlIGxlY3R1cmUgKHJlYWRlcnMpIG91IGQnw6ljcml0dXJlICh3cml0ZXJzKSBzcMOpY2lmaXF1ZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuRm9ybWF0cy5YTUxcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyBkdSBmb3JtYXQgWE1MXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJlYWRlcl0gLSBJbnN0YW5jZSBkJ3VuIFJlYWRlciBkZSBzZXJ2aWNlIChBbHRpUmVzcG9uc2VSZWFkZXIsIEdlb2NvZGVSZXF1ZXN0UmVhZGVyLCBldGMuKVxuICogICAgICB1dGlsZSBwb3VyIGludGVycHLDqXRlciBsZSBYTUwgbG9yc3F1ZSBzYSBzdHJ1Y3R1cmUgZXN0IGNvbm51ZS5cbiAqICAgICAgQ2UgcmVhZGVyIGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIHVuZSBmb25jdGlvbiBzdGF0aXF1ZSByZWFkIChyb290KSBwZXJtZXR0YW50IGQnaW5pdGlhbGlzZXIgbGEgbGVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud3JpdGVyc10gLSB3cml0ZXJzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnhtbFN0cmluZ10gLSBjaGHDrm5lIGRlIGNhcmFjdMOocmUgY29udGVuYW50IGR1IFhNTCDDoCBpbnRlcnByw6l0ZXIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gWE1MIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlhNTCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FIDogbm90aW9uIGRlIHNpbmdsZXRvblxuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIFhNTCAoKV1cIik7XG5cbiAgICAvKipcbiAgICAgKiBDaGHDrm5lIGRlIGNhcmFjdMOocmVzIGNvbnRlbmFudCBsZSB0ZXh0ZSBYTUxcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMueG1sU3RyaW5nID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIERPTSBFbGVtZW50IGNvcnJlc3BvbmRhbnQgw6AgbGEgc3RydWN0dXJlIGR1IFhNTC5cbiAgICAgKiBAdHlwZSB7RE9NRWxlbWVudH1cbiAgICAgKi9cbiAgICB0aGlzLnhtbERvYyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBPYmpldCBjb250ZW5hbnQgZGVzIGZvbmN0aW9ucyBkZSBsZWN0dXJlIGRlcyBkaWZmw6lyZW50ZXMgYmFsaXNlcyBYTUwuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnJlYWRlciA9IG51bGw7XG5cbiAgICAvLyB0cmFpdGVtZW50IGRlcyBwYXJhbcOodHJlcyBkJ29wdGlvbnMgcydpbCB5IGVuIGFcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy54bWxTdHJpbmcgJiYgdHlwZW9mIG9wdGlvbnMueG1sU3RyaW5nID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnhtbFN0cmluZyA9IG9wdGlvbnMueG1sU3RyaW5nO1xuICAgICAgICAgICAgLy8gU2kgdW5lIGNoYWluZSBkZSBjYXJhY3TDqHJlIGEgw6l0w6kgcGFzc8OpZSBlbiBlbnRyw6llIDogb24gbGEgdHJhbnNmb3JtZSBhdXNzaSBlbiBYTUwgZG9jdW1lbnRcbiAgICAgICAgICAgIHRoaXMueG1sRG9jID0gX19nZXRYTUxET0Mob3B0aW9ucy54bWxTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJlYWRlcikge1xuICAgICAgICAgICAgdGhpcy5zZXRSZWFkZXIob3B0aW9ucy5yZWFkZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5YTUwucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpYTUxcbiAgICAgKi9cblxuICAgIC8qXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IFhNTCxcblxuICAgIC8qKlxuICAgICAqIE3DqXRob2RlIHBlcm1ldHRhbnQgZGUgcsOpY3Vww6lyZXIgbGEgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBhc3NvY2nDqWUgYXUgZm9ybWF0IFhNTFxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30geG1sU3RyaW5nIC0gbGEgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBjb3JyZXNwb25kYW50IGF1IGZvcm1hdCBYTUxcbiAgICAgKi9cbiAgICBnZXRYTUxTdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmluZztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTcOpdGhvZGUgcGVybWV0dGFudCBkJ2F0dHJpYnVlciB1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBhdSBmb3JtYXQgWE1MIChhdHRyaWJ1dCB4bWxTdHJpbmcpLlxuICAgICAqIExhIG3DqXRob2RlIHZhIGF1c3NpIHRyYW5zZm9ybWVyIGNldHRlIGNoYcOubmUgZGUgY2FyYWN0w6hyZXMgZW4gZG9jdW1lbnQgWE1MLFxuICAgICAqIGFmaW4gZGUgcmVtcGxpciBsJ2F0dHJpYnV0IHhtbERvYy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB4bWxTdHJpbmcgLSBsYSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIGNvcnJlc3BvbmRhbnQgYXUgZm9ybWF0IFhNTFxuICAgICAqL1xuICAgIHNldFhNTFN0cmluZyA6IGZ1bmN0aW9uICh4bWxTdHJpbmcpIHtcbiAgICAgICAgaWYgKHhtbFN0cmluZyAmJiB0eXBlb2YgeG1sU3RyaW5nID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnhtbFN0cmluZyA9IHhtbFN0cmluZztcbiAgICAgICAgICAgIHRoaXMueG1sRG9jID0gX19nZXRYTUxET0MoeG1sU3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNw6l0aG9kZSBwZXJtZXR0YW50IGRlIHLDqWN1cMOpcmVyIGxlcyByZWFkZXJzIGFzc29jacOpcyBhdSBmb3JtYXQgWE1MLCBzJ2lscyBvbnQgw6l0w6kgZMOpZmluaXNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gcmVhZGVycyAtIGxlcyByZWFkZXJzIGFzc29jacOpcyBhdSBmb3JtYXQgWE1MLCBzJ2lscyBleGlzdGVudCxcbiAgICAgKiAgICAgIHNvdXMgZm9ybWUgZCd1bmUgY29sbGVjdGlvbiBkZSBmb25jdGlvbnNcbiAgICAgKi9cbiAgICBnZXRSZWFkZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTcOpdGhvZGUgcGVybWV0dGFudCBkJ2F0dHJpYnVlciBkZXMgcmVhZGVycywgc291cyBsYSBmb3JtZSBkJ3VuIG9iamV0IGRlIGZvbmN0aW9ucyAobm9kZSwgZGF0YSksXG4gICAgICogICAgICBsb3JzcXUnaWxzIG4nb250IHBhcyDDqXTDqSBkw6lmaW5pcyBsb3JzIGRlIGwnaW5zdGFuY2lhdGlvbiBwYXIgZXhlbXBsZSAobmV3IFhNTCAob3B0aW9ucykpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlYWRlciAtIEluc3RhbmNlIGQndW4gUmVhZGVyIGRlIHNlcnZpY2UgKEFsdGlSZXNwb25zZVJlYWRlciwgR2VvY29kZVJlcXVlc3RSZWFkZXIsIGV0Yy4pXG4gICAgICogICAgICB1dGlsZSBwb3VyIGludGVycHLDqXRlciBsZSBYTUwgbG9yc3F1ZSBzYSBzdHJ1Y3R1cmUgZXN0IGNvbm51ZS5cbiAgICAgKiAgICAgIENlIHJlYWRlciBkb2l0IGNvbXBvcnRlciBhdSBtb2lucyB1bmUgZm9uY3Rpb24gc3RhdGlxdWUgcmVhZCAocm9vdCkgcGVybWV0dGFudCBkJ2luaXRpYWxpc2VyIGxhIGxlY3R1cmUuXG4gICAgICovXG4gICAgc2V0UmVhZGVyIDogZnVuY3Rpb24gKHJlYWRlcikge1xuICAgICAgICBpZiAocmVhZGVyICYmIHJlYWRlci5yZWFkICYmIHR5cGVvZiByZWFkZXIucmVhZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNw6l0aG9kZSBwZXJtZXR0YW50IGRlIHLDqWN1cMOpcmVyIGxlIGRvY3VtZW50IFhNTCBhc3NvY2nDqSBhdSBmb3JtYXQsIHMnaWwgZXhpc3RlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RE9NRWxlbWVudH0geG1sRG9jIC0gbGUgZG9jdW1lbnQgWE1MIChET00gZG9jdW1lbnQgbm9kZSkgcydpbCBleGlzdGVcbiAgICAgKi9cbiAgICBnZXRYTUxEb2MgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhtbERvYztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0dGVyXG4gICAgICovXG4gICAgc2V0WE1MRG9jIDogZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB0aGlzLnhtbERvYyA9IGRvYztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE3DqXRob2RlIGluaXRpYWxpc2FudCBsYSBsZWN0dXJlIGR1IFhNTCwgw6AgcGFydGlyIGQndW4gWE1MIERvY3VtZW50IDpcbiAgICAgKiAgICAgIGNyw6lhdGlvbiBkJ3VuIG9iamV0IEphdmFTY3JpcHQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZHUgWE1MLFxuICAgICAqICAgICAgc2F1ZiBkYW5zIGxlIGNhcyBvw7kgaWwgbidleGlzdGUgcGFzIGRlIFhNTCBEb2N1bWVudCDDoCBpbnRlcnByw6l0ZXIgKHJldG91cm5lIHVuIG9iamV0IHZpZGUpLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBbcGFyc2VyT3V0cHV0XSAtIHVuIG9iamV0IEphdmFTY3JpcHQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZHUgWE1MIDpcbiAgICAgKiAtIHNvaXQgdG91dGVzIGxlcyBpbmZvcm1hdGlvbnMgc2kgYXVjdW4gcmVhZGVyIG4nYSDDqXTDqSBzcMOpY2lmacOpIMOgIGxhIGNyw6lhdGlvbiBkdSBmb3JtYXRcbiAgICAgKiAtIHNvaXQgbGVzIGluZm9ybWF0aW9ucyBzcMOpY2lmacOpZXMgZGFucyBsZSByZWFkZXIuXG4gICAgICovXG4gICAgcGFyc2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGJ1aWxkIHhtbCBkb2N1bWVudCBmcm9tIHhtbFN0cmluZ1xuICAgICAgICBpZiAoIXRoaXMueG1sRG9jICYmIHRoaXMueG1sU3RyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnhtbERvYyA9IF9fZ2V0WE1MRE9DKHRoaXMueG1sU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy54bWxEb2MpIHtcbiAgICAgICAgICAgIHZhciByb290ID0gX19nZXRSb290Tm9kZSh0aGlzLnhtbERvYyk7XG4gICAgICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCByZWFkZXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZGVyICYmIHRoaXMucmVhZGVyLnJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyT3V0cHV0ID0gdGhpcy5yZWFkZXIucmVhZChyb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZXJPdXRwdXQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyT3V0cHV0W3Jvb3Qubm9kZU5hbWVdID0gX19yZWFkRGVmYXVsdChyb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlck91dHB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59O1xuXG4vKipcbiAqIE3DqXRob2RlIGRlIGxhIGNsYXNzZSAocHJpdsOpZSkgcGVybWV0dGFudCBkZSBjcsOpZXIgdW4gWE1MIERvY3VtZW50IMOgIHBhcnRpciBkJ3VuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIFhNTCxcbiAqICAgICAgZW4gdXRpbGlzYW50IERPTVBhcnNlciAoKSBsb3JzcXVlIGMnZXN0IHBvc3NpYmxlLlxuICogICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOiBodHRwczovL2R2Y3MudzMub3JnL2hnL2lubmVyaHRtbC9yYXctZmlsZS90aXAvaW5kZXguaHRtbCN0aGUtZG9tcGFyc2VyLWludGVyZmFjZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgWE1MXG4gKiBAbWV0aG9kIF9fZ2V0WE1MRE9DXG4gKiBAcGFyYW0ge1N0cmluZ30geG1sU3RyaW5nIC0geG1sIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaW50byBET00gZWxlbWVudFxuICogQHJldHVybiB7RE9NRWxlbWVudH0gLSB0aGUgY29ycmVzcG9uZGluZyBYTUwgRG9jdW1lbnRcbiAqL1xuZnVuY3Rpb24gX19nZXRYTUxET0MgKHhtbFN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIGVudi4gbm9kZWpzXG4gICAgICAgIHZhciBET01QYXJzZXIgPSByZXF1aXJlKFwieG1sZG9tXCIpLkRPTVBhcnNlcjsgLy8gX194bWxkb20uRE9NUGFyc2VyO1xuICAgICAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW52LiBicm93c2VyXG5cbiAgICAgICAgdmFyIHBhcnNlcjtcbiAgICAgICAgdmFyIHhtbERvYztcbiAgICAgICAgdmFyIGVycm9yTXNnID0gXCJFcnJldXIgbG9ycyBkdSBwYXJzaW5nIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBYTUwgbm9uIGNvbmZvcm1lXCI7XG5cbiAgICAgICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA8IDlcbiAgICAgICAgICAgIHhtbERvYyA9IG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxET01cIik7XG4gICAgICAgICAgICB4bWxEb2MuYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIHhtbERvYy5sb2FkWE1MKHhtbFN0cmluZyk7XG4gICAgICAgICAgICB2YXIgcGFyc2VFcnJvciA9IHhtbERvYy5wYXJzZUVycm9yO1xuICAgICAgICAgICAgaWYgKHBhcnNlRXJyb3IuZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRXJyb3IubGluZSAmJiBwYXJzZUVycm9yLmxpbmVwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2cgKz0gXCIoIGxpZ25lIFwiICsgcGFyc2VFcnJvci5saW5lICsgXCIsIGNvbG9ubmUgXCIgKyBwYXJzZUVycm9yLmxpbmVwb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUVycm9yLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1zZyArPSBcIjogIFwiICsgcGFyc2VFcnJvci5yZWFzb24gKyBcIilcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB4bWxEb2M7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LkRPTVBhcnNlcikge1xuICAgICAgICAgICAgLy8gbGVzIGF1dHJlcyAoQ2hyb21lLCBNb3ppbGxhLCBJRSA+PSA5KVxuICAgICAgICAgICAgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgYnJvd3NlciByYWlzZXMgZXhjZXB0aW9uIGlmIHhtbFN0cmluZyBpcyBub3QgdmFsaWQgWE1MXG4gICAgICAgICAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gXCJTeW50YXhFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyZXVyIGxvcnMgZHUgcGFyc2luZyBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHBhcnNpbmcgZXJyb3IgaW4gY2FzZSBubyBleGNlcHRpb24gd2FzIHJhaXNlZFxuICAgICAgICAgICAgaWYgKHhtbERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyc2VyZXJyb3IgPSB4bWxEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJwYXJzZXJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnNlcmVycm9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gcGFyc2VyZXJyb3JbaV0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgaW4gY2FzZSBwYXJzZXJlcnJvciBpcyBqdXN0IGJlY2F1c2Ugb2YgaHVnZSB4bWwsIGJ1dCBwYXJzaW5nIGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoXCJIdWdlIGlucHV0IGxvb2t1cFwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnICs9IFwiKFwiICsgY29udGVudCArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXhtbERvYy5kb2N1bWVudEVsZW1lbnQpIHsgLy8gbWF5IGhhcHBlbiBpbiBjaHJvbWUgYnJvd3NlclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geG1sRG9jO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRklYTUVcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29tcGF0aWJsZSBET00gUGFyc2VyIHBvdXIgY2UgbmF2aWdhdGV1ciAhXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIE3DqXRob2RlIGRlIGxhIGNsYXNzZSAocHJpdsOpZSkgcGVybWV0dGFudCBkZSByw6ljdXDDqXJlciBsZSBub2V1ZCByYWNpbmUgZHUgZG9jdW1lbnQsXG4gKiAgICAgIMOgIHBhcnRpciBkJ3VuIGRvY3VtZW50IG5vZGUgKG5vZGVUeXBlPTkpLCBwdWlzIGxlY3R1cmUgZGUgY2Ugbm9ldWQgKHJlYWROb2RlKVxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgWE1MXG4gKiBAbWV0aG9kIF9fZ2V0Um9vdE5vZGVcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gW3htbERvY10gLSBhIERvY3VtZW50IE5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR9IHJvb3QgLSB0aGUgZG9jdW1lbnQgcm9vdCBub2RlXG4gKi9cbmZ1bmN0aW9uIF9fZ2V0Um9vdE5vZGUgKHhtbERvYykge1xuICAgIHZhciByb290O1xuICAgIGlmICh4bWxEb2Mubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgLy8gSU5GTyA6IG5vZGVUeXBlIDkgcmVwcmVzZW50cyB0aGUgZW50aXJlIGRvY3VtZW50ICh0aGUgcm9vdC1ub2RlIG9mIHRoZSBET00gdHJlZSlcbiAgICAgICAgcm9vdCA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIGlmICh4bWxEb2Mubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgcm9vdCA9IHhtbERvYztcbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKlxuICogTcOpdGhvZGUgZGUgbGEgY2xhc3NlIChwcml2w6llKSBwZXJtZXR0YW50IGRlIGxpcmUgYXV0b21hdGlxdWVtZW50IHVuIG5vZXVkIFhNTCxcbiAqICAgICAgbG9yc3F1J2F1Y3VuIHJlYWRlciBzcMOpY2lmaXF1ZSBuJ2Egw6l0w6kgc3DDqWNpZmnDqSAocGFyc2VyIGJydXQpXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBYTUxcbiAqIEBtZXRob2QgcmVhZERlZmF1bHRcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZSAtIGEgRE9NIGVsZW1lbnQgbm9kZVxuICogQGV4YW1wbGUgZmluYWwgZGF0YSBvYmplY3QgbG9va3MgbGlrZSA6XG4gKiAgICAgICAgICBkYXRhID0ge1xuICogICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IGF0dHJpYnV0ZVZhbHVlLFxuICogICAgICAgICAgICAgIGNoaWxkTmFtZToge1xuICogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGVWYWx1ZSxcbiAqICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlVmFsdWUsXG4gKiAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZToge1xuICogICAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0Q29udGVudFwiOiB0ZXh0Q29udGVudFxuICogICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICBjaGlsZE5hbWU6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZToge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6YXR0cmlidXRlVmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgIH1cbiAqL1xuZnVuY3Rpb24gX19yZWFkRGVmYXVsdCAobm9kZSkge1xuICAgIHZhciBkYXRhID0ge307XG5cbiAgICAvLyBpZiBlbGVtZW50IG5vZGUgaGFzIGF0dHJpYnV0ZXMsIHNldCB0aGVpciB2YWx1ZXMgdG8gZGF0YVxuICAgIGlmIChub2RlLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgZGF0YUF0dHJpYnV0ZXMgPSBfX2dldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIGRhdGFbXCJhdHRyaWJ1dGVzXCJdID0gZGF0YUF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gaWYgZWxlbWVudCBub2RlIGhhcyBjaGlsZE5vZGVzLCByZWFkIHRoZW0gYW5kIHNldCB0aGVtIHRvIGRhdGFcbiAgICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgdmFyIGNoaWxkRGF0YSA9IHt9O1xuICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDMpIHsgLy8gVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgZGF0YVtcInRleHRDb250ZW50XCJdID0gY2hpbGQubm9kZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNoaWxkRGF0YSA9IF9fcmVhZERlZmF1bHQoY2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhW2NoaWxkLm5vZGVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBjaGlsZERhdGEgaW4gYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbY2hpbGQubm9kZU5hbWVdID0gY2hpbGREYXRhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugc2V2ZXJhbCBjaGlsZE5vZGVzIGhhcyB0aGUgc2FtZSBuYW1lIDogc3RvcmUgdGhlbSBpbiBhbiBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgZGF0YVtub2RlTmFtZV0gYWxyZWFkeSBleGlzdHMgYnV0IGlzIG5vdCBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YVtjaGlsZC5ub2RlTmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkID0gZGF0YVtjaGlsZC5ub2RlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2NoaWxkLm5vZGVOYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtjaGlsZC5ub2RlTmFtZV0ucHVzaChvbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbY2hpbGQubm9kZU5hbWVdLnB1c2goY2hpbGREYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPIDogbWFuYWdlIG90aGVyIG5vZGUgdHlwZXMgKDQ9Q0RBVEEsIGV0YylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIE3DqXRob2RlIGRlIGxhIGNsYXNzZSAocHJpdsOpZSkgcGVybWV0dGFudCBkZSByw6ljdXDDqXJlciBsZXMgYXR0cmlidXRzIGQndW4gbm9ldWQgw6lsw6ltZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBYTUxcbiAqIEBtZXRob2QgX19nZXRBdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCBjb250ZW5hbnQgbCdhdHRyaWJ1dCByZWNoZXJjaMOpXG4gKiBAcmV0dXJuIHtPYmplY3R9IG5vZGVBdHRyaWJ1dGVzIC0gb2JqZXQgY29udGVuYW50IGxlcyBub21zIGV0IHZhbGV1cnMgZGVzIGRpZmbDqXJlbnRzIGF0dHJpYnV0c1xuICovXG5mdW5jdGlvbiBfX2dldEF0dHJpYnV0ZXMgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0ge307XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgbm9kZUF0dHJpYnV0ZXNbYXR0cmlidXRlLm5vZGVOYW1lXSA9IGF0dHJpYnV0ZS5ub2RlVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVBdHRyaWJ1dGVzO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgWE1MO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Formats/XML.js\n"); - -/***/ }), - -/***/ "./src/Gp.js": -/*!*******************!*\ - !*** ./src/Gp.js ***! - \*******************/ -/*! exports provided: servicesVersion, servicesDate, default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"servicesVersion\", function() { return servicesVersion; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"servicesDate\", function() { return servicesDate; });\n/* harmony import */ var _Services_Services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Services/Services */ \"./src/Services/Services.js\");\n/* harmony import */ var _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Services/DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Services/Alti/Response/model/AltiResponse */ \"./src/Services/Alti/Response/model/AltiResponse.js\");\n/* harmony import */ var _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Services/Alti/Response/model/Elevation */ \"./src/Services/Alti/Response/model/Elevation.js\");\n/* harmony import */ var _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Services/AutoComplete/Response/model/AutoCompleteResponse */ \"./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js\");\n/* harmony import */ var _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Services/AutoComplete/Response/model/SuggestedLocation */ \"./src/Services/AutoComplete/Response/model/SuggestedLocation.js\");\n/* harmony import */ var _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse */ \"./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js\");\n/* harmony import */ var _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Services/Route/Response/model/RouteResponse */ \"./src/Services/Route/Response/model/RouteResponse.js\");\n/* harmony import */ var _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Services/Route/Response/model/RouteInstruction */ \"./src/Services/Route/Response/model/RouteInstruction.js\");\n/* harmony import */ var _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Services/Config/Config */ \"./src/Services/Config/Config.js\");\n/* harmony import */ var _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Protocols/XHR */ \"./src/Protocols/XHR.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../package.json */ \"./package.json\");\nvar _package_json__WEBPACK_IMPORTED_MODULE_13___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../package.json */ \"./package.json\", 1);\n/**\n* Global variable Gp.\n*\n* @module Gp\n* @alias Gp\n* @description\n*\n* This is the global variable that is exposed in the browser environment.\n* Content is composed of constructor, functions and properties...\n*\n* > {@link Gp.Error Error()}\n* - .TYPE_SRVERR : \"SERVICE_ERROR\"\n* - .TYPE_UNKERR : \"UNKNOWN_ERROR\"\n* - .TYPE_USEERR : \"USAGE_ERROR\"\n*\n* > {@link module:Helper Helper}\n* - .indent()\n* - .normalyzeParameters()\n* - .normalyzeUrl()\n*\n* > {@link module:XHR Protocols.XHR}\n* - .call()\n*\n* > {@link module:Services Services (objects)}\n* - .Alti\n* - {@link Gp.Services.Alti.Elevation .Elevation()}\n* - {@link Gp.Services.AltiResponse .AltiResponse()}\n* - .AutoComplete\n* - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()}\n* - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()}\n* - {@link Gp.Services.Config .Config()}\n* - {@link Gp.Services.DefaultUrl .DefaultUrl()}\n* - {@link Gp.Services.GeocodeResponse .GeocodeResponse()}\n* - {@link Gp.Services.GetConfigResponse .GetConfigResponse()}\n* - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()}\n* - .Route\n* - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()}\n* - {@link Gp.Services.RouteResponse .RouteResponse()}\n*\n* > Services (factory)\n* - {@link module:Services~autoComplete .autoComplete()}\n* - {@link module:Services~geocode .geocode()}\n* - {@link module:Services~getAltitude .getAltitude()}\n* - {@link module:Services~getConfig .getConfig()}\n* - {@link module:Services~isoCurve .isoCurve()}\n* - {@link module:Services~reverseGeocode .reverseGeocode()}\n* - {@link module:Services~route .route()}\n*\n* > servicesDate : \"YYYY-MM-DD\"\n*\n* > servicesVersion : \"X.X.X\"\n*\n*/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/** Version */\nvar servicesVersion = _package_json__WEBPACK_IMPORTED_MODULE_13__.version;\n/** Publication date */\nvar servicesDate = _package_json__WEBPACK_IMPORTED_MODULE_13__.date;\n\n// on declare les ns dans root global\nvar Gp = {};\nGp.servicesVersion = servicesVersion;\nGp.servicesDate = servicesDate;\n\n// Export Protocols\nGp.Protocols = {};\nGp.Protocols.XHR = _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__[\"default\"];\n// Export services\nGp.Services = _Services_Services__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n// Export DefaultUrls\nGp.Services.DefaultUrl = _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n// Export Alti\nGp.Services.AltiResponse = _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\nGp.Services.Alti = {};\nGp.Services.Alti.Elevation = _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n// Export Autocomplete\nGp.Services.AutoCompleteResponse = _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__[\"default\"];\nGp.Services.AutoComplete = {};\nGp.Services.AutoComplete.SuggestedLocation = _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__[\"default\"];\n// Export Config\nGp.Services.Config = _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__[\"default\"];\n// Export IsoCurve\nGp.Services.IsoCurveResponse = _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__[\"default\"];\n// Export Route\nGp.Services.RouteResponse = _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\nGp.Services.Route = {};\nGp.Services.Route.RouteInstruction = _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__[\"default\"];\n// Export Erreurs et Outils\nGp.Error = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\nGp.Helper = _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (Gp);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9HcC5qcz8xZjU2Il0sIm5hbWVzIjpbInNlcnZpY2VzVmVyc2lvbiIsIlBrZyIsInZlcnNpb24iLCJzZXJ2aWNlc0RhdGUiLCJkYXRlIiwiR3AiLCJQcm90b2NvbHMiLCJYSFIiLCJTZXJ2aWNlcyIsIkRlZmF1bHRVcmwiLCJBbHRpUmVzcG9uc2UiLCJBbHRpIiwiRWxldmF0aW9uIiwiQXV0b0NvbXBsZXRlUmVzcG9uc2UiLCJBdXRvQ29tcGxldGUiLCJTdWdnZXN0ZWRMb2NhdGlvbiIsIkNvbmZpZyIsIklzb0N1cnZlUmVzcG9uc2UiLCJSb3V0ZVJlc3BvbnNlIiwiUm91dGUiLCJSb3V0ZUluc3RydWN0aW9uIiwiRXJyb3IiLCJIZWxwZXIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTJDO0FBQ1c7QUFDaUI7QUFDTjtBQUM4QjtBQUNOO0FBQ1E7QUFDdkI7QUFDTTtBQUNsQztBQUNaO0FBQ1k7QUFDVjtBQUVGOztBQUVsQztBQUNPLElBQU1BLGVBQWUsR0FBR0MsMkNBQUcsQ0FBQ0MsT0FBTztBQUMxQztBQUNPLElBQU1DLFlBQVksR0FBR0YsMkNBQUcsQ0FBQ0csSUFBSTs7QUFFcEM7QUFDQSxJQUFJQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRVhBLEVBQUUsQ0FBQ0wsZUFBZSxHQUFHQSxlQUFlO0FBQ3BDSyxFQUFFLENBQUNGLFlBQVksR0FBR0EsWUFBWTs7QUFFOUI7QUFDQUUsRUFBRSxDQUFDQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCRCxFQUFFLENBQUNDLFNBQVMsQ0FBQ0MsR0FBRyxHQUFHQSx1REFBRztBQUN0QjtBQUNBRixFQUFFLENBQUNHLFFBQVEsR0FBR0EsMERBQVE7QUFDdEI7QUFDQUgsRUFBRSxDQUFDRyxRQUFRLENBQUNDLFVBQVUsR0FBR0EsbUVBQVU7QUFDbkM7QUFDQUosRUFBRSxDQUFDRyxRQUFRLENBQUNFLFlBQVksR0FBR0Esa0ZBQVk7QUFDdkNMLEVBQUUsQ0FBQ0csUUFBUSxDQUFDRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCTixFQUFFLENBQUNHLFFBQVEsQ0FBQ0csSUFBSSxDQUFDQyxTQUFTLEdBQUdBLCtFQUFTO0FBQ3RDO0FBQ0FQLEVBQUUsQ0FBQ0csUUFBUSxDQUFDSyxvQkFBb0IsR0FBR0Esa0dBQW9CO0FBQ3ZEUixFQUFFLENBQUNHLFFBQVEsQ0FBQ00sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUM3QlQsRUFBRSxDQUFDRyxRQUFRLENBQUNNLFlBQVksQ0FBQ0MsaUJBQWlCLEdBQUdBLCtGQUFpQjtBQUM5RDtBQUNBVixFQUFFLENBQUNHLFFBQVEsQ0FBQ1EsTUFBTSxHQUFHQSwrREFBTTtBQUMzQjtBQUNBWCxFQUFFLENBQUNHLFFBQVEsQ0FBQ1MsZ0JBQWdCLEdBQUdBLHdHQUFnQjtBQUMvQztBQUNBWixFQUFFLENBQUNHLFFBQVEsQ0FBQ1UsYUFBYSxHQUFHQSxvRkFBYTtBQUN6Q2IsRUFBRSxDQUFDRyxRQUFRLENBQUNXLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDdEJkLEVBQUUsQ0FBQ0csUUFBUSxDQUFDVyxLQUFLLENBQUNDLGdCQUFnQixHQUFHQSx1RkFBZ0I7QUFDckQ7QUFDQWYsRUFBRSxDQUFDZ0IsS0FBSyxHQUFHQSxpRUFBSztBQUNoQmhCLEVBQUUsQ0FBQ2lCLE1BQU0sR0FBR0Esc0RBQU07QUFFSGpCLGlFQUFFIiwiZmlsZSI6Ii4vc3JjL0dwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4qIEdsb2JhbCB2YXJpYWJsZSBHcC5cbipcbiogQG1vZHVsZSBHcFxuKiBAYWxpYXMgR3BcbiogQGRlc2NyaXB0aW9uXG4qXG4qIFRoaXMgaXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9zZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4qIENvbnRlbnQgaXMgY29tcG9zZWQgb2YgY29uc3RydWN0b3IsIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcy4uLlxuKlxuKiA+IHtAbGluayBHcC5FcnJvciBFcnJvcigpfVxuKiAgICAgLSAuVFlQRV9TUlZFUlIgOiBcIlNFUlZJQ0VfRVJST1JcIlxuKiAgICAgLSAuVFlQRV9VTktFUlIgOiBcIlVOS05PV05fRVJST1JcIlxuKiAgICAgLSAuVFlQRV9VU0VFUlIgOiBcIlVTQUdFX0VSUk9SXCJcbipcbiogPiB7QGxpbmsgbW9kdWxlOkhlbHBlciBIZWxwZXJ9XG4qICAgICAtIC5pbmRlbnQoKVxuKiAgICAgLSAubm9ybWFseXplUGFyYW1ldGVycygpXG4qICAgICAtIC5ub3JtYWx5emVVcmwoKVxuKlxuKiA+IHtAbGluayBtb2R1bGU6WEhSIFByb3RvY29scy5YSFJ9XG4qICAgICAtIC5jYWxsKClcbipcbiogPiB7QGxpbmsgbW9kdWxlOlNlcnZpY2VzIFNlcnZpY2VzIChvYmplY3RzKX1cbiogICAgIC0gLkFsdGlcbiogICAgICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5BbHRpLkVsZXZhdGlvbiAuRWxldmF0aW9uKCl9XG4qICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5BbHRpUmVzcG9uc2UgLkFsdGlSZXNwb25zZSgpfVxuKiAgICAgLSAuQXV0b0NvbXBsZXRlXG4qICAgICAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlLlN1Z2dlc3RlZExvY2F0aW9uIC5TdWdnZXN0ZWRMb2NhdGlvbigpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlUmVzcG9uc2UgLkF1dG9Db21wbGV0ZVJlc3BvbnNlKCl9XG4qICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5Db25maWcgLkNvbmZpZygpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuRGVmYXVsdFVybCAuRGVmYXVsdFVybCgpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuR2VvY29kZVJlc3BvbnNlIC5HZW9jb2RlUmVzcG9uc2UoKX1cbiogICAgIC0ge0BsaW5rIEdwLlNlcnZpY2VzLkdldENvbmZpZ1Jlc3BvbnNlIC5HZXRDb25maWdSZXNwb25zZSgpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZSAuSXNvQ3VydmVSZXNwb25zZSgpfVxuKiAgICAgLSAuUm91dGVcbiogICAgICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5Sb3V0ZS5Sb3V0ZUluc3RydWN0aW9uIC5Sb3V0ZUluc3RydWN0aW9uKCl9XG4qICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5Sb3V0ZVJlc3BvbnNlIC5Sb3V0ZVJlc3BvbnNlKCl9XG4qXG4qID4gU2VydmljZXMgKGZhY3RvcnkpXG4qICAgICAtIHtAbGluayBtb2R1bGU6U2VydmljZXN+YXV0b0NvbXBsZXRlIC5hdXRvQ29tcGxldGUoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35nZW9jb2RlIC5nZW9jb2RlKCl9XG4qICAgICAtIHtAbGluayBtb2R1bGU6U2VydmljZXN+Z2V0QWx0aXR1ZGUgLmdldEFsdGl0dWRlKCl9XG4qICAgICAtIHtAbGluayBtb2R1bGU6U2VydmljZXN+Z2V0Q29uZmlnIC5nZXRDb25maWcoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35pc29DdXJ2ZSAuaXNvQ3VydmUoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35yZXZlcnNlR2VvY29kZSAucmV2ZXJzZUdlb2NvZGUoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35yb3V0ZSAucm91dGUoKX1cbipcbiogPiBzZXJ2aWNlc0RhdGUgOiBcIllZWVktTU0tRERcIlxuKlxuKiA+IHNlcnZpY2VzVmVyc2lvbiA6IFwiWC5YLlhcIlxuKlxuKi9cblxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuL1NlcnZpY2VzL1NlcnZpY2VzXCI7XG5pbXBvcnQgRGVmYXVsdFVybCBmcm9tIFwiLi9TZXJ2aWNlcy9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IEFsdGlSZXNwb25zZSBmcm9tIFwiLi9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0FsdGlSZXNwb25zZVwiO1xuaW1wb3J0IEVsZXZhdGlvbiBmcm9tIFwiLi9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0VsZXZhdGlvblwiO1xuaW1wb3J0IEF1dG9Db21wbGV0ZVJlc3BvbnNlIGZyb20gXCIuL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9tb2RlbC9BdXRvQ29tcGxldGVSZXNwb25zZVwiO1xuaW1wb3J0IFN1Z2dlc3RlZExvY2F0aW9uIGZyb20gXCIuL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9tb2RlbC9TdWdnZXN0ZWRMb2NhdGlvblwiO1xuaW1wb3J0IElzb0N1cnZlUmVzcG9uc2UgZnJvbSBcIi4vU2VydmljZXMvUHJvY2Vzc0lzb0N1cnZlL1Jlc3BvbnNlL21vZGVsL1Byb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlXCI7XG5pbXBvcnQgUm91dGVSZXNwb25zZSBmcm9tIFwiLi9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgUm91dGVJbnN0cnVjdGlvbiBmcm9tIFwiLi9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZUluc3RydWN0aW9uXCI7XG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL1NlcnZpY2VzL0NvbmZpZy9Db25maWdcIjtcbmltcG9ydCBYSFIgZnJvbSBcIi4vUHJvdG9jb2xzL1hIUlwiO1xuaW1wb3J0IEVycm9yIGZyb20gXCIuL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgSGVscGVyIGZyb20gXCIuL1V0aWxzL0hlbHBlclwiO1xuXG5pbXBvcnQgUGtnIGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIjtcblxuLyoqIFZlcnNpb24gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlc1ZlcnNpb24gPSBQa2cudmVyc2lvbjtcbi8qKiBQdWJsaWNhdGlvbiBkYXRlICovXG5leHBvcnQgY29uc3Qgc2VydmljZXNEYXRlID0gUGtnLmRhdGU7XG5cbi8vIG9uIGRlY2xhcmUgbGVzIG5zIGRhbnMgcm9vdCBnbG9iYWxcbnZhciBHcCA9IHt9O1xuXG5HcC5zZXJ2aWNlc1ZlcnNpb24gPSBzZXJ2aWNlc1ZlcnNpb247XG5HcC5zZXJ2aWNlc0RhdGUgPSBzZXJ2aWNlc0RhdGU7XG5cbi8vIEV4cG9ydCBQcm90b2NvbHNcbkdwLlByb3RvY29scyA9IHt9O1xuR3AuUHJvdG9jb2xzLlhIUiA9IFhIUjtcbi8vIEV4cG9ydCBzZXJ2aWNlc1xuR3AuU2VydmljZXMgPSBTZXJ2aWNlcztcbi8vIEV4cG9ydCBEZWZhdWx0VXJsc1xuR3AuU2VydmljZXMuRGVmYXVsdFVybCA9IERlZmF1bHRVcmw7XG4vLyBFeHBvcnQgQWx0aVxuR3AuU2VydmljZXMuQWx0aVJlc3BvbnNlID0gQWx0aVJlc3BvbnNlO1xuR3AuU2VydmljZXMuQWx0aSA9IHt9O1xuR3AuU2VydmljZXMuQWx0aS5FbGV2YXRpb24gPSBFbGV2YXRpb247XG4vLyBFeHBvcnQgQXV0b2NvbXBsZXRlXG5HcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGVSZXNwb25zZSA9IEF1dG9Db21wbGV0ZVJlc3BvbnNlO1xuR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlID0ge307XG5HcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGUuU3VnZ2VzdGVkTG9jYXRpb24gPSBTdWdnZXN0ZWRMb2NhdGlvbjtcbi8vIEV4cG9ydCBDb25maWdcbkdwLlNlcnZpY2VzLkNvbmZpZyA9IENvbmZpZztcbi8vIEV4cG9ydCBJc29DdXJ2ZVxuR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZSA9IElzb0N1cnZlUmVzcG9uc2U7XG4vLyBFeHBvcnQgUm91dGVcbkdwLlNlcnZpY2VzLlJvdXRlUmVzcG9uc2UgPSBSb3V0ZVJlc3BvbnNlO1xuR3AuU2VydmljZXMuUm91dGUgPSB7fTtcbkdwLlNlcnZpY2VzLlJvdXRlLlJvdXRlSW5zdHJ1Y3Rpb24gPSBSb3V0ZUluc3RydWN0aW9uO1xuLy8gRXhwb3J0IEVycmV1cnMgZXQgT3V0aWxzXG5HcC5FcnJvciA9IEVycm9yO1xuR3AuSGVscGVyID0gSGVscGVyO1xuXG5leHBvcnQgZGVmYXVsdCBHcDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Gp.js\n"); - -/***/ }), - -/***/ "./src/Protocols/JSONP.js": -/*!********************************!*\ - !*** ./src/Protocols/JSONP.js ***! - \********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/**\n * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail\n *\n * @module JSONP\n * @private\n * @alias Gp.Protocols.JSONP\n */\n\n\n// cf. https://github.com/sobstel/jsonp.js\nvar JSONP = {\n /**\n * Construction d'un identifiant statique basé sur le timestamp,\n * et qui s'incremente de +1 à chaque appel\n */\n uuid: function () {\n var id = Math.floor(Date.now());\n return function () {\n return id++;\n };\n }(),\n /**\n * Cette fonction réalise l'appel du service fourni via le paramètre \"options.url\"\n * en mettant en œuvre le protocole JSONP.\n *\n * @method call\n * @static\n * @param {Object} options - parametres d'invocation du service en JSONP\n * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP).\n * Cette URL contient déjà les paramètres du service.\n * Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ;\n * sa valeur est déterminée en fonction du paramètre callbackName.\n * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu.\n * Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut.\n * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL.\n * Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: \"callback1458574396582 ()\"\n * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL.\n * Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte.\n * La fonction de callback est créée dynamiquement par la fonction JSONP ;\n * elle a deux fonctions :\n * elle annule la condition de timeOut\n * puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse.\n * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service.\n * Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback.\n * La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre.\n * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service.\n * Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut.\n * @example\n * var options = {\n * url : 'http://localhost/some/test.json&callback=myResults',\n * timeOut : 100,\n * callbackName : 'myResults',\n * callbackSuffix : \"\",\n * onResponse : function (response) {\n * console.log('results : ', response);\n * },\n *\n * };\n * JSONP.call(options);\n */\n call: function call(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"JSONP\");\n logger.trace(\"[JSONP::call ()]\");\n\n // analyse parametres\n\n if (!options) {\n logger.error(\"missing parameter : options !\");\n throw new Error(\"missing parameter : options !\");\n }\n if (!options.url) {\n logger.error(\"missing parameter : options.url !\");\n throw new Error(\"missing parameter : options.url !\");\n }\n if (!options.timeOut) {\n logger.info(\"setting 'options.timeOut' default value\");\n options.timeOut = 0;\n }\n\n // FIXME si un callback coté client a été mis en place,\n // cette condition sur cette methode n'a pas de sens !?\n if (!options.onResponse) {\n logger.error(\"missing parameter : options.onResponse !\");\n throw new Error(\"missing parameter : options.onResponse !\");\n // FIXME doit on definir un callback interne par defaut !?\n // options.onResponse = function (data) {\n // console.log(\"response callback (inner) : \", data);\n // };\n }\n\n // ID du callback à utiliser : null ou string.\n // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = \"\")\n // sinon, on utilise un timestamp : this.uuid ()\n var callbackId = typeof options.callbackSuffix === \"string\" ? options.callbackSuffix : this.uuid();\n\n // on recherche le parametre callback et son nom de fonction dans l'url\n var urlHasCallbackKey = false;\n var urlHasCallbackName = false;\n var idx = options.url.indexOf(\"callback=\");\n if (idx !== -1) {\n urlHasCallbackKey = true;\n // extraction callbackName de l'url : entre \"callback=\" et \"&\" ou fin de ligne\n var j = options.url.indexOf(\"&\", idx);\n if (j === -1) {\n j = options.url.length;\n }\n\n // on ecrase le parametre options.callbackName s'il avait été défini\n var callbackName = options.url.substring(idx + 9, j);\n if (callbackName) {\n urlHasCallbackName = true;\n options.callbackName = callbackName;\n logger.info(\"setting 'options.callbackName' value (\" + options.callbackName + \") from 'options.url' parameter\");\n }\n }\n\n // on ajoute le parametre callback dans l'URL s'il n'existe pas\n if (!urlHasCallbackKey) {\n // gestion des autres param. et \"?\"\n var k = options.url.indexOf(\"?\");\n if (k === -1) {\n // aucun param., ni de '?'\n options.url = options.url + \"?\" + \"callback=\";\n } else if (k === options.url.length) {\n // uniquement le '?'\n options.url = options.url + \"callback=\";\n } else {\n // le '?' et les param. existent\n options.url = options.url + \"&\" + \"callback=\";\n }\n logger.info(\"setting callback default key in 'options.url' : \" + options.url);\n }\n\n // utilisation de la fonction callback coté client ?\n var HasCallbackName = options.callbackName ? true : urlHasCallbackName;\n\n // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas\n if (!urlHasCallbackName) {\n // fonction callback par defaut\n if (!options.callbackName) {\n logger.info(\"setting 'options.callbackName' default value\");\n options.callbackName = \"callback\"; // ou \"gp.protocol.jsonp\" ?\n // info : si on ne veut pas gerer d'ID dans le callback,\n // options.callbackSuffix = \"\"\n if (callbackId || callbackId === \"\") {\n options.callbackName += callbackId;\n }\n }\n options.url = options.url.replace(\"callback=\", \"callback=\" + options.callbackName);\n logger.info(\"setting callback function name in 'options.url' : \" + options.url);\n }\n\n // timeOut par defaut\n if (!options.onTimeOut) {\n logger.info(\"setting 'options.onTimeOut' default value\");\n /** callback timeout par defaut */\n options.onTimeOut = function /* error */\n () {\n console.log(\"TimeOut while invoking url : \" + options.url);\n };\n }\n if (!HasCallbackName) {\n var self = this;\n\n // event du timeout\n var onTimeOutTrigger = null;\n\n // declenche le timeout si > à 0 !\n if (options.timeOut > 0) {\n onTimeOutTrigger = window.setTimeout(function () {\n /** fonction de reponse du service */\n window[options.callbackName] = function () {};\n options.onTimeOut();\n self._deleteScript(callbackId);\n }, options.timeOut);\n }\n\n // FIXME le nom de la fonction n'accepte pas de namespace !\n // ex. Gp.Function.callback\n /**\n * fonction de reponse du service\n * @param {Object} data - data\n * @private\n */\n window[options.callbackName] = function (data) {\n window.clearTimeout(onTimeOutTrigger);\n options.onResponse(data);\n self._deleteScript(callbackId);\n };\n }\n this._createScript(callbackId, options.url);\n },\n /**\n * create Script\n * @param {String} callbackId - callback Id\n * @param {String} url - url\n * @private\n */\n _createScript: function _createScript(callbackId, url) {\n var scriptu;\n var scripto = document.getElementById(\"results\" + callbackId);\n scriptu = document.createElement(\"script\");\n scriptu.setAttribute(\"type\", \"text/javascript\");\n scriptu.setAttribute(\"src\", url);\n scriptu.setAttribute(\"charset\", \"UTF-8\");\n scriptu.setAttribute(\"id\", \"results\" + callbackId);\n scriptu.setAttribute(\"async\", \"true\"); // FIXME async ?\n // head ou body ou autres ?\n var node = document.documentElement || document.getElementsByTagName(\"head\")[0];\n if (scripto === null) {\n node.appendChild(scriptu);\n } else {\n // s'il existe déjà, on le remplace !\n node.replaceChild(scriptu, scripto);\n }\n },\n /**\n * delete Script\n * @param {String} callbackId - callback Id\n * @private\n */\n _deleteScript: function _deleteScript(callbackId) {\n var script = document.getElementById(\"results\" + callbackId);\n if (script) {\n var node = script.parentNode || document.documentElement;\n if (!node) {\n return;\n }\n node.removeChild(script);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (JSONP);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Qcm90b2NvbHMvSlNPTlAuanM/ZjVlYyJdLCJuYW1lcyI6WyJKU09OUCIsInV1aWQiLCJpZCIsIk1hdGgiLCJmbG9vciIsIkRhdGUiLCJub3ciLCJjYWxsIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiZXJyb3IiLCJFcnJvciIsInVybCIsInRpbWVPdXQiLCJpbmZvIiwib25SZXNwb25zZSIsImNhbGxiYWNrSWQiLCJjYWxsYmFja1N1ZmZpeCIsInVybEhhc0NhbGxiYWNrS2V5IiwidXJsSGFzQ2FsbGJhY2tOYW1lIiwiaWR4IiwiaW5kZXhPZiIsImoiLCJsZW5ndGgiLCJjYWxsYmFja05hbWUiLCJzdWJzdHJpbmciLCJrIiwiSGFzQ2FsbGJhY2tOYW1lIiwicmVwbGFjZSIsIm9uVGltZU91dCIsImNvbnNvbGUiLCJsb2ciLCJzZWxmIiwib25UaW1lT3V0VHJpZ2dlciIsIndpbmRvdyIsInNldFRpbWVvdXQiLCJfZGVsZXRlU2NyaXB0IiwiZGF0YSIsImNsZWFyVGltZW91dCIsIl9jcmVhdGVTY3JpcHQiLCJzY3JpcHR1Iiwic2NyaXB0byIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJyZXBsYWNlQ2hpbGQiLCJzY3JpcHQiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM4Qzs7QUFFOUM7QUFDQSxJQUFJQSxLQUFLLEdBQUc7RUFFUjtBQUNKO0FBQ0E7QUFDQTtFQUNJQyxJQUFJLEVBQUksWUFBWTtJQUNoQixJQUFJQyxFQUFFLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDQyxJQUFJLENB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SVYsUUFBUSxDQUFDSyxlQUFlO01BQ3hELElBQUksQ0FBQ0QsSUFBSSxFQUFFO1FBQ1A7TUFDSjtNQUNBQSxJQUFJLENBQUNPLFdBQVcsQ0FBQ0YsTUFBTSxDQUFDO0lBQzVCO0VBQ0o7QUFDSixDQUFDO0FBRWN0RCxvRUFBSyIsImZpbGUiOiIuL3NyYy9Qcm90b2NvbHMvSlNPTlAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEpTT05QIDogSW1wbMOpbWVudGF0aW9uIGR1IHByb3RvY29sZSBKU09OUCBkZSBsYSBwbGF0ZWZvcm1lIEfDqW9wb3J0YWlsXG4gKlxuICogQG1vZHVsZSBKU09OUFxuICogQHByaXZhdGVcbiAqIEBhbGlhcyBHcC5Qcm90b2NvbHMuSlNPTlBcbiAqL1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbi8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc29ic3RlbC9qc29ucC5qc1xudmFyIEpTT05QID0ge1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0aW9uIGQndW4gaWRlbnRpZmlhbnQgc3RhdGlxdWUgYmFzw6kgc3VyIGxlIHRpbWVzdGFtcCxcbiAgICAgKiBldCBxdWkgcydpbmNyZW1lbnRlIGRlICsxIMOgIGNoYXF1ZSBhcHBlbFxuICAgICAqL1xuICAgIHV1aWQgOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkKys7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIENldHRlIGZvbmN0aW9uIHLDqWFsaXNlIGwnYXBwZWwgZHUgc2VydmljZSBmb3VybmkgdmlhIGxlIHBhcmFtw6h0cmUgXCJvcHRpb25zLnVybFwiXG4gICAgICogZW4gbWV0dGFudCBlbiDFk3V2cmUgbGUgcHJvdG9jb2xlIEpTT05QLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBjYWxsXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gcGFyYW1ldHJlcyBkJ2ludm9jYXRpb24gZHUgc2VydmljZSBlbiBKU09OUFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnVybCAtIFVSTCBkdSBzZXJ2aWNlIMOgIGludm9xdWVyIChpbmTDqXBlbmRhbW1lbnQgZHUgcHJvdG9jb2xlIEpTT05QKS5cbiAgICAgKiAgQ2V0dGUgVVJMIGNvbnRpZW50IGTDqWrDoCBsZXMgcGFyYW3DqHRyZXMgZHUgc2VydmljZS5cbiAgICAgKiAgU2kgbGUgcGFyYW3DqHRyZSBkw6lkacOpIMOgIGxhIG1pc2UgZW4gb2V1dnJlIGR1IHByb3RvY29sZSBKU09OUCAoY2FsbGJhY2s9eHh4KSBuJ2VzdCBwYXMgcHLDqXNlbnQsIGlsIGVzdCByYWpvdXTDqSBwYXIgbGEgZm9uY3Rpb24gO1xuICAgICAqICBzYSB2YWxldXIgZXN0IGTDqXRlcm1pbsOpZSBlbiBmb25jdGlvbiBkdSBwYXJhbcOodHJlIGNhbGxiYWNrTmFtZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dCA9IDBdIC0gTm9tYnJlIGRlIG1zIGF1IGJvdXQgZHVxdWVsIG9uIGNvbnNpZMOocmUgcXVlIGxlIHNlcnZpY2UgbidhIHBhcyByw6lwb25kdS5cbiAgICAgKiAgVW5lIHZhbGV1ciBkZSAwIHBvdXIgY2UgcGFyYW3DqHRyZSBwZXJtZXQgZGUgZMOpc2FjdGl2ZXIgbGEgZ2VzdGlvbiBkdSB0aW1lT3V0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jYWxsYmFja1N1ZmZpeCA9IG51bGxdIC0gU3VmZml4ZSBkZSBsYSBmb25jdGlvbiBkZSBjYWxsYmFjayDDoCByYWpvdXRlciBzdXIgbCdVUkwuXG4gICAgICogIFNpIGF1Y3VuIHN1ZmZpeGUgbidlc3Qgc3DDqWNpZmnDqSAoY2FzIHBhciBkw6lmYXV0KSwgb24gdXRpbGlzZXJhIGwnaWRlbnRpZmlhbnQgdGhpcy51dWlkICgpIGNvbW1lIHN1ZmZpeGUuIEV4OiBcImNhbGxiYWNrMTQ1ODU3NDM5NjU4MiAoKVwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNhbGxiYWNrTmFtZSA9IGdwLnByb3RvY29sLmpzb25wXSAtIFZhbGV1ciBkdSBwYXJhbcOodHJlIGNhbGxiYWNrIMOgIHJham91dGVyIHN1ciBsJ1VSTC5cbiAgICAgKiAgU2kgbCdVUkwgZm91cm5pZSBjb250aWVudCBkw6lqw6AgbGUgcGFyYW3DqHRyZSBjYWxsYmFjaywgbGUgcGFyYW3DqHRyZSBjYWxsYmFja05hbWUgbmUgc2VyYSBwYXMgcHJpcyBlbiBjb21wdGUuXG4gICAgICogIExhIGZvbmN0aW9uIGRlIGNhbGxiYWNrIGVzdCBjcsOpw6llIGR5bmFtaXF1ZW1lbnQgcGFyIGxhIGZvbmN0aW9uIEpTT05QIDtcbiAgICAgKiAgZWxsZSBhIGRldXggZm9uY3Rpb25zIDpcbiAgICAgKiAgICBlbGxlIGFubnVsZSBsYSBjb25kaXRpb24gZGUgdGltZU91dFxuICAgICAqICAgIHB1aXMgYXBwZWxsZSBsYSBmb25jdGlvbiBmb3VybmllIHBhciBsJ3V0aWxpc2F0ZXVyIHZpYSBsZSBwYXJhbcOodHJlIG9uUmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblJlc3BvbnNlIC0gTm9tIGRlIGxhIGZvbmN0aW9uIHF1aSBzZXJhIGFwcGVsw6llIGxvcnMgZGUgbGEgcsOpY2VwdGlvbiBkZXMgcsOpc3VsdGF0cyBkdSBzZXJ2aWNlLlxuICAgICAqICBDZSBwYXJhbcOodHJlIHNlcmEgaWdub3LDqSBzaSBsJ1VSTCBjb250aWVudCBkw6lqw6AgbGUgcGFyYW3DqHRyZSBjYWxsYmFjay5cbiAgICAgKiAgTGEgZm9uY3Rpb24gZGUgcmFwcGVsIGFwcGVsw6llIHNlcmEgYWxvcnMgY2VsbGUgYXlhbnQgcG91ciBub20gbGEgdmFsZXVyIGRlIGNlIHBhcmFtw6h0cmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25UaW1lT3V0XSAtIE5vbSBkZSBsYSBmb25jdGlvbiBxdWkgc2VyYSBhcHBlbMOpZSBlbiBjYXMgZGUgbm9uIHLDqXBvbnNlIGR1IHNlcnZpY2UuXG4gICAgICogIExlIHRlbXBzIGF1IGJvdXQgZHVxdWVsIG9uIGNvbnNpZMOocmUgcXVlIGxlIHNlcnZpY2UgbidhIHBhcyByw6lwb25kdSBlc3QgZMOpdGVybWluw6kgcGFyIGxlIHBhcmFtw6h0cmUgdGltZU91dC5cbiAgICAgKiAgQGV4YW1wbGVcbiAgICAgKiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICogICAgICB1cmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zb21lL3Rlc3QuanNvbiZjYWxsYmFjaz1teVJlc3VsdHMnLFxuICAgICAqICAgICAgdGltZU91dCA6IDEwMCxcbiAgICAgKiAgICAgIGNhbGxiYWNrTmFtZSA6ICdteVJlc3VsdHMnLFxuICAgICAqICAgICAgY2FsbGJhY2tTdWZmaXggOiBcIlwiLFxuICAgICAqICAgICAgb25SZXNwb25zZSA6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXN1bHRzIDogJywgcmVzcG9uc2UpO1xuICAgICAqICAgICAgfSxcbiAgICAgKlxuICAgICAqICAgfTtcbiAgICAgKiAgIEpTT05QLmNhbGwob3B0aW9ucyk7XG4gICAgICovXG4gICAgY2FsbCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIGxvZ2dlclxuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkpTT05QXCIpO1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbSlNPTlA6OmNhbGwgKCldXCIpO1xuXG4gICAgICAgIC8vIGFuYWx5c2UgcGFyYW1ldHJlc1xuXG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwibWlzc2luZyBwYXJhbWV0ZXIgOiBvcHRpb25zICFcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHBhcmFtZXRlciA6IG9wdGlvbnMgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogb3B0aW9ucy51cmwgIVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogb3B0aW9ucy51cmwgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy50aW1lT3V0KSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgJ29wdGlvbnMudGltZU91dCcgZGVmYXVsdCB2YWx1ZVwiKTtcbiAgICAgICAgICAgIG9wdGlvbnMudGltZU91dCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRSBzaSB1biBjYWxsYmFjayBjb3TDqSBjbGllbnQgYSDDqXTDqSBtaXMgZW4gcGxhY2UsXG4gICAgICAgIC8vIGNldHRlIGNvbmRpdGlvbiBzdXIgY2V0dGUgbWV0aG9kZSBuJ2EgcGFzIGRlIHNlbnMgIT9cbiAgICAgICAgaWYgKCFvcHRpb25zLm9uUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogb3B0aW9ucy5vblJlc3BvbnNlICFcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHBhcmFtZXRlciA6IG9wdGlvbnMub25SZXNwb25zZSAhXCIpO1xuICAgICAgICAgICAgLy8gRklYTUUgZG9pdCBvbiBkZWZpbmlyIHVuIGNhbGxiYWNrIGludGVybmUgcGFyIGRlZmF1dCAhP1xuICAgICAgICAgICAgLy8gb3B0aW9ucy5vblJlc3BvbnNlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIC8vICAgIGNvbnNvbGUubG9nKFwicmVzcG9uc2UgY2FsbGJhY2sgKGlubmVyKSA6IFwiLCBkYXRhKTtcbiAgICAgICAgICAgIC8vIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJRCBkdSBjYWxsYmFjayDDoCB1dGlsaXNlciA6IG51bGwgb3Ugc3RyaW5nLlxuICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGEgc3DDqWNpZmnDqSB1biBzdWZmaXhlIHBvdXIgbGUgY2FsbGJhY2ssIG9uIGxlIHLDqWN1cMOocmUgY29tbWUgdW4gSUQgKGV4OiBvcHRpb25zLmNhbGxiYWNrU3VmZml4ID0gXCJcIilcbiAgICAgICAgLy8gc2lub24sIG9uIHV0aWxpc2UgdW4gdGltZXN0YW1wIDogdGhpcy51dWlkICgpXG4gICAgICAgIHZhciBjYWxsYmFja0lkID0gKHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrU3VmZml4ID09PSBcInN0cmluZ1wiKSA/IG9wdGlvbnMuY2FsbGJhY2tTdWZmaXggOiB0aGlzLnV1aWQoKTtcblxuICAgICAgICAvLyBvbiByZWNoZXJjaGUgbGUgcGFyYW1ldHJlIGNhbGxiYWNrIGV0IHNvbiBub20gZGUgZm9uY3Rpb24gZGFucyBsJ3VybFxuICAgICAgICB2YXIgdXJsSGFzQ2FsbGJhY2tLZXkgPSBmYWxzZTtcbiAgICAgICAgdmFyIHVybEhhc0NhbGxiYWNrTmFtZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBpZHggPSBvcHRpb25zLnVybC5pbmRleE9mKFwiY2FsbGJhY2s9XCIpO1xuXG4gICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgICB1cmxIYXNDYWxsYmFja0tleSA9IHRydWU7XG4gICAgICAgICAgICAvLyBleHRyYWN0aW9uIGNhbGxiYWNrTmFtZSBkZSBsJ3VybCA6IGVudHJlIFwiY2FsbGJhY2s9XCIgZXQgXCImXCIgb3UgZmluIGRlIGxpZ25lXG4gICAgICAgICAgICB2YXIgaiA9IG9wdGlvbnMudXJsLmluZGV4T2YoXCImXCIsIGlkeCk7XG4gICAgICAgICAgICBpZiAoaiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBqID0gb3B0aW9ucy51cmwubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBvbiBlY3Jhc2UgbGUgcGFyYW1ldHJlIG9wdGlvbnMuY2FsbGJhY2tOYW1lIHMnaWwgYXZhaXQgw6l0w6kgZMOpZmluaVxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrTmFtZSA9IG9wdGlvbnMudXJsLnN1YnN0cmluZyhpZHggKyA5LCBqKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIHVybEhhc0NhbGxiYWNrTmFtZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja05hbWUgPSBjYWxsYmFja05hbWU7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJzZXR0aW5nICdvcHRpb25zLmNhbGxiYWNrTmFtZScgdmFsdWUgKFwiICsgb3B0aW9ucy5jYWxsYmFja05hbWUgKyBcIikgZnJvbSAnb3B0aW9ucy51cmwnIHBhcmFtZXRlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIGFqb3V0ZSBsZSBwYXJhbWV0cmUgY2FsbGJhY2sgZGFucyBsJ1VSTCBzJ2lsIG4nZXhpc3RlIHBhc1xuICAgICAgICBpZiAoIXVybEhhc0NhbGxiYWNrS2V5KSB7XG4gICAgICAgICAgICAvLyBnZXN0aW9uIGRlcyBhdXRyZXMgcGFyYW0uIGV0IFwiP1wiXG4gICAgICAgICAgICB2YXIgayA9IG9wdGlvbnMudXJsLmluZGV4T2YoXCI/XCIpO1xuICAgICAgICAgICAgaWYgKGsgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gYXVjdW4gcGFyYW0uLCBuaSBkZSAnPydcbiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgXCI/XCIgKyBcImNhbGxiYWNrPVwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrID09PSBvcHRpb25zLnVybC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyB1bmlxdWVtZW50IGxlICc/J1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBcImNhbGxiYWNrPVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBsZSAnPycgZXQgbGVzIHBhcmFtLiBleGlzdGVudFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBcIiZcIiArIFwiY2FsbGJhY2s9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgY2FsbGJhY2sgZGVmYXVsdCBrZXkgaW4gJ29wdGlvbnMudXJsJyA6IFwiICsgb3B0aW9ucy51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXRpbGlzYXRpb24gZGUgbGEgZm9uY3Rpb24gY2FsbGJhY2sgY290w6kgY2xpZW50ID9cbiAgICAgICAgdmFyIEhhc0NhbGxiYWNrTmFtZSA9IG9wdGlvbnMuY2FsbGJhY2tOYW1lID8gdHJ1ZSA6IHVybEhhc0NhbGxiYWNrTmFtZTtcblxuICAgICAgICAvLyBvbiBham91dGUgbGUgbm9tIGRlIGxhIGZvbmN0aW9uIGNhbGxiYWNrIGRhbnMgbCdVUkwgc2kgZWxsZSBuJ2V4aXN0ZSBwYXNcbiAgICAgICAgaWYgKCF1cmxIYXNDYWxsYmFja05hbWUpIHtcbiAgICAgICAgICAgIC8vIGZvbmN0aW9uIGNhbGxiYWNrIHBhciBkZWZhdXRcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jYWxsYmFja05hbWUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgJ29wdGlvbnMuY2FsbGJhY2tOYW1lJyBkZWZhdWx0IHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tOYW1lID0gXCJjYWxsYmFja1wiOyAvLyBvdSBcImdwLnByb3RvY29sLmpzb25wXCIgP1xuICAgICAgICAgICAgICAgIC8vIGluZm8gOiBzaSBvbiBuZSB2ZXV0IHBhcyBnZXJlciBkJ0lEIGRhbnMgbGUgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucy5jYWxsYmFja1N1ZmZpeCA9IFwiXCJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tJZCB8fCBjYWxsYmFja0lkID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tOYW1lICs9IGNhbGxiYWNrSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybC5yZXBsYWNlKFwiY2FsbGJhY2s9XCIsIFwiY2FsbGJhY2s9XCIgKyBvcHRpb25zLmNhbGxiYWNrTmFtZSk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBpbiAnb3B0aW9ucy51cmwnIDogXCIgKyBvcHRpb25zLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aW1lT3V0IHBhciBkZWZhdXRcbiAgICAgICAgaWYgKCFvcHRpb25zLm9uVGltZU91dCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJzZXR0aW5nICdvcHRpb25zLm9uVGltZU91dCcgZGVmYXVsdCB2YWx1ZVwiKTtcbiAgICAgICAgICAgIC8qKiBjYWxsYmFjayB0aW1lb3V0IHBhciBkZWZhdXQgKi9cbiAgICAgICAgICAgIG9wdGlvbnMub25UaW1lT3V0ID0gZnVuY3Rpb24gKC8qIGVycm9yICovKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaW1lT3V0IHdoaWxlIGludm9raW5nIHVybCA6IFwiICsgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghSGFzQ2FsbGJhY2tOYW1lKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIGV2ZW50IGR1IHRpbWVvdXRcbiAgICAgICAgICAgIHZhciBvblRpbWVPdXRUcmlnZ2VyID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gZGVjbGVuY2hlIGxlIHRpbWVvdXQgc2kgPiDDoCAwICFcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbWVPdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgb25UaW1lT3V0VHJpZ2dlciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogZm9uY3Rpb24gZGUgcmVwb25zZSBkdSBzZXJ2aWNlICovXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbb3B0aW9ucy5jYWxsYmFja05hbWVdID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVGltZU91dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlU2NyaXB0KGNhbGxiYWNrSWQpO1xuICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVPdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGSVhNRSBsZSBub20gZGUgbGEgZm9uY3Rpb24gbidhY2NlcHRlIHBhcyBkZSBuYW1lc3BhY2UgIVxuICAgICAgICAgICAgLy8gZXguIEdwLkZ1bmN0aW9uLmNhbGxiYWNrXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICogZm9uY3Rpb24gZGUgcmVwb25zZSBkdSBzZXJ2aWNlXG4gICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gZGF0YVxuICAgICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHdpbmRvd1tvcHRpb25zLmNhbGxiYWNrTmFtZV0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQob25UaW1lT3V0VHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vblJlc3BvbnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2RlbGV0ZVNjcmlwdChjYWxsYmFja0lkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jcmVhdGVTY3JpcHQoY2FsbGJhY2tJZCwgb3B0aW9ucy51cmwpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAqIGNyZWF0ZSBTY3JpcHRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYWxsYmFja0lkIC0gY2FsbGJhY2sgSWRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSB1cmxcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBfY3JlYXRlU2NyaXB0IDogZnVuY3Rpb24gKGNhbGxiYWNrSWQsIHVybCkge1xuICAgICAgICB2YXIgc2NyaXB0dTtcbiAgICAgICAgdmFyIHNjcmlwdG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3VsdHNcIiArIGNhbGxiYWNrSWQpO1xuXG4gICAgICAgIHNjcmlwdHUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzY3JpcHR1LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJ0ZXh0L2phdmFzY3JpcHRcIik7XG4gICAgICAgIHNjcmlwdHUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHVybCk7XG4gICAgICAgIHNjcmlwdHUuc2V0QXR0cmlidXRlKFwiY2hhcnNldFwiLCBcIlVURi04XCIpO1xuICAgICAgICBzY3JpcHR1LnNldEF0dHJpYnV0ZShcImlkXCIsIFwicmVzdWx0c1wiICsgY2FsbGJhY2tJZCk7XG4gICAgICAgIHNjcmlwdHUuc2V0QXR0cmlidXRlKFwiYXN5bmNcIiwgXCJ0cnVlXCIpOyAvLyBGSVhNRSBhc3luYyA/XG4gICAgICAgIC8vIGhlYWQgb3UgYm9keSBvdSBhdXRyZXMgP1xuICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgIGlmIChzY3JpcHRvID09PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHNjcmlwdHUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcydpbCBleGlzdGUgZMOpasOgLCBvbiBsZSByZW1wbGFjZSAhXG4gICAgICAgICAgICBub2RlLnJlcGxhY2VDaGlsZChzY3JpcHR1LCBzY3JpcHRvKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAqIGRlbGV0ZSBTY3JpcHRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYWxsYmFja0lkIC0gY2FsbGJhY2sgSWRcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBfZGVsZXRlU2NyaXB0IDogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzdWx0c1wiICsgY2FsbGJhY2tJZCk7XG4gICAgICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gc2NyaXB0LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlNPTlA7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Protocols/JSONP.js\n"); - -/***/ }), - -/***/ "./src/Protocols/Protocol.js": -/*!***********************************!*\ - !*** ./src/Protocols/Protocol.js ***! - \***********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _XHR__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./XHR */ \"./src/Protocols/XHR.js\");\n/* harmony import */ var _JSONP__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./JSONP */ \"./src/Protocols/JSONP.js\");\n/**\n * Interface de dialogue avec les webservices\n *\n * @module Protocols\n * @private\n * @alias Gp.Protocols\n */\n\n\n\nvar Protocol = {\n /**\n * Interface unique d\"envoi d\"une requête.\n *\n * @method send\n * @static\n * @param {Object} options - options generales\n * @param {String} options.url - url du service\n * @param {String} options.method - GET, POST, PUT, DELETE\n * @param {String} options.protocol - XHR | JSONP\n * @param {String} options.format - format de la reponse du service : json, xml ou null (brute)...\n * @param {String} options.wrap - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP)\n * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix=\"\", la fonction s'appellera \"callback\")\n * @param {String} options.timeOut - 0 ms\n * @param {Boolean} options.nocache - true|false\n * @param {Object|String} options.data - content (post) ou param (get)\n * @param {Object|String} options.headers - (post) ex. referer\n * @param {Object|String} options.content - (post) ex. \"application/json\"\n * @param {String} options.scope - this (TODO)\n * @param {Function} options.onResponse - callback\n * @param {Function} options.onFailure - callback\n * @param {Function} options.onTimeOut - callback\n * @param {String} options.proxyUrl - (TODO)\n */\n send: function send(options) {\n // INFO\n // \"output\" - param est interne à la classe \"Protocol\" (parametrable via \"wrap\"), et à ajouter à l\"url\n // ce param est independant du service car il est géré par le filtre LUA :\n // ex. json|xml (json par defaut).\n // Ce param. permet d\"encapsuler du XML dans du JSON :\n // {http : {status:200, error:null},xml :\"réponse du service\"}\n // Utile pour les services qui ne repondent que du XML (ex. Geocodage)\n //\n // |-------------------------------------------------|\n // | \\service | | | |\n // | output\\ format| json | xml | remarques |\n // |--------\\------|------|-----|--------------------|\n // | json | json | json| json/xml encapsulé |\n // | xml | json | xml | param inactif |\n // |-------------------------------------------------|\n // ex. le service demande une reponse native au \"format\" json et avec un \"output\" json.\n // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas !\n // dans ce cas on ne renseigne pas output=json\n\n // INFO\n // \"wrap\" - choix d\"encapsuler ou non les reponses dans du JSON.\n // Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) !\n\n // INFO\n // \"callback\" - param est interne à la classe \"Protocol\" (non parametrable), et à ajouter à l\"url\n // ce param est independant du service car il est géré aussi par le filtre LUA :\n // ex. callback|null\n // Ce param. permet de renvoyer une reponse javascript :\n // callback ({http : {status:200, error:null},xml :\"réponse du service\"})\n // Ce param. est non renseigné par defaut car pour du JSONP, on utilise le\n // le protocol JSONP, et ce dernier implemente déjà le callback !\n\n // settings par defaut\n var settings = options || {\n method: \"GET\",\n // protocol : \"JSONP\",\n protocol: \"XHR\",\n timeOut: 0,\n format: null,\n wrap: true,\n nocache: true,\n output: \"json\",\n callback: null,\n callbackSuffix: null\n };\n\n // on determine l'environnement d'execution : browser ou non ?\n // et on stoppe pour nodeJS... sur un protocole JSONP !\n if (typeof window === \"undefined\" && options.protocol === \"JSONP\") {\n console.log(\"Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS\");\n return;\n }\n if (options.protocol === \"XHR\" || options.format === \"json\") {\n settings.wrap = false;\n } else if (options.protocol === \"JSONP\" && options.format === \"xml\") {\n settings.wrap = true;\n }\n settings.callback = null; // FIXME non géré !?\n settings.output = settings.wrap ? \"json\" : null;\n\n // on encapsule les reponses dans un objet JSON\n if (settings.wrap) {\n var params = {};\n params.output = settings.output;\n params.callback = settings.callback;\n delete params.callback; // FIXME non géré !?\n settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].normalyzeUrl(options.url, params);\n }\n\n // choix de l\"implementation :\n // XHR ou JSONP\n switch (settings.protocol) {\n case \"XHR\":\n // on normalise l'url (gestion du cache)\n if (options.method === \"GET\" && options.nocache) {\n settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].normalyzeUrl(settings.url, {\n t: new Date().getTime()\n });\n }\n // appel du service en XHR\n _XHR__WEBPACK_IMPORTED_MODULE_1__[\"default\"].call(settings);\n break;\n case \"JSONP\":\n // on normalise l'url si les params. sont renseignés dans la string|object \"data\"\n if (settings.data) {\n settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].normalyzeUrl(settings.url, settings.data);\n }\n\n // appel du service en JSONP\n _JSONP__WEBPACK_IMPORTED_MODULE_2__[\"default\"].call(settings);\n break;\n default:\n throw new Error(\"protocol not supported (XHR|JSONP) !\");\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Protocol);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Qcm90b2NvbHMvUHJvdG9jb2wuanM/YTE4MyJdLCJuYW1lcyI6WyJQcm90b2NvbCIsInNlbmQiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJtZXRob2QiLCJwcm90b2NvbCIsInRpbWVPdXQiLCJmb3JtYXQiLCJ3cmFwIiwibm9jYWNoZSIsIm91dHB1dCIsImNhbGxiYWNrIiwiY2FsbGJhY2tTdWZmaXgiLCJ3aW5kb3ciLCJjb25zb2xlIiwibG9nIiwicGFyYW1zIiwidXJsIiwiSGVscGVyIiwibm9ybWFseXplVXJsIiwidCIsIkRhdGUiLCJnZXRUaW1lIiwiWEhSIiwiY2FsbCIsImRhdGEiLCJKU09OUCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3FDO0FBQ2I7QUFDSTtBQUU1QixJQUFJQSxRQUFRLEdBQUc7RUFFWDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLElBQUksRUFBRyxTQUFBQSxLQUFVQyxPQUFPLEVBQUU7SUFDdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztJQUVBO0lBQ0E7SUFDQTs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztJQUVBO0lBQ0EsSUFBSUMsUUFBUSxHQUFHRCxPQUFPLElBQUk7TUFDdEJFLE1BQU0sRUFBRyxLQUFLO01BQ2Q7TUFDQUMsUUFBUSxFQUFHLEtBQUs7TUFDaEJDLE9BQU8sRUFBRyxDQUFDO01BQ1hDLE1BQU0sRUFBRyxJQUFJO01BQ2JDLElBQUksRUFBRyxJQUFJO01BQ1hDLE9BQU8sRUFBRyxJQUFJO01BQ2RDLE1BQU0sRUFBRyxNQUFNO01BQ2ZDLFFBQVEsRUFBRyxJQUFJO01BQ2ZDLGNBQWMsRUFBRztJQUNyQixDQUFDOztJQUVEO0lBQ0E7SUFDQSxJQUFJLE9BQU9DLE1BQU0sS0FBSyxXQUFXLElBQUlYLE9BQU8sQ0FBQ0csUUFBUSxLQUFLLE9BQU8sRUFBRTtNQUMvRFMsT0FBTyxDQUFDQyxHQUFHLENBQUMsd0ZBQXdGLENBQUM7TUFDckc7SUFDSjtJQUVBLElBQUliLE9BQU8sQ0FBQ0csUUFBUSxLQUFLLEtBQUssSUFBSUgsT0FBTyxDQUFDSyxNQUFNLEtBQUssTUFBTSxFQUFFO01BQ3pESixRQUFRLENBQUNLLElBQUksR0FBRyxLQUFLO0lBQ3pCLENBQUMsTUFBTSxJQUFJTixPQUFPLENBQUNHLFFBQVEsS0FBSyxPQUFPLElBQUlILE9BQU8sQ0FBQ0ssTUFBTSxLQUFLLEtBQUssRUFBRTtNQUNqRUosUUFBUSxDQUFDSyxJQUFJLEdBQUcsSUFBSTtJQUN4QjtJQUVBTCxRQUFRLENBQUNRLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxQlIsUUFBUSxDQUFDTyxNQUFNLEdBQUdQLFFBQVEsQ0FBQ0ssSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJOztJQUUvQztJQUNBLElBQUlMLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO01BQ2YsSUFBSVEsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUNmQSxNQUFNLENBQUNOLE1BQU0sR0FBR1AsUUFBUSxDQUFDTyxNQUFNO01BQy9CTSxNQUFNLENBQUNMLFFBQVEsR0FBR1IsUUFBUSxDQUFDUSxRQUFRO01BQ25DLE9BQU9LLE1BQU0sQ0FBQ0wsUUFBUSxDQUFDLENBQUM7TUFDeEJSLFFBQVEsQ0FBQ2MsR0FBRyxHQUFHQyxxREFBTSxDQUFDQyxZQUFZLENBQUNqQixPQUFPLENBQUNlLEdBQUcsRUFBRUQsTUFBTSxDQUFDO0lBQzNEOztJQUVBO0lBQ0E7SUFDQSxRQUFRYixRQUFRLENBQUNFLFFBQVE7TUFDckIsS0FBSyxLQUFLO1FBQ047UUFDQSxJQUFJSCxPQUFPLENBQUNFLE1BQU0sS0FBSyxLQUFLLElBQUlGLE9BQU8sQ0FBQ08sT0FBTyxFQUFFO1VBQzdDTixRQUFRLENBQUNjLEdBQUcsR0FBR0MscURBQU0sQ0FBQ0MsWUFBWSxDQUFDaEIsUUFBUSxDQUFDYyxHQUFHLEVBQUU7WUFDN0NHLENBQUMsRUFBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUM7VUFDM0IsQ0FBQyxDQUFDO1FBQ047UUFDQTtRQUNBQyw0Q0FBRyxDQUFDQyxJQUFJLENBQUNyQixRQUFRLENBQUM7UUFDbEI7TUFDSixLQUFLLE9BQU87UUFFUjtRQUNBLElBQUlBLFFBQVEsQ0FBQ3NCLElBQUksRUFBRTtVQUNmdEIsUUFBUSxDQUFDYyxHQUFHLEdBQUdDLHFEQUFNLENBQUNDLFlBQVksQ0FBQ2hCLFFBQVEsQ0FBQ2MsR0FBRyxFQUFFZCxRQUFRLENBQUNzQixJQUFJLENBQUM7UUFDbkU7O1FBRUE7UUFDQUMsOENBQUssQ0FBQ0YsSUFBSSxDQUFDckIsUUFBUSxDQUFDO1FBQ3BCO01BQ0o7UUFDSSxNQUFNLElBQUl3QixLQUFLLENBQUMsc0NBQXNDLENBQUM7SUFDL0Q7RUFDSjtBQUVKLENBQUM7QUFFYzNCLHVFQUFRIiwiZmlsZSI6Ii4vc3JjL1Byb3RvY29scy9Qcm90b2NvbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJmYWNlIGRlIGRpYWxvZ3VlIGF2ZWMgbGVzIHdlYnNlcnZpY2VzXG4gKlxuICogQG1vZHVsZSBQcm90b2NvbHNcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgR3AuUHJvdG9jb2xzXG4gKi9cbmltcG9ydCBIZWxwZXIgZnJvbSBcIi4uL1V0aWxzL0hlbHBlclwiO1xuaW1wb3J0IFhIUiBmcm9tIFwiLi9YSFJcIjtcbmltcG9ydCBKU09OUCBmcm9tIFwiLi9KU09OUFwiO1xuXG52YXIgUHJvdG9jb2wgPSB7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmZhY2UgdW5pcXVlIGRcImVudm9pIGRcInVuZSByZXF1w6p0ZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2VuZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZ2VuZXJhbGVzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudXJsICAgICAgLSB1cmwgZHUgc2VydmljZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLm1ldGhvZCAgIC0gR0VULCBQT1NULCBQVVQsIERFTEVURVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnByb3RvY29sIC0gWEhSIHwgSlNPTlBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5mb3JtYXQgICAtIGZvcm1hdCBkZSBsYSByZXBvbnNlIGR1IHNlcnZpY2UgOiBqc29uLCB4bWwgb3UgbnVsbCAoYnJ1dGUpLi4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMud3JhcCAgICAgLSBlbmNhcHN1bGVyIGxhIHJlcG9uc2UgZHUgc2VydmljZSBkYW5zIGR1IEpTT04gOiB0cnVlfGZhbHNlICh0cnVlIHBhciBkZWZhdXQgc3VyIGxlIHByb3RvY29sZSBKU09OUClcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5jYWxsYmFja1N1ZmZpeCAtIHN1ZmZpeGUgZGUgbGEgZm9uY3Rpb24gZGUgY2FsbGJhY2sgKEpTT05QIHVuaXF1ZW1lbnQpIChleDogc2kgY2FsbGJhY2tTdWZmaXg9XCJcIiwgbGEgZm9uY3Rpb24gcydhcHBlbGxlcmEgXCJjYWxsYmFja1wiKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRpbWVPdXQgIC0gMCBtc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5ub2NhY2hlICAtIHRydWV8ZmFsc2VcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnMuZGF0YSAgICAgICAgLSBjb250ZW50IChwb3N0KSBvdSBwYXJhbSAoZ2V0KVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9ucy5oZWFkZXJzICAgICAtIChwb3N0KSBleC4gcmVmZXJlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9ucy5jb250ZW50IC0gKHBvc3QpIGV4LiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnNjb3BlICAgICAgIC0gdGhpcyAoVE9ETylcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uUmVzcG9uc2UgLSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMub25GYWlsdXJlIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uVGltZU91dCAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucHJveHlVcmwgLSAgKFRPRE8pXG4gICAgICovXG4gICAgc2VuZCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gXCJvdXRwdXRcIiAtIHBhcmFtIGVzdCBpbnRlcm5lIMOgIGxhIGNsYXNzZSBcIlByb3RvY29sXCIgKHBhcmFtZXRyYWJsZSB2aWEgXCJ3cmFwXCIpLCBldCDDoCBham91dGVyIMOgIGxcInVybFxuICAgICAgICAvLyAgICAgIGNlIHBhcmFtIGVzdCBpbmRlcGVuZGFudCBkdSBzZXJ2aWNlIGNhciBpbCBlc3QgZ8OpcsOpIHBhciBsZSBmaWx0cmUgTFVBIDpcbiAgICAgICAgLy8gICAgICAgICAgZXguIGpzb258eG1sIChqc29uIHBhciBkZWZhdXQpLlxuICAgICAgICAvLyAgICAgICAgICBDZSBwYXJhbS4gcGVybWV0IGRcImVuY2Fwc3VsZXIgZHUgWE1MIGRhbnMgZHUgSlNPTiA6XG4gICAgICAgIC8vICAgICAgICAgICAgICB7aHR0cCA6IHtzdGF0dXM6MjAwLCBlcnJvcjpudWxsfSx4bWwgOlwicsOpcG9uc2UgZHUgc2VydmljZVwifVxuICAgICAgICAvLyAgICAgICAgICBVdGlsZSBwb3VyIGxlcyBzZXJ2aWNlcyBxdWkgbmUgcmVwb25kZW50IHF1ZSBkdSBYTUwgKGV4LiBHZW9jb2RhZ2UpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAvLyB8ICAgICAgXFxzZXJ2aWNlIHwgICAgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgIC8vIHwgb3V0cHV0XFwgZm9ybWF0fCBqc29uIHwgeG1sIHwgICAgIHJlbWFycXVlcyAgICAgIHxcbiAgICAgICAgLy8gfC0tLS0tLS0tXFwtLS0tLS18LS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAvLyB8ICAgIGpzb24gICAgICAgfCBqc29uIHwganNvbnwganNvbi94bWwgZW5jYXBzdWzDqSB8XG4gICAgICAgIC8vIHwgICAgeG1sICAgICAgICB8IGpzb24gfCB4bWwgfCBwYXJhbSBpbmFjdGlmICAgICAgfFxuICAgICAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAgICAgLy8gZXguIGxlIHNlcnZpY2UgZGVtYW5kZSB1bmUgcmVwb25zZSBuYXRpdmUgYXUgXCJmb3JtYXRcIiBqc29uIGV0IGF2ZWMgdW4gXCJvdXRwdXRcIiBqc29uLlxuICAgICAgICAvLyBvbiBhIGRvbmMgdW5lIHJlcG9uc2UganNvbiBlbmNhcHN1bMOpIGRhbnMgdW4ganNvbiA6IGNlIHF1J29uIG5lIHNvdWhhaXRlIHBhcyAhXG4gICAgICAgIC8vIGRhbnMgY2UgY2FzIG9uIG5lIHJlbnNlaWduZSBwYXMgb3V0cHV0PWpzb25cblxuICAgICAgICAvLyBJTkZPXG4gICAgICAgIC8vIFwid3JhcFwiIC0gY2hvaXggZFwiZW5jYXBzdWxlciBvdSBub24gbGVzIHJlcG9uc2VzIGRhbnMgZHUgSlNPTi5cbiAgICAgICAgLy8gICAgICBQYXIgZGVmYXV0LCBvbiBlbmNhcHN1bGUgdW5pcXVlbWVudCBsZXMgcmVwb25zZXMgc3VyIGxlIHByb3RvY29sZSBKU09OUCAoZXQgcXVpIHNvbnQgZW4geG1sKSAhXG5cbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyBcImNhbGxiYWNrXCIgLSBwYXJhbSBlc3QgaW50ZXJuZSDDoCBsYSBjbGFzc2UgXCJQcm90b2NvbFwiIChub24gcGFyYW1ldHJhYmxlKSwgZXQgw6AgYWpvdXRlciDDoCBsXCJ1cmxcbiAgICAgICAgLy8gICAgICBjZSBwYXJhbSBlc3QgaW5kZXBlbmRhbnQgZHUgc2VydmljZSBjYXIgaWwgZXN0IGfDqXLDqSBhdXNzaSBwYXIgbGUgZmlsdHJlIExVQSA6XG4gICAgICAgIC8vICAgICAgICAgIGV4LiBjYWxsYmFja3xudWxsXG4gICAgICAgIC8vICAgICAgICAgIENlIHBhcmFtLiBwZXJtZXQgZGUgcmVudm95ZXIgdW5lIHJlcG9uc2UgamF2YXNjcmlwdCA6XG4gICAgICAgIC8vICAgICAgICAgICAgICBjYWxsYmFjayAoe2h0dHAgOiB7c3RhdHVzOjIwMCwgZXJyb3I6bnVsbH0seG1sIDpcInLDqXBvbnNlIGR1IHNlcnZpY2VcIn0pXG4gICAgICAgIC8vICAgICAgICAgIENlIHBhcmFtLiBlc3Qgbm9uIHJlbnNlaWduw6kgcGFyIGRlZmF1dCBjYXIgcG91ciBkdSBKU09OUCwgb24gdXRpbGlzZSBsZVxuICAgICAgICAvLyAgICAgICAgICBsZSBwcm90b2NvbCBKU09OUCwgZXQgY2UgZGVybmllciBpbXBsZW1lbnRlIGTDqWrDoCBsZSBjYWxsYmFjayAhXG5cbiAgICAgICAgLy8gc2V0dGluZ3MgcGFyIGRlZmF1dFxuICAgICAgICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHtcbiAgICAgICAgICAgIG1ldGhvZCA6IFwiR0VUXCIsXG4gICAgICAgICAgICAvLyBwcm90b2NvbCA6IFwiSlNPTlBcIixcbiAgICAgICAgICAgIHByb3RvY29sIDogXCJYSFJcIixcbiAgICAgICAgICAgIHRpbWVPdXQgOiAwLFxuICAgICAgICAgICAgZm9ybWF0IDogbnVsbCxcbiAgICAgICAgICAgIHdyYXAgOiB0cnVlLFxuICAgICAgICAgICAgbm9jYWNoZSA6IHRydWUsXG4gICAgICAgICAgICBvdXRwdXQgOiBcImpzb25cIixcbiAgICAgICAgICAgIGNhbGxiYWNrIDogbnVsbCxcbiAgICAgICAgICAgIGNhbGxiYWNrU3VmZml4IDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG9uIGRldGVybWluZSBsJ2Vudmlyb25uZW1lbnQgZCdleGVjdXRpb24gOiBicm93c2VyIG91IG5vbiA/XG4gICAgICAgIC8vIGV0IG9uIHN0b3BwZSBwb3VyIG5vZGVKUy4uLiBzdXIgdW4gcHJvdG9jb2xlIEpTT05QICFcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgJiYgb3B0aW9ucy5wcm90b2NvbCA9PT0gXCJKU09OUFwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZhbHVlIChzKSBmb3IgcGFyYW1ldGVyIChzKSAncHJvdG9jb2w9SlNPTlAgKGluc3RlYWQgdXNlIFhIUiknIG5vdCBzdXBwb3J0ZWQgdG8gTm9kZUpTXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09IFwiWEhSXCIgfHwgb3B0aW9ucy5mb3JtYXQgPT09IFwianNvblwiKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy53cmFwID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wcm90b2NvbCA9PT0gXCJKU09OUFwiICYmIG9wdGlvbnMuZm9ybWF0ID09PSBcInhtbFwiKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy53cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmdzLmNhbGxiYWNrID0gbnVsbDsgLy8gRklYTUUgbm9uIGfDqXLDqSAhP1xuICAgICAgICBzZXR0aW5ncy5vdXRwdXQgPSBzZXR0aW5ncy53cmFwID8gXCJqc29uXCIgOiBudWxsO1xuXG4gICAgICAgIC8vIG9uIGVuY2Fwc3VsZSBsZXMgcmVwb25zZXMgZGFucyB1biBvYmpldCBKU09OXG4gICAgICAgIGlmIChzZXR0aW5ncy53cmFwKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0ID0gc2V0dGluZ3Mub3V0cHV0O1xuICAgICAgICAgICAgcGFyYW1zLmNhbGxiYWNrID0gc2V0dGluZ3MuY2FsbGJhY2s7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmNhbGxiYWNrOyAvLyBGSVhNRSBub24gZ8OpcsOpICE/XG4gICAgICAgICAgICBzZXR0aW5ncy51cmwgPSBIZWxwZXIubm9ybWFseXplVXJsKG9wdGlvbnMudXJsLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hvaXggZGUgbFwiaW1wbGVtZW50YXRpb24gOlxuICAgICAgICAvLyBYSFIgb3UgSlNPTlBcbiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5wcm90b2NvbCkge1xuICAgICAgICAgICAgY2FzZSBcIlhIUlwiOlxuICAgICAgICAgICAgICAgIC8vIG9uIG5vcm1hbGlzZSBsJ3VybCAoZ2VzdGlvbiBkdSBjYWNoZSlcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tZXRob2QgPT09IFwiR0VUXCIgJiYgb3B0aW9ucy5ub2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnVybCA9IEhlbHBlci5ub3JtYWx5emVVcmwoc2V0dGluZ3MudXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0IDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGVsIGR1IHNlcnZpY2UgZW4gWEhSXG4gICAgICAgICAgICAgICAgWEhSLmNhbGwoc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkpTT05QXCI6XG5cbiAgICAgICAgICAgICAgICAvLyBvbiBub3JtYWxpc2UgbCd1cmwgc2kgbGVzIHBhcmFtcy4gc29udCByZW5zZWlnbsOpcyBkYW5zIGxhIHN0cmluZ3xvYmplY3QgXCJkYXRhXCJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy51cmwgPSBIZWxwZXIubm9ybWFseXplVXJsKHNldHRpbmdzLnVybCwgc2V0dGluZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gYXBwZWwgZHUgc2VydmljZSBlbiBKU09OUFxuICAgICAgICAgICAgICAgIEpTT05QLmNhbGwoc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcm90b2NvbCBub3Qgc3VwcG9ydGVkIChYSFJ8SlNPTlApICFcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb3RvY29sO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Protocols/Protocol.js\n"); - -/***/ }), - -/***/ "./src/Protocols/XHR.js": -/*!******************************!*\ - !*** ./src/Protocols/XHR.js ***! - \******************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! es6-promise */ \"./node_modules/es6-promise/dist/es6-promise.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_2__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/* global Promise, require, XDomainRequest */\n\n\n\n\n// import __request from \"request\";\n// import __xmldom from \"xmldom\";\n\n/**\n * Ajax Request (use of Promises)\n *\n * @module XHR\n * @alias Gp.Protocols.XHR\n * @see dependance 'es6-promise'\n */\n\n// cf. https://xhr.spec.whatwg.org/\n// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n\nvar XHR = {\n /**\n * Interface unique d'envoi d'une requête.\n *\n * @method call\n * @static\n * @param {Object} settings - options generales\n * @param {String} settings.url - url du service\n * @param {String} settings.method - GET, POST, PUT, DELETE\n * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute)\n * @param {String} settings.data - content (post) ou param (get)\n * @param {String} settings.proxy - proxy url\n * @param {Object|String} settings.headers - (post) ex. referer\n * @param {Object|String} settings.content - (post) ex. 'application/json'\n * @param {String} settings.timeOut - timeout = 0 par defaut\n * @param {String} settings.scope - this\n * @param {Function} settings.onResponse - callback\n * @param {Function} settings.onFailure - callback\n */\n call: function call(settings) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"XHR\");\n logger.trace(\"[XHR::call()]\");\n\n // FIXME\n // To polyfill the global environment\n es6_promise__WEBPACK_IMPORTED_MODULE_2___default.a.polyfill();\n\n // test sur les settings obligatoires\n if (!settings.url) {\n throw new Error(\"missing parameter : url is not defined !\");\n }\n if (!settings.method) {\n throw new Error(\"missing parameter : method is not defined !\");\n }\n if (!settings.format) {\n settings.format = \"text\"; // reponse brute !\n }\n\n var options = {};\n options.url = settings.url;\n options.data = settings.data ? settings.data : null;\n options.method = settings.method;\n options.timeOut = settings.timeOut || 0;\n options.scope = settings.scope || this;\n options.proxy = settings.proxy || null;\n options.content = settings.content || null;\n options.headers = settings.headers || {\n referer: \"http://localhost\"\n };\n\n // test sur les valeurs de 'settings.method'\n switch (settings.method) {\n case \"DELETE\":\n case \"GET\":\n break;\n case \"PUT\":\n case \"POST\":\n // on force sur ces params spécifiques au mode POST\n options.content = settings.content ? settings.content : \"application/x-www-form-urlencoded\"; // FIXME en attente des services : bascule en \"application/xml\" ou \"application/json\"\n options.headers = settings.headers ? settings.headers : {\n referer: \"http://localhost\"\n }; // FIXME parametrable...\n break;\n case \"HEAD\":\n case \"OPTIONS\":\n throw new Error(\"HTTP method not yet supported !\");\n default:\n throw new Error(\"HTTP method unknown !\");\n }\n\n // test sur les valeurs de 'settings.format'\n switch (settings.format) {\n case \"text\":\n this.__call(options).then(function (response) {\n logger.trace(response);\n settings.onResponse.call(this, response);\n })[\"catch\"](function (error) {\n settings.onFailure.call(this, error);\n });\n break;\n case \"json\":\n this.__callJSON(options).then(function (response) {\n logger.trace(response);\n settings.onResponse.call(this, response);\n })[\"catch\"](function (error) {\n settings.onFailure.call(this, error);\n });\n break;\n case \"xml\":\n this.__callXML(options).then(function (response) {\n logger.trace(response);\n settings.onResponse.call(this, response);\n })[\"catch\"](function (error) {\n settings.onFailure.call(this, error);\n });\n break;\n default:\n throw new Error(\"This output Format is not yet supported !\");\n }\n },\n /**\n * Requete\n *\n * @method __call\n * @private\n * @param {Object} options - options\n * @return {Object} promise\n */\n __call: function __call(options) {\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"XHR\");\n logger.trace(\"[XHR::__call()]\");\n var promise = new Promise(function (resolve, reject) {\n // traitement du corps de la requête\n var corps = options.method === \"POST\" || options.method === \"PUT\" ? 1 : 0;\n\n // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères)\n if (options.data && (_typeof(options.data) === \"object\" && Object.keys(options.data).length || typeof options.data === \"string\" && options.data.length) && !corps) {\n if (options.scope.CLASSNAME === \"Geocode\" || options.scope.CLASSNAME === \"ReverseGeocode\") {\n options.url = options.url + options.data;\n } else {\n options.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(options.url, options.data);\n }\n }\n logger.trace(\"URL = \", options.url);\n var hXHR = null;\n\n // test on env. nodejs or browser\n if (typeof window === \"undefined\") {\n var nodefetch = __webpack_require__(/*! node-fetch */ \"node-fetch\");\n var opts = {\n headers: {\n Referer: \"https://localhost\"\n }\n };\n if (options.data && typeof options.data === \"string\" && corps) {\n opts = {\n method: options.method,\n body: options.data,\n headers: {\n \"Content-Type\": options.content,\n Referer: \"https://localhost\"\n }\n };\n }\n return nodefetch(options.url, opts).then(function (response) {\n if (response.ok) {\n // res.status >= 200 && res.status < 300\n resolve(response.text());\n } else {\n var message = \"Errors Occured on Http Request (status : '\" + response.statusText + \"' | url : '\" + response.url + \"')\";\n var status = response.status;\n reject({\n message: message,\n status: status\n });\n }\n })[\"catch\"](function (e) {\n reject({\n message: e,\n status: -1\n });\n });\n } else {\n if (window.XMLHttpRequest) {\n logger.trace(\"XMLHttpRequest\");\n hXHR = new XMLHttpRequest();\n hXHR.open(options.method, options.url, true); // async\n hXHR.overrideMimeType = options.content;\n\n // gestion du timeout\n var onTimeOutTrigger = null;\n if (options.timeOut > 0) {\n // FIXME le timeout interne ne me permet pas de declencher le bon message...\n // hXHR.timeout = options.timeOut;\n logger.trace(\"XHR - TimeOut actif !\");\n /**\n * Description\n *\n * @method onTimeOutTrigger\n * @private\n */\n onTimeOutTrigger = window.setTimeout(function () {\n var message = \"TimeOut Occured on Http Request with XMLHttpRequest !\";\n reject({\n message: message,\n status: -1\n });\n }, options.timeOut);\n }\n if (corps) {\n // headers, data, content of data\n // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader\n logger.trace(\"data = \", options.data);\n hXHR.setRequestHeader(\"Content-type\", options.content);\n // FIXME refused to set unsafe header content-length javascript\n // hXHR.setRequestHeader (\"Content-length\", options.data.length);\n // hXHR.setRequestHeader (\"Referer\", options.headers.referer);\n }\n\n /**\n * On Error\n * FIXME ne se declenche pas !?\n *\n * @param {Object} e - Event\n * @method onerror\n * @private\n */\n hXHR.onerror = function (e) {\n console.log(e);\n reject(new Error(\"Errors Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * On Timeout\n * FIXME ne se declenche pas !?\n *\n * @param {Object} e - Event\n * @method ontimeout\n * @private\n */\n hXHR.ontimeout = function (e) {\n console.log(e);\n reject(new Error(\"TimeOut Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * Description\n *\n * @method onreadystatechange\n * @private\n */\n hXHR.onreadystatechange = function (e) {\n if (hXHR.readyState === 4) {\n // DONE\n if (hXHR.status === 200) {\n window.clearTimeout(onTimeOutTrigger);\n resolve(hXHR.response);\n } else {\n var message = \"Errors Occured on Http Request (status : '\" + e.target.statusText + \"' | url : '\" + e.target.responseURL + \"' | response : '\" + e.target.response + \"')\";\n var status = e.target.status;\n reject({\n message: message,\n status: status\n });\n }\n }\n };\n\n // gestion du content data\n var data4xhr = options.data && corps ? options.data : null;\n hXHR.send(data4xhr);\n } else if (window.XDomainRequest) {\n // worked in Internet Explorer 8–10 only !\n logger.trace(\"XDomainRequest\");\n hXHR = new XDomainRequest();\n hXHR.open(options.method, options.url);\n hXHR.overrideMimeType = options.content;\n if (options.timeOut > 0) {\n hXHR.timeout = options.timeout;\n logger.trace(\"XHR - TimeOut actif !\");\n }\n if (corps) {\n // headers, data, content of data\n // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader\n hXHR.setRequestHeader(\"Content-type\", options.content);\n // FIXME refused to set unsafe header content-length javascript\n // hXHR.setRequestHeader (\"Content-length\", options.data.length);\n // hXHR.setRequestHeader (\"Referer\", options.headers.referer);\n }\n\n /**\n * Description\n *\n * @method onerror\n * @private\n */\n hXHR.onerror = function () {\n reject(new Error(\"Errors Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * Description\n *\n * @method ontimeout\n * @private\n */\n hXHR.ontimeout = function () {\n reject(new Error(\"TimeOut Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * On Load\n *\n * @method onload\n * @private\n */\n hXHR.onload = function (e) {\n if (hXHR.status === 200) {\n resolve(hXHR.responseText);\n } else {\n var message = \"Errors Occured on Http Request (status : '\" + e.target.statusText + \"' | url : '\" + e.target.responseURL + \"')\";\n var status = e.target.status;\n reject({\n message: message,\n status: status\n });\n }\n };\n var data4xdr = options.data && corps ? options.data : null;\n hXHR.send(data4xdr);\n } else {\n throw new Error(\"CORS not supported\");\n }\n }\n });\n return promise;\n },\n /**\n * Requete avec parser JSON\n *\n * @method __callJSON\n * @private\n * @param {Object} options - options\n * @return {Object} promise\n */\n __callJSON: function __callJSON(options) {\n return this.__call(options).then(JSON.parse)[\"catch\"](function (error) {\n console.log(\"_callJSON failed on : \", options.url, error);\n // FIXME pas d'exception, laissons le fil se derouler...\n // throw error;\n });\n },\n\n /**\n * Requete avec parser XML\n *\n * @method __callXML\n * @private\n * @param {Object} options - options\n * @return {Object} promise\n */\n __callXML: function __callXML(options) {\n return this.__call(options).then(function (response) {\n var xmlDoc;\n\n // test on env. nodejs or browser\n if (typeof window === \"undefined\") {\n var DOMParser = __webpack_require__(/*! xmldom */ \"xmldom\").DOMParser; // __xmldom.DOMParser\n xmlDoc = new DOMParser().parseFromString(response, \"text/xml\");\n } else {\n if (window.DOMParser) {\n var parser = new window.DOMParser();\n xmlDoc = parser.parseFromString(response, \"text/xml\");\n } else {\n // IE\n xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = false;\n xmlDoc.loadXML(response);\n }\n }\n return xmlDoc;\n })[\"catch\"](function (error) {\n console.log(\"__callXML failed on : \", options.url, error);\n // FIXME pas d'exception, laissons le fil se derouler...\n // throw error;\n });\n }\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (XHR);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Qcm90b2NvbHMvWEhSLmpzPzgzNGIiXSwibmFtZXMiOlsiWEhSIiwiY2FsbCIsInNldHRpbmdzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJFUzZQcm9taXNlIiwicG9seWZpbGwiLCJ1cmwiLCJFcnJvciIsIm1ldGhvZCIsImZvcm1hdCIsIm9wdGlvbnMiLCJkYXRhIiwidGltZU91dCIsInNjb3BlIiwicHJveHkiLCJjb250ZW50IiwiaGVhZGVycyIsInJlZmVyZXIiLCJfX2NhbGwiLCJ0aGVuIiwicmVzcG9uc2UiLCJvblJlc3BvbnNlIiwiZXJyb3IiLCJvbkZhaWx1cmUiLCJfX2NhbGxKU09OIiwiX19jYWxsWE1MIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY29ycHMiLCJfdHlwZW9mIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIkNMQVNTTkFNRSIsIkhlbHBlciIsIm5vcm1hbHl6ZVVybCIsImhYSFIiLCJ3aW5kb3ciLCJub2RlZmV0Y2giLCJyZXF1aXJlIiwib3B0cyIsIlJlZmVyZXIiLCJib2R5Iiwib2siLCJ0ZXh0IiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJzdGF0dXMiLCJlIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib3ZlcnJpZGVNaW1lVHlwZSIsIm9uVGltZU91dFRyaWdnZXIiLCJzZXRUaW1lb3V0Iiwic2V0UmVxdWVzdEhlYWRlciIsIm9uZXJyb3IiLCJjb25zb2xlIiwibG9nIiwib250aW1lb3V0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsImNsZWFyVGltZW91dCIsInRhcmdldCIsInJlc3BvbnNlVVJMIiwiZGF0YTR4aHIiLCJzZW5kIiwiWERvbWFpblJlcXVlc3QiLCJ0aW1lb3V0Iiwib25sb2FkIiwicmVzcG9uc2VUZXh0IiwiZGF0YTR4ZHIiLCJKU09OIiwicGFyc2UiLCJ4bWxEb2MiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJwYXJzZXIiLCJBY3RpdmVYT2JqZWN0IiwiYXN5bmMiLCJsb2FkWE1MIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFFOEM7QUFDVDtBQUNBO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJQSxHQUFHLEdBQUc7RUFFTjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsSUFBSSxFQUFHLFNBQUFBLEtBQVVDLFFBQVEsRUFBRTtJQUN2QjtJQUNBLElBQUlDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLEtBQUssQ0FBQztJQUNwQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsZUFBZSxDQUFDOztJQUU3QjtJQUNBO0lBQ0FDLGtEQUFVLENBQUNDLFFBQVEsQ0FBQyxDQUFDOztJQUVyQjtJQUNBLElBQUksQ0FBQ04sUUFBUSxDQUFDTyxHQUFHLEVBQUU7TUFDZixNQUFNLElBQUlDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztJQUMvRDtJQUVBLElBQUksQ0FBQ1IsUUFBUSxDQUFDUyxNQUFNLEVBQUU7TUFDbEIsTUFBTSxJQUFJRCxLQUFLLENBQUMsNkNBQTZDLENBQUM7SUFDbEU7SUFFQSxJQUFJLENBQUNSLFFBQVEsQ0FBQ1UsTUFBTSxFQUFFO01BQ2xCVixRQUFRLENBQUNVLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztJQUM5Qjs7SUFFQSxJQUFJQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCQSxPQUFPLENBQUNKLEdBQUcsR0FBR1AsUUFBUSxDQUFDTyxHQUFHO0lBQzFCSSxPQUFPLENBQUNDLElBQUksR0FBR1osUUFBUSxDQUFDWSxJQUFJLEdBQUdaLFFBQVEsQ0FBQ1ksSUFBSSxHQUFHLElBQUk7SUFDbkRELE9BQU8sQ0FBQ0YsTUFBTSxHQUFHVCxRQUFRLENBQUNTLE1BQU07SUFDaENFLE9BQU8sQ0FBQ0UsT0FBTyxHQUFHYixRQUFRLENBQUNhLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDRixPQUFPLENBQUNHLEtBQUssR0FBR2QsUUFBUSxDQUFDYyxLQUFLLElBQUksSUFBSTtJQUN0Q0gsT0FBTyxDQUFDSSxLQUFLLEdBQUdmLFFBQVEsQ0FBQ2UsS0FBSyxJQUFJLElBQUk7SUFDdENKLE9BQU8sQ0FBQ0ssT0FBTyxHQUFHaEIsUUFBUSxDQUFDZ0IsT0FBTyxJQUFJLElBQUk7SUFDMUNMLE9BQU8sQ0FBQ00sT0FBTyxHQUFHakIsUUFBUSxDQUFDaUIsT0FBTyxJQUFJO01BQ2xDQyxPQUFPLEVBQUc7SUFDZCxDQUFDOztJQUVEO0lBQ0EsUUFBUWxCLFFBQVEsQ0FBQ1MsTUFBTTtNQUNuQixLQUFLLFFBQVE7TUFDYixLQUFLLEtBQUs7UUFDTjtNQUNKLEtBQUssS0FBSztNQUNWLEtBQUssTUFBTTtRQUNQO1FBQ0FFLE9BQU8sQ0FBQ0ssT0FBTyxHQUFHaEIsUUFBUSxDQUFDZ0IsT0FBTyxHQUFHaEIsUUFBUSxDQUFDZ0IsT0FBTyxHQUFHLG1DQUFtQyxDQUFDLENBQUM7UUFDN0ZMLE9BQU8sQ0FBQ00sT0FBTyxHQUFHakIsUUFBUSxDQUFDaUIsT0FBTyxHQUFHakIsUUFBUSxDQUFDaUIsT0FBTyxHQUFHO1VBQUVDLE9BQU8sRUFBRztRQUFtQixDQUFDLENBQUMsQ0FBQztRQUMxRjtNQUNKLEtBQUssTUFBTTtNQUNYLEtBQUssU0FBUztRQUNWLE1BQU0sSUFBSVYsS0FBSyxDQUFDLGlDQUFpQyxDQUFDO01BQ3REO1FBQ0ksTUFBTSxJQUFJQSxLQUFLLENBQUMsdUJBQXVCLENBQUM7SUFDaEQ7O0lBRUE7SUFDQSxRQUFRUixRQUFRLENBQUNVLE1BQU07TUFDbkIsS0FBSyxNQUFNO1FBQ1AsSUFBSSxDQUFDUyxNQUFNLENBQUNSLE9BQU8sQ0FBQyxDQUNmUyxJQUFJLENBQUMsVUFBVUMsUUFBUSxFQUFFO1VBQ3RCcEIsTUFBTSxDQUFDRyxLQUFLLENBQUNpQixRQUFRLENBQUM7VUFDdEJyQixRQUFRLENBQUNzQixVQUFVLENBQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFc0IsUUFBUSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxTQUNJLENBQUMsVUFBVUUsS0FBSyxFQUFFO1VBQ3BCdkIsUUFBUSxDQUFDd0IsU0FBUyxDQUFDekIsSUFBSSxDQUFDLElBQUksRUFBRXdCLEtBQUssQ0FBQztRQUN4QyxDQUFDLENBQUM7UUFDTjtNQUNKLEtBQUssTUFBTTtRQUNQLElBQUksQ0FBQ0UsVUFBVSxDQUFDZCxPQUFPLENBQUMsQ0FDbkJTLElBQUksQ0FBQyxVQUFVQyxRQUFRLEVBQUU7VUFDdEJwQixNQUFNLENBQUNHLEtBQUssQ0FBQ2lCLFFBQVEsQ0FBQztVQUN0QnJCLFFBQVEsQ0FBQ3NCLFVBQVUsQ0FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUVzQixRQUFRLENBQUM7UUFDNUMsQ0FBQyxDQUFDLFNBQ0ksQ0FBQyxVQUFVRSxLQUFLLEVBQUU7VUFDcEJ2QixRQUFRLENBQUN3QixTQUFTLENBQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFd0IsS0FBSyxDQUFDO1FBQ3hDLENBQUMsQ0FBQztRQUNOO01BQ0osS0FBSyxLQUFLO1FBQ04sSUFBSSxDQUFDRyxTQUFTLENBQUNmLE9BQU8sQ0FBQyxDQUNsQlMsSUFBSSxDQUFDLFVBQVVDLFFBQVEsRUFBRTtVQUN0QnBCLE1BQU0sQ0FBQ0csS0FBSyxDQUFDaUIsUUFBUSxDQUFDO1VBQ3RCckIsUUFBUSxDQUFDc0IsVUFBVSxDQUFDdkIsSUFBSSxDQUFDLElBQUksRUFBRXNCLFFBQVEsQ0FBQztRQUM1QyxDQUFDLENBQUMsU0FDSSxDQUFDLFVBQVVFLEtBQUssRUFBRTtVQUNwQnZCLFFBQVEsQ0FBQ3dCLFNBQVMsQ0FBQ3pCLElBQUksQ0FBQyxJQUFJLEVBQUV3QixLQUFLLENBQUM7UUFDeEMsQ0FBQyxDQUFDO1FBQ047TUFDSjtRQUNJLE1BQU0sSUFBSWYsS0FBSyxDQUFDLDJDQUEyQyxDQUFDO0lBQ3BFO0VBQ0osQ0FBQztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSVcsTUFBTSxFQUFHLFNBQUFBLE9BQVVSLE9BQU8sRUFBRTtJQUN4QixJQUFJVixNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDcENGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLGlCQUFpQixDQUFDO0lBRS9CLElBQUl1QixPQUFPLEdBQUcsSUFBSUMsT0FBTyxDQUNyQixVQUFVQyxPQUFPLEVBQUVDLE1BQU0sRUFBRTtNQUN2QjtNQUNBLElBQUlDLEtBQUssR0FBSXBCLE9BQU8sQ0FBQ0YsTUFBTSxLQUFLLE1BQU0sSUFBSUUsT0FBTyxDQUFDRixNQUFNLEtBQUssS0FBSyxHQUFJLENBQUMsR0FBRyxDQUFDOztNQUUzRTtNQUNBLElBQUlFLE9BQU8sQ0FBQ0MsSUFBSSxLQUFNb0IsT0FBQSxDQUFPckIsT0FBTyxDQUFDQyxJQUFJLE1BQUssUUFBUSxJQUFJcUIsTUFBTSxDQUFDQyxJQUFJLENBQUN2QixPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDdUIsTUFBTSxJQUFNLE9BQU94QixPQUFPLENBQUNDLElBQUksS0FBSyxRQUFRLElBQUlELE9BQU8sQ0FBQ0MsSUFBSSxDQUFDdUIsTUFBTyxDQUFDLElBQUksQ0FBQ0osS0FBSyxFQUFFO1FBQ2pLLElBQUlwQixPQUFPLENBQUNHLEtBQUssQ0FBQ3NCLFNBQVMsS0FBSyxTQUFTLElBQUl6QixPQUFPLENBQUNHLEtBQUssQ0FBQ3NCLFNBQVMsS0FBSyxnQkFBZ0IsRUFBRTtVQUN2RnpCLE9BQU8sQ0FBQ0osR0FBRyxHQUFHSSxPQUFPLENBQUNKLEdBQUcsR0FBR0ksT0FBTyxDQUFDQyxJQUFJO1FBQzVDLENBQUMsTUFBTTtVQUNIRCxPQUFPLENBQUNKLEdBQUcsR0FBRzhCLHFEQUFNLENBQUNDLFlBQVksQ0FBQzNCLE9BQU8sQ0FBQ0osR0FBRyxFQUFFSSxPQUFPLENBQUNDLElBQUksQ0FBQztRQUNoRTtNQUNKO01BRUFYLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLFFBQVEsRUFBRU8sT0FBTyxDQUFDSixHQUFHLENBQUM7TUFFbkMsSUFBSWdDLElBQUksR0FBRyxJQUFJOztNQUVmO01BQ0EsSUFBSSxPQUFPQyxNQUFNLEtBQUssV0FBVyxFQUFFO1FBQy9CLElBQUlDLFNBQVMsR0FBR0MsbUJBQU8sQ0FBQyw4QkFBWSxDQUFDO1FBRXJDLElBQUlDLElBQUksR0FBRztVQUNQMUIsT0FBTyxFQUFHO1lBQ04yQixPQUFPLEVBQUc7VUFDZDtRQUNKLENBQUM7UUFFRCxJQUFJakMsT0FBTyxDQUFDQyxJQUFJLElBQUksT0FBT0QsT0FBTyxDQUFDQyxJQUFJLEtBQUssUUFBUSxJQUFJbUIsS0FBSyxFQUFFO1VBQzNEWSxJQUFJLEdBQUc7WUFDSGxDLE1BQU0sRUFBR0UsT0FBTyxDQUFDRixNQUFNO1lBQ3ZCb0MsSUFBSSxFQUFHbEMsT0FBTyxDQUFDQyxJQUFJO1lBQ25CSyxPQUFPLEVBQUc7Y0FDTixjQUFjLEVBQUdOLE9BQU8sQ0FBQ0ssT0FBTztjQUNoQzRCLE9BQU8sRUFBRztZQUNkO1VBQ0osQ0FBQztRQUNMO1FBRUEsT0FBT0gsU0FBUyxDQUFDOUIsT0FBTyxDQUFDSixHQUFHLEVBQUVvQyxJQUFJLENBQUMsQ0FDOUJ2QixJQUFJLENBQUMsVUFBVUMsUUFBUSxFQUFFO1VBQ3RCLElBQUlBLFFBQVEsQ0FBQ3lCLEVBQUUsRUFBRTtZQUFFO1lBQ2ZqQixPQUFPLENBQUNSLFFBQVEsQ0FBQzBCLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDNUIsQ0FBQyxNQUFNO1lBQ0gsSUFBSUMsT0FBTyxHQUFHLDRDQUE0QyxHQUFHM0IsUUFBUSxDQUFDNEIsVUFBVSxHQUFHLGFBQWEsR0FBRzVCLFFBQVEsQ0FBQ2QsR0FBRyxHQUFHLElBQUk7WUFDdEgsSUFBSTJDLE1BQU0sR0FBRzdCLFFBQVEsQ0FBQzZCLE1BQU07WUFDNUJwQixNQUFNLENBQUM7Y0FDSGtCLE9BQU8sRUFBR0EsT0FBTztjQUNqQkUsTUFBTSxFQUFHQTtZQUNiLENBQUMsQ0FBQztVQUNOO1FBQ0osQ0FBQyxDQUFDLFNBQ0ksQ0FBQyxVQUFVQyxDQUFDLEVBQUU7VUFDaEJyQixNQUFNLENBQUM7WUFDSGtCLE9BQU8sRUFBR0csQ0FBQztZQUNYRCxNQUFNLEVBQUcsQ0FBQztVQUNkLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQztNQUNWLENBQUMsTUFBTTtRQUNILElBQUlWLE1BQU0sQ0FBQ1ksY0FBYyxFQUFFO1VBQ3ZCbkQsTUFBTSxDQUFDRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7VUFFOUJtQyxJQUFJLEdBQUcsSUFBSWEsY0FBYyxDQUFDLENBQUM7VUFDM0JiLElBQUksQ0FBQ2MsSUFBSSxDQUFDMUMsT0FBTyxDQUFDRixNQUFNLEVBQUVFLE9BQU8sQ0FBQ0osR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDOUNnQyxJQUFJLENBQUNlLGdCQUFnQixHQUFHM0MsT0FBTyxDQUFDSyxPQUFPOztVQUV2QztVQUNBLElBQUl1QyxnQkFBZ0IsR0FBRyxJQUFJO1VBQzNCLElBQUk1QyxPQUFPLENBQUNFLE9BQU8sR0FBRyxDQUFDLEVBQUU7WUFDckI7WUFDQTtZQUNBWixNQUFNLENBQUNHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztZQUNyQztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO1lBQzRCbUQsZ0JBQWdCLEdBQUdmLE1BQU0sQ0FBQ2dCLFVBQVUsQ0FDaEMsWUFBWTtjQUNSLElBQUlSLE9BQU8sR0FBRyx1REFBdUQ7Y0FDckVsQixNQUFNLENBQUM7Z0JBQ0hrQixPQUFPLEVBQUdBLE9BQU87Z0JBQ2pCRSxNQUFNLEVBQUcsQ0FBQztjQUNkLENBQUMsQ0FBQztZQUNOLENBQUMsRUFBRXZDLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDO1VBQzNCO1VBRUEsSUFBSWtCLEtBQUssRUFBRTtZQUNQO1lBQ0E7WUFDQTlCLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLFNBQVMsRUFBRU8sT0FBTyxDQUFDQyxJQUFJLENBQUM7WUFDckMyQixJQUFJLENBQUNrQixnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU5QyxPQUFPLENBQUNLLE9BQU8sQ0FBQztZQUN0RDtZQUNBO1lBQ0E7VUFDSjs7VUFFQTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtVQUN3QnVCLElBQUksQ0FBQ21CLE9BQU8sR0FBRyxVQUFVUCxDQUFDLEVBQUU7WUFDeEJRLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDVCxDQUFDLENBQUM7WUFDZHJCLE1BQU0sQ0FBQyxJQUFJdEIsS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7VUFDN0UsQ0FBQzs7VUFFRDtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtVQUN3QitCLElBQUksQ0FBQ3NCLFNBQVMsR0FBRyxVQUFVVixDQUFDLEVBQUU7WUFDMUJRLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDVCxDQUFDLENBQUM7WUFDZHJCLE1BQU0sQ0FBQyxJQUFJdEIsS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7VUFDOUUsQ0FBQzs7VUFFRDtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO1VBQ3dCK0IsSUFBSSxDQUFDdUIsa0JBQWtCLEdBQUcsVUFBVVgsQ0FBQyxFQUFFO1lBQ25DLElBQUlaLElBQUksQ0FBQ3dCLFVBQVUsS0FBSyxDQUFDLEVBQUU7Y0FBRTtjQUN6QixJQUFJeEIsSUFBSSxDQUFDVyxNQUFNLEtBQUssR0FBRyxFQUFFO2dCQUNyQlYsTUFBTSxDQUFDd0IsWUFBWSxDQUFDVCxnQkFBZ0IsQ0FBQztnQkFDckMxQixPQUFPLENBQUNVLElBQUksQ0FBQ2xCLFFBQVEsQ0FBQztjQUMxQixDQUFDLE1BQU07Z0JBQ0gsSUFBSTJCLE9BQU8sR0FBRyw0Q0FBNEMsR0FBR0csQ0FBQyxDQUFDYyxNQUFNLENBQUNoQixVQUFVLEdBQUcsYUFBYSxHQUFHRSxDQUFDLENBQUNjLE1BQU0sQ0FBQ0MsV0FBVyxHQUFHLGtCQUFrQixHQUFHZixDQUFDLENBQUNjLE1BQU0sQ0FBQzVDLFFBQVEsR0FBRyxJQUFJO2dCQUN2SyxJQUFJNkIsTUFBTSxHQUFHQyxDQUFDLENBQUNjLE1BQU0sQ0FBQ2YsTUFBTTtnQkFDNUJwQixNQUFNLENBQUM7a0JBQ0hrQixPQUFPLEVBQUdBLE9BQU87a0JBQ2pCRSxNQUFNLEVBQUdBO2dCQUNiLENBQUMsQ0FBQztjQUNOO1lBQ0o7VUFDSixDQUFDOztVQUVEO1VBQ0EsSUFBSWlCLFFBQVEsR0FBSXhELE9BQU8sQ0FBQ0MsSUFBSSxJQUFJbUIsS0FBSyxHQUFJcEIsT0FBTyxDQUFDQyxJQUFJLEdBQUcsSUFBSTtVQUU1RDJCLElBQUksQ0FBQzZCLElBQUksQ0FBQ0QsUUFBUSxDQUFDO1FBQ3ZCLENBQUMsTUFBTSxJQUFJM0IsTUFBTSxDQUFDNkIsY0FBYyxFQUFFO1VBQzlCO1VBQ0FwRSxNQUFNLENBQUNHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztVQUU5Qm1DLElBQUksR0FBRyxJQUFJOEIsY0FBYyxDQUFDLENBQUM7VUFDM0I5QixJQUFJLENBQUNjLElBQUksQ0FBQzFDLE9BQU8sQ0FBQ0YsTUFBTSxFQUFFRSxPQUFPLENBQUNKLEdBQUcsQ0FBQztVQUV0Q2dDLElBQUksQ0FBQ2UsZ0JBQWdCLEdBQUczQyxPQUFPLENBQUNLLE9BQU87VUFFdkMsSUFBSUwsT0FBTyxDQUFDRSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCMEIsSUFBSSxDQUFDK0IsT0FBTyxHQUFHM0QsT0FBTyxDQUFDMkQsT0FBTztZQUM5QnJFLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLHVCQUF1QixDQUFDO1VBQ3pDO1VBRUEsSUFBSTJCLEtBQUssRUFBRTtZQUNQO1lBQ0E7WUFDQVEsSUFBSSxDQUFDa0IsZ0JBQWdCLENBQUMsY0FBYyxFQUFFOUMsT0FBTyxDQUFDSyxPQUFPLENBQUM7WUFDdEQ7WUFDQTtZQUNBO1VBQ0o7O1VBRUE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtVQUN3QnVCLElBQUksQ0FBQ21CLE9BQU8sR0FBRyxZQUFZO1lBQ3ZCNUIsTUFBTSxDQUFDLElBQUl0QixLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztVQUM3RSxDQUFDOztVQUVEO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7VUFDd0IrQixJQUFJLENBQUNzQixTQUFTLEdBQUcsWUFBWTtZQUN6Qi9CLE1BQU0sQ0FBQyxJQUFJdEIsS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7VUFDOUUsQ0FBQzs7VUFFRDtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO1VBQ3dCK0IsSUFBSSxDQUFDZ0MsTUFBTSxHQUFHLFVBQVVwQixDQUFDLEVBQUU7WUFDdkIsSUFBSVosSUFBSSxDQUFDVyxNQUFNLEtBQUssR0FBRyxFQUFFO2NBQ3JCckIsT0FBTyxDQUFDVSxJQUFJLENBQUNpQyxZQUFZLENBQUM7WUFDOUIsQ0FBQyxNQUFNO2NBQ0gsSUFBSXhCLE9BQU8sR0FBRyw0Q0FBNEMsR0FBR0csQ0FBQyxDQUFDYyxNQUFNLENBQUNoQixVQUFVLEdBQUcsYUFBYSxHQUFHRSxDQUFDLENBQUNjLE1BQU0sQ0FBQ0MsV0FBVyxHQUFHLElBQUk7Y0FDOUgsSUFBSWhCLE1BQU0sR0FBR0MsQ0FBQyxDQUFDYyxNQUFNLENBQUNmLE1BQU07Y0FDNUJwQixNQUFNLENBQUM7Z0JBQ0hrQixPQUFPLEVBQUdBLE9BQU87Z0JBQ2pCRSxNQUFNLEVBQUdBO2NBQ2IsQ0FBQyxDQUFDO1lBQ047VUFDSixDQUFDO1VBRUQsSUFBSXVCLFFBQVEsR0FBSTlELE9BQU8sQ0FBQ0MsSUFBSSxJQUFJbUIsS0FBSyxHQUFJcEIsT0FBTyxDQUFDQyxJQUFJLEdBQUcsSUFBSTtVQUU1RDJCLElBQUksQ0FBQzZCLElBQUksQ0FBQ0ssUUFBUSxDQUFDO1FBQ3ZCLENBQUMsTUFBTTtVQUNILE1BQU0sSUFBSWpFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztRQUN6QztNQUNKO0lBQ0osQ0FDSixDQUFDO0lBRUQsT0FBT21CLE9BQU87RUFDbEIsQ0FBQztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUYsVUFBVSxFQUFHLFNBQUFBLFdBQVVkLE9BQU8sRUFBRTtJQUM1QixPQUFPLElBQUksQ0FBQ1EsTUFBTSxDQUFDUixPQUFPLENBQUMsQ0FDdEJTLElBQUksQ0FBQ3NELElBQUksQ0FBQ0MsS0FBSyxDQUFDLFNBQ1gsQ0FBQyxVQUFVcEQsS0FBSyxFQUFFO01BQ3BCb0MsT0FBTyxDQUFDQyxHQUFHLENBQUMsd0JBQXdCLEVBQUVqRCxPQUFPLENBQUNKLEdBQUcsRUFBRWdCLEtBQUssQ0FBQztNQUN6RDtNQUNBO0lBQ0osQ0FBQyxDQUFDO0VBQ1YsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lHLFNBQVMsRUFBRyxTQUFBQSxVQUFVZixPQUFPLEVBQUU7SUFDM0IsT0FBTyxJQUFJLENBQUNRLE1BQU0sQ0FBQ1IsT0FBTyxDQUFDLENBQ3RCUyxJQUFJLENBQUMsVUFBVUMsUUFBUSxFQUFFO01BQ3RCLElBQUl1RCxNQUFNOztNQUVWO01BQ0EsSUFBSSxPQUFPcEMsTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUMvQixJQUFJcUMsU0FBUyxHQUFHbkMsbUJBQU8sQ0FBQyxzQkFBUSxDQUFDLENBQUNtQyxTQUFTLENBQUMsQ0FBQztRQUM3Q0QsTUFBTSxHQUFHLElBQUlDLFNBQVMsQ0FBQyxDQUFDLENBQUNDLGVBQWUsQ0FBQ3pELFFBQVEsRUFBRSxVQUFVLENBQUM7TUFDbEUsQ0FBQyxNQUFNO1FBQ0gsSUFBSW1CLE1BQU0sQ0FBQ3FDLFNBQVMsRUFBRTtVQUNsQixJQUFJRSxNQUFNLEdBQUcsSUFBSXZDLE1BQU0sQ0FBQ3FDLFNBQVMsQ0FBQyxDQUFDO1VBQ25DRCxNQUFNLEdBQUdHLE1BQU0sQ0FBQ0QsZUFBZSxDQUFDekQsUUFBUSxFQUFFLFVBQVUsQ0FBQztRQUN6RCxDQUFDLE1BQU07VUFBRTtVQUNMdUQsTUFBTSxHQUFHLElBQUlwQyxNQUFNLENBQUN3QyxhQUFhLENBQUMsa0JBQWtCLENBQUM7VUFDckRKLE1BQU0sQ0FBQ0ssS0FBSyxHQUFHLEtBQUs7VUFDcEJMLE1BQU0sQ0FBQ00sT0FBTyxDQUFDN0QsUUFBUSxDQUFDO1FBQzVCO01BQ0o7TUFFQSxPQUFPdUQsTUFBTTtJQUNqQixDQUFDLENBQUMsU0FDSSxDQUFDLFVBQVVyRCxLQUFLLEVBQUU7TUFDcEJvQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRWpELE9BQU8sQ0FBQ0osR0FBRyxFQUFFZ0IsS0FBSyxDQUFDO01BQ3pEO01BQ0E7SUFDSixDQUFDLENBQUM7RUFDVjtBQUVKLENBQUM7O0FBRWN6QixrRUFBRyIsImZpbGUiOiIuL3NyYy9Qcm90b2NvbHMvWEhSLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIFByb21pc2UsIHJlcXVpcmUsIFhEb21haW5SZXF1ZXN0ICovXG5cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEhlbHBlciBmcm9tIFwiLi4vVXRpbHMvSGVscGVyXCI7XG5pbXBvcnQgRVM2UHJvbWlzZSBmcm9tIFwiZXM2LXByb21pc2VcIjtcbi8vIGltcG9ydCBfX3JlcXVlc3QgZnJvbSBcInJlcXVlc3RcIjtcbi8vIGltcG9ydCBfX3htbGRvbSBmcm9tIFwieG1sZG9tXCI7XG5cbi8qKlxuICogQWpheCBSZXF1ZXN0ICh1c2Ugb2YgUHJvbWlzZXMpXG4gKlxuICogQG1vZHVsZSBYSFJcbiAqIEBhbGlhcyBHcC5Qcm90b2NvbHMuWEhSXG4gKiBAc2VlIGRlcGVuZGFuY2UgJ2VzNi1wcm9taXNlJ1xuICovXG5cbi8vIGNmLiBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvXG4vLyBjZi4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0XG5cbnZhciBYSFIgPSB7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmZhY2UgdW5pcXVlIGQnZW52b2kgZCd1bmUgcmVxdcOqdGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGNhbGxcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzIC0gb3B0aW9ucyBnZW5lcmFsZXNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ3MudXJsICAgIC0gdXJsIGR1IHNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ3MubWV0aG9kIC0gR0VULCBQT1NULCBQVVQsIERFTEVURVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5mb3JtYXQgLSBmb3JtYXQgZGUgbGEgcmVwb25zZSBkdSBzZXJ2aWNlIDoganNvbiwgeG1sIG91IG51bGwgKGJydXRlKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5kYXRhICAgLSBjb250ZW50IChwb3N0KSBvdSBwYXJhbSAoZ2V0KVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5wcm94eSAgLSBwcm94eSB1cmxcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNldHRpbmdzLmhlYWRlcnMgLSAocG9zdCkgZXguIHJlZmVyZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNldHRpbmdzLmNvbnRlbnQgLSAocG9zdCkgZXguICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy50aW1lT3V0IC0gdGltZW91dCA9IDAgcGFyIGRlZmF1dFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5zY29wZSAtIHRoaXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0aW5ncy5vblJlc3BvbnNlIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0aW5ncy5vbkZhaWx1cmUgIC0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBjYWxsIDogZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gICAgICAgIC8vIGxvZ2dlclxuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIlhIUlwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiW1hIUjo6Y2FsbCgpXVwiKTtcblxuICAgICAgICAvLyBGSVhNRVxuICAgICAgICAvLyBUbyBwb2x5ZmlsbCB0aGUgZ2xvYmFsIGVudmlyb25tZW50XG4gICAgICAgIEVTNlByb21pc2UucG9seWZpbGwoKTtcblxuICAgICAgICAvLyB0ZXN0IHN1ciBsZXMgc2V0dGluZ3Mgb2JsaWdhdG9pcmVzXG4gICAgICAgIGlmICghc2V0dGluZ3MudXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHBhcmFtZXRlciA6IHVybCBpcyBub3QgZGVmaW5lZCAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXR0aW5ncy5tZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogbWV0aG9kIGlzIG5vdCBkZWZpbmVkICFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNldHRpbmdzLmZvcm1hdCkge1xuICAgICAgICAgICAgc2V0dGluZ3MuZm9ybWF0ID0gXCJ0ZXh0XCI7IC8vIHJlcG9uc2UgYnJ1dGUgIVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9ucy51cmwgPSBzZXR0aW5ncy51cmw7XG4gICAgICAgIG9wdGlvbnMuZGF0YSA9IHNldHRpbmdzLmRhdGEgPyBzZXR0aW5ncy5kYXRhIDogbnVsbDtcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBzZXR0aW5ncy5tZXRob2Q7XG4gICAgICAgIG9wdGlvbnMudGltZU91dCA9IHNldHRpbmdzLnRpbWVPdXQgfHwgMDtcbiAgICAgICAgb3B0aW9ucy5zY29wZSA9IHNldHRpbmdzLnNjb3BlIHx8IHRoaXM7XG4gICAgICAgIG9wdGlvbnMucHJveHkgPSBzZXR0aW5ncy5wcm94eSB8fCBudWxsO1xuICAgICAgICBvcHRpb25zLmNvbnRlbnQgPSBzZXR0aW5ncy5jb250ZW50IHx8IG51bGw7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHNldHRpbmdzLmhlYWRlcnMgfHwge1xuICAgICAgICAgICAgcmVmZXJlciA6IFwiaHR0cDovL2xvY2FsaG9zdFwiXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdGVzdCBzdXIgbGVzIHZhbGV1cnMgZGUgJ3NldHRpbmdzLm1ldGhvZCdcbiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgXCJERUxFVEVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJHRVRcIjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJQVVRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJQT1NUXCI6XG4gICAgICAgICAgICAgICAgLy8gb24gZm9yY2Ugc3VyIGNlcyBwYXJhbXMgc3DDqWNpZmlxdWVzIGF1IG1vZGUgUE9TVFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudCA9IHNldHRpbmdzLmNvbnRlbnQgPyBzZXR0aW5ncy5jb250ZW50IDogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIjsgLy8gRklYTUUgZW4gYXR0ZW50ZSBkZXMgc2VydmljZXMgOiBiYXNjdWxlIGVuIFwiYXBwbGljYXRpb24veG1sXCIgb3UgXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSBzZXR0aW5ncy5oZWFkZXJzID8gc2V0dGluZ3MuaGVhZGVycyA6IHsgcmVmZXJlciA6IFwiaHR0cDovL2xvY2FsaG9zdFwiIH07IC8vIEZJWE1FIHBhcmFtZXRyYWJsZS4uLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkhFQURcIjpcbiAgICAgICAgICAgIGNhc2UgXCJPUFRJT05TXCI6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSFRUUCBtZXRob2Qgbm90IHlldCBzdXBwb3J0ZWQgIVwiKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSFRUUCBtZXRob2QgdW5rbm93biAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGVzdCBzdXIgbGVzIHZhbGV1cnMgZGUgJ3NldHRpbmdzLmZvcm1hdCdcbiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5mb3JtYXQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NhbGwob3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25SZXNwb25zZS5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25GYWlsdXJlLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NhbGxKU09OKG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9uUmVzcG9uc2UuY2FsbCh0aGlzLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9uRmFpbHVyZS5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwieG1sXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NhbGxYTUwob3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25SZXNwb25zZS5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25GYWlsdXJlLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvdXRwdXQgRm9ybWF0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkICFcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVxdWV0ZVxuICAgICAqXG4gICAgICogQG1ldGhvZCBfX2NhbGxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb21pc2VcbiAgICAgKi9cbiAgICBfX2NhbGwgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIlhIUlwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiW1hIUjo6X19jYWxsKCldXCIpO1xuXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgLy8gdHJhaXRlbWVudCBkdSBjb3JwcyBkZSBsYSByZXF1w6p0ZVxuICAgICAgICAgICAgICAgIHZhciBjb3JwcyA9IChvcHRpb25zLm1ldGhvZCA9PT0gXCJQT1NUXCIgfHwgb3B0aW9ucy5tZXRob2QgPT09IFwiUFVUXCIpID8gMSA6IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXVsZW1lbnQgc2kgb3B0aW9ucy5kYXRhIG4nZXN0IHBhcyB2aWRlIChwZXV0IMOqdHJlIHVuIG9iamV0IG91IHVuZSBjaGFpbmUgZGUgY2FyYWN0w6hyZXMpXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiAoKHR5cGVvZiBvcHRpb25zLmRhdGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5kYXRhKS5sZW5ndGgpIHx8ICh0eXBlb2Ygb3B0aW9ucy5kYXRhID09PSBcInN0cmluZ1wiICYmIG9wdGlvbnMuZGF0YS5sZW5ndGgpKSAmJiAhY29ycHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2NvcGUuQ0xBU1NOQU1FID09PSBcIkdlb2NvZGVcIiB8fCBvcHRpb25zLnNjb3BlLkNMQVNTTkFNRSA9PT0gXCJSZXZlcnNlR2VvY29kZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgb3B0aW9ucy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBIZWxwZXIubm9ybWFseXplVXJsKG9wdGlvbnMudXJsLCBvcHRpb25zLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiVVJMID0gXCIsIG9wdGlvbnMudXJsKTtcblxuICAgICAgICAgICAgICAgIHZhciBoWEhSID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIHRlc3Qgb24gZW52LiBub2RlanMgb3IgYnJvd3NlclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub2RlZmV0Y2ggPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlciA6IFwiaHR0cHM6Ly9sb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRhdGEgJiYgdHlwZW9mIG9wdGlvbnMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBjb3Jwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IDogb3B0aW9ucy5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCIgOiBvcHRpb25zLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZXIgOiBcImh0dHBzOi8vbG9jYWxob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVmZXRjaChvcHRpb25zLnVybCwgb3B0cylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykgeyAvLyByZXMuc3RhdHVzID49IDIwMCAmJiByZXMuc3RhdHVzIDwgMzAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiRXJyb3JzIE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IChzdGF0dXMgOiAnXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0ICsgXCInIHwgdXJsIDogJ1wiICsgcmVzcG9uc2UudXJsICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiBzdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiWE1MSHR0cFJlcXVlc3RcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub3BlbihvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy51cmwsIHRydWUpOyAvLyBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vdmVycmlkZU1pbWVUeXBlID0gb3B0aW9ucy5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGR1IHRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvblRpbWVPdXRUcmlnZ2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbWVPdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgbGUgdGltZW91dCBpbnRlcm5lIG5lIG1lIHBlcm1ldCBwYXMgZGUgZGVjbGVuY2hlciBsZSBib24gbWVzc2FnZS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhYSFIudGltZW91dCA9IG9wdGlvbnMudGltZU91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJYSFIgLSBUaW1lT3V0IGFjdGlmICFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBtZXRob2Qgb25UaW1lT3V0VHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25UaW1lT3V0VHJpZ2dlciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiVGltZU91dCBPY2N1cmVkIG9uIEh0dHAgUmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0ICFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVPdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ycHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJzLCBkYXRhLCBjb250ZW50IG9mIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy94aHIvcmF3LWZpbGUvdGlwL092ZXJ2aWV3Lmh0bWwjZG9tLXhtbGh0dHByZXF1ZXN0LXNldHJlcXVlc3RoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJkYXRhID0gXCIsIG9wdGlvbnMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIG9wdGlvbnMuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgcmVmdXNlZCB0byBzZXQgdW5zYWZlIGhlYWRlciBjb250ZW50LWxlbmd0aCBqYXZhc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaFhIUi5zZXRSZXF1ZXN0SGVhZGVyIChcIkNvbnRlbnQtbGVuZ3RoXCIsIG9wdGlvbnMuZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhYSFIuc2V0UmVxdWVzdEhlYWRlciAoXCJSZWZlcmVyXCIsIG9wdGlvbnMuaGVhZGVycy5yZWZlcmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBPbiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICogRklYTUUgbmUgc2UgZGVjbGVuY2hlIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBtZXRob2Qgb25lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiRXJyb3JzIE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIE9uIFRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FIG5lIHNlIGRlY2xlbmNoZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAbWV0aG9kIG9udGltZW91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJUaW1lT3V0IE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQG1ldGhvZCBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaFhIUi5yZWFkeVN0YXRlID09PSA0KSB7IC8vIERPTkVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhYSFIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQob25UaW1lT3V0VHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhYSFIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIkVycm9ycyBPY2N1cmVkIG9uIEh0dHAgUmVxdWVzdCAoc3RhdHVzIDogJ1wiICsgZS50YXJnZXQuc3RhdHVzVGV4dCArIFwiJyB8IHVybCA6ICdcIiArIGUudGFyZ2V0LnJlc3BvbnNlVVJMICsgXCInIHwgcmVzcG9uc2UgOiAnXCIgKyBlLnRhcmdldC5yZXNwb25zZSArIFwiJylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBlLnRhcmdldC5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IHN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGR1IGNvbnRlbnQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE0eGhyID0gKG9wdGlvbnMuZGF0YSAmJiBjb3JwcykgPyBvcHRpb25zLmRhdGEgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBoWEhSLnNlbmQoZGF0YTR4aHIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5YRG9tYWluUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VkIGluIEludGVybmV0IEV4cGxvcmVyIDjigJMxMCBvbmx5ICFcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcIlhEb21haW5SZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBoWEhSID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoWEhSLm9wZW4ob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMudXJsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vdmVycmlkZU1pbWVUeXBlID0gb3B0aW9ucy5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aW1lT3V0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIudGltZW91dCA9IG9wdGlvbnMudGltZW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJYSFIgLSBUaW1lT3V0IGFjdGlmICFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3Jwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlcnMsIGRhdGEsIGNvbnRlbnQgb2YgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2R2Y3MudzMub3JnL2hnL3hoci9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbCNkb20teG1saHR0cHJlcXVlc3Qtc2V0cmVxdWVzdGhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBvcHRpb25zLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlZnVzZWQgdG8gc2V0IHVuc2FmZSBoZWFkZXIgY29udGVudC1sZW5ndGggamF2YXNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhYSFIuc2V0UmVxdWVzdEhlYWRlciAoXCJDb250ZW50LWxlbmd0aFwiLCBvcHRpb25zLmRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoWEhSLnNldFJlcXVlc3RIZWFkZXIgKFwiUmVmZXJlclwiLCBvcHRpb25zLmhlYWRlcnMucmVmZXJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAbWV0aG9kIG9uZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiRXJyb3JzIE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQG1ldGhvZCBvbnRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJUaW1lT3V0IE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIE9uIExvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAbWV0aG9kIG9ubG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoWEhSLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaFhIUi5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJFcnJvcnMgT2NjdXJlZCBvbiBIdHRwIFJlcXVlc3QgKHN0YXR1cyA6ICdcIiArIGUudGFyZ2V0LnN0YXR1c1RleHQgKyBcIicgfCB1cmwgOiAnXCIgKyBlLnRhcmdldC5yZXNwb25zZVVSTCArIFwiJylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IGUudGFyZ2V0LnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhNHhkciA9IChvcHRpb25zLmRhdGEgJiYgY29ycHMpID8gb3B0aW9ucy5kYXRhIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5zZW5kKGRhdGE0eGRyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNPUlMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVxdWV0ZSBhdmVjIHBhcnNlciBKU09OXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIF9fY2FsbEpTT05cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb21pc2VcbiAgICAgKi9cbiAgICBfX2NhbGxKU09OIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jYWxsKG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbihKU09OLnBhcnNlKVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiX2NhbGxKU09OIGZhaWxlZCBvbiA6IFwiLCBvcHRpb25zLnVybCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIHBhcyBkJ2V4Y2VwdGlvbiwgbGFpc3NvbnMgbGUgZmlsIHNlIGRlcm91bGVyLi4uXG4gICAgICAgICAgICAgICAgLy8gdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVxdWV0ZSBhdmVjIHBhcnNlciBYTUxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgX19jYWxsWE1MXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBwcm9taXNlXG4gICAgICovXG4gICAgX19jYWxsWE1MIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jYWxsKG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG1sRG9jO1xuXG4gICAgICAgICAgICAgICAgLy8gdGVzdCBvbiBlbnYuIG5vZGVqcyBvciBicm93c2VyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERPTVBhcnNlciA9IHJlcXVpcmUoXCJ4bWxkb21cIikuRE9NUGFyc2VyOyAvLyBfX3htbGRvbS5ET01QYXJzZXJcbiAgICAgICAgICAgICAgICAgICAgeG1sRG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhyZXNwb25zZSwgXCJ0ZXh0L3htbFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LkRPTVBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlLCBcInRleHQveG1sXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBJRVxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sRG9jID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTERPTVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbERvYy5hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgeG1sRG9jLmxvYWRYTUwocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJfX2NhbGxYTUwgZmFpbGVkIG9uIDogXCIsIG9wdGlvbnMudXJsLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgLy8gRklYTUUgcGFzIGQnZXhjZXB0aW9uLCBsYWlzc29ucyBsZSBmaWwgc2UgZGVyb3VsZXIuLi5cbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgWEhSO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Protocols/XHR.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Alti.js": -/*!***********************************!*\ - !*** ./src/Services/Alti/Alti.js ***! - \***********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/AltiRequestFactory */ \"./src/Services/Alti/Request/AltiRequestFactory.js\");\n/* harmony import */ var _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/AltiResponseFactory */ \"./src/Services/Alti/Response/AltiResponseFactory.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n *\n * Appel du service d'altimétrie du Géoportail\n *\n * @todo gestion du parma. output et callback\n * @todo outputFormat (REST) et format (WPS)\n * @todo La reponse JSON peut encapsuler un XML !\n *\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.Alti\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {Array.} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84)\n * dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil).\n * Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants.\n * Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine).\n * Maximum 50 éléments.\n *\n * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'.\n * Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST,\n * ou la valeur du paramètre 'format' dans le cas de la norme WPS.\n * Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST,\n * pour connaître le format dans lequel sera fournie la réponse (pour son traitement).\n * Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'.\n *\n * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000.\n * A spécifier lorsqu'on souhaite accéder à cette fonctionnalité.\n * Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique\n * le long duquel le profil doit être calculé.\n * Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis,\n * c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis).\n * Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points).\n *\n * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS).\n * Par défaut, on utilise l'API REST.\n *\n * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'.\n * Vaut 'false' par défaut.\n *\n * @param {String} [options.resource] - Resource utilisée pour réaliser le calcul.\n *\n * @example\n * var options = {\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * positions : [{lon:, lat:}, {lon:, lat:}],\n * outputFormat : 'json' // json|xml\n * sampling : 3,\n * api : 'REST', // REST|WPS\n * zonly : false // false|true,\n * resource : \"resource-par-defaut\"\n * };\n *\n */\nfunction Alti(options) {\n if (!(this instanceof Alti)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Alti\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"Alti\";\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.Alti\");\n this.logger.trace(\"[Constructeur Alti (options)]\");\n\n // #####################\n // analyse des options\n // #####################\n\n if (!options.positions) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"positions\"));\n }\n if (options.positions.length === 0) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"positions\"));\n }\n\n // ajout des options spécifiques au service\n this.options.positions = options.positions;\n\n // format de réponse du service : \"json\" ou \"xml\" (valeur par défaut), en minuscule !\n this.options.outputFormat = typeof options.outputFormat === \"string\" ? options.outputFormat.toLowerCase() : \"xml\";\n\n // ressource utilisée pour le calcul altimétrique\n this.options.resource = options.resource || \"rge_alti_corse2a_float32_zip_lamb93\";\n\n // sampling\n this.options.sampling = options.sampling || null;\n\n // type d'api utilisé pour requeter le service, en majuscule !\n this.options.api = typeof options.api === \"string\" ? options.api.toUpperCase() : \"REST\";\n\n // l'api ne peut être interrogée qu'en GET.\n if (this.options.api === \"REST\") {\n this.options.httpMethod = \"GET\";\n }\n\n // param. zonly\n this.options.zonly = options.zonly || false;\n\n // param. measures\n this.options.measures = options.measures || false;\n\n // gestion de l'url du service par defaut\n // si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat)\n // ainsi que sur le type de service (profil ou elevation)\n if (!this.options.serverUrl) {\n // Code commenté pour Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti\n /* var lstUrlByDefault = DefaultUrlService.Alti.newUrl();\n if (this.options.oldAltiService) {\n lstUrlByDefault = DefaultUrlService.Alti.url();\n } */\n // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti\n var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Alti.url();\n var urlFound = null;\n switch (this.options.api) {\n case \"WPS\":\n urlFound = lstUrlByDefault.wps;\n break;\n case \"REST\":\n var key = (options.sampling ? \"profil\" : \"elevation\") + \"-\" + this.options.outputFormat;\n urlFound = lstUrlByDefault[key];\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_UNKNOWN\", \"api\"));\n }\n if (!urlFound) {\n throw new Error(\"Url by default not found !\");\n }\n this.options.serverUrl = urlFound;\n this.logger.trace(\"Server URL by default : \" + this.options.serverUrl);\n }\n\n // gestion du type de service\n // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat)\n var idx = this.options.serverUrl.lastIndexOf(\".\");\n if (idx !== -1) {\n var extension = this.options.serverUrl.substring(idx + 1);\n if (extension && extension.length < 5) {\n // FIXME extension de moins de 4 car. ...\n this.logger.trace(\"Server Extension URL : \" + extension);\n switch (extension.toLowerCase()) {\n case \"json\":\n case \"xml\":\n this.options.outputFormat = extension.toLowerCase();\n break;\n default:\n throw new Error(\"type of service : unknown or unsupported (json or xml) !\");\n }\n }\n }\n}\n\n/**\n * @lends module:Alti#\n */\nAlti.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/**\n * Constructeur (alias)\n */\nAlti.prototype.constructor = Alti;\n\n/**\n * Création de la requête (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nAlti.prototype.buildRequest = function (error, success) {\n // utilisation en mode callback\n var options = {\n httpMethod: this.options.httpMethod,\n // callback\n onSuccess: function onSuccess(result) {\n // sauvegarde de la requete !\n this.request = result;\n success.call(this, this.request);\n },\n onError: error,\n scope: this,\n // spécifique au service :\n resource: this.options.resource,\n positions: this.options.positions,\n outputFormat: this.options.outputFormat,\n sampling: this.options.sampling,\n api: this.options.api,\n zonly: this.options.zonly,\n measures: this.options.measures\n };\n _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n};\n\n/**\n * Analyse de la reponse (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nAlti.prototype.analyzeResponse = function (error, success) {\n // INFO\n // Factory pour masquer la complexité du retour du service qui renvoie soit\n // - une 'string' qui contient du XML ou JSON natif en mode XHR\n // - un objet JSON qui est natif ou encapsulé\n\n if (this.response) {\n var options = {\n response: this.response,\n outputFormat: this.options.outputFormat,\n // utile pour parser la string en mode XHR : JSON ou XML !\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this\n };\n _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Alti);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL0FsdGkuanM/Y2ZiNiJdLCJuYW1lcyI6WyJBbHRpIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwiQ29tbW9uU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJwb3NpdGlvbnMiLCJFcnJvciIsImxlbmd0aCIsIm91dHB1dEZvcm1hdCIsInRvTG93ZXJDYXNlIiwicmVzb3VyY2UiLCJzYW1wbGluZyIsImFwaSIsInRvVXBwZXJDYXNlIiwiaHR0cE1ldGhvZCIsInpvbmx5IiwibWVhc3VyZXMiLCJzZXJ2ZXJVcmwiLCJsc3RVcmxCeURlZmF1bHQiLCJEZWZhdWx0VXJsU2VydmljZSIsInVybCIsInVybEZvdW5kIiwid3BzIiwia2V5IiwiaWR4IiwibGFzdEluZGV4T2YiLCJleHRlbnNpb24iLCJzdWJzdHJpbmciLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsIm9uU3VjY2VzcyIsInJlc3VsdCIsInJlcXVlc3QiLCJjYWxsIiwib25FcnJvciIsInNjb3BlIiwiQWx0aVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsInJhd1Jlc3BvbnNlIiwiQWx0aVJlc3BvbnNlRmFjdG9yeSIsIkVycm9yU2VydmljZSJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFpRDtBQUNIO0FBQ1c7QUFDWjtBQUNRO0FBQ1M7QUFDRzs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RyxJQUFJLENBQUNsQixPQUFPLENBQUNrQixRQUFRO0lBQ2hDQyxHQUFHLEVBQUcsSUFBSSxDQUFDbkIsT0FBTyxDQUFDbUIsR0FBRztJQUN0QkcsS0FBSyxFQUFHLElBQUksQ0FBQ3RCLE9BQU8sQ0FBQ3NCLEtBQUs7SUFDMUJDLFFBQVEsRUFBRyxJQUFJLENBQUN2QixPQUFPLENBQUN1QjtFQUM1QixDQUFDO0VBRUR5QixtRUFBa0IsQ0FBQ0MsS0FBSyxDQUFDakQsT0FBTyxDQUFDO0FBQ3JDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FELElBQUksQ0FBQ29DLFNBQVMsQ0FBQ2UsZUFBZSxHQUFHLFVBQVVWLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQ3ZEO0VBQ0E7RUFDQTtFQUNBOztFQUVBLElBQUksSUFBSSxDQUFDVSxRQUFRLEVBQUU7SUFDZixJQUFJbkQsT0FBTyxHQUFHO01BQ1ZtRCxRQUFRLEVBQUcsSUFBSSxDQUFDQSxRQUFRO01BQ3hCcEMsWUFBWSxFQUFHLElBQUksQ0FBQ2YsT0FBTyxDQUFDZSxZQUFZO01BQUU7TUFDMUNxQyxXQUFXLEVBQUcsSUFBSSxDQUFDcEQsT0FBTyxDQUFDb0QsV0FBVztNQUN0Q04sT0FBTyxFQUFHTixLQUFLO01BQ2ZFLFNBQVMsRUFBR0QsT0FBTztNQUNuQk0sS0FBSyxFQUFHO0lBQ1osQ0FBQztJQUVETSxxRUFBbUIsQ0FBQ0osS0FBSyxDQUFDakQsT0FBTyxDQUFDO0VBQ3RDLENBQUMsTUFBTTtJQUNId0MsS0FBSyxDQUFDSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUlTLGdFQUFZLENBQUNwRCxnRUFBQyxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0VBQzlFO0FBQ0osQ0FBQztBQUVjSixtRUFBSSIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9BbHRpL0FsdGkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IENvbW1vblNlcnZpY2UgZnJvbSBcIi4uL0NvbW1vblNlcnZpY2VcIjtcbmltcG9ydCBEZWZhdWx0VXJsU2VydmljZSBmcm9tIFwiLi4vRGVmYXVsdFVybFNlcnZpY2VcIjtcbmltcG9ydCBBbHRpUmVxdWVzdEZhY3RvcnkgZnJvbSBcIi4vUmVxdWVzdC9BbHRpUmVxdWVzdEZhY3RvcnlcIjtcbmltcG9ydCBBbHRpUmVzcG9uc2VGYWN0b3J5IGZyb20gXCIuL1Jlc3BvbnNlL0FsdGlSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogQXBwZWwgZHUgc2VydmljZSBkJ2FsdGltw6l0cmllIGR1IEfDqW9wb3J0YWlsXG4gKlxuICogQHRvZG8gZ2VzdGlvbiBkdSBwYXJtYS4gb3V0cHV0IGV0IGNhbGxiYWNrXG4gKiBAdG9kbyBvdXRwdXRGb3JtYXQgKFJFU1QpIGV0IGZvcm1hdCAoV1BTKVxuICogQHRvZG8gTGEgcmVwb25zZSBKU09OIHBldXQgZW5jYXBzdWxlciB1biBYTUwgIVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0dwLlNlcnZpY2VzLkNvbW1vblNlcnZpY2V9XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlICgrIGxlcyBvcHRpb25zIGhlcml0w6llcylcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBvcHRpb25zLnBvc2l0aW9ucyAtIFRhYmxlYXUgKHtsb246ZmxvYXQsbGF0OmZsb2F0fSkgY29udGVuYW50IGxlcyBjb29yZG9ubsOpZXMgZGVzIHBvaW50cyAoQ1JTOjg0KVxuICogICAgICBkb250IG9uIHZldXQgY29ubmHDrnRyZSBsZXMgYWx0aXR1ZGVzIChvdSDDoCBwYXJ0aXIgZGVzcXVlbGxlcyBvbiB2YSBjYWxjdWxlciBsZSBwcm9maWwpLlxuICogICAgICBDaGFxdWUgw6lsw6ltZW50IGR1IHRhYmxlYXUgZXN0IHVuIG9iamV0IEphdmFTY3JpcHQgYXZlYyBkZXV4IGF0dHJpYnV0cyA6IGxvbiBldCBsYXQsIHF1aSBzb250IGRlcyBmbG90dGFudHMuXG4gKiAgICAgIE1pbmltdW0gMiDDqWzDqW1lbnRzIHNpIG9uIHNvdWhhaXRlIGNhbGN1bGVyIHVuIHByb2ZpbCBhbHRpbcOpdHJpcXVlIChFbGV2YXRpb25MaW5lKS5cbiAqICAgICAgTWF4aW11bSA1MCDDqWzDqW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLm91dHB1dEZvcm1hdCAtIExlIGZvcm1hdCBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIGFsdGkgOiAneG1sJyBvdSAnanNvbicuXG4gKiAgICAgIENlIHBhcmFtw6h0cmUgZMOpdGVybWluZXJhIGwnZXh0ZW5zaW9uICcueG1sJyBvdSAnLmpzb24nIGR1IHNlcnZpY2UgZGFucyBsZSBjYXMgZGUgbCdBUEkgUkVTVCxcbiAqICAgICAgb3UgbGEgdmFsZXVyIGR1IHBhcmFtw6h0cmUgJ2Zvcm1hdCcgZGFucyBsZSBjYXMgZGUgbGEgbm9ybWUgV1BTLlxuICogICAgICBOw6ljZXNzYWlyZSBzaSBzZXJ2ZXJVcmwgZXN0IHJlbnNlaWduw6ksIGV0IHF1J29uIHNvdWhhaXRlIHBhc3NlciBwYXIgbCdBUEkgUkVTVCxcbiAqICAgICAgcG91ciBjb25uYcOudHJlIGxlIGZvcm1hdCBkYW5zIGxlcXVlbCBzZXJhIGZvdXJuaWUgbGEgcsOpcG9uc2UgKHBvdXIgc29uIHRyYWl0ZW1lbnQpLlxuICogICAgICBOb24gbsOpY2Vzc2FpcmUgcG91ciBsYSBub3JtZSBXUFMuIFBhciBkw6lmYXV0LCBjZSBwYXJhbcOodHJlIHZhdXQgJ2pzb24nLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zYW1wbGluZ10gLSBOb21icmUgZGUgcG9pbnRzIMOgIHV0aWxpc2VyIHBvdXIgZMOpdGVybWluZXIgbGUgdHJhY8OpIGQndW4gcHJvZmlsIGFsdGltw6l0cmlxdWUsIGNvbXByaXMgZW50cmUgMiBldCA1MDAwLlxuICogICAgICBBIHNww6ljaWZpZXIgbG9yc3F1J29uIHNvdWhhaXRlIGFjY8OpZGVyIMOgIGNldHRlIGZvbmN0aW9ubmFsaXTDqS5cbiAqICAgICAgRGFucyBjZSBjYXMsIGxlcyBwb2ludHMgZm91cm5pcyBlbiBlbnRyw6llIChhdSBtaW5pbXVtIGRlIGRldXgpIHNlcnZlbnQgw6AgZMOpdGVybWluZXIgbCdheGUgcGxhbmltw6l0cmlxdWVcbiAqICAgICAgbGUgbG9uZyBkdXF1ZWwgbGUgcHJvZmlsIGRvaXQgw6p0cmUgY2FsY3Vsw6kuXG4gKiAgICAgIFNpIGxlIHBhcmFtw6h0cmUgc2FtcGxpbmcgbidlc3QgcGFzIHNww6ljaWZpw6kgb3UgbW9pbnMgZGUgZGV1eCBwb2ludHMgc29udCBmb3VybmlzLFxuICogICAgICBjJ2VzdCBsZSBzZXJ2aWNlIEVsZXZhdGlvbiBxdWkgc2VyYSBpbnRlcnJvZ8OpIChhbHRpdHVkZXMgc2ltcGxlcyBjYWxjdWzDqWVzIHBvdXIgbGVzIHBvaW50cyBmb3VybmlzKS5cbiAqICAgICAgVW5lIHZhbGV1ciBkZSBzYW1wbGluZyBzdHJpY3RlbWVudCBpbmbDqXJpZXVyZSDDoCAyIGTDqWNsZW5jaGVyYSB1biDDqWNoYW50aWxsb25uYWdlIGF2ZWMgbGEgdmFsZXVyIHBhciBkw6lmYXV0IGR1IHNlcnZpY2UgKDMgcG9pbnRzKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYXBpXSAtIE1hbmnDqHJlIGQnYWNjw6lkZXIgYXUgc2VydmljZSA6ICdSRVNUJyAodmlhIGwnQVBJIFJFU1QpIG91ICdXUFMnICh2aWEgbGEgbm9ybWUgV1BTKS5cbiAqICAgICAgUGFyIGTDqWZhdXQsIG9uIHV0aWxpc2UgbCdBUEkgUkVTVC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnpvbmx5XSAtIFBlcm1ldCBkZSBuZSByw6ljdXDDqXJlciBxdWUgbGVzIGFsdGl0dWRlcyBlbiBzb3J0aWUgcydpbCB2YXV0ICd0cnVlJy5cbiAqICAgICAgVmF1dCAnZmFsc2UnIHBhciBkw6lmYXV0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5yZXNvdXJjZV0gLSBSZXNvdXJjZSB1dGlsaXPDqWUgcG91ciByw6lhbGlzZXIgbGUgY2FsY3VsLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBvcHRpb25zID0ge1xuICogICAgICBhcGlLZXkgOiBudWxsLFxuICogICAgICBzZXJ2ZXJVcmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zZXJ2aWNlLycsXG4gKiAgICAgIHByb3RvY29sIDogJ0pTT05QJywgLy8gSlNPTlB8WEhSXG4gKiAgICAgIHByb3h5VVJMIDogbnVsbCxcbiAqICAgICAgaHR0cE1ldGhvZCA6ICdHRVQnLCAvLyBHRVR8UE9TVFxuICogICAgICB0aW1lT3V0IDogMTAwMDAsIC8vIG1zXG4gKiAgICAgIHJhd1Jlc3BvbnNlIDogZmFsc2UsIC8vIHRydWV8ZmFsc2VcbiAqICAgICAgc2NvcGUgOiBudWxsLCAvLyB0aGlzXG4gKiAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXNwb25zZSkge30sXG4gKiAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gKiAgICAgIC8vIHNww6ljaWZpcXVlIGF1IHNlcnZpY2VcbiAqICAgICAgcG9zaXRpb25zIDogW3tsb246LCBsYXQ6fSwge2xvbjosIGxhdDp9XSxcbiAqICAgICAgb3V0cHV0Rm9ybWF0IDogJ2pzb24nIC8vIGpzb258eG1sXG4gKiAgICAgIHNhbXBsaW5nIDogMyxcbiAqICAgICAgYXBpIDogJ1JFU1QnLCAvLyBSRVNUfFdQU1xuICogICAgICB6b25seSA6IGZhbHNlIC8vIGZhbHNlfHRydWUsXG4gKiAgICAgIHJlc291cmNlIDogXCJyZXNvdXJjZS1wYXItZGVmYXV0XCJcbiAqICAgfTtcbiAqXG4gKi9cbmZ1bmN0aW9uIEFsdGkgKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQWx0aSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfLmdldE1lc3NhZ2UoXCJDTEFTU19DT05TVFJVQ1RPUlwiLCBcIkFsdGlcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vbSBkZSBsYSBjbGFzc2UgKGhlcml0YWdlKVxuICAgICAqIEZJWE1FIGluc3RhbmNlIG91IGNsYXNzZSA/XG4gICAgICovXG4gICAgdGhpcy5DTEFTU05BTUUgPSBcIkFsdGlcIjtcblxuICAgIC8vIGFwcGVsIGR1IGNvbnN0cnVjdGV1ciBwYXIgaGVyaXRhZ2VcbiAgICBDb21tb25TZXJ2aWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJHcC5TZXJ2aWNlcy5BbHRpXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBBbHRpIChvcHRpb25zKV1cIik7XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgICAvLyBhbmFseXNlIGRlcyBvcHRpb25zXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICBpZiAoIW9wdGlvbnMucG9zaXRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwicG9zaXRpb25zXCIpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9FTVBUWVwiLCBcInBvc2l0aW9uc1wiKSk7XG4gICAgfVxuXG4gICAgLy8gYWpvdXQgZGVzIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2VcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zID0gb3B0aW9ucy5wb3NpdGlvbnM7XG5cbiAgICAvLyBmb3JtYXQgZGUgcsOpcG9uc2UgZHUgc2VydmljZSA6IFwianNvblwiIG91IFwieG1sXCIgKHZhbGV1ciBwYXIgZMOpZmF1dCksIGVuIG1pbnVzY3VsZSAhXG4gICAgdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCA9ICh0eXBlb2Ygb3B0aW9ucy5vdXRwdXRGb3JtYXQgPT09IFwic3RyaW5nXCIpID8gb3B0aW9ucy5vdXRwdXRGb3JtYXQudG9Mb3dlckNhc2UoKSA6IFwieG1sXCI7XG5cbiAgICAvLyByZXNzb3VyY2UgdXRpbGlzw6llIHBvdXIgbGUgY2FsY3VsIGFsdGltw6l0cmlxdWVcbiAgICB0aGlzLm9wdGlvbnMucmVzb3VyY2UgPSBvcHRpb25zLnJlc291cmNlIHx8IFwicmdlX2FsdGlfY29yc2UyYV9mbG9hdDMyX3ppcF9sYW1iOTNcIjtcblxuICAgIC8vIHNhbXBsaW5nXG4gICAgdGhpcy5vcHRpb25zLnNhbXBsaW5nID0gb3B0aW9ucy5zYW1wbGluZyB8fCBudWxsO1xuXG4gICAgLy8gdHlwZSBkJ2FwaSB1dGlsaXPDqSBwb3VyIHJlcXVldGVyIGxlIHNlcnZpY2UsIGVuIG1hanVzY3VsZSAhXG4gICAgdGhpcy5vcHRpb25zLmFwaSA9ICh0eXBlb2Ygb3B0aW9ucy5hcGkgPT09IFwic3RyaW5nXCIpID8gb3B0aW9ucy5hcGkudG9VcHBlckNhc2UoKSA6IFwiUkVTVFwiO1xuXG4gICAgLy8gbCdhcGkgbmUgcGV1dCDDqnRyZSBpbnRlcnJvZ8OpZSBxdSdlbiBHRVQuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcGkgPT09IFwiUkVTVFwiKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5odHRwTWV0aG9kID0gXCJHRVRcIjtcbiAgICB9XG5cbiAgICAvLyBwYXJhbS4gem9ubHlcbiAgICB0aGlzLm9wdGlvbnMuem9ubHkgPSBvcHRpb25zLnpvbmx5IHx8IGZhbHNlO1xuXG4gICAgLy8gcGFyYW0uIG1lYXN1cmVzXG4gICAgdGhpcy5vcHRpb25zLm1lYXN1cmVzID0gb3B0aW9ucy5tZWFzdXJlcyB8fCBmYWxzZTtcblxuICAgIC8vIGdlc3Rpb24gZGUgbCd1cmwgZHUgc2VydmljZSBwYXIgZGVmYXV0XG4gICAgLy8gc2kgbCd1cmwgbidlc3QgcGFzIHJlbnNlaWduw6llLCBpbCBmYXV0IHV0aWxpc2VyIGxlcyB1cmxzIHBhciBkZWZhdXRcbiAgICAvLyBlbiBmb25jdGlvbiBkdSB0eXBlIGQnYXBpLCBSRVNUIG91IFdQUywgZHUgZm9ybWF0IGRlIHJlcG9uc2UgZGVtYW5kw6kgKG91dHB1dEZvcm1hdClcbiAgICAvLyBhaW5zaSBxdWUgc3VyIGxlIHR5cGUgZGUgc2VydmljZSAocHJvZmlsIG91IGVsZXZhdGlvbilcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgLy8gQ29kZSBjb21tZW50w6kgcG91ciBSZWxlYXNlIGJldGEgc2VydmljZXMgRElGRlVTSU9OIHVuaXF1ZW1lbnQgOiBvbiB0YXBlIHN1ciBsJ2FudmNpZW4gc2VydmljZSBkJ2FsdGlcbiAgICAgICAgLyogdmFyIGxzdFVybEJ5RGVmYXVsdCA9IERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkubmV3VXJsKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub2xkQWx0aVNlcnZpY2UpIHtcbiAgICAgICAgICAgIGxzdFVybEJ5RGVmYXVsdCA9IERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKCk7XG4gICAgICAgIH0gKi9cbiAgICAgICAgLy8gUmVsZWFzZSBiZXRhIHNlcnZpY2VzIERJRkZVU0lPTiB1bmlxdWVtZW50IDogb24gdGFwZSBzdXIgbCdhbnZjaWVuIHNlcnZpY2UgZCdhbHRpXG4gICAgICAgIHZhciBsc3RVcmxCeURlZmF1bHQgPSBEZWZhdWx0VXJsU2VydmljZS5BbHRpLnVybCgpO1xuICAgICAgICB2YXIgdXJsRm91bmQgPSBudWxsO1xuICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5hcGkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJXUFNcIjpcbiAgICAgICAgICAgICAgICB1cmxGb3VuZCA9IGxzdFVybEJ5RGVmYXVsdC53cHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUkVTVFwiOlxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAob3B0aW9ucy5zYW1wbGluZyA/IFwicHJvZmlsXCIgOiBcImVsZXZhdGlvblwiKSArIFwiLVwiICsgdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdDtcbiAgICAgICAgICAgICAgICB1cmxGb3VuZCA9IGxzdFVybEJ5RGVmYXVsdFtrZXldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVU5LTk9XTlwiLCBcImFwaVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVybEZvdW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVcmwgYnkgZGVmYXVsdCBub3QgZm91bmQgIVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VydmVyVXJsID0gdXJsRm91bmQ7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiU2VydmVyIFVSTCBieSBkZWZhdWx0IDogXCIgKyB0aGlzLm9wdGlvbnMuc2VydmVyVXJsKTtcbiAgICB9XG5cbiAgICAvLyBnZXN0aW9uIGR1IHR5cGUgZGUgc2VydmljZVxuICAgIC8vIHNpIGwnZXh0ZW5zaW9uIGRlIGwndXJsIGVzdCAuanNvbiBvdSAueG1sLCBvbiBzdXJjaGFyZ2UgbGUgZm9ybWF0IGRlIHNvcnRpZSAob3V0cHV0Rm9ybWF0KVxuICAgIHZhciBpZHggPSB0aGlzLm9wdGlvbnMuc2VydmVyVXJsLmxhc3RJbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gdGhpcy5vcHRpb25zLnNlcnZlclVybC5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uLmxlbmd0aCA8IDUpIHsgLy8gRklYTUUgZXh0ZW5zaW9uIGRlIG1vaW5zIGRlIDQgY2FyLiAuLi5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiU2VydmVyIEV4dGVuc2lvbiBVUkwgOiBcIiArIGV4dGVuc2lvbik7XG4gICAgICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwieG1sXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQgPSBleHRlbnNpb24udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBvZiBzZXJ2aWNlIDogdW5rbm93biBvciB1bnN1cHBvcnRlZCAoanNvbiBvciB4bWwpICFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpBbHRpI1xuICovXG5BbHRpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qKlxuICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAqL1xuQWx0aS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbHRpO1xuXG4vKipcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZSAob3ZlcndyaXRlKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cbkFsdGkucHJvdG90eXBlLmJ1aWxkUmVxdWVzdCA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIC8vIHV0aWxpc2F0aW9uIGVuIG1vZGUgY2FsbGJhY2tcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgaHR0cE1ldGhvZCA6IHRoaXMub3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAvLyBjYWxsYmFja1xuICAgICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBzYXV2ZWdhcmRlIGRlIGxhIHJlcXVldGUgIVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVzdWx0O1xuICAgICAgICAgICAgc3VjY2Vzcy5jYWxsKHRoaXMsIHRoaXMucmVxdWVzdCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3IgOiBlcnJvcixcbiAgICAgICAgc2NvcGUgOiB0aGlzLFxuICAgICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlIDpcbiAgICAgICAgcmVzb3VyY2UgOiB0aGlzLm9wdGlvbnMucmVzb3VyY2UsXG4gICAgICAgIHBvc2l0aW9ucyA6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsXG4gICAgICAgIG91dHB1dEZvcm1hdCA6IHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQsXG4gICAgICAgIHNhbXBsaW5nIDogdGhpcy5vcHRpb25zLnNhbXBsaW5nLFxuICAgICAgICBhcGkgOiB0aGlzLm9wdGlvbnMuYXBpLFxuICAgICAgICB6b25seSA6IHRoaXMub3B0aW9ucy56b25seSxcbiAgICAgICAgbWVhc3VyZXMgOiB0aGlzLm9wdGlvbnMubWVhc3VyZXNcbiAgICB9O1xuXG4gICAgQWx0aVJlcXVlc3RGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBBbmFseXNlIGRlIGxhIHJlcG9uc2UgKG92ZXJ3cml0ZSlcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICovXG5BbHRpLnByb3RvdHlwZS5hbmFseXplUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAvLyBJTkZPXG4gICAgLy8gRmFjdG9yeSBwb3VyIG1hc3F1ZXIgbGEgY29tcGxleGl0w6kgZHUgcmV0b3VyIGR1IHNlcnZpY2UgcXVpIHJlbnZvaWUgc29pdFxuICAgIC8vICAtIHVuZSAnc3RyaW5nJyBxdWkgY29udGllbnQgZHUgWE1MIG91IEpTT04gbmF0aWYgZW4gbW9kZSBYSFJcbiAgICAvLyAgLSB1biBvYmpldCBKU09OIHF1aSBlc3QgbmF0aWYgb3UgZW5jYXBzdWzDqVxuXG4gICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICByZXNwb25zZSA6IHRoaXMucmVzcG9uc2UsXG4gICAgICAgICAgICBvdXRwdXRGb3JtYXQgOiB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0LCAvLyB1dGlsZSBwb3VyIHBhcnNlciBsYSBzdHJpbmcgZW4gbW9kZSBYSFIgOiBKU09OIG91IFhNTCAhXG4gICAgICAgICAgICByYXdSZXNwb25zZSA6IHRoaXMub3B0aW9ucy5yYXdSZXNwb25zZSxcbiAgICAgICAgICAgIG9uRXJyb3IgOiBlcnJvcixcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IHN1Y2Nlc3MsXG4gICAgICAgICAgICBzY29wZSA6IHRoaXNcbiAgICAgICAgfTtcblxuICAgICAgICBBbHRpUmVzcG9uc2VGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yLmNhbGwodGhpcywgbmV3IEVycm9yU2VydmljZShfLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VNUFRZXCIpKSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Alti.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Formats/AltiResponseReader.js": -/*!*********************************************************!*\ - !*** ./src/Services/Alti/Formats/AltiResponseReader.js ***! - \*********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Response/model/AltiResponse */ \"./src/Services/Alti/Response/model/AltiResponse.js\");\n/* harmony import */ var _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Response/model/Elevation */ \"./src/Services/Alti/Response/model/Elevation.js\");\n/* harmony import */ var _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Response/model/Measure */ \"./src/Services/Alti/Response/model/Measure.js\");\n/**\n * Fonction retournant un objet contenant des clés de lecture (readers)\n * qui permettent de parser des réponses XML du service Altimétrique du Géoportail\n * (calcul altimétrique simple ou profil altimétrique d'une courbe),\n * lorsque le paramètre output = xml,\n * afin de récupérer les élévations retournées.\n *\n * @module AltiResponseReader\n * @alias Gp.Services.Alti.Formats.AltiResponseReader\n * @private\n */\n\n// import Logger from \"../../../Utils/LoggerByDefault\";\n\n\n\n\n/**\n *\n * Objet AltiResponseReader\n *\n * @member {Object} AltiResponseReader\n *\n * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées \"readers\"\n * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire\n * et la valeur associée est une fonction (node, data)\n * où node est un noeud du document DOM\n * et data est un objet où l'on stocke les informations lues dans le XML.\n *\n * @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud \"elevations\" de la réponse XML\n * du service alti, correspondant logiquement à la racine du document\n * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)\n *\n * @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud \"elevation\" de la réponse xml du service alti.\n * (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc)\n *\n * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud \"lat\" de la réponse xml du service alti.\n * (contient une valeur de latitude, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud \"lon\" de la réponse xml du service alti.\n * (contient une valeur de longitude, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud \"z\" de la réponse xml du service alti.\n * (contient une valeur d'altitude, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud \"acc\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud \"measures\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud \"source_name\" de la réponse xml du service alti.\n * (pour remplir l'éventuel objet measure)\n *\n * @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud \"source_mesure\" de la réponse xml du service alti.\n * (pour remplir l'éventuel objet measure)\n *\n * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud \"ExceptionReport\" de la réponse xml du service alti.\n *\n * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud \"Exception\" de la réponse xml du service alti.\n *\n * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,\n * à l'aide des readers de la classe.\n *\n */\nvar AltiResponseReader = {};\nAltiResponseReader.READERS = {\n /**\n * Lecture d'un noeud \"elevations\" de la réponse XML du service alti, correspondant logiquement à la racine du document\n * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)\n *\n * @param {DOMElement} root - racine de la réponse XML\n * @static\n * @memberof AltiResponseReader\n * @returns {Object} Retourne un objet de type AltiResponse\n */\n elevations: function elevations(root) {\n // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir.\n var altiResponse = new _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n if (root.hasChildNodes()) {\n var children = root.childNodes;\n var child;\n var elevation;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (AltiResponseReader.READERS[child.nodeName]) {\n elevation = AltiResponseReader.READERS[child.nodeName](child);\n altiResponse.elevations.push(elevation);\n }\n }\n }\n return altiResponse;\n },\n /**\n * Lecture d'un noeud \"elevation\" de la réponse xml du service alti.\n * (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures)\n *\n * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures])\n * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse\n * @static\n * @memberof AltiResponseReader\n */\n elevation: function elevation(node) {\n var elevation = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (AltiResponseReader.READERS[child.nodeName]) {\n // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.\n AltiResponseReader.READERS[child.nodeName](child, elevation);\n }\n }\n }\n return elevation;\n },\n /**\n * Lecture d'un noeud \"lat\" de la réponse xml du service alti.\n * (contient une valeur de latitude, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la latitude\n * @param {Object} elevation - objet dans lequel stocker la latitude retournée\n * @static\n * @memberof AltiResponseReader\n */\n lat: function lat(node, elevation) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n elevation.lat = parseFloat(textNode.nodeValue);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : latitude attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"lon\" de la réponse xml du service alti.\n * (contient une valeur de longitude, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la longitude\n * @param {Object} elevation - objet dans lequel stocker la longitude retournée\n * @static\n * @memberof AltiResponseReader\n */\n lon: function lon(node, elevation) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n elevation.lon = parseFloat(textNode.nodeValue);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : longitude attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"z\" de la réponse xml du service alti.\n * (contient une valeur d'altitude, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'altitude\n * @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure\n * @static\n * @memberof AltiResponseReader\n */\n z: function z(node, elevationObject) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n if (elevationObject) {\n elevationObject.z = parseFloat(textNode.nodeValue);\n } else {\n elevationObject = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n elevationObject.z = parseFloat(textNode.nodeValue);\n return elevationObject;\n }\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : altitude attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"acc\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure\n * @static\n * @memberof AltiResponseReader\n */\n acc: function acc(node, elevationObject) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n elevationObject.acc = parseFloat(textNode.nodeValue);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"source_name\" de la réponse xml du service alti.\n * (contient le nom de la source, qui est un string)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} measure - objet dans lequel stocker le nom de la source retourné\n * @static\n * @memberof AltiResponseReader\n */\n source_name: function source_name(node, measure) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n measure.source_name = textNode.nodeValue;\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : source_name attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"source_measure\" de la réponse xml du service alti.\n * (contient le nom de la mesure, qui est un string)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} measure - objet dans lequel stocker le nom de la source retourné\n * @static\n * @memberof AltiResponseReader\n */\n source_measure: function source_measure(node, measure) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n measure.source_measure = textNode.nodeValue;\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : source_measure attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"measures\" et de ses enfants \"measure\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} elevation - objet dans lequel stocker la précision retournée\n * @static\n * @memberof AltiResponseReader\n */\n measures: function measures(node, elevation) {\n elevation.measures = [];\n var measure;\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var measureNode;\n var measureChildren;\n for (var i = 0; i < children.length; i++) {\n measure = new _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n measureNode = children[i];\n measureChildren = measureNode.childNodes;\n for (var j = 0; j < measureChildren.length; j++) {\n if (AltiResponseReader.READERS[measureChildren[j].nodeName]) {\n // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.\n AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : measures attendues mais absentes\");\n }\n }\n elevation.measures.push(measure);\n }\n }\n },\n /**\n * Lecture d'un noeud \"ExceptionReport\" de la réponse xml du service alti.\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'exception\n * @return {Object} exceptionReport - objet contenant l'exception\n * @static\n * @memberof AltiResponseReader\n */\n exceptionreport: function exceptionreport(node) {\n var response = {};\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.nodeName === \"Exception\") {\n response.exceptionReport = AltiResponseReader.READERS.exception(child);\n }\n }\n }\n return response;\n },\n /**\n * Lecture d'un noeud \"Exception\" de la réponse xml du service alti.\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'exception\n * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs :\n * {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception\n * {String} exceptionReport.exception - qui contient le message de l'exception\n * @static\n * @memberof AltiResponseReader\n */\n exception: function exception(node) {\n var exceptionReport = {};\n\n // get exception code\n var exceptionCode = node.getAttribute(\"exceptionCode\");\n if (exceptionCode) {\n exceptionReport.exceptionCode = exceptionCode;\n }\n\n // get exception message\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n exceptionReport.exception = textNode.nodeValue;\n }\n return exceptionReport;\n },\n /**\n * Lecture d'un noeud \"Error\" de la réponse xml du service alti.\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'exception\n * @return {Object} error - objet contenant l'exception\n * @static\n */\n error: function error(node) {\n var response = {\n error: {}\n };\n // get error code and description\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n var textNode;\n // get error code\n if (child.nodeType === 1 && child.nodeName === \"code\") {\n // 1 === node.ELEMENT_NODE\n textNode = child.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n response.error.code = textNode.nodeValue;\n }\n }\n // get error description\n if (child.nodeType === 1 && child.nodeName === \"description\") {\n // 1 === node.ELEMENT_NODE\n textNode = child.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n response.error.description = textNode.nodeValue;\n }\n }\n }\n }\n return response;\n }\n};\n\n/**\n * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,\n * à l'aide des readers de la classe.\n *\n * @method AltiResponseReader.read\n * @param {DOMElement} root - racine de la réponse XML à lire\n * @static\n * @memberof AltiResponseReader\n */\nAltiResponseReader.read = function (root) {\n if (root.nodeName === \"elevations\") {\n var altiResponse = AltiResponseReader.READERS.elevations(root);\n return altiResponse;\n } else if (root.nodeName === \"ExceptionReport\") {\n var exceptionReport = AltiResponseReader.READERS.exceptionreport(root);\n return exceptionReport;\n } else if (root.nodeName === \"error\") {\n var error = AltiResponseReader.READERS.error(root);\n return error;\n } else {\n throw new Error(\"Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.\");\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiResponseReader);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL0Zvcm1hdHMvQWx0aVJlc3BvbnNlUmVhZGVyLmpzPzNlYTAiXSwibmFtZXMiOlsiQWx0aVJlc3BvbnNlUmVhZGVyIiwiUkVBREVSUyIsImVsZXZhdGlvbnMiLCJyb290IiwiYWx0aVJlc3BvbnNlIiwiQWx0aVJlc3BvbnNlIiwiaGFzQ2hpbGROb2RlcyIsImNoaWxkcmVuIiwiY2hpbGROb2RlcyIsImNoaWxkIiwiZWxldmF0aW9uIiwiaSIsImxlbmd0aCIsIm5vZGVOYW1lIiwicHVzaCIsIm5vZGUiLCJFbGV2YXRpb24iLCJsYXQiLCJ0ZXh0Tm9kZSIsImZpcnN0Q2hpbGQiLCJub2RlVHlwZSIsInBhcnNlRmxvYXQiLCJub2RlVmFsdWUiLCJFcnJvciIsImxvbiIsInoiLCJlbGV2YXRpb25PYmplY3QiLCJhY2MiLCJzb3VyY2VfbmFtZSIsIm1lYXN1cmUiLCJzb3VyY2VfbWVhc3VyZSIsIm1lYXN1cmVzIiwibWVhc3VyZU5vZGUiLCJtZWFzdXJlQ2hpbGRyZW4iLCJNZWFzdXJlIiwiaiIsImV4Y2VwdGlvbnJlcG9ydCIsInJlc3BvbnNlIiwiZXhjZXB0aW9uUmVwb3J0IiwiZXhjZXB0aW9uIiwiZXhjZXB0aW9uQ29kZSIsImdldEF0dHJpYnV0ZSIsImVycm9yIiwiY29kZSIsImRlc2NyaXB0aW9uIiwicmVhZCJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQzBEO0FBQ047QUFDSjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QVk7RUFDdkIsQ0FBQyxNQUFNLElBQUlELElBQUksQ0FBQ1UsUUFBUSxLQUFLLGlCQUFpQixFQUFFO0lBQzVDLElBQUl5QixlQUFlLEdBQUd0QyxrQkFBa0IsQ0FBQ0MsT0FBTyxDQUFDbUMsZUFBZSxDQUFDakMsSUFBSSxDQUFDO0lBQ3RFLE9BQU9tQyxlQUFlO0VBQzFCLENBQUMsTUFBTSxJQUFJbkMsSUFBSSxDQUFDVSxRQUFRLEtBQUssT0FBTyxFQUFFO0lBQ2xDLElBQUk2QixLQUFLLEdBQUcxQyxrQkFBa0IsQ0FBQ0MsT0FBTyxDQUFDeUMsS0FBSyxDQUFDdkMsSUFBSSxDQUFDO0lBQ2xELE9BQU91QyxLQUFLO0VBQ2hCLENBQUMsTUFBTTtJQUNILE1BQU0sSUFBSW5CLEtBQUssQ0FBQyw2RUFBNkUsQ0FBQztFQUNsRztBQUNKLENBQUM7QUFFY3ZCLGlGQUFrQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9BbHRpL0Zvcm1hdHMvQWx0aVJlc3BvbnNlUmVhZGVyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEZvbmN0aW9uIHJldG91cm5hbnQgdW4gb2JqZXQgY29udGVuYW50IGRlcyBjbMOpcyBkZSBsZWN0dXJlIChyZWFkZXJzKVxuICogICAgICBxdWkgcGVybWV0dGVudCBkZSBwYXJzZXIgZGVzIHLDqXBvbnNlcyBYTUwgZHUgc2VydmljZSBBbHRpbcOpdHJpcXVlIGR1IEfDqW9wb3J0YWlsXG4gKiAgICAgIChjYWxjdWwgYWx0aW3DqXRyaXF1ZSBzaW1wbGUgb3UgcHJvZmlsIGFsdGltw6l0cmlxdWUgZCd1bmUgY291cmJlKSxcbiAqICAgICAgbG9yc3F1ZSBsZSBwYXJhbcOodHJlIG91dHB1dCA9IHhtbCxcbiAqICAgICAgYWZpbiBkZSByw6ljdXDDqXJlciBsZXMgw6lsw6l2YXRpb25zIHJldG91cm7DqWVzLlxuICpcbiAqIEBtb2R1bGUgQWx0aVJlc3BvbnNlUmVhZGVyXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5Gb3JtYXRzLkFsdGlSZXNwb25zZVJlYWRlclxuICogQHByaXZhdGVcbiAqL1xuXG4vLyBpbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBBbHRpUmVzcG9uc2UgZnJvbSBcIi4uL1Jlc3BvbnNlL21vZGVsL0FsdGlSZXNwb25zZVwiO1xuaW1wb3J0IEVsZXZhdGlvbiBmcm9tIFwiLi4vUmVzcG9uc2UvbW9kZWwvRWxldmF0aW9uXCI7XG5pbXBvcnQgTWVhc3VyZSBmcm9tIFwiLi4vUmVzcG9uc2UvbW9kZWwvTWVhc3VyZVwiO1xuXG4vKipcbiAqXG4gKiBPYmpldCBBbHRpUmVzcG9uc2VSZWFkZXJcbiAqXG4gKiBAbWVtYmVyIHtPYmplY3R9IEFsdGlSZXNwb25zZVJlYWRlclxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUyAtIE9iamV0IGNvbnRlbmFudCBkZXMgZm9uY3Rpb25zIGRlIGxlY3R1cmUsIGFwcGVsw6llcyBcInJlYWRlcnNcIlxuICogICAgICBkb250IGNoYXF1ZSBjbMOpIGNvcnJlc3BvbmQgYXUgbm9tIGQndW4gdGFnIGR1IFhNTCBxdWUgbCdvbiBzb3VoYWl0ZSBsaXJlXG4gKiAgICAgIGV0IGxhIHZhbGV1ciBhc3NvY2nDqWUgZXN0IHVuZSBmb25jdGlvbiAobm9kZSwgZGF0YSlcbiAqICAgICAgb8O5IG5vZGUgZXN0IHVuIG5vZXVkIGR1IGRvY3VtZW50IERPTVxuICogICAgICBldCBkYXRhIGVzdCB1biBvYmpldCBvw7kgbCdvbiBzdG9ja2UgbGVzIGluZm9ybWF0aW9ucyBsdWVzIGRhbnMgbGUgWE1MLlxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0aG9kfSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5lbGV2YXRpb25zIC0gIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvbnNcIiBkZSBsYSByw6lwb25zZSBYTUxcbiAqICAgICAgZHUgc2VydmljZSBhbHRpLCBjb3JyZXNwb25kYW50IGxvZ2lxdWVtZW50IMOgIGxhIHJhY2luZSBkdSBkb2N1bWVudFxuICogICAgICAoY29udGllbnQgdW4gb3UgcGx1c2lldXJzIGNoaWxkTm9kZXMgY29ycmVzcG9uZGFudCBjaGFjdW4gw6AgdW5lIMOpbMOpdmF0aW9uIHJldG91cm7DqWUpXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmVsZXZhdGlvbiAtIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKiAgICAgIChjb250aWVudCB1biBvdSA0IGNoaWxkTm9kZSAocykgY29ycmVzcG9uZGFudCDDoCBsJ2FsdGl0dWRlICh6KSBldCDDqXZlbnR1ZWxsZW1lbnQgbGF0LCBsb24sIGV0IGFjYylcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMubGF0IC0gTGVjdHVyZSBkJ3VuIG5vZXVkIFwibGF0XCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgbGF0aXR1ZGUsIHF1aSBlc3QgdW4gZmxvdHRhbnQpXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmxvbiAtIExlY3R1cmUgZCd1biBub2V1ZCBcImxvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKiAgICAgIChjb250aWVudCB1bmUgdmFsZXVyIGRlIGxvbmdpdHVkZSwgcXVpIGVzdCB1biBmbG90dGFudClcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMueiAtIExlY3R1cmUgZCd1biBub2V1ZCBcInpcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICogICAgICAoY29udGllbnQgdW5lIHZhbGV1ciBkJ2FsdGl0dWRlLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0aG9kfSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5hY2MgLSBMZWN0dXJlIGQndW4gbm9ldWQgXCJhY2NcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICogICAgICAoY29udGllbnQgdW5lIHZhbGV1ciBkZSBwcsOpY2lzaW9uLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0aG9kfSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5tZWFzdXJlcyAtIExlY3R1cmUgZCd1biBub2V1ZCBcIm1lYXN1cmVzXCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgcHLDqWNpc2lvbiwgcXVpIGVzdCB1biBmbG90dGFudClcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMuc291cmNlX25hbWUgLSBMZWN0dXJlIGQndW4gbm9ldWQgXCJzb3VyY2VfbmFtZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKiAgICAgIChwb3VyIHJlbXBsaXIgbCfDqXZlbnR1ZWwgb2JqZXQgbWVhc3VyZSlcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMuc291cmNlX21lc3VyZSAtIExlY3R1cmUgZCd1biBub2V1ZCBcInNvdXJjZV9tZXN1cmVcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICogICAgICAocG91ciByZW1wbGlyIGwnw6l2ZW50dWVsIG9iamV0IG1lYXN1cmUpXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbnJlcG9ydCAtIExlY3R1cmUgZCd1biBub2V1ZCBcIkV4Y2VwdGlvblJlcG9ydFwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbiAtIExlY3R1cmUgZCd1biBub2V1ZCBcIkV4Y2VwdGlvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5yZWFkIC0gTcOpdGhvZGUgcGVybWV0dGFudCBkZSBsYW5jZXIgbGEgbGVjdHVyZSBkJ3VuZSByw6lwb25zZSBYTUwgZHUgc2VydmljZSBhbHRpbcOpdHJpcXVlLFxuICogICAgICDDoCBsJ2FpZGUgZGVzIHJlYWRlcnMgZGUgbGEgY2xhc3NlLlxuICpcbiAqL1xudmFyIEFsdGlSZXNwb25zZVJlYWRlciA9IHt9O1xuXG5BbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUyA9IHtcblxuICAgIC8qKlxuICAgICAqIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvbnNcIiBkZSBsYSByw6lwb25zZSBYTUwgZHUgc2VydmljZSBhbHRpLCBjb3JyZXNwb25kYW50IGxvZ2lxdWVtZW50IMOgIGxhIHJhY2luZSBkdSBkb2N1bWVudFxuICAgICAqICAgICAgKGNvbnRpZW50IHVuIG91IHBsdXNpZXVycyBjaGlsZE5vZGVzIGNvcnJlc3BvbmRhbnQgY2hhY3VuIMOgIHVuZSDDqWzDqXZhdGlvbiByZXRvdXJuw6llKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290IC0gcmFjaW5lIGRlIGxhIHLDqXBvbnNlIFhNTFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0b3VybmUgdW4gb2JqZXQgZGUgdHlwZSBBbHRpUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbGV2YXRpb25zIDogZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgICAgLy8gSU5GTyA6IG9uIHBhc3NlIGVuIHBhcmFtw6h0cmUgbCdvYmpldCBlbiBlbnRyw6llIGVsZXZhdGlvbnMsIHZpZGUsIMOgIHJlbXBsaXIuXG4gICAgICAgIHZhciBhbHRpUmVzcG9uc2UgPSBuZXcgQWx0aVJlc3BvbnNlKCk7XG5cbiAgICAgICAgaWYgKHJvb3QuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSByb290LmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgICAgICB2YXIgZWxldmF0aW9uO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgICAgICAgICAgIGlmIChBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSU1tjaGlsZC5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uID0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlNbY2hpbGQubm9kZU5hbWVdKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgYWx0aVJlc3BvbnNlLmVsZXZhdGlvbnMucHVzaChlbGV2YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbHRpUmVzcG9uc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgdW4gb3UgNSBjaGlsZE5vZGUgKHMpIGNvcnJlc3BvbmRhbnQgw6AgbCdhbHRpdHVkZSAoeikgZXQgw6l2ZW50dWVsbGVtZW50IGxhdCwgbG9uLCBhY2MgZXQgbWVhc3VyZXMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCBlbGV2YXRpb24gw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgbCfDqWzDqXZhdGlvbiByZXRvdXJuw6llICh6IFssIGxvbiwgbGF0LCBhY2MsIG1lYXN1cmVzXSlcbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gZWxldmF0aW9uUmVzcG9uc2UgLSBmb3JtYXQgZGUgbGEgcsOpcG9uc2UgZW4gc29ydGllLCBpbnN0YW5jZSBkZSBBbHRpUmVzcG9uc2VcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGVsZXZhdGlvbiA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBlbGV2YXRpb24gPSBuZXcgRWxldmF0aW9uKCk7XG5cbiAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlNbY2hpbGQubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElORk8gOiBvbiBwYXNzZSBlbiBwYXJhbcOodHJlIGwnb2JqZXQgZW4gZW50csOpZSBlbGV2YXRpb24sIHZpZGUsIMOgIHJlbXBsaXIuXG4gICAgICAgICAgICAgICAgICAgIEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTW2NoaWxkLm5vZGVOYW1lXShjaGlsZCwgZWxldmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXZhdGlvbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGVjdHVyZSBkJ3VuIG5vZXVkIFwibGF0XCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAgICAgKiAgICAgIChjb250aWVudCB1bmUgdmFsZXVyIGRlIGxhdGl0dWRlLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxhIGxhdGl0dWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZXZhdGlvbiAtIG9iamV0IGRhbnMgbGVxdWVsIHN0b2NrZXIgbGEgbGF0aXR1ZGUgcmV0b3VybsOpZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICovXG4gICAgbGF0IDogZnVuY3Rpb24gKG5vZGUsIGVsZXZhdGlvbikge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgZWxldmF0aW9uLmxhdCA9IHBhcnNlRmxvYXQodGV4dE5vZGUubm9kZVZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IGxhdGl0dWRlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJsb25cIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgbG9uZ2l0dWRlLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxhIGxvbmdpdHVkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGV2YXRpb24gLSBvYmpldCBkYW5zIGxlcXVlbCBzdG9ja2VyIGxhIGxvbmdpdHVkZSByZXRvdXJuw6llXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBBbHRpUmVzcG9uc2VSZWFkZXJcbiAgICAgKi9cbiAgICBsb24gOiBmdW5jdGlvbiAobm9kZSwgZWxldmF0aW9uKSB7XG4gICAgICAgIHZhciB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRleHROb2RlICYmIHRleHROb2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIDMgPT09IG5vZGUuVEVYVF9OT0RFXG4gICAgICAgICAgICBlbGV2YXRpb24ubG9uID0gcGFyc2VGbG9hdCh0ZXh0Tm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyZXVyIGRhbnMgbGEgbGVjdHVyZSBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIDogbG9uZ2l0dWRlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJ6XCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAgICAgKiAgICAgIChjb250aWVudCB1bmUgdmFsZXVyIGQnYWx0aXR1ZGUsIHF1aSBlc3QgdW4gZmxvdHRhbnQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbCdhbHRpdHVkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGV2YXRpb25PYmplY3QgLSBvYmpldCBkYW5zIGxlcXVlbCBzdG9ja2VyIGwnYWx0aXR1ZGUgcmV0b3VybsOpZSA6IGVsZXZhdGlvbiBvdSBtZWFzdXJlXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBBbHRpUmVzcG9uc2VSZWFkZXJcbiAgICAgKi9cbiAgICB6IDogZnVuY3Rpb24gKG5vZGUsIGVsZXZhdGlvbk9iamVjdCkge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgaWYgKGVsZXZhdGlvbk9iamVjdCkge1xuICAgICAgICAgICAgICAgIGVsZXZhdGlvbk9iamVjdC56ID0gcGFyc2VGbG9hdCh0ZXh0Tm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGV2YXRpb25PYmplY3QgPSBuZXcgRWxldmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgZWxldmF0aW9uT2JqZWN0LnogPSBwYXJzZUZsb2F0KHRleHROb2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZXZhdGlvbk9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IGFsdGl0dWRlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJhY2NcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgcHLDqWNpc2lvbiwgcXVpIGVzdCB1biBmbG90dGFudClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZSAtIG5vZXVkIMOgIGxpcmUgcG91ciByw6ljdXDDqXJlciBsYSBwcsOpY2lzaW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZXZhdGlvbk9iamVjdCAtIG9iamV0IGRhbnMgbGVxdWVsIHN0b2NrZXIgbGEgcHLDqWNpc2lvbiByZXRvdXJuw6llIDogZWxldmF0aW9uIG91IG1lYXN1cmVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGFjYyA6IGZ1bmN0aW9uIChub2RlLCBlbGV2YXRpb25PYmplY3QpIHtcbiAgICAgICAgdmFyIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGV4dE5vZGUgJiYgdGV4dE5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gMyA9PT0gbm9kZS5URVhUX05PREVcbiAgICAgICAgICAgIGVsZXZhdGlvbk9iamVjdC5hY2MgPSBwYXJzZUZsb2F0KHRleHROb2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJldXIgZGFucyBsYSBsZWN0dXJlIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBwcsOpY2lzaW9uIChhY2MpIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJzb3VyY2VfbmFtZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgbGUgbm9tIGRlIGxhIHNvdXJjZSwgcXVpIGVzdCB1biBzdHJpbmcpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbGEgcHLDqWNpc2lvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZWFzdXJlIC0gb2JqZXQgZGFucyBsZXF1ZWwgc3RvY2tlciBsZSBub20gZGUgbGEgc291cmNlIHJldG91cm7DqVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICovXG4gICAgc291cmNlX25hbWUgOiBmdW5jdGlvbiAobm9kZSwgbWVhc3VyZSkge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgbWVhc3VyZS5zb3VyY2VfbmFtZSA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IHNvdXJjZV9uYW1lIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJzb3VyY2VfbWVhc3VyZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgbGUgbm9tIGRlIGxhIG1lc3VyZSwgcXVpIGVzdCB1biBzdHJpbmcpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbGEgcHLDqWNpc2lvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZWFzdXJlIC0gb2JqZXQgZGFucyBsZXF1ZWwgc3RvY2tlciBsZSBub20gZGUgbGEgc291cmNlIHJldG91cm7DqVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICovXG4gICAgc291cmNlX21lYXN1cmUgOiBmdW5jdGlvbiAobm9kZSwgbWVhc3VyZSkge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgbWVhc3VyZS5zb3VyY2VfbWVhc3VyZSA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IHNvdXJjZV9tZWFzdXJlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJtZWFzdXJlc1wiIGV0IGRlIHNlcyBlbmZhbnRzIFwibWVhc3VyZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgdW5lIHZhbGV1ciBkZSBwcsOpY2lzaW9uLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxhIHByw6ljaXNpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxldmF0aW9uIC0gb2JqZXQgZGFucyBsZXF1ZWwgc3RvY2tlciBsYSBwcsOpY2lzaW9uIHJldG91cm7DqWVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIG1lYXN1cmVzIDogZnVuY3Rpb24gKG5vZGUsIGVsZXZhdGlvbikge1xuICAgICAgICBlbGV2YXRpb24ubWVhc3VyZXMgPSBbXTtcbiAgICAgICAgdmFyIG1lYXN1cmU7XG4gICAgICAgIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgdmFyIG1lYXN1cmVOb2RlO1xuICAgICAgICAgICAgdmFyIG1lYXN1cmVDaGlsZHJlbjtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtZWFzdXJlID0gbmV3IE1lYXN1cmUoKTtcbiAgICAgICAgICAgICAgICBtZWFzdXJlTm9kZSA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIG1lYXN1cmVDaGlsZHJlbiA9IG1lYXN1cmVOb2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtZWFzdXJlQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTW21lYXN1cmVDaGlsZHJlbltqXS5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElORk8gOiBvbiBwYXNzZSBlbiBwYXJhbcOodHJlIGwnb2JqZXQgZW4gZW50csOpZSBlbGV2YXRpb24sIHZpZGUsIMOgIHJlbXBsaXIuXG4gICAgICAgICAgICAgICAgICAgICAgICBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSU1ttZWFzdXJlQ2hpbGRyZW5bal0ubm9kZU5hbWVdKG1lYXN1cmVDaGlsZHJlbltqXSwgbWVhc3VyZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJldXIgZGFucyBsYSBsZWN0dXJlIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBtZWFzdXJlcyBhdHRlbmR1ZXMgbWFpcyBhYnNlbnRlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGV2YXRpb24ubWVhc3VyZXMucHVzaChtZWFzdXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJFeGNlcHRpb25SZXBvcnRcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGwnZXhjZXB0aW9uXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBleGNlcHRpb25SZXBvcnQgLSBvYmpldCBjb250ZW5hbnQgbCdleGNlcHRpb25cbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGV4Y2VwdGlvbnJlcG9ydCA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciByZXNwb25zZSA9IHt9O1xuXG4gICAgICAgIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgdmFyIGNoaWxkO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lID09PSBcIkV4Y2VwdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmV4Y2VwdGlvblJlcG9ydCA9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbihjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJFeGNlcHRpb25cIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGwnZXhjZXB0aW9uXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBleGNlcHRpb25SZXBvcnQgLSBvYmpldCBjb250ZW5hbnQgbCdleGNlcHRpb24sIGF2ZWMgZGV1eCBhdHRyaWJ1dHMgOlxuICAgICAqICAgICAge1N0cmluZ30gZXhjZXB0aW9uUmVwb3J0LmV4Y2VwdGlvbkNvZGUgLSBxdWkgY29udGllbnQgbCdpZGVudGlmaWFudCBkdSBjb2RlIGRlIGwnZXhjZXB0aW9uXG4gICAgICogICAgICB7U3RyaW5nfSBleGNlcHRpb25SZXBvcnQuZXhjZXB0aW9uIC0gcXVpIGNvbnRpZW50IGxlIG1lc3NhZ2UgZGUgbCdleGNlcHRpb25cbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGV4Y2VwdGlvbiA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBleGNlcHRpb25SZXBvcnQgPSB7fTtcblxuICAgICAgICAvLyBnZXQgZXhjZXB0aW9uIGNvZGVcbiAgICAgICAgdmFyIGV4Y2VwdGlvbkNvZGUgPSBub2RlLmdldEF0dHJpYnV0ZShcImV4Y2VwdGlvbkNvZGVcIik7XG4gICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7XG4gICAgICAgICAgICBleGNlcHRpb25SZXBvcnQuZXhjZXB0aW9uQ29kZSA9IGV4Y2VwdGlvbkNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgZXhjZXB0aW9uIG1lc3NhZ2VcbiAgICAgICAgdmFyIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGV4dE5vZGUgJiYgdGV4dE5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gMyA9PT0gbm9kZS5URVhUX05PREVcbiAgICAgICAgICAgIGV4Y2VwdGlvblJlcG9ydC5leGNlcHRpb24gPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhjZXB0aW9uUmVwb3J0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJFcnJvclwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbCdleGNlcHRpb25cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IGVycm9yIC0gb2JqZXQgY29udGVuYW50IGwnZXhjZXB0aW9uXG4gICAgICogQHN0YXRpY1xuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgZXJyb3IgOiB7fVxuICAgICAgICB9O1xuICAgICAgICAvLyBnZXQgZXJyb3IgY29kZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICB2YXIgdGV4dE5vZGU7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGVycm9yIGNvZGVcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgY2hpbGQubm9kZU5hbWUgPT09IFwiY29kZVwiKSB7IC8vIDEgPT09IG5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgIHRleHROb2RlID0gY2hpbGQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHROb2RlICYmIHRleHROb2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIDMgPT09IG5vZGUuVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvci5jb2RlID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGdldCBlcnJvciBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiBjaGlsZC5ub2RlTmFtZSA9PT0gXCJkZXNjcmlwdGlvblwiKSB7IC8vIDEgPT09IG5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgIHRleHROb2RlID0gY2hpbGQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHROb2RlICYmIHRleHROb2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIDMgPT09IG5vZGUuVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvci5kZXNjcmlwdGlvbiA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG59O1xuXG4vKipcbiAqIE3DqXRob2RlIHBlcm1ldHRhbnQgZGUgbGFuY2VyIGxhIGxlY3R1cmUgZCd1bmUgcsOpcG9uc2UgWE1MIGR1IHNlcnZpY2UgYWx0aW3DqXRyaXF1ZSxcbiAqICAgICAgw6AgbCdhaWRlIGRlcyByZWFkZXJzIGRlIGxhIGNsYXNzZS5cbiAqXG4gKiBAbWV0aG9kIEFsdGlSZXNwb25zZVJlYWRlci5yZWFkXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3QgLSByYWNpbmUgZGUgbGEgcsOpcG9uc2UgWE1MIMOgIGxpcmVcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBBbHRpUmVzcG9uc2VSZWFkZXJcbiAqL1xuQWx0aVJlc3BvbnNlUmVhZGVyLnJlYWQgPSBmdW5jdGlvbiAocm9vdCkge1xuICAgIGlmIChyb290Lm5vZGVOYW1lID09PSBcImVsZXZhdGlvbnNcIikge1xuICAgICAgICB2YXIgYWx0aVJlc3BvbnNlID0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMuZWxldmF0aW9ucyhyb290KTtcbiAgICAgICAgcmV0dXJuIGFsdGlSZXNwb25zZTtcbiAgICB9IGVsc2UgaWYgKHJvb3Qubm9kZU5hbWUgPT09IFwiRXhjZXB0aW9uUmVwb3J0XCIpIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvblJlcG9ydCA9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbnJlcG9ydChyb290KTtcbiAgICAgICAgcmV0dXJuIGV4Y2VwdGlvblJlcG9ydDtcbiAgICB9IGVsc2UgaWYgKHJvb3Qubm9kZU5hbWUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICB2YXIgZXJyb3IgPSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5lcnJvcihyb290KTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgOiBlbGxlIG4nZXN0IHBhcyBhdSBmb3JtYXQgYXR0ZW5kdS5cIik7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlc3BvbnNlUmVhZGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Alti/Formats/AltiResponseReader.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Request/AltiRequestFactory.js": -/*!*********************************************************!*\ - !*** ./src/Services/Alti/Request/AltiRequestFactory.js ***! - \*********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AltiRequestREST */ \"./src/Services/Alti/Request/AltiRequestREST.js\");\n/* harmony import */ var _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AltiRequestWPS */ \"./src/Services/Alti/Request/AltiRequestWPS.js\");\n/**\n * Creation d'une requête en REST ou WPS\n * (Factory)\n *\n * @module AltiRequestFactory\n * @alias Gp.Services.Alti.Request.AltiRequestFactory\n * @private\n */\n\n\n\n\nvar AltiRequestFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Alti\n *\n * @example\n * var options = {\n * httpMethod : 'GET', // GET|POST\n * onSuccess : function (response) {},\n * onError : function (error) {},\n * scope : this,\n * positions : [{lon:, lat:}, {lon:, lat:}],\n * outputFormat : 'json' // json|xml\n * sampling : 3,\n * api : 'REST', // REST|WPS\n * zonly : false // false|true\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiRequestFactory\");\n logger.trace([\"AltiRequestFactory::build()\"]);\n var request = null;\n\n // on factorise les options par groupe;\n // - global,\n // - param, les params pour les data inputs\n // - wps, les param du service\n // - callback\n\n var settings = {\n // ajout des valeurs par defaut spécifiques au service\n type: options.sampling ? \"Profil\" : \"Elevation\",\n method: options.httpMethod,\n param: {\n positions: null,\n delimiter: null,\n // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !?\n indent: null,\n // par defaut\n crs: null,\n // par defaut\n format: null,\n // (only to POST)\n sampling: null,\n // (only use by Profil)\n zonly: null,\n // (only use by Elevation)\n measures: null // (only use by Elevation)\n }\n };\n\n // surcharge des valeurs obligatoires\n settings.param.positions = options.positions;\n settings.param.format = options.outputFormat;\n settings.param.sampling = options.sampling;\n settings.param.zonly = options.zonly;\n settings.param.measures = options.measures;\n settings.param.resource = options.resource;\n\n // gestion des callback\n var bOnError = !!(options.onError !== null && typeof options.onError === \"function\"); // cast variable to boolean\n var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === \"function\");\n var message = null;\n switch (options.api) {\n case \"REST\":\n // FIXME les exceptions ne sont pas 'catchées' sur le constructeur !\n var myReq = new _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](settings);\n if (!myReq.processRequestString()) {\n message = \"Error in process request (rest) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n request = myReq.requestString;\n break;\n case \"WPS\":\n // ajout des valeurs par defaut spécifiques au service WPS\n settings.wps = {\n service: null,\n // par defaut\n version: null,\n // par defaut\n identifier: null,\n // par defaut\n rawdataoutput: null,\n // par defaut\n request: null // par defaut\n };\n\n request = _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__[\"default\"].build(settings);\n if (!request) {\n message = \"Error in process request (wps) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n break;\n default:\n message = \"Type of API is not supported by service (REST or WPS) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n if (bOnSuccess) {\n options.onSuccess.call(options.scope, request);\n }\n return request;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequestFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvQWx0aVJlcXVlc3RGYWN0b3J5LmpzP2Q0MDMiXSwibmFtZXMiOlsiQWx0aVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJyZXF1ZXN0Iiwic2V0dGluZ3MiLCJ0eXBlIiwic2FtcGxpbmciLCJtZXRob2QiLCJodHRwTWV0aG9kIiwicGFyYW0iLCJwb3NpdGlvbnMiLCJkZWxpbWl0ZXIiLCJpbmRlbnQiLCJjcnMiLCJmb3JtYXQiLCJ6b25seSIsIm1lYXN1cmVzIiwib3V0cHV0Rm9ybWF0IiwicmVzb3VyY2UiLCJiT25FcnJvciIsIm9uRXJyb3IiLCJiT25TdWNjZXNzIiwib25TdWNjZXNzIiwibWVzc2FnZSIsImFwaSIsIm15UmVxIiwiQWx0aVJlcXVlc3RSRVNUIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJFcnJvciIsInJlcXVlc3RTdHJpbmciLCJ3cHMiLCJzZXJ2aWNlIiwidmVyc2lvbiIsImlkZW50aWZpZXIiLCJyYXdkYXRhb3V0cHV0IiwiQWx0aVJlcXVlc3RXUFMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ29EO0FBQ1E7QUFDWjtBQUNGO0FBRTlDLElBQUlBLGtCQUFrQixHQUFHO0VBRXJCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsb0JB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TyxDQUFDUSxJQUFJLENBQUM5QixPQUFPLENBQUMrQixLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQ1AsT0FBTyxDQUFDLENBQUM7WUFDOUQ7VUFDSjtVQUNBLE1BQU0sSUFBSVEsS0FBSyxDQUFDUixPQUFPLENBQUM7UUFDNUI7UUFDQTtNQUNKO1FBQ0lBLE9BQU8sR0FBRyx5REFBeUQ7UUFDbkUsSUFBSUosUUFBUSxFQUFFO1VBQ1ZyQixPQUFPLENBQUNzQixPQUFPLENBQUNRLElBQUksQ0FBQzlCLE9BQU8sQ0FBQytCLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDUCxPQUFPLENBQUMsQ0FBQztVQUM5RDtRQUNKO1FBQ0EsTUFBTSxJQUFJUSxLQUFLLENBQUNSLE9BQU8sQ0FBQztJQUNoQztJQUVBLElBQUlGLFVBQVUsRUFBRTtNQUNadkIsT0FBTyxDQUFDd0IsU0FBUyxDQUFDTSxJQUFJLENBQUM5QixPQUFPLENBQUMrQixLQUFLLEVBQUUxQixPQUFPLENBQUM7SUFDbEQ7SUFFQSxPQUFPQSxPQUFPO0VBQ2xCO0FBQ0osQ0FBQztBQUVjUCxpRkFBa0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L0FsdGlSZXF1ZXN0RmFjdG9yeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRpb24gZCd1bmUgcmVxdcOqdGUgZW4gUkVTVCBvdSBXUFNcbiAqIChGYWN0b3J5KVxuICpcbiAqIEBtb2R1bGUgQWx0aVJlcXVlc3RGYWN0b3J5XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5SZXF1ZXN0LkFsdGlSZXF1ZXN0RmFjdG9yeVxuICogQHByaXZhdGVcbiAqL1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IEFsdGlSZXF1ZXN0UkVTVCBmcm9tIFwiLi9BbHRpUmVxdWVzdFJFU1RcIjtcbmltcG9ydCBBbHRpUmVxdWVzdFdQUyBmcm9tIFwiLi9BbHRpUmVxdWVzdFdQU1wiO1xuXG52YXIgQWx0aVJlcXVlc3RGYWN0b3J5ID0ge1xuXG4gICAgLyoqXG4gICAgICogaW50ZXJmYWNlIHVuaXF1ZVxuICAgICAqXG4gICAgICogQG1ldGhvZCBidWlsZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZGVmaW5pZXMgZGFucyBsZSBjb21wb3NhbnQgQWx0aVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIHZhciBvcHRpb25zID0ge1xuICAgICAqICAgICAgaHR0cE1ldGhvZCA6ICdHRVQnLCAvLyBHRVR8UE9TVFxuICAgICAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAgICAgKiAgICAgIG9uRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHt9LFxuICAgICAqICAgICAgc2NvcGUgOiB0aGlzLFxuICAgICAqICAgICAgcG9zaXRpb25zIDogW3tsb246LCBsYXQ6fSwge2xvbjosIGxhdDp9XSxcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6ICdqc29uJyAvLyBqc29ufHhtbFxuICAgICAqICAgICAgc2FtcGxpbmcgOiAzLFxuICAgICAqICAgICAgYXBpIDogJ1JFU1QnLCAvLyBSRVNUfFdQU1xuICAgICAqICAgICAgem9ubHkgOiBmYWxzZSAvLyBmYWxzZXx0cnVlXG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJBbHRpUmVxdWVzdEZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJBbHRpUmVxdWVzdEZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciByZXF1ZXN0ID0gbnVsbDtcblxuICAgICAgICAvLyBvbiBmYWN0b3Jpc2UgbGVzIG9wdGlvbnMgcGFyIGdyb3VwZTtcbiAgICAgICAgLy8gLSBnbG9iYWwsXG4gICAgICAgIC8vIC0gcGFyYW0sIGxlcyBwYXJhbXMgcG91ciBsZXMgZGF0YSBpbnB1dHNcbiAgICAgICAgLy8gLSB3cHMsIGxlcyBwYXJhbSBkdSBzZXJ2aWNlXG4gICAgICAgIC8vIC0gY2FsbGJhY2tcblxuICAgICAgICB2YXIgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAvLyBham91dCBkZXMgdmFsZXVycyBwYXIgZGVmYXV0IHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlXG4gICAgICAgICAgICB0eXBlIDogb3B0aW9ucy5zYW1wbGluZyA/IFwiUHJvZmlsXCIgOiBcIkVsZXZhdGlvblwiLFxuICAgICAgICAgICAgbWV0aG9kIDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgcGFyYW0gOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgOiBudWxsLCAvLyBGSVhNRSBwYXIgZGVmYXV0LCBvbiBuZSBsZSBtZXQgcGFzIGVuIHBsYWNlIGNhciDDp2EgZmFpdCBwbGFudGVyIGxhIHJlcXXDqnRlICE/XG4gICAgICAgICAgICAgICAgaW5kZW50IDogbnVsbCwgLy8gcGFyIGRlZmF1dFxuICAgICAgICAgICAgICAgIGNycyA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICBmb3JtYXQgOiBudWxsLCAvLyAob25seSB0byBQT1NUKVxuICAgICAgICAgICAgICAgIHNhbXBsaW5nIDogbnVsbCwgLy8gKG9ubHkgdXNlIGJ5IFByb2ZpbClcbiAgICAgICAgICAgICAgICB6b25seSA6IG51bGwsIC8vIChvbmx5IHVzZSBieSBFbGV2YXRpb24pXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgOiBudWxsIC8vIChvbmx5IHVzZSBieSBFbGV2YXRpb24pXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc3VyY2hhcmdlIGRlcyB2YWxldXJzIG9ibGlnYXRvaXJlc1xuICAgICAgICBzZXR0aW5ncy5wYXJhbS5wb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9ucztcbiAgICAgICAgc2V0dGluZ3MucGFyYW0uZm9ybWF0ID0gb3B0aW9ucy5vdXRwdXRGb3JtYXQ7XG4gICAgICAgIHNldHRpbmdzLnBhcmFtLnNhbXBsaW5nID0gb3B0aW9ucy5zYW1wbGluZztcbiAgICAgICAgc2V0dGluZ3MucGFyYW0uem9ubHkgPSBvcHRpb25zLnpvbmx5O1xuICAgICAgICBzZXR0aW5ncy5wYXJhbS5tZWFzdXJlcyA9IG9wdGlvbnMubWVhc3VyZXM7XG4gICAgICAgIHNldHRpbmdzLnBhcmFtLnJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZTtcblxuICAgICAgICAvLyBnZXN0aW9uIGRlcyBjYWxsYmFja1xuICAgICAgICB2YXIgYk9uRXJyb3IgPSAhIShvcHRpb25zLm9uRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25FcnJvciA9PT0gXCJmdW5jdGlvblwiKTsgLy8gY2FzdCB2YXJpYWJsZSB0byBib29sZWFuXG4gICAgICAgIHZhciBiT25TdWNjZXNzID0gISEob3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25TdWNjZXNzID09PSBcImZ1bmN0aW9uXCIpO1xuXG4gICAgICAgIHZhciBtZXNzYWdlID0gbnVsbDtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLmFwaSkge1xuICAgICAgICAgICAgY2FzZSBcIlJFU1RcIjpcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBsZXMgZXhjZXB0aW9ucyBuZSBzb250IHBhcyAnY2F0Y2jDqWVzJyBzdXIgbGUgY29uc3RydWN0ZXVyICFcbiAgICAgICAgICAgICAgICB2YXIgbXlSZXEgPSBuZXcgQWx0aVJlcXVlc3RSRVNUKHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICBpZiAoIW15UmVxLnByb2Nlc3NSZXF1ZXN0U3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiRXJyb3IgaW4gcHJvY2VzcyByZXF1ZXN0IChyZXN0KSAhXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiT25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gbXlSZXEucmVxdWVzdFN0cmluZztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJXUFNcIjpcbiAgICAgICAgICAgICAgICAvLyBham91dCBkZXMgdmFsZXVycyBwYXIgZGVmYXV0IHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlIFdQU1xuICAgICAgICAgICAgICAgIHNldHRpbmdzLndwcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZSA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgcmF3ZGF0YW91dHB1dCA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA6IG51bGwgLy8gcGFyIGRlZmF1dFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gQWx0aVJlcXVlc3RXUFMuYnVpbGQoc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJFcnJvciBpbiBwcm9jZXNzIHJlcXVlc3QgKHdwcykgIVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYk9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIlR5cGUgb2YgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmljZSAoUkVTVCBvciBXUFMpICFcIjtcbiAgICAgICAgICAgICAgICBpZiAoYk9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJPblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdWNjZXNzLmNhbGwob3B0aW9ucy5zY29wZSwgcmVxdWVzdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbHRpUmVxdWVzdEZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/AltiRequestFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Request/AltiRequestREST.js": -/*!******************************************************!*\ - !*** ./src/Services/Alti/Request/AltiRequestREST.js ***! - \******************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/AltiElevationRequest */ \"./src/Services/Alti/Request/model/AltiElevationRequest.js\");\n/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/AltiProfilRequest */ \"./src/Services/Alti/Request/model/AltiProfilRequest.js\");\n/* jshint multistr : true */\n\n\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes de type REST sur le service altimetrique.\n *\n * @todo Le service Alti n'implemente pas le POST !?\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiRequestREST\n * @param {Object} options - options\n * @param {Object} options.param.positions - tableau de coordonnées lon/lat\n * @param {String} options.param.delimiter - '|'\n * @param {Boolean} options.param.indent - false|true\n * @param {String} options.param.crs - 'CRS:84'\n * @param {String} options.param.sampling - 3\n * @param {String} options.param.resource - 'rge_alti_corse2a_float32_zip_lamb93'\n * @param {Boolean} options.param.zonly - false|true\n * @param {Boolean} options.param.measures - false|true\n * @param {String} options.param.format - \"JSON|XML\"\n * @param {String} options.type - \"Profil|Elevation\"\n * @param {String} options.method - GET|POST\n *\n * @example\n * var options = {\n * type : 'Profil', // Elevation\n * method : 'GET', // par defaut\n * param : {\n * positions : [\n * {lon:'1.11', lat:'1.11'},\n * {lon:'1.10', lat:'1.10'},\n * {lon:'1.12', lat:'1.12'}\n * ],\n * delimiter : \";\", // par defaut\n * indent : true, // par defaut\n * crs : 'EPSG:4326', // par defaut\n * format : 'json', // par defaut (only to POST)\n * sampling : 3 , // par defaut (only use by Profil)\n * zonly : false // par defaut (only use by Elevation)\n * measures : false // par defaut (only use by Elevation)\n * }\n * };\n *\n * var result;\n * try {\n * var obj = new AltiRequestREST (options);\n * if (! obj.processRequestString ()) {\n * throw new Error(\"Request empty !?\")\n * }\n * result = obj.requestString;\n * } catch (e) {\n * // exceptions...\n * }\n * @private\n */\nfunction AltiRequestREST(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiRequestREST\");\n this.logger.trace(\"[Constructeur AltiRequestREST ()]\");\n if (!(this instanceof AltiRequestREST)) {\n throw new TypeError(\"AltiRequestREST constructor cannot be called as a function.\");\n }\n this.options = options || {};\n\n // existance des options\n if (!this.options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n // type de requete : Altitude ou Profil\n // (param. à determiner en fonction des parametres d'entrée)\n if (!this.options.type) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"type (Elevation or Profil)\"));\n }\n\n // construction du modele de requête\n // (test du type d'objet candidat)\n this.DataObject = null;\n switch (this.options.type) {\n case \"Elevation\":\n this.DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.options.param);\n break;\n case \"Profil\":\n this.DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__[\"default\"](this.options.param);\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"type (Elevation or Profil)\"));\n }\n\n /**\n * methode.\n * Par defaut, \"GET\".\n */\n this.method = this.options.method || \"GET\";\n}\nAltiRequestREST.prototype = {\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: AltiRequestREST,\n /**\n * Template de la requête.\n */\n template: {\n get: {\n // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__'\n value: \"lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'&resource=__RESOURCE__&measures=__MEASURES__\",\n input: {\n point: \"&zonly=__ZONLY__\",\n profil: \"&sampling=__SAMPLING__\"\n }\n },\n post: {\n // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\\n\\\n value: \"lon=__LON__\\n\" + \"lat=__LAT__\\n\" + \"indent=__INDENT__\\n\" + \"crs='__CRS__'\\n\" + \"resource='__RESOURCE__'\\n\" + \"measures='__MEASURES__'\\n\",\n input: {\n point: \"zonly=__ZONLY__\\n\",\n profil: \"sampling=__SAMPLING__\"\n }\n }\n },\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84'\n * // POST out : Not yet supported method POST !\n * @returns {String}\n */\n processRequestString: function processRequestString() {\n this.logger.trace(\"AltiRequestREST::processRequestString ()\");\n var template = \"\";\n if (this.method === \"POST\") {\n template = this.template.post.value;\n } else if (this.method === \"GET\") {\n template = this.template.get.value;\n }\n template = template.replace(/__LON__/g, this.DataObject.getLon());\n template = template.replace(/__LAT__/g, this.DataObject.getLat());\n // FIXME on retire le param 'delimiter'\n // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter);\n template = template.replace(/__INDENT__/g, this.DataObject.indent);\n template = template.replace(/__CRS__/g, this.DataObject.crs);\n template = template.replace(/__RESOURCE__/g, this.DataObject.resource);\n template = template.replace(/__MEASURES__/g, this.DataObject.measures);\n\n // ajout +\n template = template + this.__addDataInputs();\n this.logger.trace(\"traduction tmpl\", template);\n\n // sauvegarde\n this.requestString = template;\n return this.requestString;\n },\n /**\n * Ajout de parametres spécifiques (ex. zonly)\n *\n * @returns {String}\n */\n __addDataInputs: function __addDataInputs() {\n this.logger.trace(\"AltiRequestREST::addDataInput ()\");\n var myTemplate;\n if (this.method === \"POST\") {\n myTemplate = this.template.post;\n } else if (this.method === \"GET\") {\n myTemplate = this.template.get;\n } else {\n throw new Error(\"No other HTTP method supported by the service !\");\n }\n var tmpl = null;\n if (this.DataObject.CLASSNAME === \"AltiElevationRequest\") {\n tmpl = myTemplate.input.point;\n return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly.toString());\n } else if (this.DataObject.CLASSNAME === \"AltiProfilRequest\") {\n tmpl = myTemplate.input.profil;\n return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling);\n } else {\n throw new Error(\"No other object supported than elevation or profil !?\");\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequestREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvQWx0aVJlcXVlc3RSRVNULmpzPzY2YjkiXSwibmFtZXMiOlsiQWx0aVJlcXVlc3RSRVNUIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiVHlwZUVycm9yIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInR5cGUiLCJEYXRhT2JqZWN0IiwiQWx0aUVsZXZhdGlvblJlcXVlc3QiLCJwYXJhbSIsIkFsdGlQcm9maWxSZXF1ZXN0IiwibWV0aG9kIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwidGVtcGxhdGUiLCJnZXQiLCJ2YWx1ZSIsImlucHV0IiwicG9pbnQiLCJwcm9maWwiLCJwb3N0IiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJyZXBsYWNlIiwiZ2V0TG9uIiwiZ2V0TGF0IiwiaW5kZW50IiwiY3JzIiwicmVzb3VyY2UiLCJtZWFzdXJlcyIsIl9fYWRkRGF0YUlucHV0cyIsIm15VGVtcGxhdGUiLCJ0bXBsIiwiQ0xBU1NOQU1FIiwiem9ubHkiLCJ0b1N0cmluZyIsInNhbXBsaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRW9EO0FBQ0g7QUFDZTtBQUNOOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLGVBQWVBLENBQUVD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LFFBQVEsQ0FBQ00sSUFBSTtJQUNuQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNWLE1BQU0sS0FBSyxLQUFLLEVBQUU7TUFDOUJvQixVQUFVLEdBQUcsSUFBSSxDQUFDaEIsUUFBUSxDQUFDQyxHQUFHO0lBQ2xDLENBQUMsTUFBTTtNQUNILE1BQU0sSUFBSWIsS0FBSyxDQUFDLGlEQUFpRCxDQUFDO0lBQ3RFO0lBRUEsSUFBSTZCLElBQUksR0FBRyxJQUFJO0lBQ2YsSUFBSSxJQUFJLENBQUN6QixVQUFVLENBQUMwQixTQUFTLEtBQUssc0JBQXNCLEVBQUU7TUFDdERELElBQUksR0FBR0QsVUFBVSxDQUFDYixLQUFLLENBQUNDLEtBQUs7TUFDN0IsT0FBT2EsSUFBSSxDQUFDVCxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQ2hCLFVBQVUsQ0FBQzJCLEtBQUssQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM1QixVQUFVLENBQUMwQixTQUFTLEtBQUssbUJBQW1CLEVBQUU7TUFDMURELElBQUksR0FBR0QsVUFBVSxDQUFDYixLQUFLLENBQUNFLE1BQU07TUFDOUIsT0FBT1ksSUFBSSxDQUFDVCxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQ2hCLFVBQVUsQ0FBQzZCLFFBQVEsQ0FBQztJQUNsRSxDQUFDLE1BQU07TUFDSCxNQUFNLElBQUlqQyxLQUFLLENBQUMsdURBQXVELENBQUM7SUFDNUU7RUFDSjtBQUNKLENBQUM7QUFFY1AsOEVBQWUiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L0FsdGlSZXF1ZXN0UkVTVC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGpzaGludCBtdWx0aXN0ciA6IHRydWUgKi9cblxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBBbHRpRWxldmF0aW9uUmVxdWVzdCBmcm9tIFwiLi9tb2RlbC9BbHRpRWxldmF0aW9uUmVxdWVzdFwiO1xuaW1wb3J0IEFsdGlQcm9maWxSZXF1ZXN0IGZyb20gXCIuL21vZGVsL0FsdGlQcm9maWxSZXF1ZXN0XCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFJFU1Qgc3VyIGxlIHNlcnZpY2UgYWx0aW1ldHJpcXVlLlxuICpcbiAqIEB0b2RvIExlIHNlcnZpY2UgQWx0aSBuJ2ltcGxlbWVudGUgcGFzIGxlIFBPU1QgIT9cbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGkuUmVxdWVzdC5BbHRpUmVxdWVzdFJFU1RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9ICAgb3B0aW9ucy5wYXJhbS5wb3NpdGlvbnMgLSB0YWJsZWF1IGRlIGNvb3Jkb25uw6llcyBsb24vbGF0XG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLmRlbGltaXRlciAtICd8J1xuICogQHBhcmFtIHtCb29sZWFufSAgb3B0aW9ucy5wYXJhbS5pbmRlbnQgLSBmYWxzZXx0cnVlXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLmNycyAtICdDUlM6ODQnXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLnNhbXBsaW5nIC0gM1xuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5yZXNvdXJjZSAtICdyZ2VfYWx0aV9jb3JzZTJhX2Zsb2F0MzJfemlwX2xhbWI5MydcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gIG9wdGlvbnMucGFyYW0uem9ubHkgLSBmYWxzZXx0cnVlXG4gKiBAcGFyYW0ge0Jvb2xlYW59ICBvcHRpb25zLnBhcmFtLm1lYXN1cmVzIC0gZmFsc2V8dHJ1ZVxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5mb3JtYXQgLSBcIkpTT058WE1MXCJcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMudHlwZSAtIFwiUHJvZmlsfEVsZXZhdGlvblwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLm1ldGhvZCAtIEdFVHxQT1NUXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgICAgICAgdHlwZSA6ICdQcm9maWwnLCAvLyBFbGV2YXRpb25cbiAqICAgICAgICAgICBtZXRob2QgOiAnR0VUJywgIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICBwYXJhbSA6IHtcbiAqICAgICAgICAgICAgICAgcG9zaXRpb25zIDogW1xuICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMScsIGxhdDonMS4xMSd9LFxuICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMCcsIGxhdDonMS4xMCd9LFxuICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMicsIGxhdDonMS4xMid9XG4gKiAgICAgICAgICAgICAgIF0sXG4gKiAgICAgICAgICAgICAgIGRlbGltaXRlciA6IFwiO1wiLCAgICAgICAgIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICAgICAgaW5kZW50ICAgIDogdHJ1ZSwgICAgICAgIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICAgICAgY3JzICAgICAgIDogJ0VQU0c6NDMyNicsIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICAgICAgZm9ybWF0ICAgIDogJ2pzb24nLCAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdG8gUE9TVClcbiAqICAgICAgICAgICAgICAgc2FtcGxpbmcgIDogMyAsICAgICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IFByb2ZpbClcbiAqICAgICAgICAgICAgICAgem9ubHkgICAgIDogZmFsc2UgICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IEVsZXZhdGlvbilcbiAqICAgICAgICAgICAgICAgbWVhc3VyZXMgIDogZmFsc2UgICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IEVsZXZhdGlvbilcbiAqICAgICAgICAgICB9XG4gKiAgICAgIH07XG4gKlxuICogICAgICB2YXIgcmVzdWx0O1xuICogICAgICB0cnkge1xuICogICAgICAgICAgdmFyIG9iaiA9IG5ldyBBbHRpUmVxdWVzdFJFU1QgKG9wdGlvbnMpO1xuICogICAgICAgICAgaWYgKCEgb2JqLnByb2Nlc3NSZXF1ZXN0U3RyaW5nICgpKSB7XG4gKiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdCBlbXB0eSAhP1wiKVxuICogICAgICAgICAgfVxuICogICAgICAgICAgcmVzdWx0ID0gb2JqLnJlcXVlc3RTdHJpbmc7XG4gKiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICAgICAgIC8vIGV4Y2VwdGlvbnMuLi5cbiAqICAgICAgfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQWx0aVJlcXVlc3RSRVNUIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiQWx0aVJlcXVlc3RSRVNUXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBBbHRpUmVxdWVzdFJFU1QgKCldXCIpO1xuXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFsdGlSZXF1ZXN0UkVTVCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFsdGlSZXF1ZXN0UkVTVCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBleGlzdGFuY2UgZGVzIG9wdGlvbnNcbiAgICBpZiAoIXRoaXMub3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fRU1QVFlcIiwgXCJvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlIGRlIHJlcXVldGUgOiBBbHRpdHVkZSBvdSBQcm9maWxcbiAgICAvLyAocGFyYW0uIMOgIGRldGVybWluZXIgZW4gZm9uY3Rpb24gZGVzIHBhcmFtZXRyZXMgZCdlbnRyw6llKVxuICAgIGlmICghdGhpcy5vcHRpb25zLnR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwidHlwZSAoRWxldmF0aW9uIG9yIFByb2ZpbClcIikpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdGlvbiBkdSBtb2RlbGUgZGUgcmVxdcOqdGVcbiAgICAvLyAodGVzdCBkdSB0eXBlIGQnb2JqZXQgY2FuZGlkYXQpXG4gICAgdGhpcy5EYXRhT2JqZWN0ID0gbnVsbDtcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJFbGV2YXRpb25cIjpcbiAgICAgICAgICAgIHRoaXMuRGF0YU9iamVjdCA9IG5ldyBBbHRpRWxldmF0aW9uUmVxdWVzdCh0aGlzLm9wdGlvbnMucGFyYW0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQcm9maWxcIjpcbiAgICAgICAgICAgIHRoaXMuRGF0YU9iamVjdCA9IG5ldyBBbHRpUHJvZmlsUmVxdWVzdCh0aGlzLm9wdGlvbnMucGFyYW0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVFlQRVwiLCBcInR5cGUgKEVsZXZhdGlvbiBvciBQcm9maWwpXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBtZXRob2RlLlxuICAgICAqIFBhciBkZWZhdXQsIFwiR0VUXCIuXG4gICAgICovXG4gICAgdGhpcy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCI7XG59XG5cbkFsdGlSZXF1ZXN0UkVTVC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiByZXF1ZXN0XG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICByZXF1ZXN0U3RyaW5nIDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBBbHRpUmVxdWVzdFJFU1QsXG5cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZSA6IHtcbiAgICAgICAgZ2V0IDoge1xuICAgICAgICAgICAgLy8gRklYTUUgb24gcmV0aXJlIGxlIHBhcmFtICdkZWxpbWl0ZXInIDogJmRlbGltaXRlcj0nX19ERUxJTUlURVJfXydcbiAgICAgICAgICAgIHZhbHVlIDogXCJsb249X19MT05fXyZsYXQ9X19MQVRfXyZpbmRlbnQ9X19JTkRFTlRfXyZjcnM9J19fQ1JTX18nJnJlc291cmNlPV9fUkVTT1VSQ0VfXyZtZWFzdXJlcz1fX01FQVNVUkVTX19cIixcbiAgICAgICAgICAgIGlucHV0IDoge1xuICAgICAgICAgICAgICAgIHBvaW50IDogXCImem9ubHk9X19aT05MWV9fXCIsXG4gICAgICAgICAgICAgICAgcHJvZmlsIDogXCImc2FtcGxpbmc9X19TQU1QTElOR19fXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcG9zdCA6IHtcbiAgICAgICAgICAgIC8vIEZJWE1FIG9uIHJldGlyZSBsZSBwYXJhbSAnZGVsaW1pdGVyJyA6IGRlbGltaXRlcj0nX19ERUxJTUlURVJfXydcXG5cXFxuICAgICAgICAgICAgdmFsdWUgOiBcImxvbj1fX0xPTl9fXFxuXCIgK1xuICAgICAgICAgICAgICAgIFwibGF0PV9fTEFUX19cXG5cIiArXG4gICAgICAgICAgICAgICAgXCJpbmRlbnQ9X19JTkRFTlRfX1xcblwiICtcbiAgICAgICAgICAgICAgICBcImNycz0nX19DUlNfXydcXG5cIiArXG4gICAgICAgICAgICAgICAgXCJyZXNvdXJjZT0nX19SRVNPVVJDRV9fJ1xcblwiICtcbiAgICAgICAgICAgICAgICBcIm1lYXN1cmVzPSdfX01FQVNVUkVTX18nXFxuXCIsXG4gICAgICAgICAgICBpbnB1dCA6IHtcbiAgICAgICAgICAgICAgICBwb2ludCA6IFwiem9ubHk9X19aT05MWV9fXFxuXCIsXG4gICAgICAgICAgICAgICAgcHJvZmlsIDogXCJzYW1wbGluZz1fX1NBTVBMSU5HX19cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGlvbiBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR0VUICBvdXQgOiBsb249MC4yMzY3LDIuMTU3MCZsYXQ9NDguMDU1MSw0Ni42MDc3JmRlbGltaXRlcj0sJmluZGVudD10cnVlJnpvbmx5PXRydWUmY3JzPSdDUlM6ODQnXG4gICAgICogLy8gUE9TVCBvdXQgOiBOb3QgeWV0IHN1cHBvcnRlZCBtZXRob2QgUE9TVCAhXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVxdWVzdFN0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJBbHRpUmVxdWVzdFJFU1Q6OnByb2Nlc3NSZXF1ZXN0U3RyaW5nICgpXCIpO1xuXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5wb3N0LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUuZ2V0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX0xPTl9fL2csIHRoaXMuRGF0YU9iamVjdC5nZXRMb24oKSk7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvX19MQVRfXy9nLCB0aGlzLkRhdGFPYmplY3QuZ2V0TGF0KCkpO1xuICAgICAgICAvLyBGSVhNRSBvbiByZXRpcmUgbGUgcGFyYW0gJ2RlbGltaXRlcidcbiAgICAgICAgLy8gdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX0RFTElNSVRFUl9fL2csIHRoaXMuRGF0YU9iamVjdC5kZWxpbWl0ZXIpO1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fSU5ERU5UX18vZywgdGhpcy5EYXRhT2JqZWN0LmluZGVudCk7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvX19DUlNfXy9nLCB0aGlzLkRhdGFPYmplY3QuY3JzKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1JFU09VUkNFX18vZywgdGhpcy5EYXRhT2JqZWN0LnJlc291cmNlKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX01FQVNVUkVTX18vZywgdGhpcy5EYXRhT2JqZWN0Lm1lYXN1cmVzKTtcblxuICAgICAgICAvLyBham91dCArXG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUgKyB0aGlzLl9fYWRkRGF0YUlucHV0cygpO1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcInRyYWR1Y3Rpb24gdG1wbFwiLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgLy8gc2F1dmVnYXJkZVxuICAgICAgICB0aGlzLnJlcXVlc3RTdHJpbmcgPSB0ZW1wbGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0U3RyaW5nO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBam91dCBkZSBwYXJhbWV0cmVzIHNww6ljaWZpcXVlcyAoZXguIHpvbmx5KVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBfX2FkZERhdGFJbnB1dHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQWx0aVJlcXVlc3RSRVNUOjphZGREYXRhSW5wdXQgKClcIik7XG5cbiAgICAgICAgdmFyIG15VGVtcGxhdGU7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIG15VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnBvc3Q7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgIG15VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG90aGVyIEhUVFAgbWV0aG9kIHN1cHBvcnRlZCBieSB0aGUgc2VydmljZSAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRtcGwgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5EYXRhT2JqZWN0LkNMQVNTTkFNRSA9PT0gXCJBbHRpRWxldmF0aW9uUmVxdWVzdFwiKSB7XG4gICAgICAgICAgICB0bXBsID0gbXlUZW1wbGF0ZS5pbnB1dC5wb2ludDtcbiAgICAgICAgICAgIHJldHVybiB0bXBsLnJlcGxhY2UoL19fWk9OTFlfXy9nLCB0aGlzLkRhdGFPYmplY3Quem9ubHkudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5EYXRhT2JqZWN0LkNMQVNTTkFNRSA9PT0gXCJBbHRpUHJvZmlsUmVxdWVzdFwiKSB7XG4gICAgICAgICAgICB0bXBsID0gbXlUZW1wbGF0ZS5pbnB1dC5wcm9maWw7XG4gICAgICAgICAgICByZXR1cm4gdG1wbC5yZXBsYWNlKC9fX1NBTVBMSU5HX18vZywgdGhpcy5EYXRhT2JqZWN0LnNhbXBsaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG90aGVyIG9iamVjdCBzdXBwb3J0ZWQgdGhhbiBlbGV2YXRpb24gb3IgcHJvZmlsICE/XCIpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlcXVlc3RSRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/AltiRequestREST.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Request/AltiRequestWPS.js": -/*!*****************************************************!*\ - !*** ./src/Services/Alti/Request/AltiRequestWPS.js ***! - \*****************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Formats/WPS */ \"./src/Formats/WPS.js\");\n/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/AltiElevationRequest */ \"./src/Services/Alti/Request/model/AltiElevationRequest.js\");\n/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model/AltiProfilRequest */ \"./src/Services/Alti/Request/model/AltiProfilRequest.js\");\n/**\n * Classe d'interface des requêtes de type WPS sur le service altimetrique.\n * (Factory)\n *\n * @module Gp.Services.Alti.Request.AltiRequestWPS\n * @alias Gp.Services.Alti.Request.AltiRequestWPS\n * @private\n */\n\n\n\n\n\nvar AltiRequestWPS = {\n /**\n * Interface unique de construction de la requête.\n *\n * @method build\n * @param {Object} options - options\n * @param {Object} options.param.positions - tableau de coordonnées lon/lat\n * @param {String} options.param.delimiter - '|'\n * @param {Boolean} options.param.indent - false|true\n * @param {String} options.param.crs - 'CRS:84'\n * @param {String} options.param.sampling - 3\n * @param {Boolean} options.param.zonly - false|true\n * @param {String} options.param.format - \"JSON|XML\" (only to POST)\n * @param {String} options.wps.service - \"WPS\"\n * @param {String} options.wps.version - \"1.0.0\"\n * @param {String} options.wps.identifier - \"gs:WPSElevation|gs:WPSLineElevation\"\n * @param {String} options.wps.rawdataoutput - \"result\"\n * @param {String} options.wps.request - \"Execute\"\n * @param {String} options.type - \"Profil|Elevation\"\n * @param {String} options.method - GET|POST\n * @example\n * var options = {\n * type : 'Profil', // Elevation\n * method : 'GET', // par defaut\n * param : {\n * positions : [\n * {lon:'1.11', lat:'1.11'},\n * {lon:'1.10', lat:'1.10'},\n * {lon:'1.12', lat:'1.12'}\n * ],\n * delimiter : \";\", // par defaut\n * indent : true, // par defaut\n * crs : 'EPSG:4326', // par defaut\n * format : 'json', // par defaut (only to POST)\n * sampling : 3 , // par defaut (only use by Profil)\n * zonly : false, // par defaut (only use by Elevation)\n * },\n * wps : {\n * service : 'WPS', // par defaut\n * version : '1.0.0', // par defaut\n * identifier : 'gs:WPS', // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation\n * rawdataoutput : 'result',// par defaut\n * request : 'Execute' // par defaut\n * }\n * };\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiRequestWPS\");\n logger.trace([\"AltiRequestWPS::build()\"]);\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n // type de requete : Altitude ou Profil\n // (param. à determiner en fonction des parametres d'entrée)\n if (!options.type) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"type (Elevation or Profil)\"));\n }\n\n // construction du modele de requête\n // (test du type d'objet candidat)\n var DataObject = null;\n switch (options.type) {\n case \"Elevation\":\n // surcharge\n options.wps.identifier = \"gs:WPSElevation\";\n DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__[\"default\"](options.param);\n break;\n case \"Profil\":\n // surcharge\n options.wps.identifier = \"gs:WPSLineElevation\";\n DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__[\"default\"](options.param);\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"type (Elevation or Profil)\"));\n }\n\n // construction de la requête WPS\n var settings = {\n data: DataObject,\n method: options.method,\n param: options.wps\n };\n var rqstWPS = new _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__[\"default\"](settings);\n if (!rqstWPS.processRequestString()) {\n throw new Error(\"Enable to process request !\");\n }\n return rqstWPS.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequestWPS);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvQWx0aVJlcXVlc3RXUFMuanM/ZGU1MiJdLCJuYW1lcyI6WyJBbHRpUmVxdWVzdFdQUyIsImJ1aWxkIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInR5cGUiLCJEYXRhT2JqZWN0Iiwid3BzIiwiaWRlbnRpZmllciIsIkFsdGlFbGV2YXRpb25SZXF1ZXN0IiwicGFyYW0iLCJBbHRpUHJvZmlsUmVxdWVzdCIsInNldHRpbmdzIiwiZGF0YSIsIm1ldGhvZCIsInJxc3RXUFMiLCJXUFMiLCJwcm9jZXNzUmVxdWVzdFN0cmluZyIsInJlcXVlc3RTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDb0Q7QUFDSDtBQUNWO0FBQ3lCO0FBQ047QUFFMUQsSUFBSUEsY0FBYyxHQUFHO0VBRWpCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDL0NGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQzs7SUFFekM7SUFDQSxJQUFJLENBQUNKLE9BQU8sRUFBRTtNQUNWLE1BQU0sSUFBSUssS0FBSyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNEOztJQUVBO0lBQ0E7SUFDQSxJQUFJLENBQUNQLE9BQU8sQ0FBQ1EsSUFBSSxFQUFFO01BQ2YsTUFBTSxJQUFJSCxLQUFLLENBQUNDLGdFQUFDLENBQUNDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUM5RTs7SUFFQTtJQUNBO0lBQ0EsSUFBSUUsVUFBVSxHQUFHLElBQUk7SUFDckIsUUFBUVQsT0FBTyxDQUFDUSxJQUFJO01BQ2hCLEtBQUssV0FBVztRQUNaO1FBQ0FSLE9BQU8sQ0FBQ1UsR0FBRyxDQUFDQyxVQUFVLEdBQUcsaUJBQWlCO1FBQzFDRixVQUFVLEdBQUcsSUFBSUcsbUVBQW9CLENBQUNaLE9BQU8sQ0FBQ2EsS0FBSyxDQUFDO1FBQ3BEO01BQ0osS0FBSyxRQUFRO1FBQ1Q7UUFDQWIsT0FBTyxDQUFDVSxHQUFHLENBQUNDLFVBQVUsR0FBRyxxQkFBcUI7UUFDOUNGLFVBQVUsR0FBRyxJQUFJSyxnRUFBaUIsQ0FBQ2QsT0FBTyxDQUFDYSxLQUFLLENBQUM7UUFDakQ7TUFDSjtRQUNJLE1BQU0sSUFBSVIsS0FBSyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDakY7O0lBRUE7SUFDQSxJQUFJUSxRQUFRLEdBQUc7TUFDWEMsSUFBSSxFQUFHUCxVQUFVO01BQ2pCUSxNQUFNLEVBQUdqQixPQUFPLENBQUNpQixNQUFNO01BQ3ZCSixLQUFLLEVBQUdiLE9BQU8sQ0FBQ1U7SUFDcEIsQ0FBQztJQUVELElBQUlRLE9BQU8sR0FBRyxJQUFJQyxvREFBRyxDQUFDSixRQUFRLENBQUM7SUFFL0IsSUFBSSxDQUFDRyxPQUFPLENBQUNFLG9CQUFvQixDQUFDLENBQUMsRUFBRTtNQUNqQyxNQUFNLElBQUlmLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztJQUNsRDtJQUVBLE9BQU9hLE9BQU8sQ0FBQ0csYUFBYTtFQUNoQztBQUNKLENBQUM7QUFFY3ZCLDZFQUFjIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVxdWVzdC9BbHRpUmVxdWVzdFdQUy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3NlIGQnaW50ZXJmYWNlIGRlcyByZXF1w6p0ZXMgZGUgdHlwZSBXUFMgc3VyIGxlIHNlcnZpY2UgYWx0aW1ldHJpcXVlLlxuICogKEZhY3RvcnkpXG4gKlxuICogQG1vZHVsZSBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aVJlcXVlc3RXUFNcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aVJlcXVlc3RXUFNcbiAqIEBwcml2YXRlXG4gKi9cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgV1BTIGZyb20gXCIuLi8uLi8uLi9Gb3JtYXRzL1dQU1wiO1xuaW1wb3J0IEFsdGlFbGV2YXRpb25SZXF1ZXN0IGZyb20gXCIuL21vZGVsL0FsdGlFbGV2YXRpb25SZXF1ZXN0XCI7XG5pbXBvcnQgQWx0aVByb2ZpbFJlcXVlc3QgZnJvbSBcIi4vbW9kZWwvQWx0aVByb2ZpbFJlcXVlc3RcIjtcblxudmFyIEFsdGlSZXF1ZXN0V1BTID0ge1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJmYWNlIHVuaXF1ZSBkZSBjb25zdHJ1Y3Rpb24gZGUgbGEgcmVxdcOqdGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9ICAgb3B0aW9ucy5wYXJhbS5wb3NpdGlvbnMgLSB0YWJsZWF1IGRlIGNvb3Jkb25uw6llcyBsb24vbGF0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5kZWxpbWl0ZXIgLSAnfCdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59ICBvcHRpb25zLnBhcmFtLmluZGVudCAtIGZhbHNlfHRydWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLmNycyAtICdDUlM6ODQnXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5zYW1wbGluZyAtIDNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59ICBvcHRpb25zLnBhcmFtLnpvbmx5IC0gZmFsc2V8dHJ1ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMucGFyYW0uZm9ybWF0IC0gXCJKU09OfFhNTFwiIChvbmx5IHRvIFBPU1QpXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy53cHMuc2VydmljZSAtIFwiV1BTXCJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLndwcy52ZXJzaW9uIC0gXCIxLjAuMFwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy53cHMuaWRlbnRpZmllciAtIFwiZ3M6V1BTRWxldmF0aW9ufGdzOldQU0xpbmVFbGV2YXRpb25cIlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMud3BzLnJhd2RhdGFvdXRwdXQgLSBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy53cHMucmVxdWVzdCAtIFwiRXhlY3V0ZVwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy50eXBlIC0gXCJQcm9maWx8RWxldmF0aW9uXCJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLm1ldGhvZCAtIEdFVHxQT1NUXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAqICAgICAgICAgICB0eXBlIDogJ1Byb2ZpbCcsIC8vIEVsZXZhdGlvblxuICAgICAqICAgICAgICAgICBtZXRob2QgOiAnR0VUJywgIC8vIHBhciBkZWZhdXRcbiAgICAgKiAgICAgICAgICAgcGFyYW0gOiB7XG4gICAgICogICAgICAgICAgICAgICBwb3NpdGlvbnMgOiBbXG4gICAgICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMScsIGxhdDonMS4xMSd9LFxuICAgICAqICAgICAgICAgICAgICAgICAgIHtsb246JzEuMTAnLCBsYXQ6JzEuMTAnfSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICB7bG9uOicxLjEyJywgbGF0OicxLjEyJ31cbiAgICAgKiAgICAgICAgICAgICAgIF0sXG4gICAgICogICAgICAgICAgICAgICBkZWxpbWl0ZXIgOiBcIjtcIiwgICAgICAgICAvLyBwYXIgZGVmYXV0XG4gICAgICogICAgICAgICAgICAgICBpbmRlbnQgICAgOiB0cnVlLCAgICAgICAgLy8gcGFyIGRlZmF1dFxuICAgICAqICAgICAgICAgICAgICAgY3JzICAgICAgIDogJ0VQU0c6NDMyNicsIC8vIHBhciBkZWZhdXRcbiAgICAgKiAgICAgICAgICAgICAgIGZvcm1hdCAgICA6ICdqc29uJywgICAgICAvLyBwYXIgZGVmYXV0IChvbmx5IHRvIFBPU1QpXG4gICAgICogICAgICAgICAgICAgICBzYW1wbGluZyAgOiAzICwgICAgICAgICAgLy8gcGFyIGRlZmF1dCAob25seSB1c2UgYnkgUHJvZmlsKVxuICAgICAqICAgICAgICAgICAgICAgem9ubHkgICAgIDogZmFsc2UsICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IEVsZXZhdGlvbilcbiAgICAgKiAgICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgICAgd3BzIDoge1xuICAgICAqICAgICAgICAgICAgICAgICBzZXJ2aWNlIDogJ1dQUycsICAgICAgICAgLy8gcGFyIGRlZmF1dFxuICAgICAqICAgICAgICAgICAgICAgICB2ZXJzaW9uIDogJzEuMC4wJywgICAgICAgLy8gcGFyIGRlZmF1dFxuICAgICAqICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIDogJ2dzOldQUycsICAgLy8gcGFyIGRlZmF1dCwgRWxldmF0aW9uID0gZ3M6V1BTRWxldmF0aW9uLCBQcm9maWwgPSBnczpXUFNMaW5lRWxldmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgIHJhd2RhdGFvdXRwdXQgOiAncmVzdWx0JywvLyBwYXIgZGVmYXV0XG4gICAgICogICAgICAgICAgICAgICAgIHJlcXVlc3QgOiAnRXhlY3V0ZScgICAgICAvLyBwYXIgZGVmYXV0XG4gICAgICogICAgICAgICAgIH1cbiAgICAgKiAgICAgICB9O1xuICAgICAqL1xuICAgIGJ1aWxkIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbG9nZ2VyXG4gICAgICAgIHZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiQWx0aVJlcXVlc3RXUFNcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJBbHRpUmVxdWVzdFdQUzo6YnVpbGQoKVwiXSk7XG5cbiAgICAgICAgLy8gZXhpc3RhbmNlIGRlcyBvcHRpb25zXG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwib3B0aW9uc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0eXBlIGRlIHJlcXVldGUgOiBBbHRpdHVkZSBvdSBQcm9maWxcbiAgICAgICAgLy8gKHBhcmFtLiDDoCBkZXRlcm1pbmVyIGVuIGZvbmN0aW9uIGRlcyBwYXJhbWV0cmVzIGQnZW50csOpZSlcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9FTVBUWVwiLCBcInR5cGUgKEVsZXZhdGlvbiBvciBQcm9maWwpXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0cnVjdGlvbiBkdSBtb2RlbGUgZGUgcmVxdcOqdGVcbiAgICAgICAgLy8gKHRlc3QgZHUgdHlwZSBkJ29iamV0IGNhbmRpZGF0KVxuICAgICAgICB2YXIgRGF0YU9iamVjdCA9IG51bGw7XG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiRWxldmF0aW9uXCI6XG4gICAgICAgICAgICAgICAgLy8gc3VyY2hhcmdlXG4gICAgICAgICAgICAgICAgb3B0aW9ucy53cHMuaWRlbnRpZmllciA9IFwiZ3M6V1BTRWxldmF0aW9uXCI7XG4gICAgICAgICAgICAgICAgRGF0YU9iamVjdCA9IG5ldyBBbHRpRWxldmF0aW9uUmVxdWVzdChvcHRpb25zLnBhcmFtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJQcm9maWxcIjpcbiAgICAgICAgICAgICAgICAvLyBzdXJjaGFyZ2VcbiAgICAgICAgICAgICAgICBvcHRpb25zLndwcy5pZGVudGlmaWVyID0gXCJnczpXUFNMaW5lRWxldmF0aW9uXCI7XG4gICAgICAgICAgICAgICAgRGF0YU9iamVjdCA9IG5ldyBBbHRpUHJvZmlsUmVxdWVzdChvcHRpb25zLnBhcmFtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX1RZUEVcIiwgXCJ0eXBlIChFbGV2YXRpb24gb3IgUHJvZmlsKVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zdHJ1Y3Rpb24gZGUgbGEgcmVxdcOqdGUgV1BTXG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGRhdGEgOiBEYXRhT2JqZWN0LFxuICAgICAgICAgICAgbWV0aG9kIDogb3B0aW9ucy5tZXRob2QsXG4gICAgICAgICAgICBwYXJhbSA6IG9wdGlvbnMud3BzXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHJxc3RXUFMgPSBuZXcgV1BTKHNldHRpbmdzKTtcblxuICAgICAgICBpZiAoIXJxc3RXUFMucHJvY2Vzc1JlcXVlc3RTdHJpbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5hYmxlIHRvIHByb2Nlc3MgcmVxdWVzdCAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJxc3RXUFMucmVxdWVzdFN0cmluZztcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbHRpUmVxdWVzdFdQUztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/AltiRequestWPS.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Request/model/AltiElevationRequest.js": -/*!*****************************************************************!*\ - !*** ./src/Services/Alti/Request/model/AltiElevationRequest.js ***! - \*****************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AltiRequest */ \"./src/Services/Alti/Request/model/AltiRequest.js\");\n\n\n\n/**\n * @classdesc\n *\n * Classe de gestion des param. des requêtes de type POINT du service altimetrique.\n *\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiElevationRequest\n * @param {Object} options - options\n * @param {Boolean} options.zonly - false|true\n *\n * @private\n */\nfunction AltiElevationRequest(options) {\n if (!(this instanceof AltiElevationRequest)) {\n throw new TypeError(\"AltiElevationRequest constructor cannot be called as a function.\");\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"AltiElevationRequest\";\n\n // appel du constructeur par heritage\n _AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur AltiElevationRequest ()]\");\n\n /**\n * Z uniquement.\n * true|false\n */\n this.zonly = this.options.zonly || false; // test des options héritées !\n}\n\n/**\n * @lends module:AltiElevationRequest#\n */\n\nAltiElevationRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].prototype, {\n /**\n * Setter/getter pour \"zonly\"\n */\n zonly: {\n /** getter */\n get: function get() {\n return this._zonly;\n },\n /** setter */\n set: function set(z) {\n this._zonly = z;\n }\n }\n});\n\n/**\n * Constructeur (alias)\n */\nAltiElevationRequest.prototype.constructor = AltiElevationRequest;\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Array}\n */\nAltiElevationRequest.prototype.getData = function () {\n // par glop..., appel de AltiRequest::getData () !\n var map = [];\n map.push({\n k: \"lon\",\n v: this.getLon()\n });\n map.push({\n k: \"lat\",\n v: this.getLat()\n });\n // map.push({k : \"delimiter\", v : this.delimiter}); // FIXME on retire le param \"delimiter\"\n map.push({\n k: \"indent\",\n v: this.indent\n });\n map.push({\n k: \"crs\",\n v: this.crs\n });\n map.push({\n k: \"zonly\",\n v: this.zonly\n });\n map.push({\n k: \"format\",\n v: this.format\n });\n map.push({\n k: \"resource\",\n v: this.resource\n });\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiElevationRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvbW9kZWwvQWx0aUVsZXZhdGlvblJlcXVlc3QuanM/MTY1NCJdLCJuYW1lcyI6WyJBbHRpRWxldmF0aW9uUmVxdWVzdCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJDTEFTU05BTUUiLCJBbHRpUmVxdWVzdCIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJ6b25seSIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImdldCIsIl96b25seSIsInNldCIsInoiLCJjb25zdHJ1Y3RvciIsImdldERhdGEiLCJtYXAiLCJwdXNoIiwiayIsInYiLCJnZXRMb24iLCJnZXRMYXQiLCJpbmRlbnQiLCJjcnMiLCJmb3JtYXQiLCJyZXNvdXJjZSJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQXVEO0FBQ2Y7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLG9CQUFvQkEsQ0FBRUMsT0FBTyxFQUFFO0VBQ3BDLElBQUksRUFBRSxJQUFJLFlBQVlELG9CQUFvQixDQUFDLEVBQUU7SUFDekMsTUFBTSxJQUFJRSxTQUFTLENBQUMsa0VBQWtFLENBQUM7RUFDM0Y7O0VBRUE7QUFDSjtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxTQUFTLEdBQUcsc0JBQXNCOztFQUV2QztFQUNBQyxvREFBVyxDQUFDQyxLQUFLLENBQUMsSUFBSSxFQUFFQyxTQUFTLENBQUM7RUFFbEMsSUFBSSxDQUFDQyxNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxDQUFDO0VBQ2hDLElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsd0NBQXdDLENBQUM7O0VBRTNEO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxLQUFLLEdBQUcsSUFBSSxDQUFDVixPQUFPLENBQUNVLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFYLG9CQUFvQixDQUFDWSxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDVixvREFBVyxDQUFDUSxTQUFTLEVBQUU7RUFFbEU7QUFDSjtBQUNBO0VBQ0lELEtBQUssRUFBRztJQUNKO0lBQ0FJLEdBQUcsRUFBRyxTQUFBQSxJQUFBLEVBQVk7TUFDZCxPQUFPLElBQUksQ0FBQ0MsTUFBTTtJQUN0QixDQUFDO0lBQ0Q7SUFDQUMsR0FBRyxFQUFHLFNBQUFBLElBQVVDLENBQUMsRUFBRTtNQUNmLElBQUksQ0FBQ0YsTUFBTSxHQUFHRSxDQUFDO0lBQ25CO0VBQ0o7QUFFSixDQUFDLENBQUM7O0FBRUY7QUFDQTtBQUNBO0FBQ0FsQixvQkFBb0IsQ0FBQ1ksU0FBUyxDQUFDTyxXQUFXLEdBQUduQixvQkFBb0I7O0FBRWpFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsb0JBQW9CLENBQUNZLFNBQVMsQ0FBQ1EsT0FBTyxHQUFHLFlBQVk7RUFDakQ7RUFDQSxJQUFJQyxHQUFHLEdBQUcsRUFBRTtFQUNaQSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDQyxNQUFNLENBQUM7RUFDcEIsQ0FBQyxDQUFDO0VBQ0ZKLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO0lBQ0xDLENBQUMsRUFBRyxLQUFLO0lBQ1RDLENBQUMsRUFBRyxJQUFJLENBQUNFLE1BQU0sQ0FBQztFQUNwQixDQUFDLENBQUM7RUFDRjtFQUNBTCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDRztFQUNiLENBQUMsQ0FBQztFQUNGTixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDSTtFQUNiLENBQUMsQ0FBQztFQUNGUCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsT0FBTztJQUNYQyxDQUFDLEVBQUcsSUFBSSxDQUFDYjtFQUNiLENBQUMsQ0FBQztFQUNGVSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDSztFQUNiLENBQUMsQ0FBQztFQUNGUixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsVUFBVTtJQUNkQyxDQUFDLEVBQUcsSUFBSSxDQUFDTTtFQUNiLENBQUMsQ0FBQztFQUVGLE9BQU9ULEdBQUc7QUFDZCxDQUFDO0FBRWNyQixtRkFBb0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L21vZGVsL0FsdGlFbGV2YXRpb25SZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBBbHRpUmVxdWVzdCBmcm9tIFwiLi9BbHRpUmVxdWVzdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgcGFyYW0uIGRlcyByZXF1w6p0ZXMgZGUgdHlwZSBQT0lOVCBkdSBzZXJ2aWNlIGFsdGltZXRyaXF1ZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aUVsZXZhdGlvblJlcXVlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSAgb3B0aW9ucy56b25seSAtIGZhbHNlfHRydWVcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBBbHRpRWxldmF0aW9uUmVxdWVzdCAob3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBbHRpRWxldmF0aW9uUmVxdWVzdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFsdGlFbGV2YXRpb25SZXF1ZXN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9tIGRlIGxhIGNsYXNzZSAoaGVyaXRhZ2UpXG4gICAgICovXG4gICAgdGhpcy5DTEFTU05BTUUgPSBcIkFsdGlFbGV2YXRpb25SZXF1ZXN0XCI7XG5cbiAgICAvLyBhcHBlbCBkdSBjb25zdHJ1Y3RldXIgcGFyIGhlcml0YWdlXG4gICAgQWx0aVJlcXVlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBBbHRpRWxldmF0aW9uUmVxdWVzdCAoKV1cIik7XG5cbiAgICAvKipcbiAgICAgKiBaIHVuaXF1ZW1lbnQuXG4gICAgICogdHJ1ZXxmYWxzZVxuICAgICAqL1xuICAgIHRoaXMuem9ubHkgPSB0aGlzLm9wdGlvbnMuem9ubHkgfHwgZmFsc2U7IC8vIHRlc3QgZGVzIG9wdGlvbnMgaMOpcml0w6llcyAhXG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpBbHRpRWxldmF0aW9uUmVxdWVzdCNcbiAqL1xuXG5BbHRpRWxldmF0aW9uUmVxdWVzdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFsdGlSZXF1ZXN0LnByb3RvdHlwZSwge1xuXG4gICAgLyoqXG4gICAgICogU2V0dGVyL2dldHRlciBwb3VyIFwiem9ubHlcIlxuICAgICAqL1xuICAgIHpvbmx5IDoge1xuICAgICAgICAvKiogZ2V0dGVyICovXG4gICAgICAgIGdldCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25seTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIHNldHRlciAqL1xuICAgICAgICBzZXQgOiBmdW5jdGlvbiAoeikge1xuICAgICAgICAgICAgdGhpcy5fem9ubHkgPSB6O1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5BbHRpRWxldmF0aW9uUmVxdWVzdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbHRpRWxldmF0aW9uUmVxdWVzdDtcblxuLyoqXG4gKiBUYWJsZWF1IGRlIGNsZWZzL3ZhbGV1cnMgcG91ciBwYXJhbS5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbkFsdGlFbGV2YXRpb25SZXF1ZXN0LnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIHBhciBnbG9wLi4uLCBhcHBlbCBkZSBBbHRpUmVxdWVzdDo6Z2V0RGF0YSAoKSAhXG4gICAgdmFyIG1hcCA9IFtdO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwibG9uXCIsXG4gICAgICAgIHYgOiB0aGlzLmdldExvbigpXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJsYXRcIixcbiAgICAgICAgdiA6IHRoaXMuZ2V0TGF0KClcbiAgICB9KTtcbiAgICAvLyBtYXAucHVzaCh7ayA6IFwiZGVsaW1pdGVyXCIsIHYgOiB0aGlzLmRlbGltaXRlcn0pOyAvLyBGSVhNRSBvbiByZXRpcmUgbGUgcGFyYW0gXCJkZWxpbWl0ZXJcIlxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiaW5kZW50XCIsXG4gICAgICAgIHYgOiB0aGlzLmluZGVudFxuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiY3JzXCIsXG4gICAgICAgIHYgOiB0aGlzLmNyc1xuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiem9ubHlcIixcbiAgICAgICAgdiA6IHRoaXMuem9ubHlcbiAgICB9KTtcbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImZvcm1hdFwiLFxuICAgICAgICB2IDogdGhpcy5mb3JtYXRcbiAgICB9KTtcbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcInJlc291cmNlXCIsXG4gICAgICAgIHYgOiB0aGlzLnJlc291cmNlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aUVsZXZhdGlvblJlcXVlc3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/model/AltiElevationRequest.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Request/model/AltiProfilRequest.js": -/*!**************************************************************!*\ - !*** ./src/Services/Alti/Request/model/AltiProfilRequest.js ***! - \**************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AltiRequest */ \"./src/Services/Alti/Request/model/AltiRequest.js\");\n\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique.\n *\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiProfilRequest\n * @param {Object} options - options\n * @param {String} options.sampling - 3\n *\n * @private\n */\nfunction AltiProfilRequest(options) {\n if (!(this instanceof AltiProfilRequest)) {\n throw new TypeError(\"AltiProfilRequest constructor cannot be called as a function.\");\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"AltiProfilRequest\";\n\n // appel du constructeur par heritage\n _AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur AltiProfilRequest ()]\");\n\n /**\n * Sampling\n * Par defaut, 3\n */\n this.sampling = this.options.sampling || 3; // test des options héritées !\n}\n\n/**\n * @lends module:AltiProfilRequest#\n */\n\nAltiProfilRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].prototype, {\n /**\n * Setter/getter pour \"sampling\"\n */\n sampling: {\n /** getter */\n get: function get() {\n return this._sampling;\n },\n /** setter */\n set: function set(value) {\n this._sampling = value;\n }\n }\n});\n\n/**\n * Constructeur (alias)\n */\nAltiProfilRequest.prototype.constructor = AltiProfilRequest;\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Object[]}\n */\nAltiProfilRequest.prototype.getData = function () {\n // par glop..., appel de AltiRequest::getData () !\n var map = [];\n map.push({\n k: \"lon\",\n v: this.getLon()\n });\n map.push({\n k: \"lat\",\n v: this.getLat()\n });\n // map.push({k : \"delimiter\", v : this.delimiter}); // FIXME on retire le param \"delimiter\"\n map.push({\n k: \"indent\",\n v: this.indent\n });\n map.push({\n k: \"crs\",\n v: this.crs\n });\n map.push({\n k: \"sampling\",\n v: this.sampling\n });\n map.push({\n k: \"format\",\n v: this.format\n });\n map.push({\n k: \"resource\",\n v: this.resource\n });\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiProfilRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvbW9kZWwvQWx0aVByb2ZpbFJlcXVlc3QuanM/ZjA5YyJdLCJuYW1lcyI6WyJBbHRpUHJvZmlsUmVxdWVzdCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJDTEFTU05BTUUiLCJBbHRpUmVxdWVzdCIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJzYW1wbGluZyIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImdldCIsIl9zYW1wbGluZyIsInNldCIsInZhbHVlIiwiY29uc3RydWN0b3IiLCJnZXREYXRhIiwibWFwIiwicHVzaCIsImsiLCJ2IiwiZ2V0TG9uIiwiZ2V0TGF0IiwiaW5kZW50IiwiY3JzIiwiZm9ybWF0IiwicmVzb3VyY2UiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFBQTtBQUF1RDtBQUNmOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsaUJBQWlCQSxDQUFFQyxPQUFPLEVBQUU7RUFDakMsSUFBSSxFQUFFLElBQUksWUFBWUQsaUJBQWlCLENBQUMsRUFBRTtJQUN0QyxNQUFNLElBQUlFLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztFQUN4Rjs7RUFFQTtBQUNKO0FBQ0E7RUFDSSxJQUFJLENBQUNDLFNBQVMsR0FBRyxtQkFBbUI7O0VBRXBDO0VBQ0FDLG9EQUFXLENBQUNDLEtBQUssQ0FBQyxJQUFJLEVBQUVDLFNBQVMsQ0FBQztFQUVsQyxJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLENBQUM7RUFDaEMsSUFBSSxDQUFDRixNQUFNLENBQUNHLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQzs7RUFFeEQ7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJLENBQUNWLE9BQU8sQ0FBQ1UsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQVgsaUJBQWlCLENBQUNZLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUNWLG9EQUFXLENBQUNRLFNBQVMsRUFBRTtFQUUvRDtBQUNKO0FBQ0E7RUFDSUQsUUFBUSxFQUFHO0lBQ1A7SUFDQUksR0FBRyxFQUFHLFNBQUFBLElBQUEsRUFBWTtNQUNkLE9BQU8sSUFBSSxDQUFDQyxTQUFTO0lBQ3pCLENBQUM7SUFDRDtJQUNBQyxHQUFHLEVBQUcsU0FBQUEsSUFBVUMsS0FBSyxFQUFFO01BQ25CLElBQUksQ0FBQ0YsU0FBUyxHQUFHRSxLQUFLO0lBQzFCO0VBQ0o7QUFDSixDQUFDLENBQUM7O0FBRUY7QUFDQTtBQUNBO0FBQ0FsQixpQkFBaUIsQ0FBQ1ksU0FBUyxDQUFDTyxXQUFXLEdBQUduQixpQkFBaUI7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsaUJBQWlCLENBQUNZLFNBQVMsQ0FBQ1EsT0FBTyxHQUFHLFlBQVk7RUFDOUM7RUFDQSxJQUFJQyxHQUFHLEdBQUcsRUFBRTtFQUNaQSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDQyxNQUFNLENBQUM7RUFDcEIsQ0FBQyxDQUFDO0VBQ0ZKLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO0lBQ0xDLENBQUMsRUFBRyxLQUFLO0lBQ1RDLENBQUMsRUFBRyxJQUFJLENBQUNFLE1BQU0sQ0FBQztFQUNwQixDQUFDLENBQUM7RUFDRjtFQUNBTCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDRztFQUNiLENBQUMsQ0FBQztFQUNGTixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDSTtFQUNiLENBQUMsQ0FBQztFQUNGUCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsVUFBVTtJQUNkQyxDQUFDLEVBQUcsSUFBSSxDQUFDYjtFQUNiLENBQUMsQ0FBQztFQUNGVSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDSztFQUNiLENBQUMsQ0FBQztFQUNGUixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsVUFBVTtJQUNkQyxDQUFDLEVBQUcsSUFBSSxDQUFDTTtFQUNiLENBQUMsQ0FBQztFQUVGLE9BQU9ULEdBQUc7QUFDZCxDQUFDO0FBRWNyQixnRkFBaUIiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L21vZGVsL0FsdGlQcm9maWxSZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBBbHRpUmVxdWVzdCBmcm9tIFwiLi9BbHRpUmVxdWVzdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIENsYXNzZSBkZSBnZXN0aW9uIGRlcyBwYXJhbS4gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFBST0ZJTCBkdSBzZXJ2aWNlIGFsdGltZXRyaXF1ZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aVByb2ZpbFJlcXVlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSAgIG9wdGlvbnMgLSBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnNhbXBsaW5nIC0gM1xuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEFsdGlQcm9maWxSZXF1ZXN0IChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFsdGlQcm9maWxSZXF1ZXN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWx0aVByb2ZpbFJlcXVlc3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiQWx0aVByb2ZpbFJlcXVlc3RcIjtcblxuICAgIC8vIGFwcGVsIGR1IGNvbnN0cnVjdGV1ciBwYXIgaGVyaXRhZ2VcbiAgICBBbHRpUmVxdWVzdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIEFsdGlQcm9maWxSZXF1ZXN0ICgpXVwiKTtcblxuICAgIC8qKlxuICAgICAqIFNhbXBsaW5nXG4gICAgICogUGFyIGRlZmF1dCwgM1xuICAgICAqL1xuICAgIHRoaXMuc2FtcGxpbmcgPSB0aGlzLm9wdGlvbnMuc2FtcGxpbmcgfHwgMzsgLy8gdGVzdCBkZXMgb3B0aW9ucyBow6lyaXTDqWVzICFcbn1cblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOkFsdGlQcm9maWxSZXF1ZXN0I1xuICovXG5cbkFsdGlQcm9maWxSZXF1ZXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQWx0aVJlcXVlc3QucHJvdG90eXBlLCB7XG5cbiAgICAvKipcbiAgICAgKiBTZXR0ZXIvZ2V0dGVyIHBvdXIgXCJzYW1wbGluZ1wiXG4gICAgICovXG4gICAgc2FtcGxpbmcgOiB7XG4gICAgICAgIC8qKiBnZXR0ZXIgKi9cbiAgICAgICAgZ2V0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NhbXBsaW5nO1xuICAgICAgICB9LFxuICAgICAgICAvKiogc2V0dGVyICovXG4gICAgICAgIHNldCA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2FtcGxpbmcgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG4vKipcbiAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gKi9cbkFsdGlQcm9maWxSZXF1ZXN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFsdGlQcm9maWxSZXF1ZXN0O1xuXG4vKipcbiAqIFRhYmxlYXUgZGUgY2xlZnMvdmFsZXVycyBwb3VyIHBhcmFtLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3RbXX1cbiAqL1xuQWx0aVByb2ZpbFJlcXVlc3QucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gcGFyIGdsb3AuLi4sIGFwcGVsIGRlIEFsdGlSZXF1ZXN0OjpnZXREYXRhICgpICFcbiAgICB2YXIgbWFwID0gW107XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJsb25cIixcbiAgICAgICAgdiA6IHRoaXMuZ2V0TG9uKClcbiAgICB9KTtcbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImxhdFwiLFxuICAgICAgICB2IDogdGhpcy5nZXRMYXQoKVxuICAgIH0pO1xuICAgIC8vIG1hcC5wdXNoKHtrIDogXCJkZWxpbWl0ZXJcIiwgdiA6IHRoaXMuZGVsaW1pdGVyfSk7IC8vIEZJWE1FIG9uIHJldGlyZSBsZSBwYXJhbSBcImRlbGltaXRlclwiXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJpbmRlbnRcIixcbiAgICAgICAgdiA6IHRoaXMuaW5kZW50XG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgdiA6IHRoaXMuY3JzXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJzYW1wbGluZ1wiLFxuICAgICAgICB2IDogdGhpcy5zYW1wbGluZ1xuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiZm9ybWF0XCIsXG4gICAgICAgIHYgOiB0aGlzLmZvcm1hdFxuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwicmVzb3VyY2VcIixcbiAgICAgICAgdiA6IHRoaXMucmVzb3VyY2VcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbHRpUHJvZmlsUmVxdWVzdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/model/AltiProfilRequest.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Request/model/AltiRequest.js": -/*!********************************************************!*\ - !*** ./src/Services/Alti/Request/model/AltiRequest.js ***! - \********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes du service altimetrique.\n *\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiRequest\n * @param {Object} options - options\n * @param {Object} options.positions - tableau de coordonnées lon/lat\n * @param {String} options.delimiter - \"|\"\n * @param {Boolean} options.indent - false|true\n * @param {String} options.crs - \"CRS:84\"\n * @param {String} options.format - \"JSON|XML\"\n *\n * @private\n */\nfunction AltiRequest(options) {\n if (!(this instanceof AltiRequest)) {\n throw new TypeError(\"AltiRequest constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur AltiRequest ()]\");\n\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n /**\n * Liste des coordonnées.\n * @example\n * var c = [{lon : \"\", lat : \"\"}, {lon : \"\", lat : \"\"}];\n */\n this.positions = this.options.positions || [];\n\n /**\n * Caractère de séparation.\n * Par defaut, \"|\".\n */\n this.delimiter = this.options.delimiter || \"|\";\n\n /**\n * Indentation.\n * true|false\n */\n this.indent = this.options.indent || false;\n\n /**\n * Projection.\n * Par defaut, CRS:84.\n */\n this.crs = this.options.crs || \"CRS:84\";\n\n /**\n * format de sortie.\n * Par defaut, \"json\".\n */\n this.format = this.options.format || \"json\";\n\n /*\n * Ressource utilisée\n */\n this.resource = this.options.resource;\n\n /**\n * Réponse détaillée (source & accuracy)\n * true|false\n */\n this.measures = this.options.measures || false;\n}\n\n/**\n * CLASSNAME\n */\nAltiRequest.CLASSNAME = \"AltiRequest\";\nAltiRequest.prototype = {\n /**\n * @lends module:AltiRequest#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: AltiRequest,\n /**\n * Ajout d\"une liste de coordonnées.\n *\n * @param {Object[]} lstPosition - liste de positions\n * @example\n * obj.setPositions ([{lon : \"0.15\", lat : \"0.15\"}, {lon : \"1.15\", lat : \"1.15\"}]);\n */\n setPositions: function setPositions(lstPosition) {\n var positions = [];\n for (var i = 0; i < lstPosition.length; i++) {\n var o = lstPosition[i];\n if (o.lon && o.lat) {\n positions.push(o);\n }\n }\n this.positions = positions;\n },\n /**\n * Liste des coordonnées.\n *\n * @param {Int} pos - position\n * @returns {positions}\n * @example\n * obj.getPositions (); // [{lon : \"\", lat : \"\"}, {lon : \"\", lat : \"\"}]\n * obj.getPositions (0); // [{lon : \"\", lat : \"\"}]\n */\n getPositions: function getPositions(pos) {\n // FIXME test if not a number !?\n if (!pos) {\n return this.positions;\n }\n var index = this.positions.length - 1;\n if (pos > index || pos < index) {\n this.logger.warn(\"index out of range !\");\n return this.positions;\n }\n return this.positions[pos];\n },\n /**\n * Ajout d\"une liste de coordonnées.\n *\n * @param {Object[]} lstPosition - liste de positions\n * @example\n * obj.addPositions ([{lon : \"0.15\", lat : \"0.15\"}, {lon : \"1.15\", lat : \"1.15\"}]);\n */\n addPositions: function addPositions(lstPosition) {\n for (var i = 0; i < lstPosition.length; i++) {\n var o = lstPosition[i];\n if (o.lon && o.lat) {\n this.positions.push(lstPosition[i]);\n }\n }\n },\n /**\n * Retourne la liste des longitudes avec un caractère de séparation.\n *\n * @returns {String} - une liste de longitudes\n * @example\n * // out : 0.2367|2.1570|43.789|...\n */\n getLon: function getLon() {\n var lstLon = [];\n for (var i = 0; i < this.positions.length; i++) {\n lstLon.push(this.positions[i].lon);\n }\n this.logger.trace(lstLon);\n return lstLon.join(this.delimiter);\n },\n /**\n * Retourne la liste des lattitudes avec un caractère de séparation.\n *\n * @returns {String} - une liste de lattitudes\n * @example\n * // out : 0.2367|2.1570|43.789|...\n */\n getLat: function getLat() {\n var lstLat = [];\n for (var i = 0; i < this.positions.length; i++) {\n lstLat.push(this.positions[i].lat);\n }\n this.logger.trace(lstLat);\n return lstLat.join(this.delimiter);\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Object[]}\n */\nAltiRequest.prototype.getData = function () {\n var map = [];\n map.push({\n k: \"lon\",\n v: this.getLon()\n });\n map.push({\n k: \"lat\",\n v: this.getLat()\n });\n map.push({\n k: \"delimiter\",\n v: this.delimiter\n });\n map.push({\n k: \"indent\",\n v: this.indent\n });\n map.push({\n k: \"crs\",\n v: this.crs\n });\n map.push({\n k: \"format\",\n v: this.format\n });\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvbW9kZWwvQWx0aVJlcXVlc3QuanM/MDgwZSJdLCJuYW1lcyI6WyJBbHRpUmVxdWVzdCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsInBvc2l0aW9ucyIsImRlbGltaXRlciIsImluZGVudCIsImNycyIsImZvcm1hdCIsInJlc291cmNlIiwibWVhc3VyZXMiLCJDTEFTU05BTUUiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciIsInNldFBvc2l0aW9ucyIsImxzdFBvc2l0aW9uIiwiaSIsImxlbmd0aCIsIm8iLCJsb24iLCJsYXQiLCJwdXNoIiwiZ2V0UG9zaXRpb25zIiwicG9zIiwiaW5kZXgiLCJ3YXJuIiwiYWRkUG9zaXRpb25zIiwiZ2V0TG9uIiwibHN0TG9uIiwiam9pbiIsImdldExhdCIsImxzdExhdCIsImdldERhdGEiLCJtYXAiLCJrIiwidiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsV0FBV0EsQ0FBRUMsT0FBTyxFQUFFO0VBQzNCLElBQUksRUFBRSxJQUFJLFlBQVlELFdBQVcsQ0FBQyxFQUFFO0lBQ2hDLE1BQU0sSUFBSUUsU0FBUyxDQUFDLHlEQUF5RCxDQUFDO0VBQ2xGO0VBRUEsSUFBSSxDQUFDQyxNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxDQUFDO0VBQ2hDLElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsK0JBQStCLENBQUM7O0VBRWxEO0FBQ0o7QUFDQTtFQUNJLElBQUksQ0FBQ0wsT0FBTyxHQUFHQSxPQUFPLElBQUksQ0FBQyxDQUFDOztFQUU1QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksSUFBSSxD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LEdBQUcsQ0FBQ1osSUFBSSxDQUFDO0lBQ0xhLENBQUMsRUFBRyxLQUFLO0lBQ1RDLENBQUMsRUFBRyxJQUFJLENBQUNSLE1BQU0sQ0FBQztFQUNwQixDQUFDLENBQUM7RUFDRk0sR0FBRyxDQUFDWixJQUFJLENBQUM7SUFDTGEsQ0FBQyxFQUFHLEtBQUs7SUFDVEMsQ0FBQyxFQUFHLElBQUksQ0FBQ0wsTUFBTSxDQUFDO0VBQ3BCLENBQUMsQ0FBQztFQUNGRyxHQUFHLENBQUNaLElBQUksQ0FBQztJQUNMYSxDQUFDLEVBQUcsV0FBVztJQUNmQyxDQUFDLEVBQUcsSUFBSSxDQUFDOUI7RUFDYixDQUFDLENBQUM7RUFDRjRCLEdBQUcsQ0FBQ1osSUFBSSxDQUFDO0lBQ0xhLENBQUMsRUFBRyxRQUFRO0lBQ1pDLENBQUMsRUFBRyxJQUFJLENBQUM3QjtFQUNiLENBQUMsQ0FBQztFQUNGMkIsR0FBRyxDQUFDWixJQUFJLENBQUM7SUFDTGEsQ0FBQyxFQUFHLEtBQUs7SUFDVEMsQ0FBQyxFQUFHLElBQUksQ0FBQzVCO0VBQ2IsQ0FBQyxDQUFDO0VBQ0YwQixHQUFHLENBQUNaLElBQUksQ0FBQztJQUNMYSxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDM0I7RUFDYixDQUFDLENBQUM7RUFFRixPQUFPeUIsR0FBRztBQUNkLENBQUM7QUFFY3BDLDBFQUFXIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVxdWVzdC9tb2RlbC9BbHRpUmVxdWVzdC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHBhcmFtLiBkZXMgcmVxdcOqdGVzIGR1IHNlcnZpY2UgYWx0aW1ldHJpcXVlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGkuUmVxdWVzdC5BbHRpUmVxdWVzdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gICBvcHRpb25zLnBvc2l0aW9ucyAtIHRhYmxlYXUgZGUgY29vcmRvbm7DqWVzIGxvbi9sYXRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMuZGVsaW1pdGVyIC0gXCJ8XCJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gIG9wdGlvbnMuaW5kZW50IC0gZmFsc2V8dHJ1ZVxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5jcnMgLSBcIkNSUzo4NFwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLmZvcm1hdCAtIFwiSlNPTnxYTUxcIlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEFsdGlSZXF1ZXN0IChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFsdGlSZXF1ZXN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWx0aVJlcXVlc3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgQWx0aVJlcXVlc3QgKCldXCIpO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBlbiBwYXJhbcOqdHJlcyBkdSBjb25zdHJ1Y3RldXIuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlIGRlcyBjb29yZG9ubsOpZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYyA9IFt7bG9uIDogXCJcIiwgbGF0IDogXCJcIn0sIHtsb24gOiBcIlwiLCBsYXQgOiBcIlwifV07XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ2FyYWN0w6hyZSBkZSBzw6lwYXJhdGlvbi5cbiAgICAgKiBQYXIgZGVmYXV0LCBcInxcIi5cbiAgICAgKi9cbiAgICB0aGlzLmRlbGltaXRlciA9IHRoaXMub3B0aW9ucy5kZWxpbWl0ZXIgfHwgXCJ8XCI7XG5cbiAgICAvKipcbiAgICAgKiBJbmRlbnRhdGlvbi5cbiAgICAgKiB0cnVlfGZhbHNlXG4gICAgICovXG4gICAgdGhpcy5pbmRlbnQgPSB0aGlzLm9wdGlvbnMuaW5kZW50IHx8IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogUHJvamVjdGlvbi5cbiAgICAgKiBQYXIgZGVmYXV0LCBDUlM6ODQuXG4gICAgICovXG4gICAgdGhpcy5jcnMgPSB0aGlzLm9wdGlvbnMuY3JzIHx8IFwiQ1JTOjg0XCI7XG5cbiAgICAvKipcbiAgICAgKiBmb3JtYXQgZGUgc29ydGllLlxuICAgICAqIFBhciBkZWZhdXQsIFwianNvblwiLlxuICAgICAqL1xuICAgIHRoaXMuZm9ybWF0ID0gdGhpcy5vcHRpb25zLmZvcm1hdCB8fCBcImpzb25cIjtcblxuICAgIC8qXG4gICAgICogUmVzc291cmNlIHV0aWxpc8OpZVxuICAgICovXG4gICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMub3B0aW9ucy5yZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFLDqXBvbnNlIGTDqXRhaWxsw6llIChzb3VyY2UgJiBhY2N1cmFjeSlcbiAgICAgKiB0cnVlfGZhbHNlXG4gICAgKi9cbiAgICB0aGlzLm1lYXN1cmVzID0gdGhpcy5vcHRpb25zLm1lYXN1cmVzIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIENMQVNTTkFNRVxuICovXG5BbHRpUmVxdWVzdC5DTEFTU05BTUUgPSBcIkFsdGlSZXF1ZXN0XCI7XG5cbkFsdGlSZXF1ZXN0LnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6QWx0aVJlcXVlc3QjXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogQWx0aVJlcXVlc3QsXG5cbiAgICAvKipcbiAgICAgKiBBam91dCBkXCJ1bmUgbGlzdGUgZGUgY29vcmRvbm7DqWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3RbXX0gbHN0UG9zaXRpb24gLSBsaXN0ZSBkZSBwb3NpdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG9iai5zZXRQb3NpdGlvbnMgKFt7bG9uIDogXCIwLjE1XCIsIGxhdCA6IFwiMC4xNVwifSwge2xvbiA6IFwiMS4xNVwiLCBsYXQgOiBcIjEuMTVcIn1dKTtcbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbnMgOiBmdW5jdGlvbiAobHN0UG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxzdFBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbyA9IGxzdFBvc2l0aW9uW2ldO1xuICAgICAgICAgICAgaWYgKG8ubG9uICYmIG8ubGF0KSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2gobyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGUgZGVzIGNvb3Jkb25uw6llcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SW50fSBwb3MgLSBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIHtwb3NpdGlvbnN9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBvYmouZ2V0UG9zaXRpb25zICgpOyAgLy8gW3tsb24gOiBcIlwiLCBsYXQgOiBcIlwifSwge2xvbiA6IFwiXCIsIGxhdCA6IFwiXCJ9XVxuICAgICAqIG9iai5nZXRQb3NpdGlvbnMgKDApOyAvLyBbe2xvbiA6IFwiXCIsIGxhdCA6IFwiXCJ9XVxuICAgICAqL1xuICAgIGdldFBvc2l0aW9ucyA6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgLy8gRklYTUUgdGVzdCBpZiBub3QgYSBudW1iZXIgIT9cbiAgICAgICAgaWYgKCFwb3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucG9zaXRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChwb3MgPiBpbmRleCB8fCBwb3MgPCBpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImluZGV4IG91dCBvZiByYW5nZSAhXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zW3Bvc107XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFqb3V0IGRcInVuZSBsaXN0ZSBkZSBjb29yZG9ubsOpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBsc3RQb3NpdGlvbiAtIGxpc3RlIGRlIHBvc2l0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogb2JqLmFkZFBvc2l0aW9ucyAoW3tsb24gOiBcIjAuMTVcIiwgbGF0IDogXCIwLjE1XCJ9LCB7bG9uIDogXCIxLjE1XCIsIGxhdCA6IFwiMS4xNVwifV0pO1xuICAgICAqL1xuICAgIGFkZFBvc2l0aW9ucyA6IGZ1bmN0aW9uIChsc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxzdFBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbyA9IGxzdFBvc2l0aW9uW2ldO1xuICAgICAgICAgICAgaWYgKG8ubG9uICYmIG8ubGF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChsc3RQb3NpdGlvbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbGEgbGlzdGUgZGVzIGxvbmdpdHVkZXMgYXZlYyB1biBjYXJhY3TDqHJlIGRlIHPDqXBhcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gLSB1bmUgbGlzdGUgZGUgbG9uZ2l0dWRlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gb3V0IDogMC4yMzY3fDIuMTU3MHw0My43ODl8Li4uXG4gICAgICovXG4gICAgZ2V0TG9uIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbHN0TG9uID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxzdExvbi5wdXNoKHRoaXMucG9zaXRpb25zW2ldLmxvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UobHN0TG9uKTtcbiAgICAgICAgcmV0dXJuIGxzdExvbi5qb2luKHRoaXMuZGVsaW1pdGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbGEgbGlzdGUgZGVzIGxhdHRpdHVkZXMgYXZlYyB1biBjYXJhY3TDqHJlIGRlIHPDqXBhcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gLSB1bmUgbGlzdGUgZGUgbGF0dGl0dWRlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gb3V0IDogMC4yMzY3fDIuMTU3MHw0My43ODl8Li4uXG4gICAgICovXG4gICAgZ2V0TGF0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbHN0TGF0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxzdExhdC5wdXNoKHRoaXMucG9zaXRpb25zW2ldLmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UobHN0TGF0KTtcbiAgICAgICAgcmV0dXJuIGxzdExhdC5qb2luKHRoaXMuZGVsaW1pdGVyKTtcbiAgICB9XG5cbn07XG5cbi8qKlxuICogVGFibGVhdSBkZSBjbGVmcy92YWxldXJzIHBvdXIgcGFyYW0uXG4gKlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5BbHRpUmVxdWVzdC5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWFwID0gW107XG5cbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImxvblwiLFxuICAgICAgICB2IDogdGhpcy5nZXRMb24oKVxuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwibGF0XCIsXG4gICAgICAgIHYgOiB0aGlzLmdldExhdCgpXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJkZWxpbWl0ZXJcIixcbiAgICAgICAgdiA6IHRoaXMuZGVsaW1pdGVyXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJpbmRlbnRcIixcbiAgICAgICAgdiA6IHRoaXMuaW5kZW50XG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgdiA6IHRoaXMuY3JzXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJmb3JtYXRcIixcbiAgICAgICAgdiA6IHRoaXMuZm9ybWF0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlcXVlc3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/model/AltiRequest.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Response/AltiResponseFactory.js": -/*!***********************************************************!*\ - !*** ./src/Services/Alti/Response/AltiResponseFactory.js ***! - \***********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Formats/XML */ \"./src/Formats/XML.js\");\n/* harmony import */ var _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Formats/AltiResponseReader */ \"./src/Services/Alti/Formats/AltiResponseReader.js\");\n/* harmony import */ var _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./model/AltiResponse */ \"./src/Services/Alti/Response/model/AltiResponse.js\");\n/* harmony import */ var _model_Elevation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./model/Elevation */ \"./src/Services/Alti/Response/model/Elevation.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/**\n * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON\n * (Factory)\n *\n * @module AltiResponseFactory\n * @private\n * @alias Gp.Services.Alti.Response.AltiResponseFactory\n */\n\n\n\n\n\n\n\nvar AltiResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Alti\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiResponseFactory\");\n logger.trace([\"AltiResponseFactory::build()\"]);\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n switch (options.outputFormat) {\n case \"xml\":\n logger.trace(\"analyze response : xml\");\n try {\n var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n reader: _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n if (typeof options.response === \"string\") {\n p.setXMLString(options.response);\n } else {\n p.setXMLDoc(options.response);\n }\n data = p.parse();\n if (!data) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION_2\"));\n }\n } catch (e) {\n var message = e.message;\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", message),\n status: 200,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR\n }));\n return;\n }\n break;\n case \"json\":\n logger.trace(\"analyze response : json\");\n logger.trace(\"analyze response : \", _typeof(options.response));\n var JSONResponse = null;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // le service renvoie t il une erreur ?\n if (JSONResponse && JSONResponse.error) {\n // ex. {\"error\": {\"code\": \"BAD_PARAMETER\",\"description\": \"The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180).\"}}\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", JSONResponse.error.description),\n status: 200,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR\n }));\n return;\n }\n\n // analyse de la reponse\n if (JSONResponse) {\n var elevations = JSONResponse.elevations;\n var altiResponse = new _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n var elevation;\n if (Array.isArray(elevations) && elevations.length) {\n for (var i = 0; i < elevations.length; i++) {\n elevation = new _model_Elevation__WEBPACK_IMPORTED_MODULE_6__[\"default\"]();\n if (_typeof(elevations[i]) === \"object\") {\n // elevations[i] est un objet elevation\n if (elevations[i].lon) {\n elevation.lon = elevations[i].lon;\n }\n if (elevations[i].lat) {\n elevation.lat = elevations[i].lat;\n }\n if (elevations[i].z) {\n elevation.z = elevations[i].z;\n }\n if (elevations[i].acc) {\n elevation.acc = elevations[i].acc;\n }\n if (elevations[i].measures) {\n elevation.measures = elevations[i].measures;\n }\n } else if (typeof elevations[i] === \"number\") {\n // elevations[i] est un nombre, dans le cas de zonly=true notamment\n elevation.z = elevations[i];\n }\n if (Array.isArray(altiResponse.elevations)) {\n altiResponse.elevations.push(elevation);\n }\n }\n }\n data = altiResponse;\n }\n if (!data) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE_2\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n break;\n default:\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_FORMAT_2\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n } else if (data.error) {\n var errorMess = data.error.description;\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", errorMess),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n }\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL0FsdGlSZXNwb25zZUZhY3RvcnkuanM/NDc1MSJdLCJuYW1lcyI6WyJBbHRpUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIm91dHB1dEZvcm1hdCIsInAiLCJYTUwiLCJyZWFkZXIiLCJBbHRpUmVzcG9uc2VSZWFkZXIiLCJzZXRYTUxTdHJpbmciLCJzZXRYTUxEb2MiLCJwYXJzZSIsIkVycm9yIiwiTVJlcyIsImdldE1lc3NhZ2UiLCJlIiwibWVzc2FnZSIsIm9uRXJyb3IiLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJzdGF0dXMiLCJ0eXBlIiwiVFlQRV9TUlZFUlIiLCJfdHlwZW9mIiwiSlNPTlJlc3BvbnNlIiwiSlNPTiIsImVycm9yIiwiZGVzY3JpcHRpb24iLCJlbGV2YXRpb25zIiwiYWx0aVJlc3BvbnNlIiwiQWx0aVJlc3BvbnNlIiwiZWxldmF0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsIkVsZXZhdGlvbiIsImxvbiIsImxhdCIsInoiLCJhY2MiLCJtZWFzdXJlcyIsInB1c2giLCJUWVBFX1VOS0VSUiIsImV4Y2VwdGlvblJlcG9ydCIsImVycm9yTWVzcyIsIm9uU3VjY2VzcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNvRDtBQUNBO0FBQ1E7QUFDckI7QUFDd0I7QUFDZjtBQUNOO0FBRTFDLElBQUlBLG1CQUFtQixHQUFHO0VBRXRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FB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WSxDQUFDO1lBQ2pESixPQUFPLEVBQUdILGdFQUFJLENBQUNDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRWIsSUFBSSxDQUFDNEMsZUFBZSxDQUFDO1lBQzdFdkIsSUFBSSxFQUFHRixnRUFBWSxDQUFDRyxXQUFXO1lBQy9CRixNQUFNLEVBQUc7VUFDYixDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0osQ0FBQyxNQUFNLElBQUlwQixJQUFJLENBQUMwQixLQUFLLEVBQUU7VUFDbkIsSUFBSW1CLFNBQVMsR0FBRzdDLElBQUksQ0FBQzBCLEtBQUssQ0FBQ0MsV0FBVztVQUN0Q2hDLE9BQU8sQ0FBQ3FCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDdEIsT0FBTyxDQUFDdUIsS0FBSyxFQUFFLElBQUlDLGdFQUFZLENBQUM7WUFDakRKLE9BQU8sRUFBR0gsZ0VBQUksQ0FBQ0MsVUFBVSxDQUFDLDRCQUE0QixFQUFFZ0MsU0FBUyxDQUFDO1lBQ2xFeEIsSUFBSSxFQUFHRixnRUFBWSxDQUFDRyxXQUFXO1lBQy9CRixNQUFNLEVBQUc7VUFDYixDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTTtNQUNIekIsT0FBTyxDQUFDcUIsT0FBTyxDQUFDQyxJQUFJLENBQUN0QixPQUFPLENBQUN1QixLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQ1AsZ0VBQUksQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztNQUNoRztJQUNKO0lBRUFsQixPQUFPLENBQUNtRCxTQUFTLENBQUM3QixJQUFJLENBQUN0QixPQUFPLENBQUN1QixLQUFLLEVBQUVsQixJQUFJLENBQUM7RUFDL0M7QUFDSixDQUFDO0FBRWNQLGtGQUFtQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL0FsdGlSZXNwb25zZUZhY3RvcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgcG91ciBnw6luw6lyZXIgdW5lIHJlcG9uc2UgSlNPTiDDoCBwYXJ0aXIgZCd1biBYTUwgb3UgZCd1biBKU09OXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEFsdGlSZXNwb25zZUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5SZXNwb25zZS5BbHRpUmVzcG9uc2VGYWN0b3J5XG4gKi9cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IE1SZXMgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IFhNTCBmcm9tIFwiLi4vLi4vLi4vRm9ybWF0cy9YTUxcIjtcbmltcG9ydCBBbHRpUmVzcG9uc2VSZWFkZXIgZnJvbSBcIi4uL0Zvcm1hdHMvQWx0aVJlc3BvbnNlUmVhZGVyXCI7XG5pbXBvcnQgQWx0aVJlc3BvbnNlIGZyb20gXCIuL21vZGVsL0FsdGlSZXNwb25zZVwiO1xuaW1wb3J0IEVsZXZhdGlvbiBmcm9tIFwiLi9tb2RlbC9FbGV2YXRpb25cIjtcblxudmFyIEFsdGlSZXNwb25zZUZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBBbHRpXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICogICAgICByZXNwb25zZSA6XG4gICAgICogICAgICBvdXRwdXRGb3JtYXQgOlxuICAgICAqICAgICAgcmF3UmVzcG9uc2UgOlxuICAgICAqICAgICAgc2NvcGUgOlxuICAgICAqICAgICAgb25TdWNjZXNzIDpcbiAgICAgKiAgICAgIG9uRXJyb3IgOlxuICAgICAqICAgfTtcbiAgICAgKlxuICAgICAqL1xuICAgIGJ1aWxkIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbG9nZ2VyXG4gICAgICAgIHZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiQWx0aVJlc3BvbnNlRmFjdG9yeVwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFtcIkFsdGlSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDogcmF3XCIpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMub3V0cHV0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ4bWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiB4bWxcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgWE1MKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyIDogQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRYTUxTdHJpbmcob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRYTUxEb2Mob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHAucGFyc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05fMlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05cIiwgbWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDoganNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiBcIiwgdHlwZW9mIG9wdGlvbnMucmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgSlNPTlJlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXNwb25zZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05SZXNwb25zZSA9IEpTT04ucGFyc2Uob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05SZXNwb25zZSA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlIHNlcnZpY2UgcmVudm9pZSB0IGlsIHVuZSBlcnJldXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05SZXNwb25zZSAmJiBKU09OUmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleC4ge1wiZXJyb3JcIjoge1wiY29kZVwiOiBcIkJBRF9QQVJBTUVURVJcIixcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHZhbHVlcyAoKSBjYW5ub3QgYmUgcGFyc2VkIGFzIGEgdmFsaWQgbG9uZ2l0dWRlIChkb3VibGUgdmFsdWUgc3VjaCBhcyAtMTgwIDwgbGF0IDwgMTgwKS5cIn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBKU09OUmVzcG9uc2UuZXJyb3IuZGVzY3JpcHRpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmFseXNlIGRlIGxhIHJlcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxldmF0aW9ucyA9IEpTT05SZXNwb25zZS5lbGV2YXRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHRpUmVzcG9uc2UgPSBuZXcgQWx0aVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZXZhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGV2YXRpb25zKSAmJiBlbGV2YXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXZhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbiA9IG5ldyBFbGV2YXRpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGV2YXRpb25zW2ldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxldmF0aW9uc1tpXSBlc3QgdW4gb2JqZXQgZWxldmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ubG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi5sb24gPSBlbGV2YXRpb25zW2ldLmxvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ubGF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi5sYXQgPSBlbGV2YXRpb25zW2ldLmxhdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ueikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb24ueiA9IGVsZXZhdGlvbnNbaV0uejtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0uYWNjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi5hY2MgPSBlbGV2YXRpb25zW2ldLmFjYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ubWVhc3VyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uLm1lYXN1cmVzID0gZWxldmF0aW9uc1tpXS5tZWFzdXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGV2YXRpb25zW2ldID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxldmF0aW9uc1tpXSBlc3QgdW4gbm9tYnJlLCBkYW5zIGxlIGNhcyBkZSB6b25seT10cnVlIG5vdGFtbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi56ID0gZWxldmF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWx0aVJlc3BvbnNlLmVsZXZhdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0aVJlc3BvbnNlLmVsZXZhdGlvbnMucHVzaChlbGV2YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbHRpUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9BTkFMWVNFXzJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9VTktFUlIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfMlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogRXJyb3JTZXJ2aWNlLlRZUEVfVU5LRVJSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2kgbGEgcsOpcG9uc2UgY29udGVuYWl0IHVuZSBleGNlcHRpb24gcmVudm95w6llIHBhciBsZSBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXhjZXB0aW9uUmVwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRVhDRVBUSU9OXCIsIGRhdGEuZXhjZXB0aW9uUmVwb3J0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiAyMDBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlcnJvck1lc3MgPSBkYXRhLmVycm9yLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBlcnJvck1lc3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IDIwMFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMub25TdWNjZXNzLmNhbGwob3B0aW9ucy5zY29wZSwgZGF0YSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlc3BvbnNlRmFjdG9yeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/AltiResponseFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Response/model/AltiResponse.js": -/*!**********************************************************!*\ - !*** ./src/Services/Alti/Response/model/AltiResponse.js ***! - \**********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Array.} elevations - Elevations array.\n *\n * @namespace\n * @alias Gp.Services.AltiResponse\n */\nfunction AltiResponse() {\n if (!(this instanceof AltiResponse)) {\n throw new TypeError(\"AltiResponse constructor cannot be called as a function.\");\n }\n this.elevations = [];\n}\nAltiResponse.prototype = {\n constructor: AltiResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0FsdGlSZXNwb25zZS5qcz8yYmM1Il0sIm5hbWVzIjpbIkFsdGlSZXNwb25zZSIsIlR5cGVFcnJvciIsImVsZXZhdGlvbnMiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsWUFBWUEsQ0FBQSxFQUFJO0VBQ3JCLElBQUksRUFBRSxJQUFJLFlBQVlBLFlBQVksQ0FBQyxFQUFFO0lBQ2pDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLDBEQUEwRCxDQUFDO0VBQ25GO0VBRUEsSUFBSSxDQUFDQyxVQUFVLEdBQUcsRUFBRTtBQUN4QjtBQUVBRixZQUFZLENBQUNHLFNBQVMsR0FBRztFQUVyQkMsV0FBVyxFQUFHSjtBQUVsQixDQUFDO0FBRWNBLDJFQUFZIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVzcG9uc2UvbW9kZWwvQWx0aVJlc3BvbnNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNwb25zZSBvYmplY3QgZm9yIHtAbGluayBtb2R1bGU6U2VydmljZXN+Z2V0QWx0aXR1ZGUgR3AuU2VydmljZXMuZ2V0QWx0aXR1ZGUgKCl9IGludm9jYXRpb24gd2hlbiBzdWNjZXNzZnVsLiBSZWNlaXZlZCBhcyB0aGUgYXJndW1lbnQgb2Ygb25TdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7QXJyYXkuPEdwLlNlcnZpY2VzLkFsdGkuRWxldmF0aW9uPn0gZWxldmF0aW9ucyAtIEVsZXZhdGlvbnMgYXJyYXkuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGlSZXNwb25zZVxuICovXG5mdW5jdGlvbiBBbHRpUmVzcG9uc2UgKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBbHRpUmVzcG9uc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBbHRpUmVzcG9uc2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZXZhdGlvbnMgPSBbXTtcbn1cblxuQWx0aVJlc3BvbnNlLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yIDogQWx0aVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsdGlSZXNwb25zZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/model/AltiResponse.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Response/model/Elevation.js": -/*!*******************************************************!*\ - !*** ./src/Services/Alti/Response/model/Elevation.js ***! - \*******************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if \"zonly\" parameter wasn't set to true.\n *\n * @property {Float} lat - Point latitude. (only if zonly=false)\n * @property {Float} lon - Point longitude. (only if zonly=false)\n * @property {Float} z - Point elevation.\n * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false)\n *\n * @namespace\n * @alias Gp.Services.Alti.Elevation\n */\nfunction Elevation() {\n if (!(this instanceof Elevation)) {\n throw new TypeError(\"Elevation constructor cannot be called as a function.\");\n }\n this.z = null;\n}\nElevation.prototype = {\n constructor: Elevation\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Elevation);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0VsZXZhdGlvbi5qcz82NTZhIl0sIm5hbWVzIjpbIkVsZXZhdGlvbiIsIlR5cGVFcnJvciIsInoiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsU0FBU0EsQ0FBQSxFQUFJO0VBQ2xCLElBQUksRUFBRSxJQUFJLFlBQVlBLFNBQVMsQ0FBQyxFQUFFO0lBQzlCLE1BQU0sSUFBSUMsU0FBUyxDQUFDLHVEQUF1RCxDQUFDO0VBQ2hGO0VBRUEsSUFBSSxDQUFDQyxDQUFDLEdBQUcsSUFBSTtBQUNqQjtBQUVBRixTQUFTLENBQUNHLFNBQVMsR0FBRztFQUVsQkMsV0FBVyxFQUFHSjtBQUVsQixDQUFDO0FBRWNBLHdFQUFTIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVzcG9uc2UvbW9kZWwvRWxldmF0aW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIFNpbmdsZSBlbGV2YXRpb24gb2JqZWN0IHJldHVybmVkIGJ5IHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIENvbnRhaW5zIGF0IGxlYXN0LCBvbmUgZWxldmF0aW9uICh6KS4gTWF5IGFsc28gY29udGFpbiBwb2ludCBjb29yZGluYXRlcyBhbmQgZWxldmF0aW9uIGFjY3VyYWN5IGlmIFwiem9ubHlcIiBwYXJhbWV0ZXIgd2Fzbid0IHNldCB0byB0cnVlLlxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGxhdCAtIFBvaW50IGxhdGl0dWRlLiAob25seSBpZiB6b25seT1mYWxzZSlcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGxvbiAtIFBvaW50IGxvbmdpdHVkZS4gKG9ubHkgaWYgem9ubHk9ZmFsc2UpXG4gKiBAcHJvcGVydHkge0Zsb2F0fSB6IC0gUG9pbnQgZWxldmF0aW9uLlxuICogQHByb3BlcnR5IHtGbG9hdH0gYWNjIC0gQWNjdXJhY3kgb2YgZWxldmF0aW9uIGZvciB0aGlzIHBvaW50LiAob25seSBpZiB6b25seT1mYWxzZSlcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5FbGV2YXRpb25cbiAqL1xuZnVuY3Rpb24gRWxldmF0aW9uICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRWxldmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRWxldmF0aW9uIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy56ID0gbnVsbDtcbn1cblxuRWxldmF0aW9uLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yIDogRWxldmF0aW9uXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVsZXZhdGlvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/model/Elevation.js\n"); - -/***/ }), - -/***/ "./src/Services/Alti/Response/model/Measure.js": -/*!*****************************************************!*\ - !*** ./src/Services/Alti/Response/model/Measure.js ***! - \*****************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single measure object returned by underlying web service if measures = true and zonly = false\n *\n * @property {String} source_name - Name of the source\n * @property {String} source_measure - Name of the measure\n * @property {Float} z - Point elevation.\n * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false)\n *\n * @namespace\n * @alias Gp.Services.Alti.Measure\n */\nfunction Measure() {\n if (!(this instanceof Measure)) {\n throw new TypeError(\"Measure constructor cannot be called as a function.\");\n }\n this.source_name = null;\n this.source_measure = null;\n this.z = null;\n this.acc = null;\n}\nMeasure.prototype = {\n constructor: Measure\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Measure);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL01lYXN1cmUuanM/ZTNiMSJdLCJuYW1lcyI6WyJNZWFzdXJlIiwiVHlwZUVycm9yIiwic291cmNlX25hbWUiLCJzb3VyY2VfbWVhc3VyZSIsInoiLCJhY2MiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsT0FBT0EsQ0FBQSxFQUFJO0VBQ2hCLElBQUksRUFBRSxJQUFJLFlBQVlBLE9BQU8sQ0FBQyxFQUFFO0lBQzVCLE1BQU0sSUFBSUMsU0FBUyxDQUFDLHFEQUFxRCxDQUFDO0VBQzlFO0VBRUEsSUFBSSxDQUFDQyxXQUFXLEdBQUcsSUFBSTtFQUN2QixJQUFJLENBQUNDLGNBQWMsR0FBRyxJQUFJO0VBQzFCLElBQUksQ0FBQ0MsQ0FBQyxHQUFHLElBQUk7RUFDYixJQUFJLENBQUNDLEdBQUcsR0FBRyxJQUFJO0FBQ25CO0FBRUFMLE9BQU8sQ0FBQ00sU0FBUyxHQUFHO0VBRWhCQyxXQUFXLEVBQUdQO0FBRWxCLENBQUM7QUFFY0Esc0VBQU8iLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXNwb25zZS9tb2RlbC9NZWFzdXJlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIFNpbmdsZSBtZWFzdXJlIG9iamVjdCByZXR1cm5lZCBieSB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGlmIG1lYXN1cmVzID0gdHJ1ZSBhbmQgem9ubHkgPSBmYWxzZVxuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzb3VyY2VfbmFtZSAtIE5hbWUgb2YgdGhlIHNvdXJjZVxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNvdXJjZV9tZWFzdXJlIC0gTmFtZSBvZiB0aGUgbWVhc3VyZVxuICogQHByb3BlcnR5IHtGbG9hdH0geiAtIFBvaW50IGVsZXZhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGFjYyAtIEFjY3VyYWN5IG9mIGVsZXZhdGlvbiBmb3IgdGhpcyBwb2ludC4gKG9ubHkgaWYgem9ubHk9ZmFsc2UpXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGkuTWVhc3VyZVxuICovXG5mdW5jdGlvbiBNZWFzdXJlICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWVhc3VyZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lYXN1cmUgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvdXJjZV9uYW1lID0gbnVsbDtcbiAgICB0aGlzLnNvdXJjZV9tZWFzdXJlID0gbnVsbDtcbiAgICB0aGlzLnogPSBudWxsO1xuICAgIHRoaXMuYWNjID0gbnVsbDtcbn1cblxuTWVhc3VyZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IE1lYXN1cmVcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVhc3VyZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/model/Measure.js\n"); - -/***/ }), - -/***/ "./src/Services/AutoComplete/AutoComplete.js": -/*!***************************************************!*\ - !*** ./src/Services/AutoComplete/AutoComplete.js ***! - \***************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Response/AutoCompleteResponseFactory */ \"./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js\");\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service d'autocomplétion du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.AutoComplete\n *\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String} options.text - La chaîne de caractère à compléter.\n * Cette chaîne n'est pas \"URL encodée\".\n * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête.\n *\n * @param {Array.} [options.type = [\"StreetAddress\"]] - Type de l'objet recherché.\n * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'.\n * D'autres types pourront être rajoutés selon l'évolution du service.\n * Par défaut, type = ['StreetAddress'].\n *\n * @param {String} [options.territory] - Limitation de la zone de recherche de localisants.\n * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE',\n * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31'\n * Pas de valeur par défaut.\n * La valeur par défaut est donc celle du service.\n * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié.\n *\n * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir.\n * Pas de valeur par défaut.\n * La valeur par défaut sera donc celle du service : 10.\n *\n * @example\n * var options = {\n * // options communes aux services\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * text : \"\",\n * type : \"StreetAddress\",\n * territory : 'METROPOLE',\n * maximumResponses : 10\n * };\n */\nfunction AutoComplete(options_) {\n if (!(this instanceof AutoComplete)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"AutoComplete\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"AutoComplete\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"Gp.Services.AutoComplete\");\n this.logger.trace(\"[Constructeur AutoComplete (options)]\");\n var options = this.patchOptionConvertor(options_);\n if (!options.serverUrl) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__[\"default\"].AutoComplete.newUrl();\n if (options.oldAutocompleteService) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__[\"default\"].AutoComplete.url();\n }\n }\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].apply(this, arguments);\n if (!options.text) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"PARAM_MISSING\", \"text\"));\n }\n\n // ajout des options spécifiques au service\n this.options.text = options.text;\n\n // on definit des parametres par defaut\n if (!options.type) {\n options.type = [\"StreetAddress,PositionOfInterest\"];\n }\n this.options.type = options.type;\n this.options.territory = options.territory || \"\";\n this.options.maximumResponses = options.maximumResponses || 10;\n\n // INFO\n // le service ne repond pas en mode POST (405 Method Not Allowed)\n if (this.options.protocol === \"XHR\" && this.options.httpMethod === \"POST\") {\n this.logger.warn(\"Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !\");\n this.options.httpMethod = \"GET\"; // on surcharge !\n }\n\n // attributs d'instances\n\n /**\n * Format forcé de la réponse du service : \"json\"\n * sauf si l'on souhaite une reponse brute (options.rawResponse)\n */\n this.options.outputFormat = this.options.rawResponse ? \"\" : \"json\";\n}\n\n/**\n * @lends module:AutoComplete#\n */\n\nAutoComplete.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nAutoComplete.prototype.constructor = AutoComplete;\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} options_ - options du service\n * @return {Object} - options\n */\nAutoComplete.prototype.patchOptionConvertor = function (options_) {\n var options = options_;\n if (options.filterOptions) {\n this.logger.warn(\"The parameter 'filterOptions' is deprecated\");\n if (options.filterOptions.type) {\n this.logger.warn(\"The parameter 'filterOptions.type' is deprecated\");\n if (!options.type) {\n options.type = options.filterOptions.type;\n }\n }\n if (options.filterOptions.territory) {\n this.logger.warn(\"The parameter 'filterOptions.territory' is deprecated\");\n if (!options.terr) {\n options.terr = options.filterOptions.territory;\n }\n }\n delete options.filterOptions;\n }\n return options;\n};\n\n/**\n * (overwrite)\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nAutoComplete.prototype.buildRequest = function (error, success) {\n // ex.\n // http://wxs.ign.fr/CLEF/ols/apis/completion?\n // text=Brie-Comt&\n // type=StreetAddress,PositionOfInterest&\n // territory=METROPOLE&\n // maximumResponses=10\n\n // traitement des param KPV sous forme de tableau\n var territory = \"\";\n if (this.options.territory) {\n territory = this.options.territory;\n }\n var type = \"\";\n if (this.options.type) {\n type = this.options.type.join(\",\");\n }\n\n // normalisation de la requete avec param KPV\n this.request = _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__[\"default\"].normalyzeParameters({\n text: encodeURIComponent(this.options.text),\n type: type,\n terr: territory,\n maximumResponses: this.options.maximumResponses\n });\n !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"))) : success.call(this, this.request);\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback de succès de l'analyse de la réponse\n */\nAutoComplete.prototype.analyzeResponse = function (error, success) {\n if (this.response) {\n var options = {\n response: this.response,\n rawResponse: this.options.rawResponse,\n onSuccess: success,\n onError: error,\n scope: this\n };\n _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AutoComplete);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvQXV0b0NvbXBsZXRlLmpzP2YyN2UiXSwibmFtZXMiOlsiQXV0b0NvbXBsZXRlIiwib3B0aW9uc18iLCJUeXBlRXJyb3IiLCJNUiIsImdldE1lc3NhZ2UiLCJDTEFTU05BTUUiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsIm9wdGlvbnMiLCJwYXRjaE9wdGlvbkNvbnZlcnRvciIsInNlcnZlclVybCIsIkRlZmF1bHRVcmxTZXJ2aWNlIiwibmV3VXJsIiwib2xkQXV0b2NvbXBsZXRlU2VydmljZSIsInVybCIsIkNvbW1vblNlcnZpY2UiLCJhcHBseSIsImFyZ3VtZW50cyIsInRleHQiLCJFcnJvciIsInR5cGUiLCJ0ZXJyaXRvcnkiLCJtYXhpbXVtUmVzcG9uc2VzIiwicHJvdG9jb2wiLCJodHRwTWV0aG9kIiwid2FybiIsIm91dHB1dEZvcm1hdCIsInJhd1Jlc3BvbnNlIiwicHJvdG90eXBlIiwiT2JqZWN0IiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJmaWx0ZXJPcHRpb25zIiwidGVyciIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsImpvaW4iLCJyZXF1ZXN0IiwiSGVscGVyIiwibm9ybWFseXplUGFyYW1ldGVycyIsImVuY29kZVVSSUNvbXBvbmVudCIsImNhbGwiLCJFcnJvclNlcnZpY2UiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsIm9uU3VjY2VzcyIsIm9uRXJyb3IiLCJzY29wZSIsIkF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeSIsImJ1aWxkIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDO0FBQ1E7QUFDNEI7QUFDaEM7QUFDRjtBQUNQO0FBQ2lCOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNuQlcsT0FBTyxFQUFHWixLQUFLO01BQ2ZhLEtBQUssRUFBRztJQUNaLENBQUM7SUFFREMsNkVBQTJCLENBQUNDLEtBQUssQ0FBQzFDLE9BQU8sQ0FBQztFQUM5QyxDQUFDLE1BQU07SUFDSDJCLEtBQUssQ0FBQ08sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJQyxnRUFBWSxDQUFDMUMsZ0VBQUUsQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztFQUMvRTtBQUNKLENBQUM7QUFFY0osMkVBQVkiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQXV0b0NvbXBsZXRlL0F1dG9Db21wbGV0ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb21tb25TZXJ2aWNlIGZyb20gXCIuLi9Db21tb25TZXJ2aWNlXCI7XG5pbXBvcnQgRGVmYXVsdFVybFNlcnZpY2UgZnJvbSBcIi4uL0RlZmF1bHRVcmxTZXJ2aWNlXCI7XG5pbXBvcnQgQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5IGZyb20gXCIuL1Jlc3BvbnNlL0F1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeVwiO1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgTVIgZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgSGVscGVyIGZyb20gXCIuLi8uLi9VdGlscy9IZWxwZXJcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQXBwZWwgZHUgc2VydmljZSBkJ2F1dG9jb21wbMOpdGlvbiBkdSBHw6lvcG9ydGFpbCA6XG4gKiBlbnZvaSBkZSBsYSByZXF1w6p0ZSBjb25zdHJ1aXRlIHNlbG9uIGxlcyBwYXJhbcOodHJlcyBlbiBvcHRpb25zLFxuICogw6l2ZW50dWVsbGVtZW50IHBhcnNpbmcgZXQgYW5hbHlzZSAgZGUgbGEgcsOpcG9uc2UsXG4gKiByZXRvdXIgZCd1bmUgcsOpcG9uc2UgZW4gcGFyYW3DqHRyZSBkZSBsYSBmb25jdGlvbiBvblN1Y2Nlc3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtHcC5TZXJ2aWNlcy5Db21tb25TZXJ2aWNlfVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBzcMOpY2lmaXF1ZXMgYXUgc2VydmljZSAoKyBsZXMgb3B0aW9ucyBoZXJpdMOpZXMpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGV4dCAtIExhIGNoYcOubmUgZGUgY2FyYWN0w6hyZSDDoCBjb21wbMOpdGVyLlxuICogICAgICBDZXR0ZSBjaGHDrm5lIG4nZXN0IHBhcyBcIlVSTCBlbmNvZMOpZVwiLlxuICogICAgICBDJ2VzdCBsJ0FQSSBxdWkgcydvY2N1cGUgZGUgbCdlbmNvZGVyIHBvdXIgbCdpbmNsdXJlIGRhbnMgbGEgcmVxdcOqdGUuXG4gKlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMudHlwZSA9IFtcIlN0cmVldEFkZHJlc3NcIl1dIC0gVHlwZSBkZSBsJ29iamV0IHJlY2hlcmNow6kuXG4gKiAgICAgIExlIHNlcnZpY2UgZCdhdXRvY29tcGzDqXRpb24gZHUgR8Opb3BvcnRhaWwgcGVybWV0IGRlIHJlY2hlcmNoZXIgZGVzIHRvcG9ueW1lcyAnUG9zaXRpb25PZkludGVyZXN0JyBldC9vdSBkZXMgYWRyZXNzZXMgcG9zdGFsZXMgJ1N0cmVldEFkZHJlc3MnLlxuICogICAgICBEJ2F1dHJlcyB0eXBlcyBwb3Vycm9udCDDqnRyZSByYWpvdXTDqXMgc2Vsb24gbCfDqXZvbHV0aW9uIGR1IHNlcnZpY2UuXG4gKiAgICAgIFBhciBkw6lmYXV0LCB0eXBlID0gWydTdHJlZXRBZGRyZXNzJ10uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRlcnJpdG9yeV0gLSBMaW1pdGF0aW9uIGRlIGxhIHpvbmUgZGUgcmVjaGVyY2hlIGRlIGxvY2FsaXNhbnRzLlxuICogICAgICBMZSBzZXJ2aWNlIGQnYXV0b2NvbXBsw6l0aW9uIGR1IEfDqW9wb3J0YWlsIHBlcm1ldCBkZSBsaW1pdGVyIGxhIHJlY2hlcmNoZSDDoCBsYSBtw6l0cm9wb2xlIGV0IGxhIENvcnNlIDogb3B0aW9ucy50ZXJyaXRvcnkgPSAnTUVUUk9QT0xFJyxcbiAqICAgICAgRE9NUyBUT01TIDogb3B0aW9ucy50ZXJyaXRvcnkgPSAnRE9NVE9NJywgb3Ugw6AgdW4gZMOpcGFydGVtZW50IDogb3B0aW9ucy50ZXJyaXRvcnkgPSAnMzEnXG4gKiAgICAgIFBhcyBkZSB2YWxldXIgcGFyIGTDqWZhdXQuXG4gKiAgICAgIExhIHZhbGV1ciBwYXIgZMOpZmF1dCBlc3QgZG9uYyBjZWxsZSBkdSBzZXJ2aWNlLlxuICogICAgICBMZSBzZXJ2aWNlIGQnYXV0b2NvbXBsw6l0aW9uIGR1IEfDqW9wb3J0YWlsIHJlbnZvaWUgdG91dGVzIGxlcyBpbmZvcm1hdGlvbnMgcXVhbmQgYXVjdW4gdGVycml0b2lyZSBuJ2VzdCBzcMOpY2lmacOpLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzID0gMTBdIC0gTm9tYnJlIGRlIHLDqXBvbnNlcyBtYXhpbWFsIHF1ZSBsJ29uIHNvdWhhaXRlIHJlY2V2b2lyLlxuICogICAgICBQYXMgZGUgdmFsZXVyIHBhciBkw6lmYXV0LlxuICogICAgICBMYSB2YWxldXIgcGFyIGTDqWZhdXQgc2VyYSBkb25jIGNlbGxlIGR1IHNlcnZpY2UgOiAxMC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgb3B0aW9ucyA9IHtcbiAqICAgICAgLy8gb3B0aW9ucyBjb21tdW5lcyBhdXggc2VydmljZXNcbiAqICAgICAgYXBpS2V5IDogbnVsbCxcbiAqICAgICAgc2VydmVyVXJsIDogJ2h0dHA6Ly9sb2NhbGhvc3Qvc2VydmljZS8nLFxuICogICAgICBwcm90b2NvbCA6ICdKU09OUCcsIC8vIEpTT05QfFhIUlxuICogICAgICBwcm94eVVSTCA6IG51bGwsXG4gKiAgICAgIGh0dHBNZXRob2QgOiAnR0VUJywgLy8gR0VUfFBPU1RcbiAqICAgICAgdGltZU91dCA6IDEwMDAwLCAvLyBtc1xuICogICAgICByYXdSZXNwb25zZSA6IGZhbHNlLCAvLyB0cnVlfGZhbHNlXG4gKiAgICAgIHNjb3BlIDogbnVsbCwgLy8gdGhpc1xuICogICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHt9LFxuICogICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHt9LFxuICogICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlXG4gKiAgICAgIHRleHQgOiBcIlwiLFxuICogICAgICB0eXBlIDogXCJTdHJlZXRBZGRyZXNzXCIsXG4gKiAgICAgIHRlcnJpdG9yeSA6ICdNRVRST1BPTEUnLFxuICogICAgICBtYXhpbXVtUmVzcG9uc2VzIDogMTBcbiAqICAgfTtcbiAqL1xuZnVuY3Rpb24gQXV0b0NvbXBsZXRlIChvcHRpb25zXykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoTVIuZ2V0TWVzc2FnZShcIkNMQVNTX0NPTlNUUlVDVE9SXCIsIFwiQXV0b0NvbXBsZXRlXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKiBGSVhNRSBpbnN0YW5jZSBvdSBjbGFzc2UgP1xuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJBdXRvQ29tcGxldGVcIjtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkdwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZVwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgQXV0b0NvbXBsZXRlIChvcHRpb25zKV1cIik7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMucGF0Y2hPcHRpb25Db252ZXJ0b3Iob3B0aW9uc18pO1xuXG4gICAgaWYgKCFvcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgICBvcHRpb25zLnNlcnZlclVybCA9IERlZmF1bHRVcmxTZXJ2aWNlLkF1dG9Db21wbGV0ZS5uZXdVcmwoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub2xkQXV0b2NvbXBsZXRlU2VydmljZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zZXJ2ZXJVcmwgPSBEZWZhdWx0VXJsU2VydmljZS5BdXRvQ29tcGxldGUudXJsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBlbCBkdSBjb25zdHJ1Y3RldXIgcGFyIGhlcml0YWdlXG4gICAgQ29tbW9uU2VydmljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKCFvcHRpb25zLnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKE1SLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwidGV4dFwiKSk7XG4gICAgfVxuXG4gICAgLy8gYWpvdXQgZGVzIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2VcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dDtcblxuICAgIC8vIG9uIGRlZmluaXQgZGVzIHBhcmFtZXRyZXMgcGFyIGRlZmF1dFxuICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFtcIlN0cmVldEFkZHJlc3MsUG9zaXRpb25PZkludGVyZXN0XCJdO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgIHRoaXMub3B0aW9ucy50ZXJyaXRvcnkgPSBvcHRpb25zLnRlcnJpdG9yeSB8fCBcIlwiO1xuICAgIHRoaXMub3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzID0gb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzIHx8IDEwO1xuXG4gICAgLy8gSU5GT1xuICAgIC8vIGxlIHNlcnZpY2UgbmUgcmVwb25kIHBhcyBlbiBtb2RlIFBPU1QgKDQwNSBNZXRob2QgTm90IEFsbG93ZWQpXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcm90b2NvbCA9PT0gXCJYSFJcIiAmJiB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkxlIHNlcnZpY2UgbmUgZ8OpcmUgcGFzIGxlIG1vZGUgZCdpbnRlcnJvZ2F0aW9uIGVuIFBPU1QsIG9uIGJhc2N1bGUgc3VyIGR1IEdFVCAhXCIpO1xuICAgICAgICB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9IFwiR0VUXCI7IC8vIG9uIHN1cmNoYXJnZSAhXG4gICAgfVxuXG4gICAgLy8gYXR0cmlidXRzIGQnaW5zdGFuY2VzXG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgZm9yY8OpIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBcImpzb25cIlxuICAgICAqIHNhdWYgc2kgbCdvbiBzb3VoYWl0ZSB1bmUgcmVwb25zZSBicnV0ZSAob3B0aW9ucy5yYXdSZXNwb25zZSlcbiAgICAgKi9cbiAgICB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0ID0gKHRoaXMub3B0aW9ucy5yYXdSZXNwb25zZSkgPyBcIlwiIDogXCJqc29uXCI7XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpBdXRvQ29tcGxldGUjXG4gKi9cblxuQXV0b0NvbXBsZXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5BdXRvQ29tcGxldGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXV0b0NvbXBsZXRlO1xuXG4vKipcbiAqIFBhdGNoIHBvdXIgbGEgY29udmVydGlvbiBkZXMgb3B0aW9ucyB2ZXJzIGxlIG5vdXZlYXUgZm9ybWFsaXNtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc18gLSBvcHRpb25zIGR1IHNlcnZpY2VcbiAqIEByZXR1cm4ge09iamVjdH0gLSBvcHRpb25zXG4gKi9cbkF1dG9Db21wbGV0ZS5wcm90b3R5cGUucGF0Y2hPcHRpb25Db252ZXJ0b3IgPSBmdW5jdGlvbiAob3B0aW9uc18pIHtcbiAgICBjb25zdCBvcHRpb25zID0gb3B0aW9uc187XG5cbiAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zJyBpcyBkZXByZWNhdGVkXCIpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudHlwZScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gb3B0aW9ucy5maWx0ZXJPcHRpb25zLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zLnRlcnJpdG9yeSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudGVycml0b3J5JyBpcyBkZXByZWNhdGVkXCIpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnRlcnIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlcnIgPSBvcHRpb25zLmZpbHRlck9wdGlvbnMudGVycml0b3J5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cbkF1dG9Db21wbGV0ZS5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gZXguXG4gICAgLy8gaHR0cDovL3d4cy5pZ24uZnIvQ0xFRi9vbHMvYXBpcy9jb21wbGV0aW9uP1xuICAgIC8vIHRleHQ9QnJpZS1Db210JlxuICAgIC8vIHR5cGU9U3RyZWV0QWRkcmVzcyxQb3NpdGlvbk9mSW50ZXJlc3QmXG4gICAgLy8gdGVycml0b3J5PU1FVFJPUE9MRSZcbiAgICAvLyBtYXhpbXVtUmVzcG9uc2VzPTEwXG5cbiAgICAvLyB0cmFpdGVtZW50IGRlcyBwYXJhbSBLUFYgc291cyBmb3JtZSBkZSB0YWJsZWF1XG4gICAgdmFyIHRlcnJpdG9yeSA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50ZXJyaXRvcnkpIHtcbiAgICAgICAgdGVycml0b3J5ID0gdGhpcy5vcHRpb25zLnRlcnJpdG9yeTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgIHR5cGUgPSB0aGlzLm9wdGlvbnMudHlwZS5qb2luKFwiLFwiKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2F0aW9uIGRlIGxhIHJlcXVldGUgYXZlYyBwYXJhbSBLUFZcbiAgICB0aGlzLnJlcXVlc3QgPSBIZWxwZXIubm9ybWFseXplUGFyYW1ldGVycyh7XG4gICAgICAgIHRleHQgOiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5vcHRpb25zLnRleHQpLFxuICAgICAgICB0eXBlIDogdHlwZSxcbiAgICAgICAgdGVyciA6IHRlcnJpdG9yeSxcbiAgICAgICAgbWF4aW11bVJlc3BvbnNlcyA6IHRoaXMub3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzXG4gICAgfSk7XG5cbiAgICAoIXRoaXMucmVxdWVzdClcbiAgICAgICAgPyBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoTVIuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVRVUVTVF9CVUlMRFwiKSkpXG4gICAgICAgIDogc3VjY2Vzcy5jYWxsKHRoaXMsIHRoaXMucmVxdWVzdCk7XG59O1xuXG4vKipcbiAqIChvdmVyd3JpdGUpXG4gKiBBbmFseXNlIGRlIGxhIHJlcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBkZSBzdWNjw6hzIGRlIGwnYW5hbHlzZSBkZSBsYSByw6lwb25zZVxuICovXG5BdXRvQ29tcGxldGUucHJvdG90eXBlLmFuYWx5emVSZXNwb25zZSA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgcmVzcG9uc2UgOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgICAgICAgcmF3UmVzcG9uc2UgOiB0aGlzLm9wdGlvbnMucmF3UmVzcG9uc2UsXG4gICAgICAgICAgICBvblN1Y2Nlc3MgOiBzdWNjZXNzLFxuICAgICAgICAgICAgb25FcnJvciA6IGVycm9yLFxuICAgICAgICAgICAgc2NvcGUgOiB0aGlzXG4gICAgICAgIH07XG5cbiAgICAgICAgQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yLmNhbGwodGhpcywgbmV3IEVycm9yU2VydmljZShNUi5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FTVBUWVwiKSkpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9Db21wbGV0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/AutoComplete.js\n"); - -/***/ }), - -/***/ "./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js": -/*!***************************************************************************!*\ - !*** ./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js ***! - \***************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/AutoCompleteResponse */ \"./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js\");\n/* harmony import */ var _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model/SuggestedLocation */ \"./src/Services/AutoComplete/Response/model/SuggestedLocation.js\");\n/**\n * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON\n * (Factory)\n *\n * @module AutoCompleteResponseFactory\n * @private\n * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory\n */\n\n\n\n\n\nvar AutoCompleteResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Alti\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AutoCompleteResponseFactory\");\n logger.trace([\"AutoCompleteResponseFactory::build()\"]);\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n var JSONResponse = null;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // analyse de la réponse\n if (JSONResponse) {\n // le service renvoie t il une erreur ?\n if (JSONResponse.error) {\n // ex. ?\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", JSONResponse.error.description),\n status: JSONResponse.error.code,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR\n }));\n return;\n }\n\n // création de l'objet réponse\n data = new _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n\n // boucle sur les résultats de l'autocomplétion\n if (JSONResponse.results && Array.isArray(JSONResponse.results)) {\n var suggestedLocation = null;\n for (var i = 0; i < JSONResponse.results.length; i++) {\n var result = JSONResponse.results[i];\n suggestedLocation = new _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n if (result) {\n if (result.country === \"StreetAddress\") {\n suggestedLocation.street = result.street;\n suggestedLocation.type = \"StreetAddress\";\n } else if (result.country === \"PositionOfInterest\") {\n suggestedLocation.poi = result.street;\n suggestedLocation.kind = result.kind;\n suggestedLocation.type = \"PositionOfInterest\";\n }\n if (suggestedLocation.position) {\n suggestedLocation.position.x = result.x;\n suggestedLocation.position.y = result.y;\n }\n suggestedLocation.commune = result.city;\n suggestedLocation.fullText = result.fulltext;\n suggestedLocation.postalCode = result.zipcode;\n suggestedLocation.classification = result.classification;\n }\n // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation\n data.suggestedLocations.push(suggestedLocation);\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_FORMAT_3\")));\n return;\n }\n if (!data.suggestedLocations.length) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_FORMAT_3\")));\n return;\n }\n }\n if (!data) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE_2\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n }\n }\n } else {\n // si la réponse (xmlString) est vide, on appelle le callback d'erreur\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n\n // si tout s'est bien passé, on appelle le callback de succès\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AutoCompleteResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvUmVzcG9uc2UvQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5LmpzPzdhZTMiXSwibmFtZXMiOlsiQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIkpTT05SZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsImVycm9yIiwib25FcnJvciIsImNhbGwiLCJzY29wZSIsIkVycm9yU2VydmljZSIsIm1lc3NhZ2UiLCJNUmVzIiwiZ2V0TWVzc2FnZSIsImRlc2NyaXB0aW9uIiwic3RhdHVzIiwiY29kZSIsInR5cGUiLCJUWVBFX1NSVkVSUiIsIkF1dG9Db21wbGV0ZVJlc3BvbnNlIiwicmVzdWx0cyIsIkFycmF5IiwiaXNBcnJheSIsInN1Z2dlc3RlZExvY2F0aW9uIiwiaSIsImxlbmd0aCIsInJlc3VsdCIsIlN1Z2dlc3RlZExvY2F0aW9uIiwiY291bnRyeSIsInN0cmVldCIsInBvaSIsImtpbmQiLCJwb3NpdGlvbiIsIngiLCJ5IiwiY29tbXVuZSIsImNpdHkiLCJmdWxsVGV4dCIsImZ1bGx0ZXh0IiwicG9zdGFsQ29kZSIsInppcGNvZGUiLCJjbGFzc2lmaWNhdGlvbiIsInN1Z2dlc3RlZExvY2F0aW9ucyIsInB1c2giLCJUWVBFX1VOS0VSUiIsImV4Y2VwdGlvblJlcG9ydCIsIm9uU3VjY2VzcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNvRDtBQUNBO0FBQ1E7QUFDSTtBQUNOO0FBRTFELElBQUlBLDJCQUEyQixHQUFHO0VBRTlCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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YixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDO1lBQ2pEQyxPQUFPLEVBQUdDLGdFQUFJLENBQUNDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRWIsSUFBSSxDQUFDNkMsZUFBZSxDQUFDO1lBQzdFNUIsSUFBSSxFQUFHUCxnRUFBWSxDQUFDUSxXQUFXO1lBQy9CSCxNQUFNLEVBQUc7VUFDYixDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTTtNQUNIO01BQ0FwQixPQUFPLENBQUNZLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDRSxnRUFBSSxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO01BQ2hHO0lBQ0o7O0lBRUE7SUFDQWxCLE9BQU8sQ0FBQ21ELFNBQVMsQ0FBQ3RDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUVULElBQUksQ0FBQztFQUMvQztBQUNKLENBQUM7QUFFY1AsMEZBQTJCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9BdXRvQ29tcGxldGVSZXNwb25zZUZhY3RvcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgcG91ciBnw6luw6lyZXIgdW5lIHJlcG9uc2UgSlNPTiDDoCBwYXJ0aXIgZCd1biBYTUwgb3UgZCd1biBKU09OXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeVxuICogQHByaXZhdGVcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGUuUmVzcG9uc2UuQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5XG4gKi9cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IE1SZXMgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IEF1dG9Db21wbGV0ZVJlc3BvbnNlIGZyb20gXCIuL21vZGVsL0F1dG9Db21wbGV0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgU3VnZ2VzdGVkTG9jYXRpb24gZnJvbSBcIi4vbW9kZWwvU3VnZ2VzdGVkTG9jYXRpb25cIjtcblxudmFyIEF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeSA9IHtcblxuICAgIC8qKlxuICAgICAqIGludGVyZmFjZSB1bmlxdWVcbiAgICAgKlxuICAgICAqIEBtZXRob2QgYnVpbGRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGRlZmluaWVzIGRhbnMgbGUgY29tcG9zYW50IEFsdGlcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6XG4gICAgICogICAgICByYXdSZXNwb25zZSA6XG4gICAgICogICAgICBzY29wZSA6XG4gICAgICogICAgICBvblN1Y2Nlc3MgOlxuICAgICAqICAgICAgb25FcnJvciA6XG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJBdXRvQ29tcGxldGVSZXNwb25zZUZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJBdXRvQ29tcGxldGVSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDogcmF3XCIpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgSlNPTlJlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgSlNPTlJlc3BvbnNlID0gSlNPTi5wYXJzZShvcHRpb25zLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBKU09OUmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFuYWx5c2UgZGUgbGEgcsOpcG9uc2VcbiAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxlIHNlcnZpY2UgcmVudm9pZSB0IGlsIHVuZSBlcnJldXIgP1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleC4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRVhDRVBUSU9OXCIsIEpTT05SZXNwb25zZS5lcnJvci5kZXNjcmlwdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogSlNPTlJlc3BvbnNlLmVycm9yLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY3LDqWF0aW9uIGRlIGwnb2JqZXQgcsOpcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBBdXRvQ29tcGxldGVSZXNwb25zZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGJvdWNsZSBzdXIgbGVzIHLDqXN1bHRhdHMgZGUgbCdhdXRvY29tcGzDqXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05SZXNwb25zZS5yZXN1bHRzICYmIEFycmF5LmlzQXJyYXkoSlNPTlJlc3BvbnNlLnJlc3VsdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VnZ2VzdGVkTG9jYXRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEpTT05SZXNwb25zZS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEpTT05SZXNwb25zZS5yZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZExvY2F0aW9uID0gbmV3IFN1Z2dlc3RlZExvY2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY291bnRyeSA9PT0gXCJTdHJlZXRBZGRyZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZExvY2F0aW9uLnN0cmVldCA9IHJlc3VsdC5zdHJlZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi50eXBlID0gXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNvdW50cnkgPT09IFwiUG9zaXRpb25PZkludGVyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZExvY2F0aW9uLnBvaSA9IHJlc3VsdC5zdHJlZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi5raW5kID0gcmVzdWx0LmtpbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi50eXBlID0gXCJQb3NpdGlvbk9mSW50ZXJlc3RcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0ZWRMb2NhdGlvbi5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24ucG9zaXRpb24ueCA9IHJlc3VsdC54O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24ucG9zaXRpb24ueSA9IHJlc3VsdC55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24uY29tbXVuZSA9IHJlc3VsdC5jaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi5mdWxsVGV4dCA9IHJlc3VsdC5mdWxsdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24ucG9zdGFsQ29kZSA9IHJlc3VsdC56aXBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi5jbGFzc2lmaWNhdGlvbiA9IHJlc3VsdC5jbGFzc2lmaWNhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXQgZHUgcsOpc3VsdGF0IGF1IHRhYmxlYXUgcmV2ZXJzZUdlb2NvZGVkTG9jYXRpb25zIGRlIGdlb2NvZGVkTG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Z2dlc3RlZExvY2F0aW9ucy5wdXNoKHN1Z2dlc3RlZExvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfM1wiKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Z2dlc3RlZExvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfM1wiKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfQU5BTFlTRV8yXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1VOS0VSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNpIGxhIHLDqXBvbnNlIGNvbnRlbmFpdCB1bmUgZXhjZXB0aW9uIHJlbnZvecOpZSBwYXIgbGUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmV4Y2VwdGlvblJlcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBkYXRhLmV4Y2VwdGlvblJlcG9ydCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogRXJyb3JTZXJ2aWNlLlRZUEVfU1JWRVJSLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogMjAwXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNpIGxhIHLDqXBvbnNlICh4bWxTdHJpbmcpIGVzdCB2aWRlLCBvbiBhcHBlbGxlIGxlIGNhbGxiYWNrIGQnZXJyZXVyXG4gICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNpIHRvdXQgcydlc3QgYmllbiBwYXNzw6ksIG9uIGFwcGVsbGUgbGUgY2FsbGJhY2sgZGUgc3VjY8Ooc1xuICAgICAgICBvcHRpb25zLm9uU3VjY2Vzcy5jYWxsKG9wdGlvbnMuc2NvcGUsIGRhdGEpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js": -/*!**************************************************************************!*\ - !*** ./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js ***! - \**************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Array.} suggestedLocations - SuggestedLocations array.\n *\n * @namespace\n * @alias Gp.Services.AutoCompleteResponse\n */\nfunction AutoCompleteResponse() {\n if (!(this instanceof AutoCompleteResponse)) {\n throw new TypeError(\"AutoCompleteResponse constructor cannot be called as a function.\");\n }\n this.suggestedLocations = [];\n}\nAutoCompleteResponse.prototype = {\n constructor: AutoCompleteResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AutoCompleteResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvUmVzcG9uc2UvbW9kZWwvQXV0b0NvbXBsZXRlUmVzcG9uc2UuanM/NjViOSJdLCJuYW1lcyI6WyJBdXRvQ29tcGxldGVSZXNwb25zZSIsIlR5cGVFcnJvciIsInN1Z2dlc3RlZExvY2F0aW9ucyIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxvQkFBb0JBLENBQUEsRUFBSTtFQUM3QixJQUFJLEVBQUUsSUFBSSxZQUFZQSxvQkFBb0IsQ0FBQyxFQUFFO0lBQ3pDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLGtFQUFrRSxDQUFDO0VBQzNGO0VBRUEsSUFBSSxDQUFDQyxrQkFBa0IsR0FBRyxFQUFFO0FBQ2hDO0FBRUFGLG9CQUFvQixDQUFDRyxTQUFTLEdBQUc7RUFFN0JDLFdBQVcsRUFBR0o7QUFFbEIsQ0FBQztBQUVjQSxtRkFBb0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQXV0b0NvbXBsZXRlL1Jlc3BvbnNlL21vZGVsL0F1dG9Db21wbGV0ZVJlc3BvbnNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNwb25zZSBvYmplY3QgZm9yIHtAbGluayBtb2R1bGU6U2VydmljZXN+YXV0b0NvbXBsZXRlIEdwLlNlcnZpY2VzLmF1dG9Db21wbGV0ZSAoKX0gaW52b2NhdGlvbiB3aGVuIHN1Y2Nlc3NmdWwuIFJlY2VpdmVkIGFzIHRoZSBhcmd1bWVudCBvZiBvblN1Y2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHByb3BlcnR5IHtBcnJheS48R3AuU2VydmljZXMuQXV0b0NvbXBsZXRlLlN1Z2dlc3RlZExvY2F0aW9uPn0gc3VnZ2VzdGVkTG9jYXRpb25zIC0gU3VnZ2VzdGVkTG9jYXRpb25zIGFycmF5LlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGVSZXNwb25zZVxuICovXG5mdW5jdGlvbiBBdXRvQ29tcGxldGVSZXNwb25zZSAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVJlc3BvbnNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXV0b0NvbXBsZXRlUmVzcG9uc2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnN1Z2dlc3RlZExvY2F0aW9ucyA9IFtdO1xufVxuXG5BdXRvQ29tcGxldGVSZXNwb25zZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IEF1dG9Db21wbGV0ZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9Db21wbGV0ZVJlc3BvbnNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js\n"); - -/***/ }), - -/***/ "./src/Services/AutoComplete/Response/model/SuggestedLocation.js": -/*!***********************************************************************!*\ - !*** ./src/Services/AutoComplete/Response/model/SuggestedLocation.js ***! - \***********************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single SuggestedLocation Object returned by underlying web service.\n * Each suggested location represents a street address (\"StreetAddress\") or a place name (\"PositionOfInterest\").\n *\n * @property {String} type - Suggested location type : \"StreetAddress\" ou \"PositionOfInterest\"\n * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system.\n * @property {String} commune - Suggested municipality\n * @property {String} fullText - Full text representation of the suggested location.\n * @property {String} postalCode - Suggested location postcode\n * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important).\n * @property {String} street - Street name of the suggested location (\"StreetAddress\" only).\n * @property {String} kind - Nature of the suggested location : \"prefecture\", \"monument\", \"commune\", ... for instance (\"PositionOfInterest\" only).\n *\n * @namespace\n * @alias Gp.Services.AutoComplete.SuggestedLocation\n */\nfunction SuggestedLocation() {\n if (!(this instanceof SuggestedLocation)) {\n throw new TypeError(\"SuggestedLocation constructor cannot be called as a function.\");\n }\n\n /* REPONSE :\n {\n \"status\" : \"OK\",\n \"results\" : [\n {\n \"country\":\"PositionOfInterest\",\n \"x\":-1.559185,\n \"y\":47.952603,\n \"city\":\"Brie\",\n \"zipcode\":\"35150\",\n \"street\":\"corbe\",\n \"kind\":\"Lieu-dit habité\",\n \"fulltext\":\"corbe, 35150 Brie\",\n \"classification\":6\n },\n {\n \"country\":\"StreetAddress\",\n \"x\":1.538295,\n \"y\":43.19646,\n \"city\":\"Brie\",\n \"zipcode\":\"09700\",\n \"street\":\"courreste\",\n \"kind\":\"\",\n \"fulltext\":\"courreste, 09700 Brie\",\n \"classification\":7\n }\n ]\n }\n */\n\n /* REPONSE EN ERREUR\n {\n status : \"ERROR\",\n results : [ ]\n }\n */\n\n /**\n * Suggested location type : \"StreetAddress\" ou \"PositionOfInterest\"\n * @type {String}\n */\n this.type = null;\n\n /**\n * Position of the suggested location given in requested coordinates system.\n * @type {Gp.Point}\n */\n this.position = {\n x: null,\n y: null\n };\n\n /**\n * Suggested municipality\n * @type {String}\n */\n this.commune = null;\n\n /**\n * Full text representation of the suggested location.\n * @type {String}\n */\n this.fullText = null;\n\n /**\n * Suggested location postcode\n * @type {Number}\n */\n this.postalCode = null;\n\n /**\n * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important).\n * @type {Integer}\n */\n this.classification = null;\n\n /**\n * Street name of the suggested location (\"StreetAddress\" only).\n * @type {String}\n */\n this.street = null;\n\n /**\n * Place name of the suggested location (\"PositionOfInterest\" only).\n * @type {String}\n */\n this.poi = null;\n\n /**\n * Nature of the suggested location : \"prefecture\", \"monument\", \"commune\", ... for instance (\"PositionOfInterest\" only).\n * @type {String}\n */\n this.kind = null;\n}\nSuggestedLocation.prototype = {\n constructor: SuggestedLocation\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SuggestedLocation);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvUmVzcG9uc2UvbW9kZWwvU3VnZ2VzdGVkTG9jYXRpb24uanM/ODM1YyJdLCJuYW1lcyI6WyJTdWdnZXN0ZWRMb2NhdGlvbiIsIlR5cGVFcnJvciIsInR5cGUiLCJwb3NpdGlvbiIsIngiLCJ5IiwiY29tbXVuZSIsImZ1bGxUZXh0IiwicG9zdGFsQ29kZSIsImNsYXNzaWZpY2F0aW9uIiwic3RyZWV0IiwicG9pIiwia2luZCIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsaUJBQWlCQSxDQUFBLEVBQUk7RUFDMUIsSUFBSSxFQUFFLElBQUksWUFBWUEsaUJBQWlCLENBQUMsRUFBRTtJQUN0QyxNQUFNLElBQUlDLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztFQUN4Rjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFSTtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUk7O0VBRWhCO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxRQUFRLEdBQUc7SUFDWkMsQ0FBQyxFQUFHLElBQUk7SUFDUkMsQ0FBQyxFQUFHO0VBQ1IsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUk7O0VBRW5CO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTs7RUFFcEI7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFJLENBQUNDLFVBQVUsR0FBRyxJQUFJOztFQUV0QjtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsY0FBYyxHQUFHLElBQUk7O0VBRTFCO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxNQUFNLEdBQUcsSUFBSTs7RUFFbEI7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFJLENBQUNDLEdBQUcsR0FBRyxJQUFJOztFQUVmO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtBQUNwQjtBQUVBWixpQkFBaUIsQ0FBQ2EsU0FBUyxHQUFHO0VBRTFCQyxXQUFXLEVBQUdkO0FBQ2xCLENBQUM7QUFFY0EsZ0ZBQWlCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9tb2RlbC9TdWdnZXN0ZWRMb2NhdGlvbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBTaW5nbGUgU3VnZ2VzdGVkTG9jYXRpb24gT2JqZWN0IHJldHVybmVkIGJ5IHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuXG4gKiBFYWNoIHN1Z2dlc3RlZCBsb2NhdGlvbiByZXByZXNlbnRzIGEgc3RyZWV0IGFkZHJlc3MgKFwiU3RyZWV0QWRkcmVzc1wiKSBvciBhIHBsYWNlIG5hbWUgKFwiUG9zaXRpb25PZkludGVyZXN0XCIpLlxuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0eXBlIC0gU3VnZ2VzdGVkIGxvY2F0aW9uIHR5cGUgOiBcIlN0cmVldEFkZHJlc3NcIiBvdSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiXG4gKiBAcHJvcGVydHkge0dwLlBvaW50fSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gZ2l2ZW4gaW4gcmVxdWVzdGVkIGNvb3JkaW5hdGVzIHN5c3RlbS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb21tdW5lIC0gU3VnZ2VzdGVkIG11bmljaXBhbGl0eVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGZ1bGxUZXh0IC0gRnVsbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcG9zdGFsQ29kZSAtIFN1Z2dlc3RlZCBsb2NhdGlvbiBwb3N0Y29kZVxuICogQHByb3BlcnR5IHtJbnRlZ2VyfSBjbGFzc2lmaWNhdGlvbiAtIE51bWJlciB1c2VkIHRvIGNsYXNzaWZ5IHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBwbGFjZSB3aGVyZSBpcyB0aGUgc3VnZ2VzdGVkIGxvY2F0aW9uIGZyb20gMSAobW9zdCBpbXBvcnRhbnQpIHRvIDcgKGxlc3MgaW1wb3J0YW50KS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzdHJlZXQgLSBTdHJlZXQgbmFtZSBvZiB0aGUgc3VnZ2VzdGVkIGxvY2F0aW9uIChcIlN0cmVldEFkZHJlc3NcIiBvbmx5KS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBraW5kIC0gTmF0dXJlIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gOiBcInByZWZlY3R1cmVcIiwgXCJtb251bWVudFwiLCBcImNvbW11bmVcIiwgLi4uIGZvciBpbnN0YW5jZSAoXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiBvbmx5KS5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlLlN1Z2dlc3RlZExvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIFN1Z2dlc3RlZExvY2F0aW9uICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU3VnZ2VzdGVkTG9jYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdWdnZXN0ZWRMb2NhdGlvbiBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8qIFJFUE9OU0UgOlxuICAgICAgICB7XG4gICAgICAgICAgIFwic3RhdHVzXCIgOiBcIk9LXCIsXG4gICAgICAgICAgIFwicmVzdWx0c1wiIDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIFwiY291bnRyeVwiOlwiUG9zaXRpb25PZkludGVyZXN0XCIsXG4gICAgICAgICAgICAgICAgIFwieFwiOi0xLjU1OTE4NSxcbiAgICAgICAgICAgICAgICAgXCJ5XCI6NDcuOTUyNjAzLFxuICAgICAgICAgICAgICAgICBcImNpdHlcIjpcIkJyaWVcIixcbiAgICAgICAgICAgICAgICAgXCJ6aXBjb2RlXCI6XCIzNTE1MFwiLFxuICAgICAgICAgICAgICAgICBcInN0cmVldFwiOlwiY29yYmVcIixcbiAgICAgICAgICAgICAgICAgXCJraW5kXCI6XCJMaWV1LWRpdCBoYWJpdMOpXCIsXG4gICAgICAgICAgICAgICAgIFwiZnVsbHRleHRcIjpcImNvcmJlLCAzNTE1MCBCcmllXCIsXG4gICAgICAgICAgICAgICAgIFwiY2xhc3NpZmljYXRpb25cIjo2XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgXCJjb3VudHJ5XCI6XCJTdHJlZXRBZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgIFwieFwiOjEuNTM4Mjk1LFxuICAgICAgICAgICAgICAgICBcInlcIjo0My4xOTY0NixcbiAgICAgICAgICAgICAgICAgXCJjaXR5XCI6XCJCcmllXCIsXG4gICAgICAgICAgICAgICAgIFwiemlwY29kZVwiOlwiMDk3MDBcIixcbiAgICAgICAgICAgICAgICAgXCJzdHJlZXRcIjpcImNvdXJyZXN0ZVwiLFxuICAgICAgICAgICAgICAgICBcImtpbmRcIjpcIlwiLFxuICAgICAgICAgICAgICAgICBcImZ1bGx0ZXh0XCI6XCJjb3VycmVzdGUsIDA5NzAwIEJyaWVcIixcbiAgICAgICAgICAgICAgICAgXCJjbGFzc2lmaWNhdGlvblwiOjdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAqL1xuXG4gICAgLyogUkVQT05TRSBFTiBFUlJFVVJcbiAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzIDogXCJFUlJPUlwiLFxuICAgICAgICAgICAgcmVzdWx0cyA6IFsgXVxuICAgICAgICB9XG4gICAgKi9cblxuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBsb2NhdGlvbiB0eXBlIDogXCJTdHJlZXRBZGRyZXNzXCIgb3UgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFBvc2l0aW9uIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gZ2l2ZW4gaW4gcmVxdWVzdGVkIGNvb3JkaW5hdGVzIHN5c3RlbS5cbiAgICAgKiBAdHlwZSB7R3AuUG9pbnR9XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICAgICAgeCA6IG51bGwsXG4gICAgICAgIHkgOiBudWxsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBtdW5pY2lwYWxpdHlcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuY29tbXVuZSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBGdWxsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1Z2dlc3RlZCBsb2NhdGlvbi5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZnVsbFRleHQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIGxvY2F0aW9uIHBvc3Rjb2RlXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBvc3RhbENvZGUgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIHVzZWQgdG8gY2xhc3NpZnkgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIHBsYWNlIHdoZXJlIGlzIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gZnJvbSAxIChtb3N0IGltcG9ydGFudCkgdG8gNyAobGVzcyBpbXBvcnRhbnQpLlxuICAgICAqIEB0eXBlIHtJbnRlZ2VyfVxuICAgICAqL1xuICAgIHRoaXMuY2xhc3NpZmljYXRpb24gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU3RyZWV0IG5hbWUgb2YgdGhlIHN1Z2dlc3RlZCBsb2NhdGlvbiAoXCJTdHJlZXRBZGRyZXNzXCIgb25seSkuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnN0cmVldCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZSBuYW1lIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gKFwiUG9zaXRpb25PZkludGVyZXN0XCIgb25seSkuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnBvaSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBOYXR1cmUgb2YgdGhlIHN1Z2dlc3RlZCBsb2NhdGlvbiA6IFwicHJlZmVjdHVyZVwiLCBcIm1vbnVtZW50XCIsIFwiY29tbXVuZVwiLCAuLi4gZm9yIGluc3RhbmNlIChcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiIG9ubHkpLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5raW5kID0gbnVsbDtcbn1cblxuU3VnZ2VzdGVkTG9jYXRpb24ucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBTdWdnZXN0ZWRMb2NhdGlvblxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VnZ2VzdGVkTG9jYXRpb247XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/Response/model/SuggestedLocation.js\n"); - -/***/ }), - -/***/ "./src/Services/CommonService.js": -/*!***************************************!*\ - !*** ./src/Services/CommonService.js ***! - \***************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Protocols/Protocol */ \"./src/Protocols/Protocol.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../package.json */ \"./package.json\");\nvar _package_json__WEBPACK_IMPORTED_MODULE_5___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../../package.json */ \"./package.json\", 1);\n\n\n\n\n\n// import DefaultUrlService from \"./DefaultUrlService\";\n// package.json (extract version)\n\n\n/**\n * @classdesc\n * Composant Service\n *\n * @constructor\n * @alias Gp.Services.CommonService\n * @param {Object} options - options communes à tous les services\n *\n * @param {String} [options.serverUrl] - URL d'accès au service. Par défaut \"https://wxs.ign.fr/calcul/geoportail/SERVICE/\".\n * Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès.\n * Si ce paramètre est renseigné alors, le paramètre par défaut est ignoré.\n *\n * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service :\n * peut valoir 'JSONP' ou 'XHR'.\n * Par défaut, c'est le protocole XHR qui sera utilisé.\n * Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR).\n *\n * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https.\n * Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS).\n * Sur un navigateur, le protocole est automatiquement extrait de l'url du site...\n * Par défaut, on utilise le protocole http (ssl=false).\n *\n * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR.\n * Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP.\n *\n * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP.\n * Par défaut, la fonction de callback portera un nom du type \"callback\"+ID, où ID est soit un identifiant unique généré à chaque requête,\n * soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix=\"_2\", la fonction sera \"callback_2 ()\".\n * Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu\n * Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'.\n *\n * @param {String} [options.httpMethod] - La méthode HTTP\n * à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'.\n * Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET.\n * Par défaut, c'est la méthode GET qui est utilisée.\n *\n * @param {String} [options.contentType] - Content-Type de la requete\n * à utiliser dans le cas d'une requête XHR en mode POST.\n * Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET.\n * Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type.\n *\n * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête).\n * Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0).\n *\n * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée.\n * (Cf. paramètre « onSuccess » pour plus de détails).\n *\n * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête\n * (code HTTP 200, sans message d'erreur).\n * Cette fonction prend en paramètre la réponse du service,\n * soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ;\n * soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ».\n *\n * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement\n * (code HTTP de retour différent de 200 ou pas de réponse).\n *\n * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse\n * Permet de modifier la réponse avant parsing et la fonction doit retourner une String.\n * Cette fonction prend en paramètre la réponse telle que renvoyée par le service\n * (cad au format json ou xml).\n * Pour le JSONP, si le paramètre \"rawResponse\" a été précisé avec la valeur \"true\",\n * la fonction prend en paramètre un Object JavaScript contenant la réponse XML.\n *\n * @example\n * var options = {\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * ssl : false,\n * proxyURL : null,\n * callbackName : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * onBeforeParse : function (rawResponse) {}\n * };\n */\nfunction CommonService(options) {\n if (!(this instanceof CommonService)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\"));\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"CommonService\");\n this.logger.trace(\"[Constructeur CommonService (options)]\");\n\n // #####################\n // récupération des options par défaut pour les paramètres optionnels\n // #####################\n\n /**\n * Options du service\n * @type {Object}\n */\n this.options = {\n // protocol : \"JSONP\",\n protocol: \"XHR\",\n ssl: true,\n proxyURL: \"\",\n // callbackName : \"\",\n callbackSuffix: null,\n httpMethod: \"GET\",\n timeOut: 0,\n rawResponse: false,\n scope: this,\n /**\n * callback par defaut pour la reponse\n * @param {Object} response - response\n * @private\n */\n onSuccess: function onSuccess(response) {\n console.log(\"onSuccess - la reponse est la suivante : \", response);\n },\n /**\n * callback par defaut pour les erreurs\n * @param {Object} error - error\n * @private\n */\n onFailure: function onFailure(error) {\n if (error.status === 200 || !error.status) {\n console.log(\"onFailure : \", error.message);\n } else {\n console.log(\"onFailure - Erreur (\", error.status, \") : \", error.message);\n }\n }\n };\n\n // et on ajoute les options en paramètre aux options par défaut\n for (var opt in options) {\n if (options.hasOwnProperty(opt)) {\n this.options[opt] = options[opt];\n }\n }\n\n // #####################\n // analyse des options\n // #####################\n\n // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée\n if (this.options.rawResponse && !this.options.onSuccess) {\n /**\n * callback par defaut pour la reponse\n * @param {Object} response - response\n * @private\n */\n this.options.onSuccess = function (response) {\n console.log(\"onSuccess - la réponse brute du service est la suivante : \", response);\n };\n }\n\n // gestion du callback onSuccess\n var bOnSuccess = !!(this.options.onSuccess !== null && typeof this.options.onSuccess === \"function\");\n if (!bOnSuccess) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_MISSING\", \"onSuccess()\"));\n }\n\n // FIXME traitement au niveau de chaque composant pour tester service WXS / GPF\n // gestion de l'url du service par defaut\n /*\n if (!this.options.serverUrl) {\n // INFO\n // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut\n // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant\n // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n DefaultUrlService.ssl = this.options.ssl;\n var urlByDefault = DefaultUrlService[this.CLASSNAME].url(\"calcul\");\n if (typeof urlByDefault === \"string\") {\n this.options.serverUrl = urlByDefault;\n } else {\n this.logger.trace(\"URL par defaut à determiner au niveau du composant...\");\n }\n }\n */\n\n // FIXME nettoyage des KVP dans l'url du service\n // if (this.options.serverUrl) {\n // // INFO\n // // si l'url est renseignée, il faut la nettoyer de tous ses KVP\n // // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait\n // // des opérations d'encapsulations des reponses légèrement farfelues ...\n // var urlsource = this.options.serverUrl;\n // var urlparts = urlsource.split(\"?\");\n // this.options.serverUrl = urlparts[0];\n // }\n\n // gestion de la methode HTTP\n this.options.httpMethod = typeof options.httpMethod === \"string\" ? options.httpMethod.toUpperCase() : \"GET\";\n switch (this.options.httpMethod) {\n case \"POST\":\n case \"GET\":\n break;\n case \"PUT\":\n case \"DELETE\":\n case \"HEAD\":\n case \"OPTIONS\":\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_NOT_SUPPORT\", \"httpMethod\"));\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_UNKNOWN\", \"httpMethod\"));\n }\n\n // gestion du protocole\n // this.options.protocol = (typeof options.protocol === \"string\" ) ? options.protocol.toUpperCase() : \"JSONP\";\n this.options.protocol = typeof options.protocol === \"string\" ? options.protocol.toUpperCase() : \"XHR\";\n switch (this.options.protocol) {\n case \"JSONP\":\n case \"XHR\":\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_UNKNOWN\", \"protocol\"));\n }\n\n // on determine l'environnement d'execution : browser ou non ?\n // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS...\n if (typeof window === \"undefined\" && this.options.protocol === \"JSONP\") {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_NOT_SUPPORT_NODEJS\", \"protocol=JSONP (instead use XHR)\"));\n }\n\n // le protocole JSONP ne fonctionne qu'en GET.\n if (this.options.protocol === \"JSONP\") {\n this.options.httpMethod = \"GET\";\n }\n\n // gestion du cache\n this.options.nocache = options.nocache || false;\n\n // #####################\n // attributs d'instances\n // #####################\n\n /**\n * Format de réponse du service\n */\n this.options.outputFormat = null;\n /**\n * Requête envoyée au service\n */\n this.request = null;\n /**\n * Reponse du service\n */\n this.response = null;\n}\n\n/**\n * @lends module:CommonService\n */\nCommonService.prototype = {\n /*\n * Constructeur (alias)\n */\n constructor: CommonService,\n /**\n * Appel du service Géoportail\n */\n call: function call() {\n /* jshint validthis : true */\n this.logger.trace(\"CommonService::call ()\");\n var context = this;\n /** fonction d'execution */\n function run() {\n this.logger.trace(\"CommonService::run ()\");\n this.buildRequest.call(context, onError, onBuildRequest);\n }\n run.call(context);\n\n // callback de fin de construction de la requête\n function onBuildRequest(result) {\n this.logger.trace(\"CommonService::onBuildRequest : \", result);\n this.callService.call(context, onError, onCallService);\n }\n\n // callback de fin d'appel au service\n function onCallService(result) {\n this.logger.trace(\"CommonService::onCallService : \", result);\n this.analyzeResponse.call(context, onError, onAnalyzeResponse);\n }\n\n // callback de fin de lecture de la reponse\n function onAnalyzeResponse(result) {\n this.logger.trace(\"CommonService::onAnalyzeResponse : \", result);\n if (result) {\n this.options.onSuccess.call(this, result);\n } else {\n return onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](\"Analyse de la reponse en échec !?\"));\n }\n }\n\n // callback de gestion des erreurs : renvoit un objet de type ErrorService\n function onError(error) {\n this.logger.trace(\"CommonService::onError()\");\n // error : l'objet est du type ErrorService ou Error\n var e = error;\n if (!(e instanceof _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"])) {\n e = new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](error.message);\n }\n this.options.onFailure.call(this, e);\n }\n },\n /**\n * Création de la requête\n * @param {Function} error - callback\n * @param {Function} success - callback\n */\n buildRequest: function buildRequest(error, success) {\n // INFO\n this.logger.error(\"overwritten method !\");\n // retourne l'objet 'this.request'\n if (error) {\n error.call(this, \"This method must be overwritten !\");\n }\n success.call(this, \"This method must be overwritten !\");\n },\n /**\n * Appel du service\n * @param {Function} error - callback\n * @param {Function} success - callback\n */\n callService: function callService(error, success) {\n // INFO\n // retourne l'objet 'this.response'\n\n // NOTES\n // Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document).\n // Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes :\n // - natif\n // - XML encapsulé :\n // {http : {status:200, error:null},xml :'réponse du service'}\n // {http : {status:400, error:'reponse du service'},xml :null}\n // En XHR, la reponse est directement sauvegardée dans 'this.response'.\n // Par contre, en JSONP, on doit analyser la reponse (status ou non vide),\n // et ne renvoyer que le contenu (xml ou l'objet)\n\n // gestion de la proxification du service\n var strUrlProxified = null;\n var strData = this.request;\n\n // a t on mis en place un proxy ?\n // la proxyfication est valable uniquement en mode XHR !\n var bUrlProxified = !!(this.options.proxyURL && this.options.protocol === \"XHR\");\n\n // rajout de l'option gpbibaccess\n // INFO : acces au numero de version de package.conf aprés compilation !\n if (this.CLASSNAME !== \"Geocode\" && this.CLASSNAME !== \"ReverseGeocode\" && this.CLASSNAME !== \"AutoComplete\") {\n this.options.serverUrl = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(this.options.serverUrl, {\n \"gp-access-lib\": _package_json__WEBPACK_IMPORTED_MODULE_5__.version,\n apiKey: this.options.apiKey || \"calcul\"\n }, false);\n }\n\n // si le proxy est renseigné, on proxifie l'url du service\n if (bUrlProxified) {\n if (this.options.httpMethod === \"GET\") {\n strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(this.options.serverUrl, this.request, true);\n strData = null;\n }\n if (this.options.httpMethod === \"POST\") {\n strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(this.options.serverUrl, null, true);\n strData = this.request;\n }\n }\n\n // contexte du composant spécifique !\n var self = this;\n var options = {\n url: strUrlProxified || this.options.serverUrl,\n method: this.options.httpMethod,\n protocol: this.options.protocol,\n timeOut: this.options.timeOut || 0,\n format: this.options.outputFormat,\n // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) !\n nocache: this.options.nocache || false,\n // ceci permet d'ajouter un timestamp dans la requête\n wrap: this.options.protocol !== \"XHR\",\n // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR !\n callbackSuffix: this.options.callbackSuffix,\n // callbackName : this.options.callbackName || null,\n data: strData,\n headers: null,\n // TODO...\n content: this.options.contentType || \"application/xml\",\n scope: this.options.scope || this,\n // callback de reponse\n onResponse: function onResponse(response) {\n self.logger.trace(\"callService::onResponse()\");\n\n // le contenu de la reponse à renvoyer !\n var content = null;\n\n // XHR : on renvoie toujours la reponse brute du service (json ou xml)\n // au parser du composant...\n if (self.options.protocol === \"XHR\") {\n self.logger.trace(\"Response XHR\", response);\n content = response; // par defaut, la reponse du service !\n }\n\n // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas)\n // avant de l'envoyer au parser du composant...\n if (self.options.protocol === \"JSONP\") {\n self.logger.trace(\"Response JSON\", response);\n if (response) {\n if (response.http) {\n // reponse encapsulée :\n // ex. reponse du service en xml\n // > {http : {status:200, error:null},xml :'réponse du service'}\n if (response.http.status !== 200) {\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n status: response.http.status,\n message: response.http.error,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].TYPE_SRVERR\n }));\n return;\n } else {\n content = response.xml; // par defaut !\n if (self.options.rawResponse) {\n content = response;\n }\n }\n } else {\n // reponse non encapsulée :\n // ex. reponse du service en json ou xml\n content = response;\n }\n } else {\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](\"Le contenu de la reponse est vide !?\"));\n return;\n }\n }\n\n // si on souhaite parser la reponse du service\n if (typeof self.options.onBeforeParse === \"function\") {\n var newResponse = self.options.onBeforeParse(content);\n if (typeof newResponse === \"string\") {\n // la reponse parsée par l'utilisateur est retournée sous\n // forme de string !\n content = newResponse;\n }\n }\n // sauvegarde de la reponse dans l'objet parent (CommonService)\n self.response = content;\n // on renvoie la reponse...\n success.call(self, content);\n },\n // callback des erreurs\n onFailure: function onFailure(e) {\n self.logger.trace(\"callService::onFailure()\");\n // on est forcement sur une erreur levée par un service !\n e.type = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].TYPE_SRVERR;\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](e));\n },\n // callback de timeOut\n onTimeOut: function onTimeOut() {\n self.logger.trace(\"callService::onTimeOut()\");\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](\"TimeOut!\"));\n }\n };\n _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__[\"default\"].send(options);\n },\n /**\n * Analyse de la réponse\n * @param {Function} error - callback\n * @param {Function} success - callback\n */\n analyzeResponse: function analyzeResponse(error, success) {\n // INFO\n this.logger.error(\"overwritten method !\");\n // retourne l'objet spécifique au type de composant (json)\n if (error) {\n error.call(this, \"This method must be overwritten !\");\n }\n success.call(this, \"This method must be overwritten !\");\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (CommonService);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Db21tb25TZXJ2aWNlLmpzP2ZkNTciXSwibmFtZXMiOlsiQ29tbW9uU2VydmljZSIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwicHJvdG9jb2wiLCJzc2wiLCJwcm94eVVSTCIsImNhbGxiYWNrU3VmZml4IiwiaHR0cE1ldGhvZCIsInRpbWVPdXQiLCJyYXdSZXNwb25zZSIsInNjb3BlIiwib25TdWNjZXNzIiwicmVzcG9uc2UiLCJjb25zb2xlIiwibG9nIiwib25GYWlsdXJlIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwib3B0IiwiaGFzT3duUHJvcGVydHkiLCJiT25TdWNjZXNzIiwiRXJyb3IiLCJ0b1VwcGVyQ2FzZSIsIndpbmRvdyIsIm5vY2FjaGUiLCJvdXRwdXRGb3JtYXQiLCJyZXF1ZXN0IiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJjYWxsIiwiY29udGV4dCIsInJ1biIsImJ1aWxkUmVxdWVzdCIsIm9uRXJyb3IiLCJvbkJ1aWxkUmVxdWVzdCIsInJlc3VsdCIsImNhbGxTZXJ2aWNlIiwib25DYWxsU2VydmljZSIsImFuYWx5emVSZXNwb25zZSIsIm9uQW5hbHl6ZVJlc3BvbnNlIiwiRXJyb3JTZXJ2aWNlIiwiZSIsInN1Y2Nlc3MiLCJzdHJVcmxQcm94aWZpZWQiLCJzdHJEYXRhIiwiYlVybFByb3hpZmllZCIsIkNMQVNTTkFNRSIsInNlcnZlclVybCIsIkhlbHBlciIsIm5vcm1hbHl6ZVVybCIsIlBrZyIsInZlcnNpb24iLCJhcGlLZXkiLCJzZWxmIiwidXJsIiwibWV0aG9kIiwiZm9ybWF0Iiwid3JhcCIsImRhdGEiLCJoZWFkZXJzIiwiY29udGVudCIsImNvbnRlbnRUeXBlIiwib25SZXNwb25zZSIsImh0dHAiLCJ0eXBlIiwiVFlQRV9TUlZFUlIiLCJ4bWwiLCJvbkJlZm9yZVBh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Q0FBQztJQUN6QztJQUNBLElBQUlBLEtBQUssRUFBRTtNQUNQQSxLQUFLLENBQUNjLElBQUksQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLENBQUM7SUFDekQ7SUFDQWEsT0FBTyxDQUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDO0VBQzNEO0FBRUosQ0FBQztBQUVjcEMsNEVBQWEiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQ29tbW9uU2VydmljZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEhlbHBlciBmcm9tIFwiLi4vVXRpbHMvSGVscGVyXCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBQcm90b2NvbCBmcm9tIFwiLi4vUHJvdG9jb2xzL1Byb3RvY29sXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuLy8gaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuL0RlZmF1bHRVcmxTZXJ2aWNlXCI7XG4vLyBwYWNrYWdlLmpzb24gKGV4dHJhY3QgdmVyc2lvbilcbmltcG9ydCBQa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIENvbXBvc2FudCBTZXJ2aWNlXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQ29tbW9uU2VydmljZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGNvbW11bmVzIMOgIHRvdXMgbGVzIHNlcnZpY2VzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybF0gLSBVUkwgZCdhY2PDqHMgYXUgc2VydmljZS4gUGFyIGTDqWZhdXQgXCJodHRwczovL3d4cy5pZ24uZnIvY2FsY3VsL2dlb3BvcnRhaWwvU0VSVklDRS9cIi5cbiAqICAgICAgUGVybWV0IGRlIGZvcmNlciBsJ3V0aWxpc2F0aW9uIGQndW4gc2VydmljZSDDqXF1aXZhbGVudCBkw6lwbG95w6kgZGVycmnDqHJlIHVuZSDDqXZlbnR1ZWxsZSBhdXRyZSBVUkwgZCdhY2PDqHMuXG4gKiAgICAgIFNpIGNlIHBhcmFtw6h0cmUgZXN0IHJlbnNlaWduw6kgYWxvcnMsIGxlIHBhcmFtw6h0cmUgcGFyIGTDqWZhdXQgZXN0IGlnbm9yw6kuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3RvY29sXSAtIExlIHByb3RvY29sZSDDoCB1dGlsaXNlciBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbmZvcm1hdGlvbnMgZHUgc2VydmljZSA6XG4gKiAgICAgIHBldXQgdmFsb2lyICdKU09OUCcgb3UgJ1hIUicuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBjJ2VzdCBsZSBwcm90b2NvbGUgWEhSIHF1aSBzZXJhIHV0aWxpc8OpLlxuICogICAgICBBdHRlbnRpb24sIGxlIHByb3RvY29sZSBKU09OUCBuJ2VzdCBwYXMgdmFsaWRlIGRhbnMgdW4gZW52aXJvbm5lbWVudCBOb2RlSlMgKFV0aWxpc2F0aW9uIGR1IG1vZGUgWEhSKS5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbF0gLSBJbmRpcXVlIHNpIGwnb24gc291aGFpdGUgaW50w6lycm9nZXIgbGVzIHNlcnZpY2VzIGVuIGh0dHBzLlxuICogICAgICBDZSBwYXJhbcOodHJlIG5lIGZvbmN0aW9ubmUgcXVlIHBvdXIgdW5lIHV0aWxpc2F0aW9uIGhvcnMgbmF2aWdhdGV1ciAoZXguIE5vZGVKUykuXG4gKiAgICAgIFN1ciB1biBuYXZpZ2F0ZXVyLCBsZSBwcm90b2NvbGUgZXN0IGF1dG9tYXRpcXVlbWVudCBleHRyYWl0IGRlIGwndXJsIGR1IHNpdGUuLi5cbiAqICAgICAgUGFyIGTDqWZhdXQsIG9uIHV0aWxpc2UgbGUgcHJvdG9jb2xlIGh0dHAgKHNzbD1mYWxzZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIExlIHByb3h5IMOgIHV0aWxpc2VyIHBvdXIgcGFsbGllciBhdSBwcm9ibMOobWUgZGUgY3Jvc3MtZG9tYWluIGRhbnMgbGUgY2FzIGQndW5lIHJlcXXDqnRlIFhIUi5cbiAqICAgICAgVXRpbGUgc2kgbGUgcGFyYW3DqHRyZSAncHJvdG9jb2wnIHZhdXQgJ1hIUicsIGlsIG5lIHNlcmEgcGFzIHByaXMgZW4gY29tcHRlIHNpIHByb3RvY29sIHZhdXQgSlNPTlAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNhbGxiYWNrU3VmZml4XSAtIFN1ZmZpeGUgZGUgbGEgZm9uY3Rpb24gZGUgY2FsbGJhY2sgw6AgdXRpbGlzZXIsIGRhbnMgbGUgY2FzIGR1IHByb3RvY29sZSBKU09OUC5cbiAqICAgICAgUGFyIGTDqWZhdXQsIGxhIGZvbmN0aW9uIGRlIGNhbGxiYWNrIHBvcnRlcmEgdW4gbm9tIGR1IHR5cGUgXCJjYWxsYmFja1wiK0lELCBvw7kgSUQgZXN0IHNvaXQgdW4gaWRlbnRpZmlhbnQgdW5pcXVlIGfDqW7DqXLDqSDDoCBjaGFxdWUgcmVxdcOqdGUsXG4gKiAgICAgIHNvaXQgbGUgcGFyYW3DqHRyZSBjYWxsYmFja1N1ZmZpeCBzJ2lsIGVzdCBzcMOpY2lmacOpLiBQYXIgZXhlbXBsZSwgc2kgY2FsbGJhY2tTdWZmaXg9XCJfMlwiLCBsYSBmb25jdGlvbiBzZXJhIFwiY2FsbGJhY2tfMiAoKVwiLlxuICogICAgICBVdGlsZSBwb3VyIHV0aWxpc2VyIHVuZSByw6lwb25zZSBkw6lqw6AgZW5jYXBzdWzDqWUgZGFucyB1bmUgZm9uY3Rpb24gZGUgY2FsbGJhY2ssIGRvbnQgbGUgbm9tIGVzdCBjb25udVxuICogICAgICBVdGlsZSBzZXVsZW1lbnQgc2kgbGUgcGFyYW3DqHRyZSAncHJvdG9jb2wnIHZhdXQgJ0pTT05QJywgaWwgbmUgc2VyYSBwYXMgcHJpcyBlbiBjb21wdGUgc2kgcHJvdG9jb2wgdmF1dCAnWEhSJy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaHR0cE1ldGhvZF0gLSBMYSBtw6l0aG9kZSBIVFRQXG4gKiAgICAgIMOgIHV0aWxpc2VyIGRhbnMgbGUgY2FzIGQndW5lIHJlcXXDqnRlIFhIUiA6IHBldXQgdmFsb2lyICdHRVQnIG91ICdQT1NUJy5cbiAqICAgICAgTm9uIHByaXMgZW4gY29tcHRlIHNpICdwcm90b2NvbCcgdmF1dCBKU09OUCBxdWkgZm9uY3Rpb25uZSBvYmxpZ2F0b2lyZW1lbnQgZW4gR0VULlxuICogICAgICBQYXIgZMOpZmF1dCwgYydlc3QgbGEgbcOpdGhvZGUgR0VUIHF1aSBlc3QgdXRpbGlzw6llLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jb250ZW50VHlwZV0gLSBDb250ZW50LVR5cGUgZGUgbGEgcmVxdWV0ZVxuICogICAgICDDoCB1dGlsaXNlciBkYW5zIGxlIGNhcyBkJ3VuZSByZXF1w6p0ZSBYSFIgZW4gbW9kZSBQT1NULlxuICogICAgICBOb24gcHJpcyBlbiBjb21wdGUgc2kgJ3Byb3RvY29sJyB2YXV0IEpTT05QIGV0L291IGxhIG3DqXRob2RlIEhUVFAgdmF1dCBHRVQuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBjJ2VzdCBsYSBtw6l0aG9kZSBHRVQgcXVpIGVzdCB1dGlsaXPDqWUgZG9uYyBvbiBuJ3V0aWxpc2UgcGFzIGRlIENvbnRlbnQtVHlwZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dF0gLSBEw6lsYWkgZCdhdHRlbnRlIG1heGltYWwgKGVuIG1zKSBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlICjDoCBwYXJ0aXIgZGUgbCdlbnZvaSBkZSBsYSByZXF1w6p0ZSkuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBhdWN1biB0aW1lT3V0IG4nZXN0IHByaXMgZW4gY29tcHRlICh0aW1lb3V0RGVsYXk9IDApLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmF3UmVzcG9uc2VdIC0gSW5kaXF1ZSBzaSBsJ29uIHNvdWhhaXRlIHF1ZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIG5lIHNvaXQgcGFzIHBhcnPDqWUgcGFyIGwnQVBJIGF2YW50IGQnw6p0cmUgcmVzdGl0dcOpZS5cbiAqICAgICAgKENmLiBwYXJhbcOodHJlIMKrIG9uU3VjY2VzcyDCuyBwb3VyIHBsdXMgZGUgZMOpdGFpbHMpLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uU3VjY2Vzc10gLSBGb25jdGlvbiBhcHBlbMOpZSBsb3JzcXVlIGxlIHNlcnZpY2UgcsOpcG9uZCBjb3JyZWN0ZW1lbnQgw6AgbGEgcmVxdcOqdGVcbiAqICAgICAgKGNvZGUgSFRUUCAyMDAsIHNhbnMgbWVzc2FnZSBkJ2VycmV1cikuXG4gKiAgICAgIENldHRlIGZvbmN0aW9uIHByZW5kIGVuIHBhcmFtw6h0cmUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSxcbiAqICAgICAgc29pdCBzb3VzIGxhIGZvcm1lIGQndW4gT2JqZWN0IEphdmFzY3JpcHQgZm9ybWF0w6kgcGFyIGxlIHBhcnNldXIgZMOpZGnDqSDDoCBsYSBzeW50YXhlIGR1IHNlcnZpY2UgKGNvbXBvcnRlbWVudCBwYXIgZMOpZmF1dCkgO1xuICogICAgICBzb2l0IGJydXRlIGF1IGZvcm1hdCBTdHJpbmcgbm9uIHByw6l0cmFpdMOpIHNpIGxlIHBhcmFtw6h0cmUgwqsgcmF3UmVzcG9uc2UgwrsgYSDDqXTDqSBwcsOpY2lzw6kgYXZlYyBsYSB2YWxldXIgwqsgdHJ1ZSDCuy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkZhaWx1cmVdIC0gRm9uY3Rpb24gYXBwZWzDqWUgbG9yc3F1ZSBsZSBzZXJ2aWNlIG5lIHLDqXBvbmQgcGFzIGNvcnJlY3RlbWVudFxuICogICAgICAoY29kZSBIVFRQIGRlIHJldG91ciBkaWZmw6lyZW50IGRlIDIwMCBvdSBwYXMgZGUgcsOpcG9uc2UpLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uQmVmb3JlUGFyc2VdIC0gRm9uY3Rpb24gYXBwZWzDqWUgYXZhbnQgbGUgcGFyc2luZyBkZSBsYSByw6lwb25zZVxuICogICAgICBQZXJtZXQgZGUgbW9kaWZpZXIgbGEgcsOpcG9uc2UgYXZhbnQgcGFyc2luZyBldCBsYSBmb25jdGlvbiBkb2l0IHJldG91cm5lciB1bmUgU3RyaW5nLlxuICogICAgICBDZXR0ZSBmb25jdGlvbiBwcmVuZCBlbiBwYXJhbcOodHJlIGxhIHLDqXBvbnNlIHRlbGxlIHF1ZSByZW52b3nDqWUgcGFyIGxlIHNlcnZpY2VcbiAqICAgICAgKGNhZCBhdSBmb3JtYXQganNvbiBvdSB4bWwpLlxuICogICAgICBQb3VyIGxlIEpTT05QLCBzaSBsZSBwYXJhbcOodHJlIFwicmF3UmVzcG9uc2VcIiBhIMOpdMOpIHByw6ljaXPDqSBhdmVjIGxhIHZhbGV1ciBcInRydWVcIixcbiAqICAgICAgbGEgZm9uY3Rpb24gcHJlbmQgZW4gcGFyYW3DqHRyZSB1biBPYmplY3QgSmF2YVNjcmlwdCBjb250ZW5hbnQgbGEgcsOpcG9uc2UgWE1MLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBvcHRpb25zID0ge1xuICogICAgICBzZXJ2ZXJVcmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zZXJ2aWNlLycsXG4gKiAgICAgIHByb3RvY29sIDogJ0pTT05QJywgLy8gSlNPTlB8WEhSXG4gKiAgICAgIHNzbCA6IGZhbHNlLFxuICogICAgICBwcm94eVVSTCA6IG51bGwsXG4gKiAgICAgIGNhbGxiYWNrTmFtZSA6IG51bGwsXG4gKiAgICAgIGh0dHBNZXRob2QgOiAnR0VUJywgLy8gR0VUfFBPU1RcbiAqICAgICAgdGltZU91dCA6IDEwMDAwLCAvLyBtc1xuICogICAgICByYXdSZXNwb25zZSA6IGZhbHNlLCAvLyB0cnVlfGZhbHNlXG4gKiAgICAgIHNjb3BlIDogbnVsbCwgLy8gdGhpc1xuICogICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHt9LFxuICogICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHt9LFxuICogICAgICBvbkJlZm9yZVBhcnNlIDogZnVuY3Rpb24gKHJhd1Jlc3BvbnNlKSB7fVxuICogICB9O1xuICovXG5mdW5jdGlvbiBDb21tb25TZXJ2aWNlIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbW1vblNlcnZpY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIikpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkNvbW1vblNlcnZpY2VcIik7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIENvbW1vblNlcnZpY2UgKG9wdGlvbnMpXVwiKTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAgIC8vIHLDqWN1cMOpcmF0aW9uIGRlcyBvcHRpb25zIHBhciBkw6lmYXV0IHBvdXIgbGVzIHBhcmFtw6h0cmVzIG9wdGlvbm5lbHNcbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgZHUgc2VydmljZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAvLyBwcm90b2NvbCA6IFwiSlNPTlBcIixcbiAgICAgICAgcHJvdG9jb2wgOiBcIlhIUlwiLFxuICAgICAgICBzc2wgOiB0cnVlLFxuICAgICAgICBwcm94eVVSTCA6IFwiXCIsXG4gICAgICAgIC8vIGNhbGxiYWNrTmFtZSA6IFwiXCIsXG4gICAgICAgIGNhbGxiYWNrU3VmZml4IDogbnVsbCxcbiAgICAgICAgaHR0cE1ldGhvZCA6IFwiR0VUXCIsXG4gICAgICAgIHRpbWVPdXQgOiAwLFxuICAgICAgICByYXdSZXNwb25zZSA6IGZhbHNlLFxuICAgICAgICBzY29wZSA6IHRoaXMsXG4gICAgICAgIC8qKlxuICAgICAgICAqIGNhbGxiYWNrIHBhciBkZWZhdXQgcG91ciBsYSByZXBvbnNlXG4gICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gcmVzcG9uc2VcbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAqL1xuICAgICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TdWNjZXNzIC0gbGEgcmVwb25zZSBlc3QgbGEgc3VpdmFudGUgOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgKiBjYWxsYmFjayBwYXIgZGVmYXV0IHBvdXIgbGVzIGVycmV1cnNcbiAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3IgLSBlcnJvclxuICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICovXG4gICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gMjAwIHx8ICFlcnJvci5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uRmFpbHVyZSA6IFwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvbkZhaWx1cmUgLSBFcnJldXIgKFwiLCBlcnJvci5zdGF0dXMsIFwiKSA6IFwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBldCBvbiBham91dGUgbGVzIG9wdGlvbnMgZW4gcGFyYW3DqHRyZSBhdXggb3B0aW9ucyBwYXIgZMOpZmF1dFxuICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1tvcHRdID0gb3B0aW9uc1tvcHRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gYW5hbHlzZSBkZXMgb3B0aW9uc1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gICAgLy8gbW9kaWZpY2F0aW9uIGRlIGxhIGZvbmN0aW9uIGRlIGNhbGxiYWNrIG9uU3VjY2VzcyBkYW5zIGxlIGNhcyBvw7kgbGEgcsOpcG9uc2UgYnJ1dGUgZXN0IGRlbWFuZMOpZVxuICAgIGlmICh0aGlzLm9wdGlvbnMucmF3UmVzcG9uc2UgJiYgIXRoaXMub3B0aW9ucy5vblN1Y2Nlc3MpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICogY2FsbGJhY2sgcGFyIGRlZmF1dCBwb3VyIGxhIHJlcG9uc2VcbiAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgLSByZXNwb25zZVxuICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMub3B0aW9ucy5vblN1Y2Nlc3MgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TdWNjZXNzIC0gbGEgcsOpcG9uc2UgYnJ1dGUgZHUgc2VydmljZSBlc3QgbGEgc3VpdmFudGUgOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGdlc3Rpb24gZHUgY2FsbGJhY2sgb25TdWNjZXNzXG4gICAgdmFyIGJPblN1Y2Nlc3MgPSAhISh0aGlzLm9wdGlvbnMub25TdWNjZXNzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMub25TdWNjZXNzID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIGlmICghYk9uU3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcIm9uU3VjY2VzcygpXCIpKTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRSB0cmFpdGVtZW50IGF1IG5pdmVhdSBkZSBjaGFxdWUgY29tcG9zYW50IHBvdXIgdGVzdGVyIHNlcnZpY2UgV1hTIC8gR1BGXG4gICAgLy8gZ2VzdGlvbiBkZSBsJ3VybCBkdSBzZXJ2aWNlIHBhciBkZWZhdXRcbiAgICAvKlxuICAgIGlmICghdGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgICAvLyBJTkZPXG4gICAgICAgIC8vIGdlc3Rpb24gZGUgbCd1cmwgZHUgc2VydmljZSBwYXIgZGVmYXV0IHBvdXIgbGVzIHNlcnZpY2VzIHF1aSBuZSBwb3Nzw6hkZW50IHF1J3VuZSBzZXVsIHVybCBwYXIgZGVmYXV0XG4gICAgICAgIC8vIGxlcyBjYXMgcGFydGljdWxpZXJzIGRlcyBzZXJ2aWNlcyBhdmVjIHBsdXNpZXVycyB1cmxzIChleC4gQWx0aSkgZGV2cm9udCDDqnRyZSB0cmFpdMOpIGRhbnMgbGEgY2xhc3NlIGR1IGNvbXBvc2FudFxuICAgICAgICAvLyBkb25jIHNpIGwndXJsIG4nZXN0IHBhcyByZW5zZWlnbsOpZSwgaWwgZmF1dCB1dGlsaXNlciBsZXMgdXJscyBwYXIgZGVmYXV0XG4gICAgICAgIERlZmF1bHRVcmxTZXJ2aWNlLnNzbCA9IHRoaXMub3B0aW9ucy5zc2w7XG4gICAgICAgIHZhciB1cmxCeURlZmF1bHQgPSBEZWZhdWx0VXJsU2VydmljZVt0aGlzLkNMQVNTTkFNRV0udXJsKFwiY2FsY3VsXCIpO1xuICAgICAgICBpZiAodHlwZW9mIHVybEJ5RGVmYXVsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcnZlclVybCA9IHVybEJ5RGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiVVJMIHBhciBkZWZhdXQgw6AgZGV0ZXJtaW5lciBhdSBuaXZlYXUgZHUgY29tcG9zYW50Li4uXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICovXG5cbiAgICAvLyBGSVhNRSBuZXR0b3lhZ2UgZGVzIEtWUCBkYW5zIGwndXJsIGR1IHNlcnZpY2VcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgIC8vICAgICAvLyBJTkZPXG4gICAgLy8gICAgIC8vIHNpIGwndXJsIGVzdCByZW5zZWlnbsOpZSwgaWwgZmF1dCBsYSBuZXR0b3llciBkZSB0b3VzIHNlcyBLVlBcbiAgICAvLyAgICAgLy8gZXguIG9uIG5lIHZldXQgcGFzIGRlIHBhcmFtcy4gJ2NhbGxiYWNrJyBvdSAnb3V0cHV0JyBjYXIgY2VjaSBkZWNsZW5jaGVyYWl0XG4gICAgLy8gICAgIC8vIGRlcyBvcMOpcmF0aW9ucyBkJ2VuY2Fwc3VsYXRpb25zIGRlcyByZXBvbnNlcyBsw6lnw6hyZW1lbnQgZmFyZmVsdWVzIC4uLlxuICAgIC8vICAgICB2YXIgdXJsc291cmNlID0gdGhpcy5vcHRpb25zLnNlcnZlclVybDtcbiAgICAvLyAgICAgdmFyIHVybHBhcnRzID0gdXJsc291cmNlLnNwbGl0KFwiP1wiKTtcbiAgICAvLyAgICAgdGhpcy5vcHRpb25zLnNlcnZlclVybCA9IHVybHBhcnRzWzBdO1xuICAgIC8vIH1cblxuICAgIC8vIGdlc3Rpb24gZGUgbGEgbWV0aG9kZSBIVFRQXG4gICAgdGhpcy5vcHRpb25zLmh0dHBNZXRob2QgPSAodHlwZW9mIG9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJzdHJpbmdcIikgPyBvcHRpb25zLmh0dHBNZXRob2QudG9VcHBlckNhc2UoKSA6IFwiR0VUXCI7XG5cbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5odHRwTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgXCJQT1NUXCI6XG4gICAgICAgIGNhc2UgXCJHRVRcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUFVUXCI6XG4gICAgICAgIGNhc2UgXCJERUxFVEVcIjpcbiAgICAgICAgY2FzZSBcIkhFQURcIjpcbiAgICAgICAgY2FzZSBcIk9QVElPTlNcIjpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9OT1RfU1VQUE9SVFwiLCBcImh0dHBNZXRob2RcIikpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX1VOS05PV05cIiwgXCJodHRwTWV0aG9kXCIpKTtcbiAgICB9XG5cbiAgICAvLyBnZXN0aW9uIGR1IHByb3RvY29sZVxuICAgIC8vIHRoaXMub3B0aW9ucy5wcm90b2NvbCA9ICh0eXBlb2Ygb3B0aW9ucy5wcm90b2NvbCA9PT0gXCJzdHJpbmdcIiApID8gb3B0aW9ucy5wcm90b2NvbC50b1VwcGVyQ2FzZSgpIDogXCJKU09OUFwiO1xuICAgIHRoaXMub3B0aW9ucy5wcm90b2NvbCA9ICh0eXBlb2Ygb3B0aW9ucy5wcm90b2NvbCA9PT0gXCJzdHJpbmdcIikgPyBvcHRpb25zLnByb3RvY29sLnRvVXBwZXJDYXNlKCkgOiBcIlhIUlwiO1xuXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMucHJvdG9jb2wpIHtcbiAgICAgICAgY2FzZSBcIkpTT05QXCI6XG4gICAgICAgIGNhc2UgXCJYSFJcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX1VOS05PV05cIiwgXCJwcm90b2NvbFwiKSk7XG4gICAgfVxuXG4gICAgLy8gb24gZGV0ZXJtaW5lIGwnZW52aXJvbm5lbWVudCBkJ2V4ZWN1dGlvbiA6IGJyb3dzZXIgb3Ugbm9uID9cbiAgICAvLyBldCBvbiBsYW5jZSB1bmUgZXhjZXB0aW9uIHN1ciBsJ3V0aWxpc2F0aW9uIGR1IHByb3RvY29sZSBKU09OUCBwb3VyIG5vZGVKUy4uLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiICYmIHRoaXMub3B0aW9ucy5wcm90b2NvbCA9PT0gXCJKU09OUFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9OT1RfU1VQUE9SVF9OT0RFSlNcIiwgXCJwcm90b2NvbD1KU09OUCAoaW5zdGVhZCB1c2UgWEhSKVwiKSk7XG4gICAgfVxuXG4gICAgLy8gbGUgcHJvdG9jb2xlIEpTT05QIG5lIGZvbmN0aW9ubmUgcXUnZW4gR0VULlxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJvdG9jb2wgPT09IFwiSlNPTlBcIikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9IFwiR0VUXCI7XG4gICAgfVxuXG4gICAgLy8gZ2VzdGlvbiBkdSBjYWNoZVxuICAgIHRoaXMub3B0aW9ucy5ub2NhY2hlID0gb3B0aW9ucy5ub2NhY2hlIHx8IGZhbHNlO1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gYXR0cmlidXRzIGQnaW5zdGFuY2VzXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgZGUgcsOpcG9uc2UgZHUgc2VydmljZVxuICAgICAqL1xuICAgIHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlcXXDqnRlIGVudm95w6llIGF1IHNlcnZpY2VcbiAgICAgKi9cbiAgICB0aGlzLnJlcXVlc3QgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlcG9uc2UgZHUgc2VydmljZVxuICAgICAqL1xuICAgIHRoaXMucmVzcG9uc2UgPSBudWxsO1xufVxuXG4vKipcbiAqIEBsZW5kcyBtb2R1bGU6Q29tbW9uU2VydmljZVxuICovXG5Db21tb25TZXJ2aWNlLnByb3RvdHlwZSA9IHtcblxuICAgIC8qXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IENvbW1vblNlcnZpY2UsXG5cbiAgICAvKipcbiAgICAgKiBBcHBlbCBkdSBzZXJ2aWNlIEfDqW9wb3J0YWlsXG4gICAgICovXG4gICAgY2FsbCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoganNoaW50IHZhbGlkdGhpcyA6IHRydWUgKi9cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJDb21tb25TZXJ2aWNlOjpjYWxsICgpXCIpO1xuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgLyoqIGZvbmN0aW9uIGQnZXhlY3V0aW9uICovXG4gICAgICAgIGZ1bmN0aW9uIHJ1biAoKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkNvbW1vblNlcnZpY2U6OnJ1biAoKVwiKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRSZXF1ZXN0LmNhbGwoY29udGV4dCwgb25FcnJvciwgb25CdWlsZFJlcXVlc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVuLmNhbGwoY29udGV4dCk7XG5cbiAgICAgICAgLy8gY2FsbGJhY2sgZGUgZmluIGRlIGNvbnN0cnVjdGlvbiBkZSBsYSByZXF1w6p0ZVxuICAgICAgICBmdW5jdGlvbiBvbkJ1aWxkUmVxdWVzdCAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkNvbW1vblNlcnZpY2U6Om9uQnVpbGRSZXF1ZXN0IDogXCIsIHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmNhbGxTZXJ2aWNlLmNhbGwoY29udGV4dCwgb25FcnJvciwgb25DYWxsU2VydmljZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxsYmFjayBkZSBmaW4gZCdhcHBlbCBhdSBzZXJ2aWNlXG4gICAgICAgIGZ1bmN0aW9uIG9uQ2FsbFNlcnZpY2UgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJDb21tb25TZXJ2aWNlOjpvbkNhbGxTZXJ2aWNlIDogXCIsIHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmFuYWx5emVSZXNwb25zZS5jYWxsKGNvbnRleHQsIG9uRXJyb3IsIG9uQW5hbHl6ZVJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGxiYWNrIGRlIGZpbiBkZSBsZWN0dXJlIGRlIGxhIHJlcG9uc2VcbiAgICAgICAgZnVuY3Rpb24gb25BbmFseXplUmVzcG9uc2UgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJDb21tb25TZXJ2aWNlOjpvbkFuYWx5emVSZXNwb25zZSA6IFwiLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vblN1Y2Nlc3MuY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoXCJBbmFseXNlIGRlIGxhIHJlcG9uc2UgZW4gw6ljaGVjICE/XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGxiYWNrIGRlIGdlc3Rpb24gZGVzIGVycmV1cnMgOiByZW52b2l0IHVuIG9iamV0IGRlIHR5cGUgRXJyb3JTZXJ2aWNlXG4gICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkNvbW1vblNlcnZpY2U6Om9uRXJyb3IoKVwiKTtcbiAgICAgICAgICAgIC8vIGVycm9yIDogbCdvYmpldCBlc3QgZHUgdHlwZSBFcnJvclNlcnZpY2Ugb3UgRXJyb3JcbiAgICAgICAgICAgIHZhciBlID0gZXJyb3I7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3JTZXJ2aWNlKSkge1xuICAgICAgICAgICAgICAgIGUgPSBuZXcgRXJyb3JTZXJ2aWNlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uRmFpbHVyZS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBidWlsZFJlcXVlc3QgOiBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gSU5GT1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIm92ZXJ3cml0dGVuIG1ldGhvZCAhXCIpO1xuICAgICAgICAvLyByZXRvdXJuZSBsJ29iamV0ICd0aGlzLnJlcXVlc3QnXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBcIlRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcndyaXR0ZW4gIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdWNjZXNzLmNhbGwodGhpcywgXCJUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJ3cml0dGVuICFcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFwcGVsIGR1IHNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gICAgICovXG4gICAgY2FsbFNlcnZpY2UgOiBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyByZXRvdXJuZSBsJ29iamV0ICd0aGlzLnJlc3BvbnNlJ1xuXG4gICAgICAgIC8vIE5PVEVTXG4gICAgICAgIC8vICBQb3VyIGxlIG1vZGUgWEhSLCBvbiByZWN1cMOocmUgdW5lIHJlcG9uc2Ugc291cyBmb3JtZSBkJ3VuIGpzb24gb3UgeG1sICgjZG9jdW1lbnQpLlxuICAgICAgICAvLyAgUG91ciBsZSBtb2RlIEpTT05QLCBvbiBhIHRvdWpvdXJzIHVuIG9iamV0IEpTT04gbWFpcyBzb3VzIDIgZm9ybWVzIDpcbiAgICAgICAgLy8gICAgICAtIG5hdGlmXG4gICAgICAgIC8vICAgICAgLSBYTUwgZW5jYXBzdWzDqSA6XG4gICAgICAgIC8vICAgICAgICAgIHtodHRwIDoge3N0YXR1czoyMDAsIGVycm9yOm51bGx9LHhtbCA6J3LDqXBvbnNlIGR1IHNlcnZpY2UnfVxuICAgICAgICAvLyAgICAgICAgICB7aHR0cCA6IHtzdGF0dXM6NDAwLCBlcnJvcjoncmVwb25zZSBkdSBzZXJ2aWNlJ30seG1sIDpudWxsfVxuICAgICAgICAvLyAgRW4gWEhSLCBsYSByZXBvbnNlIGVzdCBkaXJlY3RlbWVudCBzYXV2ZWdhcmTDqWUgZGFucyAndGhpcy5yZXNwb25zZScuXG4gICAgICAgIC8vICBQYXIgY29udHJlLCBlbiBKU09OUCwgb24gZG9pdCBhbmFseXNlciBsYSByZXBvbnNlIChzdGF0dXMgb3Ugbm9uIHZpZGUpLFxuICAgICAgICAvLyAgZXQgbmUgcmVudm95ZXIgcXVlIGxlIGNvbnRlbnUgKHhtbCBvdSBsJ29iamV0KVxuXG4gICAgICAgIC8vIGdlc3Rpb24gZGUgbGEgcHJveGlmaWNhdGlvbiBkdSBzZXJ2aWNlXG4gICAgICAgIHZhciBzdHJVcmxQcm94aWZpZWQgPSBudWxsO1xuICAgICAgICB2YXIgc3RyRGF0YSA9IHRoaXMucmVxdWVzdDtcblxuICAgICAgICAvLyBhIHQgb24gbWlzIGVuIHBsYWNlIHVuIHByb3h5ID9cbiAgICAgICAgLy8gbGEgcHJveHlmaWNhdGlvbiBlc3QgdmFsYWJsZSB1bmlxdWVtZW50IGVuIG1vZGUgWEhSICFcbiAgICAgICAgdmFyIGJVcmxQcm94aWZpZWQgPSAhISh0aGlzLm9wdGlvbnMucHJveHlVUkwgJiYgdGhpcy5vcHRpb25zLnByb3RvY29sID09PSBcIlhIUlwiKTtcblxuICAgICAgICAvLyByYWpvdXQgZGUgbCdvcHRpb24gZ3BiaWJhY2Nlc3NcbiAgICAgICAgLy8gSU5GTyA6IGFjY2VzIGF1IG51bWVybyBkZSB2ZXJzaW9uIGRlIHBhY2thZ2UuY29uZiBhcHLDqXMgY29tcGlsYXRpb24gIVxuICAgICAgICBpZiAodGhpcy5DTEFTU05BTUUgIT09IFwiR2VvY29kZVwiICYmIHRoaXMuQ0xBU1NOQU1FICE9PSBcIlJldmVyc2VHZW9jb2RlXCIgJiYgdGhpcy5DTEFTU05BTUUgIT09IFwiQXV0b0NvbXBsZXRlXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwgPSBIZWxwZXIubm9ybWFseXplVXJsKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwsIHtcbiAgICAgICAgICAgICAgICBcImdwLWFjY2Vzcy1saWJcIiA6IFBrZy52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFwaUtleSA6IHRoaXMub3B0aW9ucy5hcGlLZXkgfHwgXCJjYWxjdWxcIlxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2kgbGUgcHJveHkgZXN0IHJlbnNlaWduw6ksIG9uIHByb3hpZmllIGwndXJsIGR1IHNlcnZpY2VcbiAgICAgICAgaWYgKGJVcmxQcm94aWZpZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAgIHN0clVybFByb3hpZmllZCA9IHRoaXMub3B0aW9ucy5wcm94eVVSTCArIEhlbHBlci5ub3JtYWx5emVVcmwodGhpcy5vcHRpb25zLnNlcnZlclVybCwgdGhpcy5yZXF1ZXN0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBzdHJEYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgICAgICAgICAgIHN0clVybFByb3hpZmllZCA9IHRoaXMub3B0aW9ucy5wcm94eVVSTCArIEhlbHBlci5ub3JtYWx5emVVcmwodGhpcy5vcHRpb25zLnNlcnZlclVybCwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3RyRGF0YSA9IHRoaXMucmVxdWVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnRleHRlIGR1IGNvbXBvc2FudCBzcMOpY2lmaXF1ZSAhXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHVybCA6IHN0clVybFByb3hpZmllZCB8fCB0aGlzLm9wdGlvbnMuc2VydmVyVXJsLFxuICAgICAgICAgICAgbWV0aG9kIDogdGhpcy5vcHRpb25zLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBwcm90b2NvbCA6IHRoaXMub3B0aW9ucy5wcm90b2NvbCxcbiAgICAgICAgICAgIHRpbWVPdXQgOiB0aGlzLm9wdGlvbnMudGltZU91dCB8fCAwLFxuICAgICAgICAgICAgZm9ybWF0IDogdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCwgLy8gY2VjaSBkZWNsZW5jaGUgbGUgcGFyc2luZyBkZSBsYSByZXBvbnNlIGR1IHNlcnZpY2UsIG1haXMgb24gc291aGFpdGUgdG91am91cnMgdW5lIHJlcG9uc2UgYnJ1dGUgKHN0cmluZykgIVxuICAgICAgICAgICAgbm9jYWNoZSA6IHRoaXMub3B0aW9ucy5ub2NhY2hlIHx8IGZhbHNlLCAvLyBjZWNpIHBlcm1ldCBkJ2Fqb3V0ZXIgdW4gdGltZXN0YW1wIGRhbnMgbGEgcmVxdcOqdGVcbiAgICAgICAgICAgIHdyYXAgOiB0aGlzLm9wdGlvbnMucHJvdG9jb2wgIT09IFwiWEhSXCIsIC8vIGNlY2kgZGVjbGVuY2hlIGwnZW5jYXBzdWxhdGlvbiBkZSBsYSByZXBvbnNlIFhNTCBkdSBzZXJ2aWNlIGRhbnMgZHUgSlNPTiwgbWFpcyBwYXMgZW4gbW9kZSBYSFIgIVxuICAgICAgICAgICAgY2FsbGJhY2tTdWZmaXggOiB0aGlzLm9wdGlvbnMuY2FsbGJhY2tTdWZmaXgsXG4gICAgICAgICAgICAvLyBjYWxsYmFja05hbWUgOiB0aGlzLm9wdGlvbnMuY2FsbGJhY2tOYW1lIHx8IG51bGwsXG4gICAgICAgICAgICBkYXRhIDogc3RyRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnMgOiBudWxsLCAvLyBUT0RPLi4uXG4gICAgICAgICAgICBjb250ZW50IDogdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlIHx8IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgICAgICBzY29wZSA6IHRoaXMub3B0aW9ucy5zY29wZSB8fCB0aGlzLFxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgZGUgcmVwb25zZVxuICAgICAgICAgICAgb25SZXNwb25zZSA6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFwiY2FsbFNlcnZpY2U6Om9uUmVzcG9uc2UoKVwiKTtcblxuICAgICAgICAgICAgICAgIC8vIGxlIGNvbnRlbnUgZGUgbGEgcmVwb25zZSDDoCByZW52b3llciAhXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gWEhSIDogb24gcmVudm9pZSB0b3Vqb3VycyBsYSByZXBvbnNlIGJydXRlIGR1IHNlcnZpY2UgKGpzb24gb3UgeG1sKVxuICAgICAgICAgICAgICAgIC8vIGF1IHBhcnNlciBkdSBjb21wb3NhbnQuLi5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnByb3RvY29sID09PSBcIlhIUlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFwiUmVzcG9uc2UgWEhSXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHJlc3BvbnNlOyAvLyBwYXIgZGVmYXV0LCBsYSByZXBvbnNlIGR1IHNlcnZpY2UgICFcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBKU09OUCA6IG9uIHByZS1hbmFseXNlIGxhIHJlcG9uc2UgYnJ1dGUgZHUgc2VydmljZSAoZW5jYXBzdWxlciBvdSBwYXMpXG4gICAgICAgICAgICAgICAgLy8gYXZhbnQgZGUgbCdlbnZveWVyIGF1IHBhcnNlciBkdSBjb21wb3NhbnQuLi5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnByb3RvY29sID09PSBcIkpTT05QXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIudHJhY2UoXCJSZXNwb25zZSBKU09OXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaHR0cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9uc2UgZW5jYXBzdWzDqWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4LiByZXBvbnNlIGR1IHNlcnZpY2UgZW4geG1sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPiB7aHR0cCA6IHtzdGF0dXM6MjAwLCBlcnJvcjpudWxsfSx4bWwgOidyw6lwb25zZSBkdSBzZXJ2aWNlJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaHR0cC5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYWxsKHNlbGYsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogcmVzcG9uc2UuaHR0cC5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogcmVzcG9uc2UuaHR0cC5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHJlc3BvbnNlLnhtbDsgLy8gcGFyIGRlZmF1dCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb25zZSBub24gZW5jYXBzdWzDqWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4LiByZXBvbnNlIGR1IHNlcnZpY2UgZW4ganNvbiBvdSB4bWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYWxsKHNlbGYsIG5ldyBFcnJvclNlcnZpY2UoXCJMZSBjb250ZW51IGRlIGxhIHJlcG9uc2UgZXN0IHZpZGUgIT9cIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gc2kgb24gc291aGFpdGUgcGFyc2VyIGxhIHJlcG9uc2UgZHUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5vcHRpb25zLm9uQmVmb3JlUGFyc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UmVzcG9uc2UgPSBzZWxmLm9wdGlvbnMub25CZWZvcmVQYXJzZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdSZXNwb25zZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGEgcmVwb25zZSBwYXJzw6llIHBhciBsJ3V0aWxpc2F0ZXVyIGVzdCByZXRvdXJuw6llIHNvdXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1lIGRlIHN0cmluZyAhXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbmV3UmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc2F1dmVnYXJkZSBkZSBsYSByZXBvbnNlIGRhbnMgbCdvYmpldCBwYXJlbnQgKENvbW1vblNlcnZpY2UpXG4gICAgICAgICAgICAgICAgc2VsZi5yZXNwb25zZSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgLy8gb24gcmVudm9pZSBsYSByZXBvbnNlLi4uXG4gICAgICAgICAgICAgICAgc3VjY2Vzcy5jYWxsKHNlbGYsIGNvbnRlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gICAgICAgICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFwiY2FsbFNlcnZpY2U6Om9uRmFpbHVyZSgpXCIpO1xuICAgICAgICAgICAgICAgIC8vIG9uIGVzdCBmb3JjZW1lbnQgc3VyIHVuZSBlcnJldXIgbGV2w6llIHBhciB1biBzZXJ2aWNlICFcbiAgICAgICAgICAgICAgICBlLnR5cGUgPSBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlI7XG4gICAgICAgICAgICAgICAgZXJyb3IuY2FsbChzZWxmLCBuZXcgRXJyb3JTZXJ2aWNlKGUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBkZSB0aW1lT3V0XG4gICAgICAgICAgICBvblRpbWVPdXQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIudHJhY2UoXCJjYWxsU2VydmljZTo6b25UaW1lT3V0KClcIik7XG4gICAgICAgICAgICAgICAgZXJyb3IuY2FsbChzZWxmLCBuZXcgRXJyb3JTZXJ2aWNlKFwiVGltZU91dCFcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFByb3RvY29sLnNlbmQob3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFuYWx5c2UgZGUgbGEgcsOpcG9uc2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gICAgICovXG4gICAgYW5hbHl6ZVJlc3BvbnNlIDogZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgICAgIC8vIElORk9cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJvdmVyd3JpdHRlbiBtZXRob2QgIVwiKTtcbiAgICAgICAgLy8gcmV0b3VybmUgbCdvYmpldCBzcMOpY2lmaXF1ZSBhdSB0eXBlIGRlIGNvbXBvc2FudCAoanNvbilcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBlcnJvci5jYWxsKHRoaXMsIFwiVGhpcyBtZXRob2QgbXVzdCBiZSBvdmVyd3JpdHRlbiAhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCBcIlRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcndyaXR0ZW4gIVwiKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1vblNlcnZpY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/CommonService.js\n"); - -/***/ }), - -/***/ "./src/Services/Config/Config.js": -/*!***************************************!*\ - !*** ./src/Services/Config/Config.js ***! - \***************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ConfigInterface */ \"./src/Services/Config/ConfigInterface.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n/**\n * @classdesc\n *\n * Recupération de la configuration de clés Géoportail sous forme de JSON\n *\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.Config\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n * @param {Sting} options.apiKey - clé(s) dont on veut obtenir la configuration. Si plusieurs clés, séparer chacune par une virgule\n * @param {Boolean} [options.sync=false] - force le mode synchrone\n * @param {String} options.customConfigFile - chemin vers un fichier de configuration personnalisé. Surcharge le paramètre apiKey.\n *\n * @example\n * var options = {\n * apiKey : \"cartes,ortho\",\n * sync : false,\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * };\n *\n */\nfunction Config(options) {\n if (!(this instanceof Config)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Config\"));\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"Config\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Config\");\n this.logger.trace(\"[Constructeur Config (options)]\");\n\n // #####################\n // analyse des options\n // #####################\n\n // gestion du callback onSuccess\n var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === \"function\");\n if (!bOnSuccess) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"onSuccess()\"));\n }\n if (!options.apiKey && !options.customConfigFile) {\n // si pas de thème spécifié, on récupère toutes les ressources possibles dans l'objet Config\n options.apiKey = \"full\";\n }\n this.options = {};\n this.options.onSuccess = options.onSuccess;\n this.options.onFailure = options.onFailure;\n\n // mode sync\n this.options.sync = options.sync || false;\n\n // gestion d'un tableau d'url des fichiers de configuration\n this.options.listConfigUrls = options.customConfigFile ? [options.customConfigFile] : !Array.isArray(options.apiKey) ? _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].Config.url(options.apiKey.split(\",\")) : _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].Config.url(options.apiKey);\n}\n\n/**\n * @lends module:Config#\n */\nConfig.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/**\n * Constructeur (alias)\n */\nConfig.prototype.constructor = Config;\n\n/**\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n * @overload\n */\nConfig.prototype.buildRequest = function (error, success) {\n // liste des urls des fichiers de configuration en JSON\n this.listConfigUrls = this.options.listConfigUrls;\n if (!this.listConfigUrls) {\n error.call(this, new Error(\"url by default not found !\"));\n return;\n }\n\n // INFO :\n // il n'y a pas de construction de requête,\n // on passe directement à l'appel des requêtes\n success.call(this, this.listConfigUrls);\n};\n\n/**\n * Récupération des configuration\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n * @overload\n */\nConfig.prototype.callService = function (error, success) {\n if (this.options.sync) {\n __callServiceSync.call(this, error, success);\n } else {\n __callService.call(this, error, success);\n }\n};\n\n/**\n * Requêtes en mode asynchrone\n *\n * @param {*} error\n * @param {*} success\n * @private\n */\nvar __callService = function __callService(error, success) {\n var _this = this;\n // liste des resultats au format JSON\n this.listConfigResults = [];\n\n // test on env. nodejs or browser\n var Fetch = null;\n if (typeof window === \"undefined\") {\n var nodefetch = __webpack_require__(/*! node-fetch */ \"node-fetch\");\n Fetch = nodefetch;\n } else {\n Fetch = window.fetch;\n }\n\n // the factory of fetch !\n var fetchFactory = function fetchFactory(url) {\n return Fetch(url, {\n credentials: \"same-origin\"\n }).then(function (response) {\n if (response.ok) {\n return response.json().then(function (json) {\n // TODO :\n // tester le contenu !\n return json;\n })[\"catch\"](function (error) {\n throw new Error(\"Exception Json : \" + error);\n });\n } else {\n throw new Error(\"Exception HTTP : \" + response.status + \" (status code) !\");\n }\n })[\"catch\"](function (error) {\n return new Promise(function (resolve, reject) {\n // eslint-disable-line no-unused-vars\n reject(error);\n });\n });\n };\n\n // construction des promises fetch\n var promises = [];\n for (var index = 0; index < this.listConfigUrls.length; index++) {\n var url = this.listConfigUrls[index];\n promises.push(fetchFactory(url));\n }\n Promise.all(promises).then(function (results) {\n if (!results) {\n throw new Error(\"results config empty !?\");\n }\n results.forEach(function (result) {\n // TODO :\n // verification des resultats\n _this.listConfigResults.push(result);\n });\n }).then(function () {\n success.call(_this, _this.listConfigResults);\n })[\"catch\"](function (e) {\n // TODO :\n // construction d'un message\n error.call(_this, e);\n });\n};\n\n/**\n * Requêtes en mode synchrone\n *\n * @param {*} error\n * @param {*} success\n * @private\n */\nvar __callServiceSync = function __callServiceSync(error, success) {\n // liste des resultats au format JSON\n this.listConfigResults = [];\n\n // FIXME :\n // boucle synchrone !\n for (var i = 0; i < this.listConfigUrls.length; i++) {\n var url = this.listConfigUrls[i];\n // TODO :\n // prévoir le CORS, headers, ...\n var request = new XMLHttpRequest();\n request.open(\"GET\", url, false);\n request.send(null);\n if (request.status === 200) {\n // TODO :\n // tester la reponse !\n var response = JSON.parse(request.responseText);\n this.listConfigResults.push(response);\n }\n }\n // callback\n if (this.listConfigResults.length !== 0) {\n success.call(this, this.listConfigResults);\n } else {\n error.call(this, new Error(\"...\"));\n }\n};\n\n/**\n * Analyse et mise en forme de la réponse en fusionnant les configurations\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n * @overload\n */\nConfig.prototype.analyzeResponse = function (error, success) {\n // fonction de merge des objects JSON\n var mergeConfig = function mergeConfig(objects) {\n // objet fusion des couches\n var allLayersConfig = {};\n // objet fusion des clés\n var allKeysConfig = {};\n // objet fusion des TMS\n var allTMSConfig = {};\n\n // on fusionne les résultat\n for (var i = 0; i < objects.length; i++) {\n if (!objects[i].generalOptions || !objects[i].layers) {\n return;\n }\n allKeysConfig = _objectSpread(_objectSpread({}, allKeysConfig), objects[i].generalOptions.apiKeys);\n allLayersConfig = _objectSpread(_objectSpread({}, allLayersConfig), objects[i].layers);\n allTMSConfig = _objectSpread(_objectSpread({}, allTMSConfig), objects[i].tileMatrixSets);\n }\n var mergedConfig = {\n generalOptions: {\n apiKeys: allKeysConfig\n },\n layers: allLayersConfig,\n tileMatrixSets: allTMSConfig\n };\n return mergedConfig;\n };\n\n // fusion des configurations JSON\n var ConfigJSON = mergeConfig(this.listConfigResults);\n if (!ConfigJSON) {\n error.call(this, new Error(\"configuration structure not conforme !\"));\n return;\n }\n\n // creation des interfaces\n var IConfig = new _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n // ajout des interfaces avec la configuration JSON\n Object.assign(IConfig, ConfigJSON);\n\n // définition de la variable globale Gp.Config\n var scope = typeof window !== \"undefined\" ? window : {};\n if (!scope.Gp) {\n scope.Gp = {};\n }\n\n // enregistrement\n if (scope.Gp.Config) {\n Object.assign(scope.Gp.Config, IConfig);\n // dans le doute..., ceinture et bretelles !\n for (var property in IConfig) {\n scope.Gp.Config[property] = IConfig[property];\n }\n } else {\n scope.Gp.Config = IConfig;\n }\n\n // INFO :\n // il n'y a pas d'analyse des résultats,\n // on passe directement à l'appel de la callback utilisateur\n success.call(this, scope.Gp.Config);\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Config);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Db25maWcvQ29uZmlnLmpzP2FjMjIiXSwibmFtZXMiOlsiQ29uZmlnIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJiT25TdWNjZXNzIiwib25TdWNjZXNzIiwiRXJyb3IiLCJhcGlLZXkiLCJjdXN0b21Db25maWdGaWxlIiwib25GYWlsdXJlIiwic3luYyIsImxpc3RDb25maWdVcmxzIiwiQXJyYXkiLCJpc0FycmF5IiwiRGVmYXVsdFVybFNlcnZpY2UiLCJ1cmwiLCJzcGxpdCIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsIkNvbW1vblNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsImNhbGwiLCJjYWxsU2VydmljZSIsIl9fY2FsbFNlcnZpY2VTeW5jIiwiX19jYWxsU2VydmljZSIsIl90aGlzIiwibGlzdENvbmZpZ1Jlc3VsdHMiLCJGZXRjaCIsIndpbmRvdyIsIm5vZGVmZXRjaCIsInJlcXVpcmUiLCJmZXRjaCIsImZldGNoRmFjdG9yeSIsImNyZWRlbnRpYWxzIiwidGhlbiIsInJlc3BvbnNlIiwib2siLCJqc29uIiwic3RhdHVzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlcyIsImluZGV4IiwibGVuZ3RoIiwicHVzaCIsImFsbCIsInJlc3VsdHMiLCJmb3JFYWNoIiwicmVzdWx0IiwiZSIsImkiLCJyZXF1ZXN0IiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwic2VuZCIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsImFuYWx5emVSZXNwb25zZSIsIm1lcmdlQ29uZmlnIiwib2JqZWN0cyIsImFsbExheWVyc0NvbmZpZyIsImFsbEtleXNDb25maWciLCJhbGxUTVNDb25maWciLCJnZW5lcmFsT3B0aW9ucyIsImxheWVycyIsIl9vYmplY3RTcHJlYWQiLCJhcGlLZXlzIiwidGlsZU1hdHJpeFNldHMiLCJtZXJnZWRDb25maWciLCJDb25maWdKU09OIiwiSUNvbmZpZyIsIkNvbmZpZ0ludGVyZmFjZSIsImFzc2lnbiIsInNjb3BlIiwiR3AiLCJwcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQWlEO0FBQ0g7QUFDRDtBQUNRO0FBQ0w7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsTUFBTUEsQ0FBRUMsT0FBTyxFQUFFO0VBQ3RCLElBQUksRUFBRSxJQUFJLFlBQVlELE1BQU0sQ0FBQyxFQUFFO0lBQzNCLE1BQU0sSUFBSUUsU0FBUyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7RUFDcEU7O0VBRUE7QUFDSjtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxTQUFTLEdBQUcsUUFBUTtFQUV6QixJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLFdBQVcsQ0FBQztFQUMzQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLGlDQUFpQyxDQUFDOztFQUVwRDtFQUNBO0VBQ0E7O0VBRUE7RUFDQSxJQUFJQyxVQUFVLEdBQUcsQ0FBQyxFQUFFVCxPQUFPLENBQUNVLFNBQVMsS0FBSyxJQUFJLElBQUksT0FBT1YsT0FBTyxDQUFDVSxTQUFTLEtBQUssVUFBVSxDQUFDO0VBQzFGLElBQUksQ0FBQ0QsVUFBVSxFQUFFO0lBQ2IsTUFBTSxJQUFJRSxLQUFLLENBQUNULGdFQUFDLENBQUNDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7RUFDakU7RUFDQSxJQUFJLENBQUNILE9BQU8sQ0FBQ1ksTUFBTSxJQUFJLENB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QUNqQjs7RUFFQTtFQUNBLElBQUlELEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxFQUFFO0lBQ2pCd0IsTUFBTSxDQUFDNEQsTUFBTSxDQUFDQyxLQUFLLENBQUNDLEVBQUUsQ0FBQ3RGLE1BQU0sRUFBRWtGLE9BQU8sQ0FBQztJQUN2QztJQUNBLEtBQUssSUFBSUssUUFBUSxJQUFJTCxPQUFPLEVBQUU7TUFDMUJHLEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxDQUFDdUYsUUFBUSxDQUFDLEdBQUdMLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDO0lBQ2pEO0VBQ0osQ0FBQyxNQUFNO0lBQ0hGLEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxHQUFHa0YsT0FBTztFQUM3Qjs7RUFFQTtFQUNBO0VBQ0E7RUFDQXBELE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLElBQUksRUFBRXNELEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxDQUFDO0FBQ3ZDLENBQUM7QUFFY0EscUVBQU0iLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQ29uZmlnL0NvbmZpZy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgQ29tbW9uU2VydmljZSBmcm9tIFwiLi4vQ29tbW9uU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuLi9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IENvbmZpZ0ludGVyZmFjZSBmcm9tIFwiLi9Db25maWdJbnRlcmZhY2VcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogUmVjdXDDqXJhdGlvbiBkZSBsYSBjb25maWd1cmF0aW9uIGRlIGNsw6lzIEfDqW9wb3J0YWlsIHNvdXMgZm9ybWUgZGUgSlNPTlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0dwLlNlcnZpY2VzLkNvbW1vblNlcnZpY2V9XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQ29uZmlnXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2UgKCsgbGVzIG9wdGlvbnMgaGVyaXTDqWVzKVxuICogQHBhcmFtIHtTdGluZ30gb3B0aW9ucy5hcGlLZXkgLSBjbMOpKHMpIGRvbnQgb24gdmV1dCBvYnRlbmlyIGxhIGNvbmZpZ3VyYXRpb24uIFNpIHBsdXNpZXVycyBjbMOpcywgc8OpcGFyZXIgY2hhY3VuZSBwYXIgdW5lIHZpcmd1bGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3luYz1mYWxzZV0gLSBmb3JjZSBsZSBtb2RlIHN5bmNocm9uZVxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuY3VzdG9tQ29uZmlnRmlsZSAtIGNoZW1pbiB2ZXJzIHVuIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBwZXJzb25uYWxpc8OpLiBTdXJjaGFyZ2UgbGUgcGFyYW3DqHRyZSBhcGlLZXkuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIGFwaUtleSA6IFwiY2FydGVzLG9ydGhvXCIsXG4gKiAgICAgIHN5bmMgOiBmYWxzZSxcbiAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAqICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7fSxcbiAqICAgfTtcbiAqXG4gKi9cbmZ1bmN0aW9uIENvbmZpZyAob3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb25maWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIiwgXCJDb25maWdcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vbSBkZSBsYSBjbGFzc2UgKGhlcml0YWdlKVxuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJDb25maWdcIjtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkdwLkNvbmZpZ1wiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgQ29uZmlnIChvcHRpb25zKV1cIik7XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgICAvLyBhbmFseXNlIGRlcyBvcHRpb25zXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvLyBnZXN0aW9uIGR1IGNhbGxiYWNrIG9uU3VjY2Vzc1xuICAgIHZhciBiT25TdWNjZXNzID0gISEob3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25TdWNjZXNzID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIGlmICghYk9uU3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcIm9uU3VjY2VzcygpXCIpKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmFwaUtleSAmJiAhb3B0aW9ucy5jdXN0b21Db25maWdGaWxlKSB7XG4gICAgICAgIC8vIHNpIHBhcyBkZSB0aMOobWUgc3DDqWNpZmnDqSwgb24gcsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHJlc3NvdXJjZXMgcG9zc2libGVzIGRhbnMgbCdvYmpldCBDb25maWdcbiAgICAgICAgb3B0aW9ucy5hcGlLZXkgPSBcImZ1bGxcIjtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgdGhpcy5vcHRpb25zLm9uU3VjY2VzcyA9IG9wdGlvbnMub25TdWNjZXNzO1xuICAgIHRoaXMub3B0aW9ucy5vbkZhaWx1cmUgPSBvcHRpb25zLm9uRmFpbHVyZTtcblxuICAgIC8vIG1vZGUgc3luY1xuICAgIHRoaXMub3B0aW9ucy5zeW5jID0gb3B0aW9ucy5zeW5jIHx8IGZhbHNlO1xuXG4gICAgLy8gZ2VzdGlvbiBkJ3VuIHRhYmxlYXUgZCd1cmwgZGVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm9wdGlvbnMubGlzdENvbmZpZ1VybHMgPSAob3B0aW9ucy5jdXN0b21Db25maWdGaWxlKVxuICAgICAgICA/IFtvcHRpb25zLmN1c3RvbUNvbmZpZ0ZpbGVdXG4gICAgICAgIDogIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hcGlLZXkpXG4gICAgICAgICAgICA/IERlZmF1bHRVcmxTZXJ2aWNlLkNvbmZpZy51cmwob3B0aW9ucy5hcGlLZXkuc3BsaXQoXCIsXCIpKVxuICAgICAgICAgICAgOiBEZWZhdWx0VXJsU2VydmljZS5Db25maWcudXJsKG9wdGlvbnMuYXBpS2V5KTtcbn1cblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOkNvbmZpZyNcbiAqL1xuQ29uZmlnLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qKlxuICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAqL1xuQ29uZmlnLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmZpZztcblxuLyoqXG4gKiBDcsOpYXRpb24gZGUgbGEgcmVxdcOqdGVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICogQG92ZXJsb2FkXG4gKi9cbkNvbmZpZy5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gbGlzdGUgZGVzIHVybHMgZGVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24gZW4gSlNPTlxuICAgIHRoaXMubGlzdENvbmZpZ1VybHMgPSB0aGlzLm9wdGlvbnMubGlzdENvbmZpZ1VybHM7XG5cbiAgICBpZiAoIXRoaXMubGlzdENvbmZpZ1VybHMpIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3IoXCJ1cmwgYnkgZGVmYXVsdCBub3QgZm91bmQgIVwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJTkZPIDpcbiAgICAvLyBpbCBuJ3kgYSBwYXMgZGUgY29uc3RydWN0aW9uIGRlIHJlcXXDqnRlLFxuICAgIC8vIG9uIHBhc3NlIGRpcmVjdGVtZW50IMOgIGwnYXBwZWwgZGVzIHJlcXXDqnRlc1xuICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLmxpc3RDb25maWdVcmxzKTtcbn07XG5cbi8qKlxuICogUsOpY3Vww6lyYXRpb24gZGVzIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICogQG92ZXJsb2FkXG4gKi9cbkNvbmZpZy5wcm90b3R5cGUuY2FsbFNlcnZpY2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN5bmMpIHtcbiAgICAgICAgX19jYWxsU2VydmljZVN5bmMuY2FsbCh0aGlzLCBlcnJvciwgc3VjY2Vzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX19jYWxsU2VydmljZS5jYWxsKHRoaXMsIGVycm9yLCBzdWNjZXNzKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJlcXXDqnRlcyBlbiBtb2RlIGFzeW5jaHJvbmVcbiAqXG4gKiBAcGFyYW0geyp9IGVycm9yXG4gKiBAcGFyYW0geyp9IHN1Y2Nlc3NcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBfX2NhbGxTZXJ2aWNlID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gbGlzdGUgZGVzIHJlc3VsdGF0cyBhdSBmb3JtYXQgSlNPTlxuICAgIHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMgPSBbXTtcblxuICAgIC8vIHRlc3Qgb24gZW52LiBub2RlanMgb3IgYnJvd3NlclxuICAgIGxldCBGZXRjaCA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmFyIG5vZGVmZXRjaCA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpO1xuICAgICAgICBGZXRjaCA9IG5vZGVmZXRjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBGZXRjaCA9IHdpbmRvdy5mZXRjaDtcbiAgICB9XG5cbiAgICAvLyB0aGUgZmFjdG9yeSBvZiBmZXRjaCAhXG4gICAgdmFyIGZldGNoRmFjdG9yeSA9ICh1cmwpID0+IHtcbiAgICAgICAgcmV0dXJuIEZldGNoKHVybCwgeyBjcmVkZW50aWFscyA6IFwic2FtZS1vcmlnaW5cIiB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVzdGVyIGxlIGNvbnRlbnUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gSnNvbiA6IFwiICsgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIEhUVFAgOiBcIiArIHJlc3BvbnNlLnN0YXR1cyArIFwiIChzdGF0dXMgY29kZSkgIVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBjb25zdHJ1Y3Rpb24gZGVzIHByb21pc2VzIGZldGNoXG4gICAgdmFyIHByb21pc2VzID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMubGlzdENvbmZpZ1VybHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubGlzdENvbmZpZ1VybHNbaW5kZXhdO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZldGNoRmFjdG9yeSh1cmwpKTtcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3VsdHMgY29uZmlnIGVtcHR5ICE/XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIDpcbiAgICAgICAgICAgICAgICAvLyB2ZXJpZmljYXRpb24gZGVzIHJlc3VsdGF0c1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLmxpc3RDb25maWdSZXN1bHRzKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPIDpcbiAgICAgICAgICAgIC8vIGNvbnN0cnVjdGlvbiBkJ3VuIG1lc3NhZ2VcbiAgICAgICAgICAgIGVycm9yLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH0pO1xufTtcblxuLyoqXG4gKiBSZXF1w6p0ZXMgZW4gbW9kZSBzeW5jaHJvbmVcbiAqXG4gKiBAcGFyYW0geyp9IGVycm9yXG4gKiBAcGFyYW0geyp9IHN1Y2Nlc3NcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBfX2NhbGxTZXJ2aWNlU3luYyA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIC8vIGxpc3RlIGRlcyByZXN1bHRhdHMgYXUgZm9ybWF0IEpTT05cbiAgICB0aGlzLmxpc3RDb25maWdSZXN1bHRzID0gW107XG5cbiAgICAvLyBGSVhNRSA6XG4gICAgLy8gYm91Y2xlIHN5bmNocm9uZSAhXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpc3RDb25maWdVcmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubGlzdENvbmZpZ1VybHNbaV07XG4gICAgICAgIC8vIFRPRE8gOlxuICAgICAgICAvLyBwcsOpdm9pciBsZSBDT1JTLCBoZWFkZXJzLCAuLi5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdXJsLCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Quc2VuZChudWxsKTtcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIC8vIFRPRE8gOlxuICAgICAgICAgICAgLy8gdGVzdGVyIGxhIHJlcG9uc2UgIVxuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RDb25maWdSZXN1bHRzLnB1c2gocmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNhbGxiYWNrXG4gICAgaWYgKHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLmxpc3RDb25maWdSZXN1bHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvcihcIi4uLlwiKSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBbmFseXNlIGV0IG1pc2UgZW4gZm9ybWUgZGUgbGEgcsOpcG9uc2UgZW4gZnVzaW9ubmFudCBsZXMgY29uZmlndXJhdGlvbnNcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICogQG92ZXJsb2FkXG4gKi9cbkNvbmZpZy5wcm90b3R5cGUuYW5hbHl6ZVJlc3BvbnNlID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gZm9uY3Rpb24gZGUgbWVyZ2UgZGVzIG9iamVjdHMgSlNPTlxuICAgIHZhciBtZXJnZUNvbmZpZyA9IGZ1bmN0aW9uIChvYmplY3RzKSB7XG4gICAgICAgIC8vIG9iamV0IGZ1c2lvbiBkZXMgY291Y2hlc1xuICAgICAgICB2YXIgYWxsTGF5ZXJzQ29uZmlnID0ge307XG4gICAgICAgIC8vIG9iamV0IGZ1c2lvbiBkZXMgY2zDqXNcbiAgICAgICAgdmFyIGFsbEtleXNDb25maWcgPSB7fTtcbiAgICAgICAgLy8gb2JqZXQgZnVzaW9uIGRlcyBUTVNcbiAgICAgICAgdmFyIGFsbFRNU0NvbmZpZyA9IHt9O1xuXG4gICAgICAgIC8vIG9uIGZ1c2lvbm5lIGxlcyByw6lzdWx0YXRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIW9iamVjdHNbaV0uZ2VuZXJhbE9wdGlvbnMgfHwgIW9iamVjdHNbaV0ubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxsS2V5c0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxLZXlzQ29uZmlnLFxuICAgICAgICAgICAgICAgIC4uLm9iamVjdHNbaV0uZ2VuZXJhbE9wdGlvbnMuYXBpS2V5c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFsbExheWVyc0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxMYXllcnNDb25maWcsXG4gICAgICAgICAgICAgICAgLi4ub2JqZWN0c1tpXS5sYXllcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhbGxUTVNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4uYWxsVE1TQ29uZmlnLFxuICAgICAgICAgICAgICAgIC4uLm9iamVjdHNbaV0udGlsZU1hdHJpeFNldHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWVyZ2VkQ29uZmlnID0ge1xuICAgICAgICAgICAgZ2VuZXJhbE9wdGlvbnMgOiB7XG4gICAgICAgICAgICAgICAgYXBpS2V5cyA6IGFsbEtleXNDb25maWdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXllcnMgOiBhbGxMYXllcnNDb25maWcsXG4gICAgICAgICAgICB0aWxlTWF0cml4U2V0cyA6IGFsbFRNU0NvbmZpZ1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWVyZ2VkQ29uZmlnO1xuICAgIH07XG5cbiAgICAvLyBmdXNpb24gZGVzIGNvbmZpZ3VyYXRpb25zIEpTT05cbiAgICB2YXIgQ29uZmlnSlNPTiA9IG1lcmdlQ29uZmlnKHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMpO1xuICAgIGlmICghQ29uZmlnSlNPTikge1xuICAgICAgICBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvcihcImNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIG5vdCBjb25mb3JtZSAhXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNyZWF0aW9uIGRlcyBpbnRlcmZhY2VzXG4gICAgdmFyIElDb25maWcgPSBuZXcgQ29uZmlnSW50ZXJmYWNlKCk7XG4gICAgLy8gYWpvdXQgZGVzIGludGVyZmFjZXMgYXZlYyBsYSBjb25maWd1cmF0aW9uIEpTT05cbiAgICBPYmplY3QuYXNzaWduKElDb25maWcsIENvbmZpZ0pTT04pO1xuXG4gICAgLy8gZMOpZmluaXRpb24gZGUgbGEgdmFyaWFibGUgZ2xvYmFsZSBHcC5Db25maWdcbiAgICB2YXIgc2NvcGUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge307XG4gICAgaWYgKCFzY29wZS5HcCkge1xuICAgICAgICBzY29wZS5HcCA9IHt9O1xuICAgIH1cblxuICAgIC8vIGVucmVnaXN0cmVtZW50XG4gICAgaWYgKHNjb3BlLkdwLkNvbmZpZykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNjb3BlLkdwLkNvbmZpZywgSUNvbmZpZyk7XG4gICAgICAgIC8vIGRhbnMgbGUgZG91dGUuLi4sIGNlaW50dXJlIGV0IGJyZXRlbGxlcyAhXG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIElDb25maWcpIHtcbiAgICAgICAgICAgIHNjb3BlLkdwLkNvbmZpZ1twcm9wZXJ0eV0gPSBJQ29uZmlnW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHNjb3BlLkdwLkNvbmZpZyA9IElDb25maWc7XG4gICAgfVxuXG4gICAgLy8gSU5GTyA6XG4gICAgLy8gaWwgbid5IGEgcGFzIGQnYW5hbHlzZSBkZXMgcsOpc3VsdGF0cyxcbiAgICAvLyBvbiBwYXNzZSBkaXJlY3RlbWVudCDDoCBsJ2FwcGVsIGRlIGxhIGNhbGxiYWNrIHV0aWxpc2F0ZXVyXG4gICAgc3VjY2Vzcy5jYWxsKHRoaXMsIHNjb3BlLkdwLkNvbmZpZyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb25maWc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Config/Config.js\n"); - -/***/ }), - -/***/ "./src/Services/Config/ConfigInterface.js": -/*!************************************************!*\ - !*** ./src/Services/Config/ConfigInterface.js ***! - \************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Object} generalOptions - General properties for default map configuration resources.\n * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key.\n * @property {String} generalOptions.title - Underlying web service Title.\n * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array.\n * @property {String} generalOptions.theme - default theme (FIXME : for what ?)\n * @property {Array.} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel.\n * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}).\n * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}).\n *\n * @namespace\n * @alias Gp.Services.GetConfigInterface\n */\nfunction ConfigInterface() {\n if (!(this instanceof ConfigInterface)) {\n throw new TypeError(\"ConfigInterface constructor cannot be called as a function.\");\n }\n this.generalOptions = {\n apiKeys: {},\n title: null,\n defaultGMLGFIStyle: null,\n theme: null,\n wgs84Resolutions: []\n };\n this.layers = {};\n this.tileMatrixSets = {};\n}\nConfigInterface.prototype = {\n /*\n * Constructor (alias)\n */\n constructor: ConfigInterface,\n /**\n * Check if config is loaded for a given key\n *\n * @param {String} apiKey - Access key to Geoportal platform\n * @returns {Boolean} isKeyConfLoaded - true if config of the key is already loaded, false otherwise\n */\n isKeyConfLoaded: function isKeyConfLoaded(apiKey) {\n if (!apiKey) {\n return;\n }\n if (this.generalOptions.apiKeys[apiKey]) {\n return true;\n }\n return false;\n },\n /**\n * Returns an array of Geoportal layers identifiers, corresponding to an API contract key.\n *\n * @param {String} apiKey - Access key to Geoportal platform\n * @returns {Array} apiKeys - Array of geoportal layers identifiers\n */\n getLayersId: function getLayersId(apiKey) {\n return this.generalOptions.apiKeys[apiKey];\n },\n /**\n * Returns the id of a Geoportal layer with its name and its service.\n *\n * @param {String} layerName - name of the layer (ex. \"ORTHOIMAGERY.ORTHOPHOTOS\")\n * @param {String} service - name of the service (ex. \"WMS\" ou \"WMTS\")\n * @returns {String} Id of the layer (ex. \"ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS\")\n */\n getLayerId: function getLayerId(layerName, service) {\n if (!layerName || !service) {\n return;\n }\n var layerId = null;\n\n // layer\n // key : [layerName]$[contexte]:OGC:[service]\n // ex : \"ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS\"\n\n // service\n // key : [layerName]$[contexte];[service]\n // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode\n\n if (this.layers) {\n var layers = this.layers;\n for (var key in layers) {\n if (layers.hasOwnProperty(key)) {\n var parts = key.split(\"$\");\n if (layerName === parts[0]) {\n if (parts[1]) {\n var servicePartsLayer = parts[1].split(\":\");\n var servicePartsService = parts[1].split(\";\");\n if (servicePartsService[1] === service.toUpperCase()) {\n layerId = key;\n break;\n }\n if (servicePartsLayer[2] === service.toUpperCase()) {\n layerId = key;\n break;\n }\n }\n }\n }\n }\n }\n if (!layerId) {\n return;\n }\n return layerId;\n },\n /**\n * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key.\n * If no key is specified, all layers from configuration are returned.\n *\n * @param {String} apiKey - Access key to Geoportal platform\n * @returns {Object} layers - Object which properties are layers identifiers.\n */\n getLayersConf: function getLayersConf(apiKey) {\n var layers = {};\n var layersIdArray = this.getLayersId(apiKey);\n if (layersIdArray) {\n for (var i = 0; i < layersIdArray.length; i++) {\n var lyrId = layersIdArray[i];\n layers[lyrId] = this.layers[lyrId];\n }\n }\n return layers;\n },\n /**\n * Returns a geoportal layer configuration, given its identifier\n *\n * @param {String} layerId - Geoportal layer identifier (e.g. \"GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS\")\n * @return {Object} layer - Layer configuration\n */\n getLayerConf: function getLayerConf(layerId) {\n if (!this.layers) {\n return;\n }\n return this.layers[layerId];\n },\n /**\n * Get all parameters needed to display a WMS or WMTS layer given its name, its service and its key\n *\n * @param {String} layerName - name of the layer (ex. \"ORTHOIMAGERY.ORTHOPHOTOS\")\n * @param {String} service - name of the service (ex. \"WMS\" ou \"WMTS\")\n * @param {String} [apiKey] - Contract API key\n * @returns {Object} params - params of the service (WMS or WMTS) for the given layer\n * @returns {String} params.url - Url of the service to reach to display the layer\n * @returns {String} params.version - Version of the service\n * @returns {String} params.styles - Default style of the layer\n * @returns {String} params.format - Default format of the layer\n * @returns {String} params.projection - Default projection of the layer\n * @returns {Number} params.minScale - Min scale denominator of the layer\n * @returns {Number} params.maxScale - Max scale denominator of the layer\n * @returns {Gp.BBox} params.extent - Extent of the layer, in the projection of the layer\n * @returns {Array} params.legends - Array of legends associated to the layer\n * @returns {Array} params.title - Name of the layer, readable by a human\n * @returns {Array} params.description - Description of the layer\n * @returns {String} params.[TMSLink] - Id of the Tile Matrix Set (TMS), in the case of WMTS layer\n * @returns {Gp.Point} params.[matrixOrigin] - Originof the tile matrix (top left corner), in the case of WMTS layer\n * @returns {Array} params.[nativeResolutions] - Array with the resolution of each level of the tile matrix set, in the case of WMTS layer\n * @returns {Array} params.[matrixIds] - Array with the ID of each level of the tile matrix set, in the case of WMTS layer\n */\n getLayerParams: function getLayerParams(layerName, service) {\n var params = {};\n if ((service === \"WMS\" || Object.keys(this.tileMatrixSets).length !== 0) && Object.keys(this.layers).length !== 0) {\n // get the layerId of the layer\n var layerId = this.getLayerId(layerName, service);\n if (layerId) {\n // get the layer Conf Object\n var layerConf = this.getLayerConf(layerId);\n var keys = this.getLayerKey(layerId);\n if (keys.length === 0) {\n return;\n }\n\n // get services params\n for (var i = 0; i < keys.length; i++) {\n // only one serverUrl is saved in Gp.Config : with multiKeys, we have to retrieve the key used in the serverUrl property\n if (layerConf.serviceParams.serverUrl[keys[i]]) {\n params.url = layerConf.serviceParams.serverUrl[keys[i]];\n }\n }\n var wmsTypeRegex = /\\/v\\//;\n // WMS vector style always empty (not in getCap)\n if (wmsTypeRegex.test(params.url)) {\n params.styles = \" \";\n } else {\n // WMS raster style is defined in getCap\n params.styles = layerConf.styles[0].name;\n }\n params.version = layerConf.serviceParams.version;\n params.format = layerConf.formats[0].name;\n params.projection = layerConf.defaultProjection;\n\n // get layer info and constraints\n params.minScale = layerConf.globalConstraint.minScaleDenominator;\n params.maxScale = layerConf.globalConstraint.maxScaleDenominator;\n params.extent = layerConf.globalConstraint.bbox;\n params.legends = layerConf.legends;\n params.title = layerConf.title;\n params.description = layerConf.description;\n if (service === \"WMS\") {\n params.metadata = layerConf.metadata;\n }\n\n // Informations non disponibles avec les getCap\n // params.metadata = layerConf.getMetadata();\n // params.originators = layerConf.getOriginators();\n // params.quicklookUrl = layerConf.getQuicklookUrl();\n\n // WMTS : get the tileMatrixSetLimits\n if (layerConf.wmtsOptions) {\n params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits;\n var TMSLink = layerConf.wmtsOptions.tileMatrixSetLink;\n if (TMSLink) {\n params.TMSLink = TMSLink;\n var tmsConf = this.getTMSConf(TMSLink);\n // Get matrix origin : Gp.Point = Object{x:Float, y:Float}\n // params.matrixOrigin = tmsConf.getTopLeftCorner();\n params.matrixIds = Object.keys(tmsConf.tileMatrices);\n params.tileMatrices = tmsConf.tileMatrices;\n // by default, pseudo mercator resolutions\n params.nativeResolutions = tmsConf.nativeResolutions || this.getTMSConf(\"PM\").nativeResolutions;\n }\n }\n }\n }\n return params;\n },\n /**\n * Get the contract key(s) associated to a given layer.\n *\n * @param {String} layerId - Geoportal layer identifier (e.g. \"GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS\")\n * @return {Array} layerKey - array of key(s) associated to the given layer\n */\n getLayerKey: function getLayerKey(layerId) {\n var layerKey = [];\n if (this.generalOptions && this.generalOptions.apiKeys && Object.keys(this.generalOptions.apiKeys).length !== 0) {\n var resourcesByKey = this.generalOptions.apiKeys;\n for (var key in resourcesByKey) {\n var resourcesArray = resourcesByKey[key];\n resourcesArray.forEach(function (arrayLayerId) {\n if (arrayLayerId === layerId) {\n layerKey.push(key);\n }\n });\n }\n }\n return layerKey;\n },\n /**\n * Returns an associative array of Tile Matrix Sets configurations.\n *\n * @return {Object} tileMatrixSets - Object which properties are TMS identifiers\n *\n */\n getTileMatrixSets: function getTileMatrixSets() {\n return this.tileMatrixSets;\n },\n /**\n * Returns a Tile Matrix Sets configuration, given its identifier.\n *\n * @param {String} tmsID - Tile Matrix Set identifier (e.g. : \"PM\")\n * @return {Object} tileMatrixSet - Tile Matrix Set configuration\n */\n getTMSConf: function getTMSConf(tmsID) {\n if (!this.tileMatrixSets) {\n return;\n }\n return this.tileMatrixSets[tmsID];\n },\n /**\n * Get global constraints for a given Layer : extent, minScale, maxScale, projection\n *\n * @param {String} layerId - Geoportal layer identifier (e.g. \"GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS\")\n * @returns {Object} params - layer constraints\n * @returns {String} params.projection - default layer projection\n * @returns {Number} params.minScale - layer min scale denominator\n * @returns {Number} params.maxScale - layer max scale denominator\n * @returns {Gp.BBox} params.extent - layer extent expressed in the layer projection\n */\n getGlobalConstraints: function getGlobalConstraints(layerId) {\n var params = {};\n if (layerId) {\n // get layer configuration object\n var layerConf = this.getLayerConf(layerId);\n params.projection = layerConf.defaultProjection;\n params.minScale = layerConf.globalConstraint.minScaleDenominator;\n params.maxScale = layerConf.globalConstraint.maxScaleDenominator;\n params.extent = layerConf.globalConstraint.bbox;\n }\n return params;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ConfigInterface);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Db25maWcvQ29uZmlnSW50ZXJmYWNlLmpzPzQyYjQiXSwibmFtZXMiOlsiQ29uZmlnSW50ZXJmYWNlIiwiVHlwZUVycm9yIiwiZ2VuZXJhbE9wdGlvbnMiLCJhcGlLZXlzIiwidGl0bGUiLCJkZWZhdWx0R01MR0ZJU3R5bGUiLCJ0aGVtZSIsIndnczg0UmVzb2x1dGlvbnMiLCJsYXllcnMiLCJ0aWxlTWF0cml4U2V0cyIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIiwiaXNLZXlDb25mTG9hZGVkIiwiYXBpS2V5IiwiZ2V0TGF5ZXJzSWQiLCJnZXRMYXllcklkIiwibGF5ZXJOYW1lIiwic2VydmljZSIsImxheWVySWQiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcnRzIiwic3BsaXQiLCJzZXJ2aWNlUGFydHNMYXllciIsInNlcnZpY2VQYXJ0c1NlcnZpY2UiLCJ0b1VwcGVyQ2FzZSIsImdldExheWVyc0NvbmYiLCJsYXllcnNJZEFycmF5IiwiaSIsImxlbmd0aCIsImx5cklkIiwiZ2V0TGF5ZXJDb25mIiwiZ2V0TGF5ZXJQYXJhbXMiLCJwYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwibGF5ZXJDb25mIiwiZ2V0TGF5ZXJLZXkiLCJzZXJ2aWNlUGFyYW1zIiwic2VydmVyVXJsIiwidXJsIiwid21zVHlwZVJlZ2V4IiwidGVzdCIsInN0eWxlcyIsIm5hbWUiLCJ2ZXJzaW9uIiwiZm9ybWF0IiwiZm9ybWF0cyIsInByb2plY3Rpb24iLCJkZWZhdWx0UHJvamVjdGlvbiIsIm1pblNjYWxlIiwiZ2xvYmFsQ29uc3RyYWludCIsIm1pblNjYWxlRGVub21pbmF0b3IiLCJtYXhTY2FsZSIsIm1heFNjYWxlRGVub21pbmF0b3IiLCJleHRlbnQiLCJiYm94IiwibGVnZW5kcyIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJ3bXRzT3B0aW9ucyIsInRpbGVNYXRyaXhTZXRMaW1pdHMiLCJUTVNMaW5rIiwidGlsZU1hdHJpeFNldExpbmsiLCJ0bXNDb25mIiwiZ2V0VE1TQ29uZiIsIm1hdHJpeElkcyIsInRpbGVNYXRyaWNlcyIsIm5hdGl2ZVJlc29sdXRpb25zIiwibGF5ZXJLZXkiLCJyZXNvdXJjZXNCeUtleSIsInJlc291cmNlc0FycmF5IiwiZm9yRWFjaCIsImFycmF5TGF5ZXJJZCIsInB1c2giLCJnZXRUaWxlTWF0cml4U2V0cyIsInRtc0lEIiwiZ2V0R2xvYmFsQ29uc3RyYWludHMiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsZUFBZUEsQ0FBQSxFQUFJO0VBQ3hCLElBQUksRUFBRSxJQUFJLFlBQVlBLGVBQWUsQ0FBQyxFQUFFO0lBQ3BDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLDZEQUE2RCxDQUFDO0VBQ3RGO0VBRUEsSUFBSSxDQUFDQyxjQUFjLEdBQUc7SUFDbEJDLE9BQU8sRUFBRyxDQUFDLENBQUM7SUFDWkMsS0FBSyxFQUFHLElBQUk7SUFDWkMsa0JBQWtCLEVBQUcsSUFBSTtJQUN6QkMsS0FBSyxFQUFHLElBQUk7SUFDWkMsZ0JBQWdCLEVBQUc7RUFDdkIsQ0FBQztFQUVELElBQUksQ0FBQ0MsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUVoQixJQUFJLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDNUI7QUFFQVQsZUFBZSxDQUFDVSxTQUFTLEdBQUc7RUFFeEI7QUFDSjtBQUNBO0VBQ0lDLFdBQVcsRUFBR1gsZUFBZTtFQUU3QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSVksZUFBZSxFQUFHLFNBQUFBLGdCQUFVQyxNQUFNLEVBQUU7SUFDaEMsSUFBSSxDQUFDQSxNQUFNLEVBQUU7TUFDVDtJQUNKO0lBQ0EsSUFBSSxJQUFJLENBQUNYLGNBQWMsQ0FBQ0MsT0FBTyxDQUFDVSxNQUFNLENBQUMsRUFBRTtNQUNyQyxPQUFPLElBQUk7SUFDZjtJQUNB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Q0FBQztNQUNOO0lBQ0o7SUFDQSxPQUFPa0QsUUFBUTtFQUNuQixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lNLGlCQUFpQixFQUFHLFNBQUFBLGtCQUFBLEVBQVk7SUFDNUIsT0FBTyxJQUFJLENBQUNsRSxjQUFjO0VBQzlCLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXdELFVBQVUsRUFBRyxTQUFBQSxXQUFVVyxLQUFLLEVBQUU7SUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQ25FLGNBQWMsRUFBRTtNQUN0QjtJQUNKO0lBQ0EsT0FBTyxJQUFJLENBQUNBLGNBQWMsQ0FBQ21FLEtBQUssQ0FBQztFQUNyQyxDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsb0JBQW9CLEVBQUcsU0FBQUEscUJBQVUzRCxPQUFPLEVBQUU7SUFDdEMsSUFBSWUsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLElBQUlmLE9BQU8sRUFBRTtNQUNUO01BQ0EsSUFBSWtCLFNBQVMsR0FBRyxJQUFJLENBQUNMLFlBQVksQ0FBQ2IsT0FBTyxDQUFDO01BQzFDZSxNQUFNLENBQUNlLFVBQVUsR0FBR1osU0FBUyxDQUFDYSxpQkFBaUI7TUFDL0NoQixNQUFNLENBQUNpQixRQUFRLEdBQUdkLFNBQVMsQ0FBQ2UsZ0JBQWdCLENBQUNDLG1CQUFtQjtNQUNoRW5CLE1BQU0sQ0FBQ29CLFFBQVEsR0FBR2pCLFNBQVMsQ0FBQ2UsZ0JBQWdCLENBQUNHLG1CQUFtQjtNQUNoRXJCLE1BQU0sQ0FBQ3NCLE1BQU0sR0FBR25CLFNBQVMsQ0FBQ2UsZ0JBQWdCLENBQUNLLElBQUk7SUFDbkQ7SUFFQSxPQUFPdkIsTUFBTTtFQUNqQjtBQUVKLENBQUM7QUFFY2pDLDhFQUFlIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0NvbmZpZy9Db25maWdJbnRlcmZhY2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2VzfmdldENvbmZpZyBHcC5TZXJ2aWNlcy5nZXRDb25maWcgKCl9IGludm9jYXRpb24gd2hlbiBzdWNjZXNzZnVsLiBSZWNlaXZlZCBhcyB0aGUgYXJndW1lbnQgb2Ygb25TdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBnZW5lcmFsT3B0aW9ucyAtIEdlbmVyYWwgcHJvcGVydGllcyBmb3IgZGVmYXVsdCBtYXAgY29uZmlndXJhdGlvbiByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gZ2VuZXJhbE9wdGlvbnMuYXBpS2V5cyAtIE9iamVjdCB0aGF0IGFzc29jaWF0ZXMgYXBpS2V5IChzKSB3aXRoIGFuIGFycmF5IG9mIHJlc291cmNlcyBJRHMgYXZhaWxhYmxlcyB3aXRoIHRoYXQga2V5LlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGdlbmVyYWxPcHRpb25zLnRpdGxlIC0gVW5kZXJseWluZyB3ZWIgc2VydmljZSBUaXRsZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBnZW5lcmFsT3B0aW9ucy5kZWZhdWx0R01MR0ZJU3R5bGUgLSBYU0wgVVJMIHVzZWQgYnkgZGVmYXVsdCB0byB0cmFuc2xhdGUgYW4gWE1MIEdldEZlYXR1cmVJbmZvIHJlc3BvbnNlIGludG8gYW4gSFRNTCBhcnJheS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBnZW5lcmFsT3B0aW9ucy50aGVtZSAtIGRlZmF1bHQgdGhlbWUgKEZJWE1FIDogZm9yIHdoYXQgPylcbiAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZsb2F0Pn0gZ2VuZXJhbE9wdGlvbnMud2dzODRSZXNvbHV0aW9ucyAtIGdlb2dyYXBoaWNhbCByZXNvbHV0aW9ucyBBcnJheSBmb3IgZWFjaCBbem9vbSBsZXZlbCBvZiB0aGUgR2VvcG9ydGFsIHBsYXRmb3JtXXtAbGluayBodHRwOi8vYXBpLmlnbi5mci90ZWNoLWRvY3MtanMvd2VibWFzdGVyL2xheWVycy5odG1sI0dlb3BvcnRhbF9yZXNvbHV0aW9uc30gZnJvbSAwIHRvIDIxLiBFeHByZXNzZWQgaW4gZGVncmVlcy9waXhlbC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsYXllcnMgLSBBc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIHJlc291cmNlcyBhdmFpbGFibGVzIElEcyAoa2V5cykgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICh2YWx1ZXMgZ2l2ZW4gYXMge0BsaW5rIEdwLlNlcnZpY2VzLkNvbmZpZy5MYXllcn0pLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbGVNYXRyaXhTZXRzIC0gQXNzb2NpYXRpdmUgQXJyYXkgbWFwcGluZyBUaWxlTWF0cml4U2V0cyBJRHMgKGtleXMpIGF2YWlsYWJsZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICh2YWx1ZXMgZ2l2ZW4gYXMge0BsaW5rIEdwLlNlcnZpY2VzLkNvbmZpZy5UaWxlTWF0cml4U2V0fSkuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdldENvbmZpZ0ludGVyZmFjZVxuICovXG5mdW5jdGlvbiBDb25maWdJbnRlcmZhY2UgKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb25maWdJbnRlcmZhY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25maWdJbnRlcmZhY2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmdlbmVyYWxPcHRpb25zID0ge1xuICAgICAgICBhcGlLZXlzIDoge30sXG4gICAgICAgIHRpdGxlIDogbnVsbCxcbiAgICAgICAgZGVmYXVsdEdNTEdGSVN0eWxlIDogbnVsbCxcbiAgICAgICAgdGhlbWUgOiBudWxsLFxuICAgICAgICB3Z3M4NFJlc29sdXRpb25zIDogW11cbiAgICB9O1xuXG4gICAgdGhpcy5sYXllcnMgPSB7fTtcblxuICAgIHRoaXMudGlsZU1hdHJpeFNldHMgPSB7fTtcbn1cblxuQ29uZmlnSW50ZXJmYWNlLnByb3RvdHlwZSA9IHtcblxuICAgIC8qXG4gICAgICogQ29uc3RydWN0b3IgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogQ29uZmlnSW50ZXJmYWNlLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uZmlnIGlzIGxvYWRlZCBmb3IgYSBnaXZlbiBrZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBhcGlLZXkgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybVxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBpc0tleUNvbmZMb2FkZWQgLSB0cnVlIGlmIGNvbmZpZyBvZiB0aGUga2V5IGlzIGFscmVhZHkgbG9hZGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBpc0tleUNvbmZMb2FkZWQgOiBmdW5jdGlvbiAoYXBpS2V5KSB7XG4gICAgICAgIGlmICghYXBpS2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2VuZXJhbE9wdGlvbnMuYXBpS2V5c1thcGlLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgR2VvcG9ydGFsIGxheWVycyBpZGVudGlmaWVycywgY29ycmVzcG9uZGluZyB0byBhbiBBUEkgY29udHJhY3Qga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFwaUtleSAtIEFjY2VzcyBrZXkgdG8gR2VvcG9ydGFsIHBsYXRmb3JtXG4gICAgICogQHJldHVybnMge0FycmF5fSBhcGlLZXlzIC0gQXJyYXkgb2YgZ2VvcG9ydGFsIGxheWVycyBpZGVudGlmaWVyc1xuICAgICAqL1xuICAgIGdldExheWVyc0lkIDogZnVuY3Rpb24gKGFwaUtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmFsT3B0aW9ucy5hcGlLZXlzW2FwaUtleV07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlkIG9mIGEgR2VvcG9ydGFsIGxheWVyIHdpdGggaXRzIG5hbWUgYW5kIGl0cyBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVyTmFtZSAtIG5hbWUgb2YgdGhlIGxheWVyIChleC4gXCJPUlRIT0lNQUdFUlkuT1JUSE9QSE9UT1NcIilcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmljZSAgIC0gbmFtZSBvZiB0aGUgc2VydmljZSAoZXguIFwiV01TXCIgb3UgXCJXTVRTXCIpXG4gICAgICogQHJldHVybnMge1N0cmluZ30gSWQgb2YgdGhlIGxheWVyIChleC4gXCJPUlRIT0lNQUdFUlkuT1JUSE9QSE9UT1MkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqL1xuICAgIGdldExheWVySWQgOiBmdW5jdGlvbiAobGF5ZXJOYW1lLCBzZXJ2aWNlKSB7XG4gICAgICAgIGlmICghbGF5ZXJOYW1lIHx8ICFzZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxheWVySWQgPSBudWxsO1xuXG4gICAgICAgIC8vIGxheWVyXG4gICAgICAgIC8vIGtleSA6IFtsYXllck5hbWVdJFtjb250ZXh0ZV06T0dDOltzZXJ2aWNlXVxuICAgICAgICAvLyBleCA6IFwiT1JUSE9JTUFHRVJZLk9SVEhPUEhPVE9TJEdFT1BPUlRBSUw6T0dDOldNVFNcIlxuXG4gICAgICAgIC8vIHNlcnZpY2VcbiAgICAgICAgLy8ga2V5IDogW2xheWVyTmFtZV0kW2NvbnRleHRlXTtbc2VydmljZV1cbiAgICAgICAgLy8gZXggOiBQb3NpdGlvbk9mSW50ZXJlc3QkT0dDOk9QRU5MUztSZXZlcnNlR2VvY29kZVxuXG4gICAgICAgIGlmICh0aGlzLmxheWVycykge1xuICAgICAgICAgICAgdmFyIGxheWVycyA9IHRoaXMubGF5ZXJzO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGxheWVycykge1xuICAgICAgICAgICAgICAgIGlmIChsYXllcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQoXCIkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJOYW1lID09PSBwYXJ0c1swXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXJ0c0xheWVyID0gcGFydHNbMV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlUGFydHNTZXJ2aWNlID0gcGFydHNbMV0uc3BsaXQoXCI7XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXJ0c1NlcnZpY2VbMV0gPT09IHNlcnZpY2UudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcklkID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXJ0c0xheWVyWzJdID09PSBzZXJ2aWNlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGF5ZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcklkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIEdlb3BvcnRhbCBsYXllcnMgY29uZmlndXJhdGlvbnMsIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVBJIGNvbnRyYWN0IGtleS5cbiAgICAgKiBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCBhbGwgbGF5ZXJzIGZyb20gY29uZmlndXJhdGlvbiBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm1cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBsYXllcnMgLSBPYmplY3Qgd2hpY2ggcHJvcGVydGllcyBhcmUgbGF5ZXJzIGlkZW50aWZpZXJzLlxuICAgICAqL1xuICAgIGdldExheWVyc0NvbmYgOiBmdW5jdGlvbiAoYXBpS2V5KSB7XG4gICAgICAgIHZhciBsYXllcnMgPSB7fTtcbiAgICAgICAgdmFyIGxheWVyc0lkQXJyYXkgPSB0aGlzLmdldExheWVyc0lkKGFwaUtleSk7XG4gICAgICAgIGlmIChsYXllcnNJZEFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyc0lkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbHlySWQgPSBsYXllcnNJZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIGxheWVyc1tseXJJZF0gPSB0aGlzLmxheWVyc1tseXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGdlb3BvcnRhbCBsYXllciBjb25maWd1cmF0aW9uLCBnaXZlbiBpdHMgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVySWQgLSBHZW9wb3J0YWwgbGF5ZXIgaWRlbnRpZmllciAoZS5nLiBcIkdFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gbGF5ZXIgLSBMYXllciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZ2V0TGF5ZXJDb25mIDogZnVuY3Rpb24gKGxheWVySWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheWVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyc1tsYXllcklkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBwYXJhbWV0ZXJzIG5lZWRlZCB0byBkaXNwbGF5IGEgV01TIG9yIFdNVFMgbGF5ZXIgZ2l2ZW4gaXRzIG5hbWUsIGl0cyBzZXJ2aWNlIGFuZCBpdHMga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGF5ZXJOYW1lIC0gbmFtZSBvZiB0aGUgbGF5ZXIgKGV4LiBcIk9SVEhPSU1BR0VSWS5PUlRIT1BIT1RPU1wiKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlICAgLSBuYW1lIG9mIHRoZSBzZXJ2aWNlIChleC4gXCJXTVNcIiBvdSBcIldNVFNcIilcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2FwaUtleV0gIC0gQ29udHJhY3QgQVBJIGtleVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBhcmFtcyAgLSBwYXJhbXMgb2YgdGhlIHNlcnZpY2UgKFdNUyBvciBXTVRTKSBmb3IgdGhlIGdpdmVuIGxheWVyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcGFyYW1zLnVybCAgICAgICAgLSBVcmwgb2YgdGhlIHNlcnZpY2UgdG8gcmVhY2ggdG8gZGlzcGxheSB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwYXJhbXMudmVyc2lvbiAgICAtIFZlcnNpb24gb2YgdGhlIHNlcnZpY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwYXJhbXMuc3R5bGVzICAgICAtIERlZmF1bHQgc3R5bGUgb2YgdGhlIGxheWVyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcGFyYW1zLmZvcm1hdCAgICAgLSBEZWZhdWx0IGZvcm1hdCBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwYXJhbXMucHJvamVjdGlvbiAtIERlZmF1bHQgcHJvamVjdGlvbiBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwYXJhbXMubWluU2NhbGUgICAtIE1pbiBzY2FsZSBkZW5vbWluYXRvciBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwYXJhbXMubWF4U2NhbGUgICAtIE1heCBzY2FsZSBkZW5vbWluYXRvciBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7R3AuQkJveH0gcGFyYW1zLmV4dGVudCAgICAtIEV4dGVudCBvZiB0aGUgbGF5ZXIsIGluIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLmxlZ2VuZHMgICAgIC0gQXJyYXkgb2YgbGVnZW5kcyBhc3NvY2lhdGVkIHRvIHRoZSBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLnRpdGxlICAgICAgIC0gTmFtZSBvZiB0aGUgbGF5ZXIsIHJlYWRhYmxlIGJ5IGEgaHVtYW5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHBhcmFtcy5kZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uIG9mIHRoZSBsYXllclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHBhcmFtcy5bVE1TTGlua10gICAgICAgICAgLSBJZCBvZiB0aGUgVGlsZSBNYXRyaXggU2V0IChUTVMpLCBpbiB0aGUgY2FzZSBvZiBXTVRTIGxheWVyXG4gICAgICogQHJldHVybnMge0dwLlBvaW50fSBwYXJhbXMuW21hdHJpeE9yaWdpbl0gICAtIE9yaWdpbm9mIHRoZSB0aWxlIG1hdHJpeCAodG9wIGxlZnQgY29ybmVyKSwgaW4gdGhlIGNhc2Ugb2YgV01UUyBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLltuYXRpdmVSZXNvbHV0aW9uc10gLSBBcnJheSB3aXRoIHRoZSByZXNvbHV0aW9uIG9mIGVhY2ggbGV2ZWwgb2YgdGhlIHRpbGUgbWF0cml4IHNldCwgaW4gdGhlIGNhc2Ugb2YgV01UUyBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLlttYXRyaXhJZHNdICAgICAgICAgLSBBcnJheSB3aXRoIHRoZSBJRCBvZiBlYWNoIGxldmVsIG9mIHRoZSB0aWxlIG1hdHJpeCBzZXQsIGluIHRoZSBjYXNlIG9mIFdNVFMgbGF5ZXJcbiAgICAgKi9cbiAgICBnZXRMYXllclBhcmFtcyA6IGZ1bmN0aW9uIChsYXllck5hbWUsIHNlcnZpY2UpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHt9O1xuXG4gICAgICAgIGlmICgoc2VydmljZSA9PT0gXCJXTVNcIiB8fCBPYmplY3Qua2V5cyh0aGlzLnRpbGVNYXRyaXhTZXRzKS5sZW5ndGggIT09IDApICYmIE9iamVjdC5rZXlzKHRoaXMubGF5ZXJzKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIGdldCB0aGUgbGF5ZXJJZCBvZiB0aGUgbGF5ZXJcbiAgICAgICAgICAgIHZhciBsYXllcklkID0gdGhpcy5nZXRMYXllcklkKGxheWVyTmFtZSwgc2VydmljZSk7XG5cbiAgICAgICAgICAgIGlmIChsYXllcklkKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXllciBDb25mIE9iamVjdFxuICAgICAgICAgICAgICAgIHZhciBsYXllckNvbmYgPSB0aGlzLmdldExheWVyQ29uZihsYXllcklkKTtcblxuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5nZXRMYXllcktleShsYXllcklkKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGdldCBzZXJ2aWNlcyBwYXJhbXNcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgc2VydmVyVXJsIGlzIHNhdmVkIGluIEdwLkNvbmZpZyA6IHdpdGggbXVsdGlLZXlzLCB3ZSBoYXZlIHRvIHJldHJpZXZlIHRoZSBrZXkgdXNlZCBpbiB0aGUgc2VydmVyVXJsIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckNvbmYuc2VydmljZVBhcmFtcy5zZXJ2ZXJVcmxba2V5c1tpXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51cmwgPSBsYXllckNvbmYuc2VydmljZVBhcmFtcy5zZXJ2ZXJVcmxba2V5c1tpXV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB3bXNUeXBlUmVnZXggPSAvXFwvdlxcLy87XG4gICAgICAgICAgICAgICAgLy8gV01TIHZlY3RvciBzdHlsZSBhbHdheXMgZW1wdHkgKG5vdCBpbiBnZXRDYXApXG4gICAgICAgICAgICAgICAgaWYgKHdtc1R5cGVSZWdleC50ZXN0KHBhcmFtcy51cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zdHlsZXMgPSBcIiBcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXTVMgcmFzdGVyIHN0eWxlIGlzIGRlZmluZWQgaW4gZ2V0Q2FwXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zdHlsZXMgPSBsYXllckNvbmYuc3R5bGVzWzBdLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyYW1zLnZlcnNpb24gPSBsYXllckNvbmYuc2VydmljZVBhcmFtcy52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5mb3JtYXQgPSBsYXllckNvbmYuZm9ybWF0c1swXS5uYW1lO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5wcm9qZWN0aW9uID0gbGF5ZXJDb25mLmRlZmF1bHRQcm9qZWN0aW9uO1xuXG4gICAgICAgICAgICAgICAgLy8gZ2V0IGxheWVyIGluZm8gYW5kIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgcGFyYW1zLm1pblNjYWxlID0gbGF5ZXJDb25mLmdsb2JhbENvbnN0cmFpbnQubWluU2NhbGVEZW5vbWluYXRvcjtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWF4U2NhbGUgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5tYXhTY2FsZURlbm9taW5hdG9yO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5leHRlbnQgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5iYm94O1xuICAgICAgICAgICAgICAgIHBhcmFtcy5sZWdlbmRzID0gbGF5ZXJDb25mLmxlZ2VuZHM7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnRpdGxlID0gbGF5ZXJDb25mLnRpdGxlO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5kZXNjcmlwdGlvbiA9IGxheWVyQ29uZi5kZXNjcmlwdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09PSBcIldNU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5tZXRhZGF0YSA9IGxheWVyQ29uZi5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbnMgIG5vbiBkaXNwb25pYmxlcyBhdmVjIGxlcyBnZXRDYXBcbiAgICAgICAgICAgICAgICAvLyBwYXJhbXMubWV0YWRhdGEgPSBsYXllckNvbmYuZ2V0TWV0YWRhdGEoKTtcbiAgICAgICAgICAgICAgICAvLyBwYXJhbXMub3JpZ2luYXRvcnMgPSBsYXllckNvbmYuZ2V0T3JpZ2luYXRvcnMoKTtcbiAgICAgICAgICAgICAgICAvLyBwYXJhbXMucXVpY2tsb29rVXJsID0gbGF5ZXJDb25mLmdldFF1aWNrbG9va1VybCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gV01UUyA6IGdldCB0aGUgdGlsZU1hdHJpeFNldExpbWl0c1xuICAgICAgICAgICAgICAgIGlmIChsYXllckNvbmYud210c09wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRpbGVNYXRyaXhTZXRMaW1pdHMgPSBsYXllckNvbmYud210c09wdGlvbnMudGlsZU1hdHJpeFNldExpbWl0cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIFRNU0xpbmsgPSBsYXllckNvbmYud210c09wdGlvbnMudGlsZU1hdHJpeFNldExpbms7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUTVNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuVE1TTGluayA9IFRNU0xpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1zQ29uZiA9IHRoaXMuZ2V0VE1TQ29uZihUTVNMaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBtYXRyaXggb3JpZ2luIDogR3AuUG9pbnQgPSBPYmplY3R7eDpGbG9hdCwgeTpGbG9hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtcy5tYXRyaXhPcmlnaW4gPSB0bXNDb25mLmdldFRvcExlZnRDb3JuZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5tYXRyaXhJZHMgPSBPYmplY3Qua2V5cyh0bXNDb25mLnRpbGVNYXRyaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGlsZU1hdHJpY2VzID0gdG1zQ29uZi50aWxlTWF0cmljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBwc2V1ZG8gbWVyY2F0b3IgcmVzb2x1dGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uYXRpdmVSZXNvbHV0aW9ucyA9IHRtc0NvbmYubmF0aXZlUmVzb2x1dGlvbnMgfHwgdGhpcy5nZXRUTVNDb25mKFwiUE1cIikubmF0aXZlUmVzb2x1dGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb250cmFjdCBrZXkocykgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVySWQgLSBHZW9wb3J0YWwgbGF5ZXIgaWRlbnRpZmllciAoZS5nLiBcIkdFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqIEByZXR1cm4ge0FycmF5fSBsYXllcktleSAtIGFycmF5IG9mIGtleShzKSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBsYXllclxuICAgICAqL1xuICAgIGdldExheWVyS2V5IDogZnVuY3Rpb24gKGxheWVySWQpIHtcbiAgICAgICAgdmFyIGxheWVyS2V5ID0gW107XG4gICAgICAgIGlmICh0aGlzLmdlbmVyYWxPcHRpb25zICYmIHRoaXMuZ2VuZXJhbE9wdGlvbnMuYXBpS2V5cyAmJiBPYmplY3Qua2V5cyh0aGlzLmdlbmVyYWxPcHRpb25zLmFwaUtleXMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIHJlc291cmNlc0J5S2V5ID0gdGhpcy5nZW5lcmFsT3B0aW9ucy5hcGlLZXlzO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHJlc291cmNlc0J5S2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlc0FycmF5ID0gcmVzb3VyY2VzQnlLZXlba2V5XTtcbiAgICAgICAgICAgICAgICByZXNvdXJjZXNBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChhcnJheUxheWVySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5TGF5ZXJJZCA9PT0gbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJLZXkucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVyS2V5O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIFRpbGUgTWF0cml4IFNldHMgY29uZmlndXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRpbGVNYXRyaXhTZXRzIC0gT2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgYXJlIFRNUyBpZGVudGlmaWVyc1xuICAgICAqXG4gICAgICovXG4gICAgZ2V0VGlsZU1hdHJpeFNldHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVNYXRyaXhTZXRzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVGlsZSBNYXRyaXggU2V0cyBjb25maWd1cmF0aW9uLCBnaXZlbiBpdHMgaWRlbnRpZmllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0bXNJRCAtIFRpbGUgTWF0cml4IFNldCBpZGVudGlmaWVyIChlLmcuIDogXCJQTVwiKVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGlsZU1hdHJpeFNldCAtIFRpbGUgTWF0cml4IFNldCBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZ2V0VE1TQ29uZiA6IGZ1bmN0aW9uICh0bXNJRCkge1xuICAgICAgICBpZiAoIXRoaXMudGlsZU1hdHJpeFNldHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50aWxlTWF0cml4U2V0c1t0bXNJRF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBnbG9iYWwgY29uc3RyYWludHMgZm9yIGEgZ2l2ZW4gTGF5ZXIgOiBleHRlbnQsIG1pblNjYWxlLCBtYXhTY2FsZSwgcHJvamVjdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVySWQgLSBHZW9wb3J0YWwgbGF5ZXIgaWRlbnRpZmllciAoZS5nLiBcIkdFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBhcmFtcyAtIGxheWVyIGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcGFyYW1zLnByb2plY3Rpb24gLSBkZWZhdWx0IGxheWVyIHByb2plY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwYXJhbXMubWluU2NhbGUgICAtIGxheWVyIG1pbiBzY2FsZSBkZW5vbWluYXRvclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHBhcmFtcy5tYXhTY2FsZSAgIC0gbGF5ZXIgbWF4IHNjYWxlIGRlbm9taW5hdG9yXG4gICAgICogQHJldHVybnMge0dwLkJCb3h9IHBhcmFtcy5leHRlbnQgICAgLSBsYXllciBleHRlbnQgZXhwcmVzc2VkIGluIHRoZSBsYXllciBwcm9qZWN0aW9uXG4gICAgICovXG4gICAgZ2V0R2xvYmFsQ29uc3RyYWludHMgOiBmdW5jdGlvbiAobGF5ZXJJZCkge1xuICAgICAgICB2YXIgcGFyYW1zID0ge307XG5cbiAgICAgICAgaWYgKGxheWVySWQpIHtcbiAgICAgICAgICAgIC8vIGdldCBsYXllciBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgICAgdmFyIGxheWVyQ29uZiA9IHRoaXMuZ2V0TGF5ZXJDb25mKGxheWVySWQpO1xuICAgICAgICAgICAgcGFyYW1zLnByb2plY3Rpb24gPSBsYXllckNvbmYuZGVmYXVsdFByb2plY3Rpb247XG4gICAgICAgICAgICBwYXJhbXMubWluU2NhbGUgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5taW5TY2FsZURlbm9taW5hdG9yO1xuICAgICAgICAgICAgcGFyYW1zLm1heFNjYWxlID0gbGF5ZXJDb25mLmdsb2JhbENvbnN0cmFpbnQubWF4U2NhbGVEZW5vbWluYXRvcjtcbiAgICAgICAgICAgIHBhcmFtcy5leHRlbnQgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5iYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZ0ludGVyZmFjZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Config/ConfigInterface.js\n"); - -/***/ }), - -/***/ "./src/Services/DefaultUrlService.js": -/*!*******************************************!*\ - !*** ./src/Services/DefaultUrlService.js ***! - \*******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n// cette classe contient les URLs par defaut des services.\n// DefaultUrlService.Alti.url(key)[elevation-json]\n// DefaultUrlService.Alti.url(key)[elevation-xml]\n// DefaultUrlService.Alti.url(key)[profil-json]\n// DefaultUrlService.Alti.url(key)[profil-xml]\n// DefaultUrlService.ProcessIsoCurve.url(key)\n// DefaultUrlService.AutoComplete.url(key)\n// DefaultUrlService.ReverseGeocode.url(key)\n// DefaultUrlService.Geocode.url(key)\n// DefaultUrlService.Route.url(key)\n\n// Example :\n//\n// DefaultUrlService.Alti.url('alti')[elevation-json]\n// output {String} -> http://wxs.ign.fr/calcul/alti/rest/elevation.json\n//\n// DefaultUrlService.Alti.url('calcul')\n// output {Object|String}\n// -> http://wxs.ign.fr/calcul/alti/rest/elevation.json\n// -> http://wxs.ign.fr/calcul/alti/rest/elevation.xml\n// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.json\n// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.xml\n//\n// ssl by default.\n//\n// Force to not do ssl :\n// DefaultUrlService.ssl = false;\n//\n// DefaultUrlService.AutoComplete.url('calcul')\n// output {Object|String}\n// -> https://wxs.ign.fr/calcul/ols/apis/completion\n\n// constantes internes\nvar HOSTNAME = \"wxs.ign.fr\";\n\n/**\n * Default Geoportal web services URLs access.\n *\n * @namespace\n * @alias Gp.Services.DefaultUrl\n */\nvar DefaultUrlService = {\n /** if set true, require the use of https protocol */\n ssl: true,\n /**\n * base url of services (ssl protocol management)\n * @param {String} path - path\n * @returns {String} url\n */\n url: function url(path) {\n // comportement par défaut => https\n // sinon, il est fixé par l'option 'ssl' (false => http)\n var _protocol;\n if (DefaultUrlService.ssl === false) {\n _protocol = \"http://\";\n } else {\n _protocol = \"https://\";\n }\n return _protocol + HOSTNAME + path;\n },\n /**\n * base new-url of services (ssl protocol management)\n * @param {String} path - path\n * @returns {String} url\n */\n newUrl: function newUrl(path, hostname) {\n // comportement par défaut => https\n // sinon, il est fixé par l'option 'ssl' (false => http)\n var _protocol;\n if (DefaultUrlService.ssl === false) {\n _protocol = \"http://\";\n } else {\n _protocol = \"https://\";\n }\n return _protocol + hostname + path;\n },\n /**\n * Elevation web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols (\"elevation-json\", \"elevation-xml\", \"profil-json\" or \"profil-xml\").\n */\n Alti: {\n new_key: {\n // rest\n \"elevation-json\": \"/altimetrie/1.0/calcul/alti/rest/elevation.json\",\n \"elevation-xml\": \"/altimetrie/1.0/calcul/alti/rest/elevation.xml\",\n \"profil-json\": \"/altimetrie/1.0/calcul/alti/rest/elevationLine.json\",\n \"profil-xml\": \"/altimetrie/1.0/calcul/alti/rest/elevationLine.xml\"\n },\n _key: {\n // rest\n \"elevation-json\": \"/calcul/alti/rest/elevation.json\",\n \"elevation-xml\": \"/calcul/alti/rest/elevation.xml\",\n \"profil-json\": \"/calcul/alti/rest/elevationLine.json\",\n \"profil-xml\": \"/calcul/alti/rest/elevationLine.xml\",\n // other\n wps: \"/alti/wps\"\n },\n /**\n * newurl from geoplateforme service\n * @param {String} key - key\n * @returns {String} url\n */\n newUrl: function newUrl() {},\n /**\n * url from wxs service\n * @returns {String} url\n */\n url: function url() {\n return {\n // rest\n \"elevation-json\": DefaultUrlService.url(this._key[\"elevation-json\"]),\n \"elevation-xml\": DefaultUrlService.url(this._key[\"elevation-xml\"]),\n \"profil-json\": DefaultUrlService.url(this._key[\"profil-json\"]),\n \"profil-xml\": DefaultUrlService.url(this._key[\"profil-xml\"])\n };\n }\n },\n /**\n * IsoCurve web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols (\"iso-json\" or \"iso-xml\").\n */\n ProcessIsoCurve: {\n new_key: \"/itineraire/isochrone\",\n _key: \"/calcul/geoportail/isochrone/rest/1.0.0/isochrone\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {},\n /**\n * url from wxs service\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Config web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns config service default urls with or without geoportal access key given as a parameter.\n */\n Config: {\n _key: \"https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/\",\n /**\n * url\n * @param {String} key - key\n * @returns {String} url\n */\n url: function url(key) {\n // key must be an array of one or several keys\n if (!Array.isArray(key)) {\n key = key.split(\",\");\n }\n // not homogeneous with others geoportal services URLs\n var url = [];\n for (var i = 0; i < key.length; i++) {\n url[i] = this._key + key[i] + \"Config.json\";\n }\n return url;\n }\n },\n /**\n * Autocompletion web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String.\n */\n AutoComplete: {\n new_key: \"/geocodage/completion\",\n _key: \"/calcul/geoportail/geocodage/rest/0.1/completion\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {\n var NEW_AUTOCOMPLETE_HOSTNAME = \"data.geopf.fr\";\n return DefaultUrlService.newUrl(this.new_key, NEW_AUTOCOMPLETE_HOSTNAME);\n },\n /**\n * url\n * @returns {String} url\n */\n url: function url(key) {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Reverse geocoding web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String.\n */\n ReverseGeocode: {\n new_key: \"/geocodage/reverse\",\n _key: \"/calcul/geoportail/geocodage/rest/0.1/reverse\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {\n var NEW_REVERSE_GEOCODE_HOSTNAME = \"data.geopf.fr\";\n return DefaultUrlService.newUrl(this.new_key, NEW_REVERSE_GEOCODE_HOSTNAME);\n },\n /**\n * url\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Geocoding web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String.\n */\n Geocode: {\n new_key: \"/geocodage/search\",\n _key: \"/calcul/geoportail/geocodage/rest/0.1/search\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {\n var NEW_GEOCODE_HOSTNAME = \"data.geopf.fr\";\n return DefaultUrlService.newUrl(this.new_key, NEW_GEOCODE_HOSTNAME);\n },\n /**\n * url\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Routing web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols.\n */\n Route: {\n new_key: \"/itineraire/route\",\n _key: \"/calcul/geoportail/itineraire/rest/1.0.0/route\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {},\n /**\n * url from wxs service\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (DefaultUrlService);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9EZWZhdWx0VXJsU2VydmljZS5qcz8zYTBkIl0sIm5hbWVzIjpbIkhPU1ROQU1FIiwiRGVmYXVsdFVybFNlcnZpY2UiLCJzc2wiLCJ1cmwiLCJwYXRoIiwiX3Byb3RvY29sIiwibmV3VXJsIiwiaG9zdG5hbWUiLCJBbHRpIiwibmV3X2tleSIsIl9rZXkiLCJ3cHMiLCJQcm9jZXNzSXNvQ3VydmUiLCJDb25maWciLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJBdXRvQ29tcGxldGUiLCJORVdfQVVUT0NPTVBMRVRFX0hPU1ROQU1FIiwiUmV2ZXJzZUdlb2NvZGUiLCJORVdfUkVWRVJTRV9HRU9DT0RFX0hPU1ROQU1FIiwiR2VvY29kZSIsIk5FV19HRU9DT0RFX0hPU1ROQU1FIiwiUm91dGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUlBLFFBQVEsR0FBRyxZQUFZOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQyxpQkFBaUIsR0FBRztFQUVwQjtFQUNBQyxHQUFHLEVBQUcsSUFBSTtFQUVWO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsR0FBRyxFQUFHLFNBQUFBLElBQVVDLElBQUksRUFBRTtJQUNsQjtJQUNBO0lBQ0EsSUFBSUMsU0FBUztJQUNiLElBQUlKLGlCQUFpQixDQUFDQyxHQUFHLEtBQUssS0FBSyxFQUFFO01BQ2pDRyxTQUFTLEdBQUcsU0FBUztJQUN6QixDQUFDLE1BQU07TUFDSEEsU0FBUyxHQUFHLFVBQVU7SUFDMUI7SUFFQSxPQUFPQSxT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ckQ7QUFDUjtBQUNBO0FBQ0E7SUFDUUosTUFBTSxFQUFHLFNBQUFBLE9BQUEsRUFBWTtNQUNqQixJQUFJbUIsb0JBQW9CLEdBQUcsZUFBZTtNQUUxQyxPQUFPeEIsaUJBQWlCLENBQUNLLE1BQU0sQ0FBQyxJQUFJLENBQUNHLE9BQU8sRUFBRWdCLG9CQUFvQixDQUFDO0lBQ3ZFLENBQUM7SUFFRDtBQUNSO0FBQ0E7QUFDQTtJQUNRdEIsR0FBRyxFQUFHLFNBQUFBLElBQUEsRUFBWTtNQUNkLE9BQU9GLGlCQUFpQixDQUFDRSxHQUFHLENBQUMsSUFBSSxDQUFDTyxJQUFJLENBQUM7SUFDM0M7RUFDSixDQUFDO0VBQ0Q7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lnQixLQUFLLEVBQUc7SUFDSmpCLE9BQU8sRUFBRyxtQkFBbUI7SUFFN0JDLElBQUksRUFBRyxnREFBZ0Q7SUFFdkQ7QUFDUjtBQUNBO0FBQ0E7SUFDUUosTUFBTSxFQUFHLFNBQUFBLE9BQUEsRUFBWSxDQUNyQixDQUFDO0lBRUQ7QUFDUjtBQUNBO0FBQ0E7SUFDUUgsR0FBRyxFQUFHLFNBQUFBLElBQUEsRUFBWTtNQUNkLE9BQU9GLGlCQUFpQixDQUFDRSxHQUFHLENBQUMsSUFBSSxDQUFDTyxJQUFJLENBQUM7SUFDM0M7RUFDSjtBQUNKLENBQUM7QUFFY1QsZ0ZBQWlCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0RlZmF1bHRVcmxTZXJ2aWNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gY2V0dGUgY2xhc3NlIGNvbnRpZW50IGxlcyBVUkxzIHBhciBkZWZhdXQgZGVzIHNlcnZpY2VzLlxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKGtleSlbZWxldmF0aW9uLWpzb25dXG4vLyAgRGVmYXVsdFVybFNlcnZpY2UuQWx0aS51cmwoa2V5KVtlbGV2YXRpb24teG1sXVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKGtleSlbcHJvZmlsLWpzb25dXG4vLyAgRGVmYXVsdFVybFNlcnZpY2UuQWx0aS51cmwoa2V5KVtwcm9maWwteG1sXVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLlByb2Nlc3NJc29DdXJ2ZS51cmwoa2V5KVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLkF1dG9Db21wbGV0ZS51cmwoa2V5KVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLlJldmVyc2VHZW9jb2RlLnVybChrZXkpXG4vLyAgRGVmYXVsdFVybFNlcnZpY2UuR2VvY29kZS51cmwoa2V5KVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLlJvdXRlLnVybChrZXkpXG5cbi8vIEV4YW1wbGUgOlxuLy9cbi8vIERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKCdhbHRpJylbZWxldmF0aW9uLWpzb25dXG4vLyAgb3V0cHV0IHtTdHJpbmd9IC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLmpzb25cbi8vXG4vLyBEZWZhdWx0VXJsU2VydmljZS5BbHRpLnVybCgnY2FsY3VsJylcbi8vIG91dHB1dCB7T2JqZWN0fFN0cmluZ31cbi8vIC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLmpzb25cbi8vIC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLnhtbFxuLy8gLT4gaHR0cDovL3d4cy5pZ24uZnIvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLmpzb25cbi8vIC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uTGluZS54bWxcbi8vXG4vLyBzc2wgYnkgZGVmYXVsdC5cbi8vXG4vLyBGb3JjZSB0byBub3QgZG8gc3NsIDpcbi8vIERlZmF1bHRVcmxTZXJ2aWNlLnNzbCA9IGZhbHNlO1xuLy9cbi8vIERlZmF1bHRVcmxTZXJ2aWNlLkF1dG9Db21wbGV0ZS51cmwoJ2NhbGN1bCcpXG4vLyBvdXRwdXQge09iamVjdHxTdHJpbmd9XG4vLyAtPiBodHRwczovL3d4cy5pZ24uZnIvY2FsY3VsL29scy9hcGlzL2NvbXBsZXRpb25cblxuLy8gY29uc3RhbnRlcyBpbnRlcm5lc1xudmFyIEhPU1ROQU1FID0gXCJ3eHMuaWduLmZyXCI7XG5cbi8qKlxuICogRGVmYXVsdCBHZW9wb3J0YWwgd2ViIHNlcnZpY2VzIFVSTHMgYWNjZXNzLlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5EZWZhdWx0VXJsXG4gKi9cbnZhciBEZWZhdWx0VXJsU2VydmljZSA9IHtcblxuICAgIC8qKiBpZiBzZXQgdHJ1ZSwgcmVxdWlyZSB0aGUgdXNlIG9mIGh0dHBzIHByb3RvY29sICovXG4gICAgc3NsIDogdHJ1ZSxcblxuICAgIC8qKlxuICAgICogYmFzZSB1cmwgb2Ygc2VydmljZXMgKHNzbCBwcm90b2NvbCBtYW5hZ2VtZW50KVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggLSBwYXRoXG4gICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAqL1xuICAgIHVybCA6IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIC8vIGNvbXBvcnRlbWVudCBwYXIgZMOpZmF1dCA9PiBodHRwc1xuICAgICAgICAvLyBzaW5vbiwgaWwgZXN0IGZpeMOpIHBhciBsJ29wdGlvbiAnc3NsJyAoZmFsc2UgPT4gaHR0cClcbiAgICAgICAgdmFyIF9wcm90b2NvbDtcbiAgICAgICAgaWYgKERlZmF1bHRVcmxTZXJ2aWNlLnNzbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIF9wcm90b2NvbCA9IFwiaHR0cDovL1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3Byb3RvY29sID0gXCJodHRwczovL1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9wcm90b2NvbCArIEhPU1ROQU1FICsgcGF0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgKiBiYXNlIG5ldy11cmwgb2Ygc2VydmljZXMgKHNzbCBwcm90b2NvbCBtYW5hZ2VtZW50KVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggLSBwYXRoXG4gICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAqL1xuICAgIG5ld1VybCA6IGZ1bmN0aW9uIChwYXRoLCBob3N0bmFtZSkge1xuICAgICAgICAvLyBjb21wb3J0ZW1lbnQgcGFyIGTDqWZhdXQgPT4gaHR0cHNcbiAgICAgICAgLy8gc2lub24sIGlsIGVzdCBmaXjDqSBwYXIgbCdvcHRpb24gJ3NzbCcgKGZhbHNlID0+IGh0dHApXG4gICAgICAgIHZhciBfcHJvdG9jb2w7XG4gICAgICAgIGlmIChEZWZhdWx0VXJsU2VydmljZS5zc2wgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBfcHJvdG9jb2wgPSBcImh0dHA6Ly9cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9wcm90b2NvbCA9IFwiaHR0cHM6Ly9cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcHJvdG9jb2wgKyBob3N0bmFtZSArIHBhdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVsZXZhdGlvbiB3ZWIgc2VydmljZSBhY2Nlc3NcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cmwgKGtleSkgLSBSZXR1cm5zIGVsZXZhdGlvbiBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXN1bHQgaXMgYSBqYXZhc2NyaXB0IG9iamVjdCB3aXRoIGRpZmZlcmVudCB1cmxzIGdpdmVuIHVzZWQgcHJvdG9jb2xzIChcImVsZXZhdGlvbi1qc29uXCIsIFwiZWxldmF0aW9uLXhtbFwiLCBcInByb2ZpbC1qc29uXCIgb3IgXCJwcm9maWwteG1sXCIpLlxuICAgICAqL1xuICAgIEFsdGkgOiB7XG4gICAgICAgIG5ld19rZXkgOiB7XG4gICAgICAgICAgICAvLyByZXN0XG4gICAgICAgICAgICBcImVsZXZhdGlvbi1qc29uXCIgOiBcIi9hbHRpbWV0cmllLzEuMC9jYWxjdWwvYWx0aS9yZXN0L2VsZXZhdGlvbi5qc29uXCIsXG4gICAgICAgICAgICBcImVsZXZhdGlvbi14bWxcIiA6IFwiL2FsdGltZXRyaWUvMS4wL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLnhtbFwiLFxuICAgICAgICAgICAgXCJwcm9maWwtanNvblwiIDogXCIvYWx0aW1ldHJpZS8xLjAvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLmpzb25cIixcbiAgICAgICAgICAgIFwicHJvZmlsLXhtbFwiIDogXCIvYWx0aW1ldHJpZS8xLjAvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLnhtbFwiXG4gICAgICAgIH0sXG4gICAgICAgIF9rZXkgOiB7XG4gICAgICAgICAgICAvLyByZXN0XG4gICAgICAgICAgICBcImVsZXZhdGlvbi1qc29uXCIgOiBcIi9jYWxjdWwvYWx0aS9yZXN0L2VsZXZhdGlvbi5qc29uXCIsXG4gICAgICAgICAgICBcImVsZXZhdGlvbi14bWxcIiA6IFwiL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLnhtbFwiLFxuICAgICAgICAgICAgXCJwcm9maWwtanNvblwiIDogXCIvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLmpzb25cIixcbiAgICAgICAgICAgIFwicHJvZmlsLXhtbFwiIDogXCIvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLnhtbFwiLFxuICAgICAgICAgICAgLy8gb3RoZXJcbiAgICAgICAgICAgIHdwcyA6IFwiL2FsdGkvd3BzXCJcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICogbmV3dXJsIGZyb20gZ2VvcGxhdGVmb3JtZSBzZXJ2aWNlXG4gICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIGtleVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIHd4cyBzZXJ2aWNlXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIHVybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLy8gcmVzdFxuICAgICAgICAgICAgICAgIFwiZWxldmF0aW9uLWpzb25cIiA6IERlZmF1bHRVcmxTZXJ2aWNlLnVybCh0aGlzLl9rZXlbXCJlbGV2YXRpb24tanNvblwiXSksXG4gICAgICAgICAgICAgICAgXCJlbGV2YXRpb24teG1sXCIgOiBEZWZhdWx0VXJsU2VydmljZS51cmwodGhpcy5fa2V5W1wiZWxldmF0aW9uLXhtbFwiXSksXG4gICAgICAgICAgICAgICAgXCJwcm9maWwtanNvblwiIDogRGVmYXVsdFVybFNlcnZpY2UudXJsKHRoaXMuX2tleVtcInByb2ZpbC1qc29uXCJdKSxcbiAgICAgICAgICAgICAgICBcInByb2ZpbC14bWxcIiA6IERlZmF1bHRVcmxTZXJ2aWNlLnVybCh0aGlzLl9rZXlbXCJwcm9maWwteG1sXCJdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogSXNvQ3VydmUgd2ViIHNlcnZpY2UgYWNjZXNzXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXJsIChrZXkpIC0gUmV0dXJucyBpc29jdXJ2ZSBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXN1bHQgaXMgYSBqYXZhc2NyaXB0IG9iamVjdCB3aXRoIGRpZmZlcmVudCB1cmxzIGdpdmVuIHVzZWQgcHJvdG9jb2xzIChcImlzby1qc29uXCIgb3IgXCJpc28teG1sXCIpLlxuICAgICAqL1xuICAgIFByb2Nlc3NJc29DdXJ2ZSA6IHtcblxuICAgICAgICBuZXdfa2V5IDogXCIvaXRpbmVyYWlyZS9pc29jaHJvbmVcIixcblxuICAgICAgICBfa2V5IDogXCIvY2FsY3VsL2dlb3BvcnRhaWwvaXNvY2hyb25lL3Jlc3QvMS4wLjAvaXNvY2hyb25lXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsIGZyb20gZ2VvcGxhdGVmb3JtZSBzZXJ2aWNlXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIG5ld1VybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiB1cmwgZnJvbSB3eHMgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICB1cmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UudXJsKHRoaXMuX2tleSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENvbmZpZyB3ZWIgc2VydmljZSBhY2Nlc3NcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cmwgKGtleSkgLSBSZXR1cm5zIGNvbmZpZyBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgQ29uZmlnIDoge1xuICAgICAgICBfa2V5IDogXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSUdORi9nZW9wb3J0YWwtY29uZmlndXJhdGlvbi9uZXctdXJsL2Rpc3QvXCIsXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybFxuICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSBrZXlcbiAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAgICAgKi9cbiAgICAgICAgdXJsIDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgLy8ga2V5IG11c3QgYmUgYW4gYXJyYXkgb2Ygb25lIG9yIHNldmVyYWwga2V5c1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm90IGhvbW9nZW5lb3VzIHdpdGggb3RoZXJzIGdlb3BvcnRhbCBzZXJ2aWNlcyBVUkxzXG4gICAgICAgICAgICB2YXIgdXJsID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHVybFtpXSA9IHRoaXMuX2tleSArIGtleVtpXSArIFwiQ29uZmlnLmpzb25cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEF1dG9jb21wbGV0aW9uIHdlYiBzZXJ2aWNlIGFjY2Vzc1xuICAgICAqXG4gICAgICogQG1lbWJlciB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVybCAoa2V5KSAtIFJldHVybnMgYXV0b2NvbXBsZXRlIHNlcnZpY2UgZGVmYXVsdCB1cmxzIHdpdGggb3Igd2l0aG91dCBnZW9wb3J0YWwgYWNjZXNzIGtleSBnaXZlbiBhcyBhIHBhcmFtZXRlci4gVGhlIHJlc3VsdCBpcyBhIFN0cmluZy5cbiAgICAgKi9cbiAgICBBdXRvQ29tcGxldGUgOiB7XG4gICAgICAgIG5ld19rZXkgOiBcIi9nZW9jb2RhZ2UvY29tcGxldGlvblwiLFxuXG4gICAgICAgIF9rZXkgOiBcIi9jYWxjdWwvZ2VvcG9ydGFpbC9nZW9jb2RhZ2UvcmVzdC8wLjEvY29tcGxldGlvblwiLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIGdlb3BsYXRlZm9ybWUgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgTkVXX0FVVE9DT01QTEVURV9IT1NUTkFNRSA9IFwiZGF0YS5nZW9wZi5mclwiO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UubmV3VXJsKHRoaXMubmV3X2tleSwgTkVXX0FVVE9DT01QTEVURV9IT1NUTkFNRSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIHVybCA6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0VXJsU2VydmljZS51cmwodGhpcy5fa2V5KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZSBnZW9jb2Rpbmcgd2ViIHNlcnZpY2UgYWNjZXNzXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXJsIChrZXkpIC0gUmV0dXJucyByZXZlcnNlIGdlb2NvZGluZyBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXN1bHQgaXMgYSBTdHJpbmcuXG4gICAgICovXG4gICAgUmV2ZXJzZUdlb2NvZGUgOiB7XG4gICAgICAgIG5ld19rZXkgOiBcIi9nZW9jb2RhZ2UvcmV2ZXJzZVwiLFxuXG4gICAgICAgIF9rZXkgOiBcIi9jYWxjdWwvZ2VvcG9ydGFpbC9nZW9jb2RhZ2UvcmVzdC8wLjEvcmV2ZXJzZVwiLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIGdlb3BsYXRlZm9ybWUgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgTkVXX1JFVkVSU0VfR0VPQ09ERV9IT1NUTkFNRSA9IFwiZGF0YS5nZW9wZi5mclwiO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UubmV3VXJsKHRoaXMubmV3X2tleSwgTkVXX1JFVkVSU0VfR0VPQ09ERV9IT1NUTkFNRSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIHVybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0VXJsU2VydmljZS51cmwodGhpcy5fa2V5KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2VvY29kaW5nIHdlYiBzZXJ2aWNlIGFjY2Vzc1xuICAgICAqXG4gICAgICogQG1lbWJlciB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVybCAoa2V5KSAtIFJldHVybnMgZ2VvY29kaW5nIHNlcnZpY2UgZGVmYXVsdCB1cmxzIHdpdGggb3Igd2l0aG91dCBnZW9wb3J0YWwgYWNjZXNzIGtleSBnaXZlbiBhcyBhIHBhcmFtZXRlci4gVGhlIHJlc3VsdCBpcyBhIFN0cmluZy5cbiAgICAgKi9cbiAgICBHZW9jb2RlIDoge1xuICAgICAgICBuZXdfa2V5IDogXCIvZ2VvY29kYWdlL3NlYXJjaFwiLFxuXG4gICAgICAgIF9rZXkgOiBcIi9jYWxjdWwvZ2VvcG9ydGFpbC9nZW9jb2RhZ2UvcmVzdC8wLjEvc2VhcmNoXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsIGZyb20gZ2VvcGxhdGVmb3JtZSBzZXJ2aWNlXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIG5ld1VybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBORVdfR0VPQ09ERV9IT1NUTkFNRSA9IFwiZGF0YS5nZW9wZi5mclwiO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UubmV3VXJsKHRoaXMubmV3X2tleSwgTkVXX0dFT0NPREVfSE9TVE5BTUUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybFxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICB1cmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UudXJsKHRoaXMuX2tleSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgd2ViIHNlcnZpY2UgYWNjZXNzXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXJsIChrZXkpIC0gUmV0dXJucyByb3V0aW5nIHNlcnZpY2UgZGVmYXVsdCB1cmxzIHdpdGggb3Igd2l0aG91dCBnZW9wb3J0YWwgYWNjZXNzIGtleSBnaXZlbiBhcyBhIHBhcmFtZXRlci4gVGhlIHJlc3VsdCBpcyBhIGphdmFzY3JpcHQgb2JqZWN0IHdpdGggZGlmZmVyZW50IHVybHMgZ2l2ZW4gdXNlZCBwcm90b2NvbHMuXG4gICAgICovXG4gICAgUm91dGUgOiB7XG4gICAgICAgIG5ld19rZXkgOiBcIi9pdGluZXJhaXJlL3JvdXRlXCIsXG5cbiAgICAgICAgX2tleSA6IFwiL2NhbGN1bC9nZW9wb3J0YWlsL2l0aW5lcmFpcmUvcmVzdC8xLjAuMC9yb3V0ZVwiLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIGdlb3BsYXRlZm9ybWUgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsIGZyb20gd3hzIHNlcnZpY2VcbiAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAgICAgKi9cbiAgICAgICAgdXJsIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRVcmxTZXJ2aWNlLnVybCh0aGlzLl9rZXkpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRGVmYXVsdFVybFNlcnZpY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/DefaultUrlService.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Formats/GeocodeResponseParser.js": -/*!***************************************************************!*\ - !*** ./src/Services/Geocode/Formats/GeocodeResponseParser.js ***! - \***************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Response/model/GeocodeResponse */ \"./src/Services/Geocode/Response/model/GeocodeResponse.js\");\n/* harmony import */ var _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Response/model/GeocodedLocation */ \"./src/Services/Geocode/Response/model/GeocodedLocation.js\");\n// import Logger from \"../../../Utils/LoggerByDefault\";\n\n\n\n\n\n/**\n * Fonction retournant un objet contenant des clés de lecture (readers)\n * qui permettent de parser des réponses XML du service de géocodage direct du Géoportail\n * afin de récupérer les résultats retournés.\n * @module GeocodeResponseParser\n * @alias Gp.Services.Geocode.Formats.GeocodeResponseParser\n * @private\n */\n\n/**\n * @classdesc\n *\n * Classe permettant de parser une réponse GeoJSON\n *\n * @constructor\n * @alias Gp.Formats.GeocodeResponseParser\n *\n * @private\n */\nfunction GeocodeResponseParser() {\n if (!(this instanceof GeocodeResponseParser)) {\n throw new TypeError(\"GeocodeResponseParser constructor cannot be called as a function.\");\n }\n}\nGeocodeResponseParser.prototype = {\n /**\n * @lends module:GeocodeResponseParser\n */\n\n /*\n * Constructeur (alias)\n */\n constructor: GeocodeResponseParser,\n /**\n * Méthode permettant de lancer la lecture d'une réponse GeoJSON,\n *\n * @param {String} json - réponse au format GeoJSON\n * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse GeoJSON,\n * sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception.\n */\n parse: function parse(json) {\n var geocodeResponse = new _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n var obj = JSON.parse(json);\n if (obj.type === \"FeatureCollection\") {\n for (var i = 0; i < obj.features.length; ++i) {\n _parseFeature(obj.features[i], geocodeResponse);\n }\n } else if (obj.type === \"Feature\") {\n _parseFeature(obj, geocodeResponse);\n } else if (obj.type === \"SERVICE_ERROR\") {\n return _parseError(obj);\n } else {\n var mess = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", obj.type);\n throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"]({\n message: mess,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"].TYPE_UNKERR,\n status: 200\n });\n }\n return geocodeResponse;\n }\n};\n\n/**\n * Méthode permettant de parser un feature\n *\n * @private\n *\n * @param {Object} feature\n * @param {Object} geocodeResponse\n *\n * @memberof GeocodeResponseParser\n * @return {Object} objet GeocodedLocation\n */\nfunction _parseFeature(feature, geocodeResponse) {\n var location = new _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n if (feature.geometry && feature.geometry.type === \"Point\") {\n location.position = {\n lon: feature.geometry.coordinates[0],\n lat: feature.geometry.coordinates[1]\n };\n }\n if (feature.properties) {\n for (var prop in feature.properties) {\n if (prop === \"_score\") {\n location.accuracy = feature.properties[prop];\n } else if (prop === \"_type\") {\n if (feature.properties[prop] === \"address\") {\n location.type = \"StreetAddress\";\n } else if (feature.properties[prop] === \"poi\") {\n location.type = \"PositionOfInterest\";\n } else if (feature.properties[prop] === \"parcel\") {\n location.type = \"CadastralParcel\";\n }\n } else {\n location.placeAttributes[prop] = feature.properties[prop];\n }\n }\n if (feature.properties._type === \"address\") {\n location.matchType = feature.properties.number !== undefined && feature.properties.number !== null ? \"street number\" : \"street\";\n }\n }\n geocodeResponse.locations.push(location);\n}\n\n/**\n * Méthode permettant de parser une erreur\n *\n * @private\n *\n * @param {Object} error\n *\n * @memberof GeocodeResponseParser\n * @return {Object}\n */\nfunction _parseError(error) {\n return {\n exceptionReport: error\n };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeResponseParser);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL0Zvcm1hdHMvR2VvY29kZVJlc3BvbnNlUGFyc2VyLmpzPzJlNDUiXSwibmFtZXMiOlsiR2VvY29kZVJlc3BvbnNlUGFyc2VyIiwiVHlwZUVycm9yIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJwYXJzZSIsImpzb24iLCJnZW9jb2RlUmVzcG9uc2UiLCJHZW9jb2RlUmVzcG9uc2UiLCJvYmoiLCJKU09OIiwidHlwZSIsImkiLCJmZWF0dXJlcyIsImxlbmd0aCIsIl9wYXJzZUZlYXR1cmUiLCJfcGFyc2VFcnJvciIsIm1lc3MiLCJNUiIsImdldE1lc3NhZ2UiLCJFcnJTcnYiLCJtZXNzYWdlIiwiVFlQRV9VTktFUlIiLCJzdGF0dXMiLCJmZWF0dXJlIiwibG9jYXRpb24iLCJHZW9jb2RlZExvY2F0aW9uIiwiZ2VvbWV0cnkiLCJwb3NpdGlvbiIsImxvbiIsImNvb3JkaW5hdGVzIiwibGF0IiwicHJvcGVydGllcyIsInByb3AiLCJhY2N1cmFjeSIsInBsYWNlQXR0cmlidXRlcyIsIl90eXBlIiwibWF0Y2hUeXBlIiwibnVtYmVyIiwidW5kZWZpbmVkIiwibG9jYXRpb25zIiwicHVzaCIsImVycm9yIiwiZXhjZXB0aW9uUmVwb3J0Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDa0Q7QUFDSTtBQUNVO0FBQ0U7O0FBRWxFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxxQkFBcUJBLENBQUEsRUFBSTtFQUM5QixJQUFJLEVBQUUsSUFBSSxZQUFZQSxxQkFBcUIsQ0FBQyxFQUFFO0lBQzFDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLG1FQUFtRSxDQUFDO0VBQzVGO0FBQ0o7QUFFQUQscUJBQXFCLENBQUNFLFNBQVMsR0FBRztFQUU5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LGVBQWUsQ0FBQ0YsSUFBSSxDQUFDLEdBQUdULE9BQU8sQ0FBQ1EsVUFBVSxDQUFDQyxJQUFJLENBQUM7TUFDN0Q7SUFDSjtJQUNBLElBQUlULE9BQU8sQ0FBQ1EsVUFBVSxDQUFDSSxLQUFLLEtBQUssU0FBUyxFQUFFO01BQ3hDWCxRQUFRLENBQUNZLFNBQVMsR0FBR2IsT0FBTyxDQUFDUSxVQUFVLENBQUNNLE1BQU0sS0FBS0MsU0FBUyxJQUFJZixPQUFPLENBQUNRLFVBQVUsQ0FBQ00sTUFBTSxLQUFLLElBQUksR0FBRyxlQUFlLEdBQUcsUUFBUTtJQUNuSTtFQUNKO0VBQ0EvQixlQUFlLENBQUNpQyxTQUFTLENBQUNDLElBQUksQ0FBQ2hCLFFBQVEsQ0FBQztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNULFdBQVdBLENBQUUwQixLQUFLLEVBQUU7RUFDekIsT0FBTztJQUNIQyxlQUFlLEVBQUdEO0VBQ3RCLENBQUM7QUFDTDtBQUVlekMsb0ZBQXFCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0dlb2NvZGUvRm9ybWF0cy9HZW9jb2RlUmVzcG9uc2VQYXJzZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBNUiBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJTcnYgZnJvbSBcIi4uLy4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgR2VvY29kZVJlc3BvbnNlIGZyb20gXCIuLi9SZXNwb25zZS9tb2RlbC9HZW9jb2RlUmVzcG9uc2VcIjtcbmltcG9ydCBHZW9jb2RlZExvY2F0aW9uIGZyb20gXCIuLi9SZXNwb25zZS9tb2RlbC9HZW9jb2RlZExvY2F0aW9uXCI7XG5cbi8qKlxuICogRm9uY3Rpb24gcmV0b3VybmFudCB1biBvYmpldCBjb250ZW5hbnQgZGVzIGNsw6lzIGRlIGxlY3R1cmUgKHJlYWRlcnMpXG4gKiAgICAgIHF1aSBwZXJtZXR0ZW50IGRlIHBhcnNlciBkZXMgcsOpcG9uc2VzIFhNTCBkdSBzZXJ2aWNlIGRlIGfDqW9jb2RhZ2UgZGlyZWN0IGR1IEfDqW9wb3J0YWlsXG4gKiAgICAgIGFmaW4gZGUgcsOpY3Vww6lyZXIgbGVzIHLDqXN1bHRhdHMgcmV0b3VybsOpcy5cbiAqIEBtb2R1bGUgR2VvY29kZVJlc3BvbnNlUGFyc2VyXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuR2VvY29kZS5Gb3JtYXRzLkdlb2NvZGVSZXNwb25zZVBhcnNlclxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBDbGFzc2UgcGVybWV0dGFudCBkZSBwYXJzZXIgdW5lIHLDqXBvbnNlIEdlb0pTT05cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5Gb3JtYXRzLkdlb2NvZGVSZXNwb25zZVBhcnNlclxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEdlb2NvZGVSZXNwb25zZVBhcnNlciAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGVSZXNwb25zZVBhcnNlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlb2NvZGVSZXNwb25zZVBhcnNlciBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cbn1cblxuR2VvY29kZVJlc3BvbnNlUGFyc2VyLnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6R2VvY29kZVJlc3BvbnNlUGFyc2VyXG4gICAgICovXG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBHZW9jb2RlUmVzcG9uc2VQYXJzZXIsXG5cbiAgICAvKipcbiAgICAgKiBNw6l0aG9kZSBwZXJtZXR0YW50IGRlIGxhbmNlciBsYSBsZWN0dXJlIGQndW5lIHLDqXBvbnNlIEdlb0pTT04sXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ganNvbiAtIHLDqXBvbnNlIGF1IGZvcm1hdCBHZW9KU09OXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBnZW9jb2RlUmVzcG9uc2V8ZXhjZXB0aW9uUmVwb3J0IDogbCdvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkZSBsYSByw6lwb25zZSBHZW9KU09OLFxuICAgICAqICAgICAgc291cyBsYSBmb3JtZSBkJ3VuIG9iamV0IEdlb2NvZGVSZXNwb25zZSwgb3UgdW4gb2JqZXQgbGl0dMOpcmFsIGV4Y2VwdGlvblJlcG9ydCBzaSBsZSBzZXJ2aWNlIGEgcmVudm95w6kgdW5lIGV4Y2VwdGlvbi5cbiAgICAgKi9cbiAgICBwYXJzZSA6IGZ1bmN0aW9uIChqc29uKSB7XG4gICAgICAgIHZhciBnZW9jb2RlUmVzcG9uc2UgPSBuZXcgR2VvY29kZVJlc3BvbnNlKCk7XG5cbiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShqc29uKTtcblxuICAgICAgICBpZiAob2JqLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmouZmVhdHVyZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBfcGFyc2VGZWF0dXJlKG9iai5mZWF0dXJlc1tpXSwgZ2VvY29kZVJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gXCJGZWF0dXJlXCIpIHtcbiAgICAgICAgICAgIF9wYXJzZUZlYXR1cmUob2JqLCBnZW9jb2RlUmVzcG9uc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09PSBcIlNFUlZJQ0VfRVJST1JcIikge1xuICAgICAgICAgICAgcmV0dXJuIF9wYXJzZUVycm9yKG9iaik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbWVzcyA9IE1SLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0VcIiwgb2JqLnR5cGUpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVyclNydih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3MsXG4gICAgICAgICAgICAgICAgdHlwZSA6IEVyclNydi5UWVBFX1VOS0VSUixcbiAgICAgICAgICAgICAgICBzdGF0dXMgOiAyMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdlb2NvZGVSZXNwb25zZTtcbiAgICB9XG59O1xuXG4vKipcbiAqIE3DqXRob2RlIHBlcm1ldHRhbnQgZGUgcGFyc2VyIHVuIGZlYXR1cmVcbiAqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlXG4gKiBAcGFyYW0ge09iamVjdH0gZ2VvY29kZVJlc3BvbnNlXG4gKlxuICogQG1lbWJlcm9mIEdlb2NvZGVSZXNwb25zZVBhcnNlclxuICogQHJldHVybiB7T2JqZWN0fSBvYmpldCBHZW9jb2RlZExvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGdlb2NvZGVSZXNwb25zZSkge1xuICAgIHZhciBsb2NhdGlvbiA9IG5ldyBHZW9jb2RlZExvY2F0aW9uKCk7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgJiYgZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgbG9jYXRpb24ucG9zaXRpb24gPSB7XG4gICAgICAgICAgICBsb24gOiBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAgICAgbGF0IDogZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfc2NvcmVcIikge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uLmFjY3VyYWN5ID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wID09PSBcIl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BdID09PSBcImFkZHJlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi50eXBlID0gXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF0gPT09IFwicG9pXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24udHlwZSA9IFwiUG9zaXRpb25PZkludGVyZXN0XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF0gPT09IFwicGFyY2VsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24udHlwZSA9IFwiQ2FkYXN0cmFsUGFyY2VsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5wbGFjZUF0dHJpYnV0ZXNbcHJvcF0gPSBmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcy5fdHlwZSA9PT0gXCJhZGRyZXNzXCIpIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLm1hdGNoVHlwZSA9IGZlYXR1cmUucHJvcGVydGllcy5udW1iZXIgIT09IHVuZGVmaW5lZCAmJiBmZWF0dXJlLnByb3BlcnRpZXMubnVtYmVyICE9PSBudWxsID8gXCJzdHJlZXQgbnVtYmVyXCIgOiBcInN0cmVldFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdlb2NvZGVSZXNwb25zZS5sb2NhdGlvbnMucHVzaChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogTcOpdGhvZGUgcGVybWV0dGFudCBkZSBwYXJzZXIgdW5lIGVycmV1clxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGVycm9yXG4gKlxuICogQG1lbWJlcm9mIEdlb2NvZGVSZXNwb25zZVBhcnNlclxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfcGFyc2VFcnJvciAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBleGNlcHRpb25SZXBvcnQgOiBlcnJvclxuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVSZXNwb25zZVBhcnNlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Formats/GeocodeResponseParser.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Geocode.js": -/*!*****************************************!*\ - !*** ./src/Services/Geocode/Geocode.js ***! - \*****************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/GeocodeRequestFactory */ \"./src/Services/Geocode/Request/GeocodeRequestFactory.js\");\n/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/GeocodeResponseFactory */ \"./src/Services/Geocode/Response/GeocodeResponseFactory.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service de géocodage direct du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n *\n *\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.Geocode\n *\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String|Object} options.query - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée.\n *\n * @param {Object} [options.filters] - Les propriétés possibles de cet objet sont décrites ci-après.\n * @param {String} [options.filters.[prop]] - Critère supplémentaire pour filtrer la recherche sous la forme\n * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête.\n * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"city\".\n * Il permet également de filtrer les toponymes avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"type\".\n * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés :\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n *\n * @param {String} [options.index = \"StreetAddress\"] - Type de l'objet recherché.\n * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress'\n * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales.\n * L'index 'location' regroupe les indexes 'StreetAddress' et 'PositionOfInterest'.\n * D'autres types pourront être rajoutés selon l'évolution du service.\n * Par défaut, index = 'StreetAddress'.\n *\n * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs.\n * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité.\n * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité.\n *\n * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir.\n * Pas de valeur par défaut.\n * Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20.\n *\n * @param {Boolean} [options.returnTrueGeometry = false] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés.\n * false par défaut.\n *\n *\n * @example\n * var options = {\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * proxyURL : null,\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * position : {lon:, lat:},\n * index : 'StreetAddress',\n * query : '10 rue du pont Machin-ville'\n * (...)\n * };\n */\nfunction Geocode(options_) {\n if (!(this instanceof Geocode)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Geocode\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"Geocode\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.Geocode\");\n this.logger.trace(\"[Constructeur Geocode (options)]\");\n var options = this.patchOptionConvertor(options_);\n if (!options.serverUrl) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Geocode.newUrl();\n if (options.oldGeocodeService) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Geocode.url();\n }\n }\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, [options]);\n if (!options.hasOwnProperty(\"query\")) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"query\"));\n }\n\n // ajout des options spécifiques au service\n this.options.query = options.query;\n\n // on definit l'index par defaut\n if (!options.index) {\n this.options.index = options.index = \"StreetAddress\";\n }\n if (options.filters) {\n var filter = Object.keys(options.filters);\n for (var i = 0; i < filter.length; i++) {\n var key = filter[i];\n // on supprime les filtres vides\n if (typeof options.filters[key] === \"undefined\" || _typeof(options.filters[key]) === \"object\" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === \"string\" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) {\n delete this.options.filters[key];\n }\n }\n }\n this.options.index = options.index || \"StreetAddress\";\n this.options.maximumResponses = options.maximumResponses || 20;\n}\n\n/**\n * @lends module:Geocode#\n */\nGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nGeocode.prototype.constructor = Geocode;\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} options_ - options du service\n * @return {Object} - options\n */\nGeocode.prototype.patchOptionConvertor = function (options_) {\n var options = options_;\n if (options.hasOwnProperty(\"location\")) {\n this.logger.warn(\"The parameter 'location' is deprecated\");\n if (!options.query) {\n options.query = options.location;\n }\n delete options.location;\n }\n if (options.filterOptions) {\n this.logger.warn(\"The parameter 'filterOptions' is deprecated\");\n if (!options.filters) {\n options.filters = options.filterOptions;\n if (options.filters.type) {\n this.logger.warn(\"The parameter 'filterOptions.type' is deprecated\");\n if (!options.index) {\n if (Array.isArray(options.filters.type) && options.filters.type.length > 0) {\n options.index = options.filters.type[0];\n } else {\n options.index = options.filters.type;\n }\n }\n delete options.filters.type;\n }\n if (options.filters.bbox) {\n this.logger.warn(\"The parameter 'filterOptions.bbox' is deprecated\");\n delete options.filters.bbox;\n }\n }\n delete options.filterOptions;\n }\n if (options.position) {\n if (options.position.x) {\n this.logger.warn(\"The parameter 'position.x' is deprecated\");\n if (!options.position.lon) {\n options.position.lon = options.position.x;\n }\n delete options.position.x;\n }\n if (options.position.y) {\n this.logger.warn(\"The parameter 'position.y' is deprecated\");\n if (!options.position.lat) {\n options.position.lat = options.position.y;\n }\n delete options.position.y;\n }\n }\n if (options.returnFreeForm) {\n this.logger.warn(\"The parameter 'returnFreeForm' is deprecated\");\n delete options.returnFreeForm;\n }\n if (options.srs) {\n this.logger.warn(\"The parameter 'srs' is deprecated\");\n delete options.srs;\n }\n return options;\n};\n\n/**\n * Création de la requête (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nGeocode.prototype.buildRequest = function (error, success) {\n var options = {\n httpMethod: this.options.httpMethod,\n // options specifiques du service\n geocodeMethod: \"search\",\n query: this.options.query,\n index: this.options.index,\n returnTrueGeometry: this.options.returnTrueGeometry,\n position: this.options.position,\n maxResp: this.options.maximumResponses,\n filters: this.options.filters\n };\n this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n\n // on teste si la requete a bien été construite !\n !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"))) : success.call(this, this.request);\n};\n\n/**\n * Analyse de la reponse (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nGeocode.prototype.analyzeResponse = function (error, success) {\n /* INFO :\n Etape 1 : Création de la requête (URL)\n -> stockage de la requête dans this.request\n Etape 2 : Envoi de la requête\n -> appel du protocol XHR, et envoi (par ex send ())\n -> récupération de la réponse JSON dans la fonction onSuccess () (this.response)\n -> si code HTTP 200 et pas de message d'erreur : etape 3\n -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur\n Etape 3 : Analyse de la réponse JSON (si rawResponse === false )\n -> appel du parser pour récupérer le document\n Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse :\n -> JSON (si rawResponse === true)\n -> ou geocodedLocations\n */\n\n if (this.response) {\n var options = {\n response: this.response,\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this\n };\n _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Geocode);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL0dlb2NvZGUuanM/NGZjNyJdLCJuYW1lcyI6WyJHZW9jb2RlIiwib3B0aW9uc18iLCJUeXBlRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsIkNMQVNTTkFNRSIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwib3B0aW9ucyIsInBhdGNoT3B0aW9uQ29udmVydG9yIiwic2VydmVyVXJsIiwiRGVmYXVsdFVybFNlcnZpY2UiLCJuZXdVcmwiLCJvbGRHZW9jb2RlU2VydmljZSIsInVybCIsIkNvbW1vblNlcnZpY2UiLCJhcHBseSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJxdWVyeSIsImluZGV4IiwiZmlsdGVycyIsImZpbHRlciIsIk9iamVjdCIsImtleXMiLCJpIiwibGVuZ3RoIiwia2V5IiwiX3R5cGVvZiIsIkFycmF5IiwiaXNBcnJheSIsIm1heGltdW1SZXNwb25zZXMiLCJwcm90b3R5cGUiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndhcm4iLCJsb2NhdGlvbiIsImZpbHRlck9wdGlvbnMiLCJ0eXBlIiwiYmJveCIsInBvc2l0aW9uIiwieCIsImxvbiIsInkiLCJsYXQiLCJyZXR1cm5GcmVlRm9ybSIsInNycyIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsImh0dHBNZXRob2QiLCJnZW9jb2RlTWV0aG9kIiwicmV0dXJuVHJ1ZUdlb21ldHJ5IiwibWF4UmVzcCIsInJlcXVlc3QiLCJHZW9jb2RlUmVxdWVzdEZhY3RvcnkiLCJidWlsZCIsImNhbGwiLCJFcnJvclNlcnZpY2UiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsInJhd1Jlc3BvbnNlIiwib25FcnJvciIsIm9uU3VjY2VzcyIsInNjb3BlIiwiR2VvY29kZVJlc3BvbnNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWlEO0FBQ0g7QUFDVztBQUNaO0FBQ1E7QUFDZTtB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QkMsV0FBVyxFQUFHLElBQUksQ0FBQ3JELE9BQU8sQ0FBQ3FELFdBQVc7TUFDdENDLE9BQU8sRUFBR2QsS0FBSztNQUNmZSxTQUFTLEVBQUdkLE9BQU87TUFDbkJlLEtBQUssRUFBRztJQUNaLENBQUM7SUFFREMsd0VBQXNCLENBQUNULEtBQUssQ0FBQ2hELE9BQU8sQ0FBQztFQUN6QyxDQUFDLE1BQU07SUFDSHdDLEtBQUssQ0FBQ1MsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJQyxnRUFBWSxDQUFDekQsZ0VBQUMsQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztFQUM5RTtBQUNKLENBQUM7QUFFY0osc0VBQU8iLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9HZW9jb2RlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgQ29tbW9uU2VydmljZSBmcm9tIFwiLi4vQ29tbW9uU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuLi9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IEdlb2NvZGVSZXF1ZXN0RmFjdG9yeSBmcm9tIFwiLi9SZXF1ZXN0L0dlb2NvZGVSZXF1ZXN0RmFjdG9yeVwiO1xuaW1wb3J0IEdlb2NvZGVSZXNwb25zZUZhY3RvcnkgZnJvbSBcIi4vUmVzcG9uc2UvR2VvY29kZVJlc3BvbnNlRmFjdG9yeVwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEFwcGVsIGR1IHNlcnZpY2UgZGUgZ8Opb2NvZGFnZSBkaXJlY3QgZHUgR8Opb3BvcnRhaWwgOlxuICogICAgIGVudm9pIGRlIGxhIHJlcXXDqnRlIGNvbnN0cnVpdGUgc2Vsb24gbGVzIHBhcmFtw6h0cmVzIGVuIG9wdGlvbnMsXG4gKiAgICAgw6l2ZW50dWVsbGVtZW50IHBhcnNpbmcgZXQgYW5hbHlzZSAgZGUgbGEgcsOpcG9uc2UsXG4gKiAgICAgcmV0b3VyIGQndW5lIHLDqXBvbnNlIGVuIHBhcmFtw6h0cmUgZGUgbGEgZm9uY3Rpb24gb25TdWNjZXNzLlxuICpcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtHcC5TZXJ2aWNlcy5Db21tb25TZXJ2aWNlfVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2UgKCsgbGVzIG9wdGlvbnMgaGVyaXTDqWVzKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gb3B0aW9ucy5xdWVyeSAtIE5vbSBkZSBsJ2FkcmVzc2UsIGR1IHRvcG9ueW1lLCBkZSBsJ3VuaXTDqSBhZG1pbmlzdHJhdGl2ZSBvdSBkZSBsYSBwYXJjZWxsZSBjYWRhc3RyYWxlIHJlY2hlcmNow6llLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maWx0ZXJzXSAtIExlcyBwcm9wcmnDqXTDqXMgcG9zc2libGVzIGRlIGNldCBvYmpldCBzb250IGTDqWNyaXRlcyBjaS1hcHLDqHMuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZmlsdGVycy5bcHJvcF1dIC0gQ3JpdMOocmUgc3VwcGzDqW1lbnRhaXJlIHBvdXIgZmlsdHJlciBsYSByZWNoZXJjaGUgc291cyBsYSBmb3JtZVxuICogICAgICBkJ3VuIGNvdXBsZSBjbMOpL3ZhbGV1ciDDoCBkw6lmaW5pciBzZWxvbiBsZXMgcG9zc2liaWxpdMOpcyBkdSBzZXJ2ZXVyIGFqb3V0w6kgw6AgbGEgcmVxdcOqdGUuXG4gKiAgICAgIExlIHNlcnZpY2UgZGUgZ8Opb2NvZGFnZSBkdSBHw6lvcG9ydGFpbCBwZXJtZXQgZGUgZmlsdHJlciBsZXMgYWRyZXNzZXMgcG9zdGFsZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIDpcbiAqICAgICAgICAgIFwicG9zdGFsQ29kZVwiLCBcImluc2VlQ29kZVwiLCBcImNpdHlcIi5cbiAqICAgICAgSWwgcGVybWV0IMOpZ2FsZW1lbnQgZGUgZmlsdHJlciBsZXMgdG9wb255bWVzIGF2ZWMgbGVzIHByb3ByacOpdMOpcyA6XG4gKiAgICAgICAgICBcInBvc3RhbENvZGVcIiwgXCJpbnNlZUNvZGVcIiwgXCJ0eXBlXCIuXG4gKiAgICAgIEVuZmluLCBpbCBwZXJtZXQgZGUgZmlsdHJlciBsZXMgcGFyY2VsbGVzIGNhZGFzdHJhbGVzIGF2ZWMgbGVzIHByb3ByacOpdMOpcyA6XG4gKiAgICAgICAgICBcImNvZGVEZXBhcnRlbWVudFwiLCBcImNvZGVDb21tdW5lXCIsIFwibm9tQ29tbXVuZVwiLCBcImNvZGVDb21tdW5lQWJzXCIsIFwiY29kZUFycm9uZGlzc2VtZW50XCIsIFwic2VjdGlvblwiLCBcIm51bWVyb1wiLCBcImZldWlsbGVcIi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaW5kZXggPSBcIlN0cmVldEFkZHJlc3NcIl0gLSBUeXBlIGRlIGwnb2JqZXQgcmVjaGVyY2jDqS5cbiAqICAgICAgTGUgc2VydmljZSBkZSBnw6lvY29kYWdlIGR1IEfDqW9wb3J0YWlsIHBlcm1ldCBkZSByZWNoZXJjaGVyIGRlcyAnUG9zaXRpb25PZkludGVyZXN0JyBwb3VyIGRlcyB0b3BvbnltZXMsIGRlcyAnU3RyZWV0QWRkcmVzcydcbiAqICAgICAgcG91ciBkZXMgYWRyZXNzZXMgcG9zdGFsZXMgb3UgZGVzICdDYWRhc3RyYWxQYXJjZWwnIHBvdXIgZGVzIHBhcmNlbGxlcyBjYWRhc3RyYWxlcy5cbiAqICAgICAgTCdpbmRleCAnbG9jYXRpb24nIHJlZ3JvdXBlIGxlcyBpbmRleGVzICdTdHJlZXRBZGRyZXNzJyBldCAnUG9zaXRpb25PZkludGVyZXN0Jy5cbiAqICAgICAgRCdhdXRyZXMgdHlwZXMgcG91cnJvbnQgw6p0cmUgcmFqb3V0w6lzIHNlbG9uIGwnw6l2b2x1dGlvbiBkdSBzZXJ2aWNlLlxuICogICAgICBQYXIgZMOpZmF1dCwgaW5kZXggPSAnU3RyZWV0QWRkcmVzcycuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMucG9zaXRpb24gLSBQb3NpdGlvbiBkdSBwb2ludCBkZSByw6lmw6lyZW5jZSBwb3VyIGxlIGNhbGN1bCBkZSBwcm94aW1pdMOpIGV4cHJpbcOpZSBkYW5zIGxlIHN5c3TDqG1lIGRlIHLDqWbDqXJlbmNlIHNww6ljaWZpw6kgcGFyIGxlIHNycy5cbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi5sb24gLSBMb25naXR1ZGUgZHUgcG9pbnQgZGUgcsOpZsOpcmVuY2UgcG91ciBsZSBjYWxjdWwgZGUgcHJveGltaXTDqS5cbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBMYXRpdHVkZSBkdSBwb2ludCBkZSByw6lmw6lyZW5jZSBwb3VyIGxlIGNhbGN1bCBkZSBwcm94aW1pdMOpLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzXSAtIE5vbWJyZSBkZSByw6lwb25zZXMgbWF4aW1hbCBxdWUgbCdvbiBzb3VoYWl0ZSByZWNldm9pci5cbiAqICAgICAgUGFzIGRlIHZhbGV1ciBwYXIgZMOpZmF1dC5cbiAqICAgICAgU2kgbGUgc2VydmV1ciBjb25zdWx0w6kgZXN0IGNlbHVpIGR1IEfDqW9wb3J0YWlsLCBsYSB2YWxldXIgcGFyIGTDqWZhdXQgc2VyYSBkb25jIGNlbGxlIGR1IHNlcnZpY2UgOiAyMC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldHVyblRydWVHZW9tZXRyeSA9IGZhbHNlXSAtIEJvb2zDqWVuIGluZGlxdWFudCBzaSBsJ29uIHNvdWhhaXRlIHLDqWN1cMOpcmVyIGxhIGfDqW9tw6l0cmllIHZyYWllIGRlcyBvYmplY3RzIGfDqW9sb2NhbGlzw6lzLlxuICogICAgICBmYWxzZSBwYXIgZMOpZmF1dC5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIGFwaUtleSA6IG51bGwsXG4gKiAgICAgIHNlcnZlclVybCA6ICdodHRwOi8vbG9jYWxob3N0L3NlcnZpY2UvJyxcbiAqICAgICAgcHJveHlVUkwgOiBudWxsLFxuICogICAgICB0aW1lT3V0IDogMTAwMDAsIC8vIG1zXG4gKiAgICAgIHJhd1Jlc3BvbnNlIDogZmFsc2UsIC8vIHRydWV8ZmFsc2VcbiAqICAgICAgc2NvcGUgOiBudWxsLCAvLyB0aGlzXG4gKiAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXNwb25zZSkge30sXG4gKiAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gKiAgICAgIC8vIHNww6ljaWZpcXVlIGF1IHNlcnZpY2VcbiAqICAgICAgcG9zaXRpb24gOiB7bG9uOiwgbGF0On0sXG4gKiAgICAgIGluZGV4IDogJ1N0cmVldEFkZHJlc3MnLFxuICogICAgICBxdWVyeSA6ICcxMCBydWUgZHUgcG9udCBNYWNoaW4tdmlsbGUnXG4gKiAgICAgICguLi4pXG4gKiAgIH07XG4gKi9cbmZ1bmN0aW9uIEdlb2NvZGUgKG9wdGlvbnNfKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIiwgXCJHZW9jb2RlXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKiBGSVhNRSBpbnN0YW5jZSBvdSBjbGFzc2UgP1xuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJHZW9jb2RlXCI7XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJHcC5TZXJ2aWNlcy5HZW9jb2RlXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBHZW9jb2RlIChvcHRpb25zKV1cIik7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMucGF0Y2hPcHRpb25Db252ZXJ0b3Iob3B0aW9uc18pO1xuICAgIGlmICghb3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgb3B0aW9ucy5zZXJ2ZXJVcmwgPSBEZWZhdWx0VXJsU2VydmljZS5HZW9jb2RlLm5ld1VybCgpO1xuICAgICAgICBpZiAob3B0aW9ucy5vbGRHZW9jb2RlU2VydmljZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zZXJ2ZXJVcmwgPSBEZWZhdWx0VXJsU2VydmljZS5HZW9jb2RlLnVybCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwZWwgZHUgY29uc3RydWN0ZXVyIHBhciBoZXJpdGFnZVxuICAgIENvbW1vblNlcnZpY2UuYXBwbHkodGhpcywgW29wdGlvbnNdKTtcblxuICAgIGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShcInF1ZXJ5XCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwicXVlcnlcIikpO1xuICAgIH1cblxuICAgIC8vIGFqb3V0IGRlcyBvcHRpb25zIHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlXG4gICAgdGhpcy5vcHRpb25zLnF1ZXJ5ID0gb3B0aW9ucy5xdWVyeTtcblxuICAgIC8vIG9uIGRlZmluaXQgbCdpbmRleCBwYXIgZGVmYXV0XG4gICAgaWYgKCFvcHRpb25zLmluZGV4KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5pbmRleCA9IG9wdGlvbnMuaW5kZXggPSBcIlN0cmVldEFkZHJlc3NcIjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5maWx0ZXJzKSB7XG4gICAgICAgIHZhciBmaWx0ZXIgPSBPYmplY3Qua2V5cyhvcHRpb25zLmZpbHRlcnMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGZpbHRlcltpXTtcbiAgICAgICAgICAgIC8vIG9uIHN1cHByaW1lIGxlcyBmaWx0cmVzIHZpZGVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyc1trZXldID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmZpbHRlcnNba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmZpbHRlcnNba2V5XSkubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXJzW2tleV0gPT09IFwic3RyaW5nXCIgJiYgb3B0aW9ucy5maWx0ZXJzW2tleV0ubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsdGVyc1trZXldKSAmJiBvcHRpb25zLmZpbHRlcnNba2V5XS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmZpbHRlcnNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5pbmRleCA9IG9wdGlvbnMuaW5kZXggfHwgXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMgPSBvcHRpb25zLm1heGltdW1SZXNwb25zZXMgfHwgMjA7XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpHZW9jb2RlI1xuICovXG5HZW9jb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5HZW9jb2RlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlb2NvZGU7XG5cbi8qKlxuICogUGF0Y2ggcG91ciBsYSBjb252ZXJ0aW9uIGRlcyBvcHRpb25zIHZlcnMgbGUgbm91dmVhdSBmb3JtYWxpc21lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXyAtIG9wdGlvbnMgZHUgc2VydmljZVxuICogQHJldHVybiB7T2JqZWN0fSAtIG9wdGlvbnNcbiAqL1xuR2VvY29kZS5wcm90b3R5cGUucGF0Y2hPcHRpb25Db252ZXJ0b3IgPSBmdW5jdGlvbiAob3B0aW9uc18pIHtcbiAgICBjb25zdCBvcHRpb25zID0gb3B0aW9uc187XG5cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShcImxvY2F0aW9uXCIpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdsb2NhdGlvbicgaXMgZGVwcmVjYXRlZFwiKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMucXVlcnkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucXVlcnkgPSBvcHRpb25zLmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLmxvY2F0aW9uO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmZpbHRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMnIGlzIGRlcHJlY2F0ZWRcIik7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVycyA9IG9wdGlvbnMuZmlsdGVyT3B0aW9ucztcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVycy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudHlwZScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5maWx0ZXJzLnR5cGUpICYmIG9wdGlvbnMuZmlsdGVycy50eXBlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmZpbHRlcnMudHlwZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmZpbHRlcnMudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5maWx0ZXJzLnR5cGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcnMuYmJveCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zLmJib3gnIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVycy5iYm94O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLmZpbHRlck9wdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucG9zaXRpb24ueCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ3Bvc2l0aW9uLngnIGlzIGRlcHJlY2F0ZWRcIik7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wb3NpdGlvbi5sb24pIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnBvc2l0aW9uLmxvbiA9IG9wdGlvbnMucG9zaXRpb24ueDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnBvc2l0aW9uLng7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbi55KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiVGhlIHBhcmFtZXRlciAncG9zaXRpb24ueScgaXMgZGVwcmVjYXRlZFwiKTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBvc2l0aW9uLmxhdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucG9zaXRpb24ubGF0ID0gb3B0aW9ucy5wb3NpdGlvbi55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMucG9zaXRpb24ueTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJldHVybkZyZWVGb3JtKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdyZXR1cm5GcmVlRm9ybScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgZGVsZXRlIG9wdGlvbnMucmV0dXJuRnJlZUZvcm07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3JzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdzcnMnIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnNycztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogQ3LDqWF0aW9uIGRlIGxhIHJlcXXDqnRlIChvdmVyd3JpdGUpXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAqL1xuR2VvY29kZS5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIGh0dHBNZXRob2QgOiB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCxcbiAgICAgICAgLy8gb3B0aW9ucyBzcGVjaWZpcXVlcyBkdSBzZXJ2aWNlXG4gICAgICAgIGdlb2NvZGVNZXRob2QgOiBcInNlYXJjaFwiLFxuICAgICAgICBxdWVyeSA6IHRoaXMub3B0aW9ucy5xdWVyeSxcbiAgICAgICAgaW5kZXggOiB0aGlzLm9wdGlvbnMuaW5kZXgsXG4gICAgICAgIHJldHVyblRydWVHZW9tZXRyeSA6IHRoaXMub3B0aW9ucy5yZXR1cm5UcnVlR2VvbWV0cnksXG4gICAgICAgIHBvc2l0aW9uIDogdGhpcy5vcHRpb25zLnBvc2l0aW9uLFxuICAgICAgICBtYXhSZXNwIDogdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMsXG4gICAgICAgIGZpbHRlcnMgOiB0aGlzLm9wdGlvbnMuZmlsdGVyc1xuICAgIH07XG5cbiAgICB0aGlzLnJlcXVlc3QgPSBHZW9jb2RlUmVxdWVzdEZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG5cbiAgICAvLyBvbiB0ZXN0ZSBzaSBsYSByZXF1ZXRlIGEgYmllbiDDqXTDqSBjb25zdHJ1aXRlICFcbiAgICAoIXRoaXMucmVxdWVzdClcbiAgICAgICAgPyBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoXy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVFVRVNUX0JVSUxEXCIpKSlcbiAgICAgICAgOiBzdWNjZXNzLmNhbGwodGhpcywgdGhpcy5yZXF1ZXN0KTtcbn07XG5cbi8qKlxuICogQW5hbHlzZSBkZSBsYSByZXBvbnNlIChvdmVyd3JpdGUpXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAqL1xuR2VvY29kZS5wcm90b3R5cGUuYW5hbHl6ZVJlc3BvbnNlID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLyogSU5GTyA6XG4gICAgICAgICBFdGFwZSAxIDogQ3LDqWF0aW9uIGRlIGxhIHJlcXXDqnRlIChVUkwpXG4gICAgICAgICAgICAtPiBzdG9ja2FnZSBkZSBsYSByZXF1w6p0ZSBkYW5zIHRoaXMucmVxdWVzdFxuICAgICAgICAgRXRhcGUgMiA6IEVudm9pIGRlIGxhIHJlcXXDqnRlXG4gICAgICAgICAgICAtPiBhcHBlbCBkdSBwcm90b2NvbCBYSFIsIGV0IGVudm9pIChwYXIgZXggc2VuZCAoKSlcbiAgICAgICAgICAgIC0+IHLDqWN1cMOpcmF0aW9uIGRlIGxhIHLDqXBvbnNlIEpTT04gZGFucyBsYSBmb25jdGlvbiBvblN1Y2Nlc3MgKCkgKHRoaXMucmVzcG9uc2UpXG4gICAgICAgICAgICAtPiBzaSBjb2RlIEhUVFAgMjAwIGV0IHBhcyBkZSBtZXNzYWdlIGQnZXJyZXVyIDogZXRhcGUgM1xuICAgICAgICAgICAgLT4gc2kgY29kZSBIVFRQICE9IDIwMCA6IGxhbmNlbWVudCBkZSBsYSBmb25jdGlvbiBkZSBjYWxsYmFjayBvbkZhaWx1cmUgYXZlYyBsZSBtZXNzYWdlIGQnZXJyZXVyXG4gICAgICAgICBFdGFwZSAzIDogQW5hbHlzZSBkZSBsYSByw6lwb25zZSBKU09OIChzaSByYXdSZXNwb25zZSA9PT0gZmFsc2UgKVxuICAgICAgICAgICAgLT4gYXBwZWwgZHUgcGFyc2VyIHBvdXIgcsOpY3Vww6lyZXIgbGUgZG9jdW1lbnRcbiAgICAgICAgIEV0YXBlIDQgOiBMYW5jZW1lbnQgZGUgbGEgZm9uY3Rpb24gZGUgY2FsbGJhY2sgb25TdWNjZXNzIGF2ZWMgbGEgcsOpcG9uc2UgOlxuICAgICAgICAgICAgLT4gSlNPTiAoc2kgcmF3UmVzcG9uc2UgPT09IHRydWUpXG4gICAgICAgICAgICAtPiBvdSBnZW9jb2RlZExvY2F0aW9uc1xuICAgICovXG5cbiAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlIDogdGhpcy5yZXNwb25zZSxcbiAgICAgICAgICAgIHJhd1Jlc3BvbnNlIDogdGhpcy5vcHRpb25zLnJhd1Jlc3BvbnNlLFxuICAgICAgICAgICAgb25FcnJvciA6IGVycm9yLFxuICAgICAgICAgICAgb25TdWNjZXNzIDogc3VjY2VzcyxcbiAgICAgICAgICAgIHNjb3BlIDogdGhpc1xuICAgICAgICB9O1xuXG4gICAgICAgIEdlb2NvZGVSZXNwb25zZUZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBHZW9jb2RlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Geocode.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Request/GeocodeRequestFactory.js": -/*!***************************************************************!*\ - !*** ./src/Services/Geocode/Request/GeocodeRequestFactory.js ***! - \***************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GeocodeRequestREST */ \"./src/Services/Geocode/Request/GeocodeRequestREST.js\");\n\n\n\n/**\n * Creation d'une requête\n * (Factory)\n *\n * @module GeocodeRequestFactory\n * @alias Gp.Services.Geocode.Request.GeocodeRequestFactory\n * @private\n */\nvar GeocodeRequestFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Geocode\n *\n * @example\n * var options = {\n * // options specifiques du service\n * geocodeMethod:\n * query:\n * filters:\n * maximumResponses:\n * };\n * var result = GeocodeRequestFactory.build(options);\n * if (!result) {\n * // error...\n * }\n * @returns {String} request\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"GeocodeRequestFactory\");\n logger.trace([\"GeocodeRequestFactory::build()\"]);\n var settings = options || {};\n var myReq = new _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__[\"default\"](settings);\n if (!myReq.processRequestString()) {\n throw new Error(\"Error process request (rest) !\");\n }\n var request = myReq.requestString;\n logger.trace(request);\n return request;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeRequestFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvR2VvY29kZVJlcXVlc3RGYWN0b3J5LmpzPzQ1MzgiXSwibmFtZXMiOlsiR2VvY29kZVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJzZXR0aW5ncyIsIm15UmVxIiwiR2VvY29kZVJlcXVlc3RSRVNUIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJFcnJvciIsInJlcXVlc3QiLCJyZXF1ZXN0U3RyaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBb0Q7QUFDRTs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLHFCQUFxQixHQUFHO0VBRXhCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsdUJBQXVCLENBQUM7SUFDdERGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUVoRCxJQUFJQyxRQUFRLEdBQUdMLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFFNUIsSUFBSU0sS0FBSyxHQUFHLElBQUlDLDJEQUFrQixDQUFDRixRQUFRLENBQUM7SUFDNUMsSUFBSSxDQUFDQyxLQUFLLENBQUNFLG9CQUFvQixDQUFDLENBQUMsRUFBRTtNQUMvQixNQUFNLElBQUlDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztJQUNyRDtJQUNBLElBQUlDLE9BQU8sR0FBR0osS0FBSyxDQUFDSyxhQUFhO0lBRWpDVixNQUFNLENBQUNHLEtBQUssQ0FBQ00sT0FBTyxDQUFDO0lBRXJCLE9BQU9BLE9BQU87RUFDbEI7QUFDSixDQUFDO0FBRWNaLG9GQUFxQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvR2VvY29kZVJlcXVlc3RGYWN0b3J5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgR2VvY29kZVJlcXVlc3RSRVNUIGZyb20gXCIuL0dlb2NvZGVSZXF1ZXN0UkVTVFwiO1xuXG4vKipcbiAqIENyZWF0aW9uIGQndW5lIHJlcXXDqnRlXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEdlb2NvZGVSZXF1ZXN0RmFjdG9yeVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGUuUmVxdWVzdC5HZW9jb2RlUmVxdWVzdEZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBHZW9jb2RlUmVxdWVzdEZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBHZW9jb2RlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICogICAgICAvLyBvcHRpb25zIHNwZWNpZmlxdWVzIGR1IHNlcnZpY2VcbiAgICAgKiAgICAgIGdlb2NvZGVNZXRob2Q6XG4gICAgICogICAgICBxdWVyeTpcbiAgICAgKiAgICAgIGZpbHRlcnM6XG4gICAgICogICAgICBtYXhpbXVtUmVzcG9uc2VzOlxuICAgICAqICAgfTtcbiAgICAgKiAgIHZhciByZXN1bHQgPSBHZW9jb2RlUmVxdWVzdEZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgICogICBpZiAoIXJlc3VsdCkge1xuICAgICAqICAgICAgIC8vIGVycm9yLi4uXG4gICAgICogICB9XG4gICAgICogQHJldHVybnMge1N0cmluZ30gcmVxdWVzdFxuICAgICAqL1xuICAgIGJ1aWxkIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbG9nZ2VyXG4gICAgICAgIHZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiR2VvY29kZVJlcXVlc3RGYWN0b3J5XCIpO1xuICAgICAgICBsb2dnZXIudHJhY2UoW1wiR2VvY29kZVJlcXVlc3RGYWN0b3J5OjpidWlsZCgpXCJdKTtcblxuICAgICAgICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHZhciBteVJlcSA9IG5ldyBHZW9jb2RlUmVxdWVzdFJFU1Qoc2V0dGluZ3MpO1xuICAgICAgICBpZiAoIW15UmVxLnByb2Nlc3NSZXF1ZXN0U3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHByb2Nlc3MgcmVxdWVzdCAocmVzdCkgIVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVxdWVzdCA9IG15UmVxLnJlcXVlc3RTdHJpbmc7XG5cbiAgICAgICAgbG9nZ2VyLnRyYWNlKHJlcXVlc3QpO1xuXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVSZXF1ZXN0RmFjdG9yeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Request/GeocodeRequestFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Request/GeocodeRequestREST.js": -/*!************************************************************!*\ - !*** ./src/Services/Geocode/Request/GeocodeRequestREST.js ***! - \************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/GeocodeParamREST */ \"./src/Services/Geocode/Request/model/GeocodeParamREST.js\");\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire\n * (uniquement en GET)\n *\n * @constructor\n * @alias Gp.Services.Geocode.Request.GeocodeRequestREST\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * var options = {\n * (...)\n * };\n *\n * @private\n */\nfunction GeocodeRequestREST(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"GeocodeRequestREST\");\n this.logger.trace(\"[Constructeur GeocodeRequestREST ()]\");\n if (!(this instanceof GeocodeRequestREST)) {\n throw new TypeError(\"GeocodeRequestREST constructor cannot be called as a function.\");\n }\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n /** liste des options */\n this.settings = options;\n}\nGeocodeRequestREST.prototype = {\n /**\n * @lends module:GeocodeRequestREST#\n */\n\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: GeocodeRequestREST,\n /**\n * Construction de la requête.\n *\n * @returns {String} request\n */\n processRequestString: function processRequestString() {\n var request = \"\";\n\n // Mapping des options avec le service de l'API REST\n var oParams = new _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.settings);\n var params = oParams.getParams();\n for (var i = 0; i < params.length; i++) {\n var o = params[i];\n if (request) {\n request += \"&\";\n }\n request += o.k + \"=\" + o.v;\n }\n if (!this.settings.geocodeMethod || this.settings.geocodeMethod !== \"search\" && this.settings.geocodeMethod !== \"reverse\") {\n throw new Error(\"Error geocodeMethod not valid\");\n }\n this.requestString = \"?\" + request;\n this.logger.trace(this.requestString);\n return this.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeRequestREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvR2VvY29kZVJlcXVlc3RSRVNULmpzP2Q1ZTciXSwibmFtZXMiOlsiR2VvY29kZVJlcXVlc3RSRVNUIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiVHlwZUVycm9yIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInNldHRpbmdzIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJyZXF1ZXN0Iiwib1BhcmFtcyIsIkdlb2NvZGVQYXJhbVJFU1QiLCJwYXJhbXMiLCJnZXRQYXJhbXMiLCJpIiwibGVuZ3RoIiwibyIsImsiLCJ2IiwiZ2VvY29kZU1ldGhvZCJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBb0Q7QUFDSDtBQUNPOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLGtCQUFrQkEsQ0FBRUMsT0FBTyxFQUFFO0VBQ2xDLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsb0JBQW9CLENBQUM7RUFDcEQsSUFBSSxDQUFDRixNQUFNLENBQUNHLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQztFQUV6RCxJQUFJLEVBQUUsSUFBSSxZQUFZTCxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3ZDLE1BQU0sSUFBSU0sU0FBUyxDQUFDLGdFQUFnRSxDQUFDO0VBQ3pGOztFQUVBO0VBQ0EsSUFBSSxDQUFDTCxPQUFPLEVBQUU7SUFDVixNQUFNLElBQUlNLEtBQUssQ0FBQ0MsZ0VBQUMsQ0FBQ0MsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztFQUMzRDs7RUFFQTtFQUNBLElBQUksQ0FBQ0MsUUFBUSxHQUFHVCxPQUFPO0FBQzNCO0FBRUFELGtCQUFrQixDQUFDVyxTQUFTLEdBQUc7RUFFM0I7QUFDSjtBQUNBOztFQUVJO0FBQ0o7QUFDQTtBQUNBO0VBQ0lDLGFBQWEsRUFBRyxJQUFJO0VBRXBCO0FBQ0o7QUFDQTtFQUNJQyxXQUFXLEVBQUdiLGtCQUFrQjtFQUVoQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0ljLG9CQUFvQixFQUFHLFNBQUFBLHFCQUFBLEVBQVk7SUFDL0IsSUFBSUMsT0FBTyxHQUFHLEVBQUU7O0lBRWhCO0lBQ0EsSUFBTUMsT0FBTyxHQUFHLElBQUlDLCtEQUFnQixDQUFDLElBQUksQ0FBQ1AsUUFBUSxDQUFDO0lBRW5ELElBQU1RLE1BQU0sR0FBR0YsT0FBTyxDQUFDRyxTQUFTLENBQUMsQ0FBQztJQUNsQyxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0YsTUFBTSxDQUFDRyxNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO01BQ3BDLElBQUlFLENBQUMsR0FBR0osTUFBTSxDQUFDRSxDQUFDLENBQUM7TUFDakIsSUFBSUwsT0FBTyxFQUFFO1FBQ1RBLE9BQU8sSUFBSSxHQUFHO01BQ2xCO01BQ0FBLE9BQU8sSUFBSU8sQ0FBQyxDQUFDQyxDQUFDLEdBQUcsR0FBRyxHQUFHRCxDQUFDLENBQUNFLENBQUM7SUFDOUI7SUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDZCxRQUFRLENBQUNlLGFBQWEsSUFBSyxJQUFJLENBQUNmLFFBQVEsQ0FBQ2UsYUFBYSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUNmLFFBQVEsQ0FBQ2UsYUFBYSxLQUFLLFNBQVUsRUFBRTtNQUN6SCxNQUFNLElBQUlsQixLQUFLLENBQUMsK0JBQStCLENBQUM7SUFDcEQ7SUFFQSxJQUFJLENBQUNLLGFBQWEsR0FBRyxHQUFHLEdBQUdHLE9BQU87SUFDbEMsSUFBSSxDQUFDYixNQUFNLENBQUNHLEtBQUssQ0FBQyxJQUFJLENBQUNPLGFBQWEsQ0FBQztJQUVyQyxPQUFPLElBQUksQ0FBQ0EsYUFBYTtFQUM3QjtBQUNKLENBQUM7QUFFY1osaUZBQWtCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0dlb2NvZGUvUmVxdWVzdC9HZW9jb2RlUmVxdWVzdFJFU1QuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgR2VvY29kZVBhcmFtUkVTVCBmcm9tIFwiLi9tb2RlbC9HZW9jb2RlUGFyYW1SRVNUXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFJFU1Qgc3VyIGxlIHNlcnZpY2UgZGUgY2FsY3VsIGQnaXRpbmVyYWlyZVxuICogKHVuaXF1ZW1lbnQgZW4gR0VUKVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGUuUmVxdWVzdC5HZW9jb2RlUmVxdWVzdFJFU1RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBSb3V0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiB2YXIgb3B0aW9ucyA9IHtcbiAqICAgICAgKC4uLilcbiAqIH07XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gR2VvY29kZVJlcXVlc3RSRVNUIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiR2VvY29kZVJlcXVlc3RSRVNUXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBHZW9jb2RlUmVxdWVzdFJFU1QgKCldXCIpO1xuXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGVSZXF1ZXN0UkVTVCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlb2NvZGVSZXF1ZXN0UkVTVCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8vIGV4aXN0YW5jZSBkZXMgb3B0aW9uc1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fRU1QVFlcIiwgXCJvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgICAvKiogbGlzdGUgZGVzIG9wdGlvbnMgKi9cbiAgICB0aGlzLnNldHRpbmdzID0gb3B0aW9ucztcbn1cblxuR2VvY29kZVJlcXVlc3RSRVNULnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6R2VvY29kZVJlcXVlc3RSRVNUI1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogcmVxdWVzdFxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmVxdWVzdFN0cmluZyA6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogR2VvY29kZVJlcXVlc3RSRVNULFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0aW9uIGRlIGxhIHJlcXXDqnRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NSZXF1ZXN0U3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IFwiXCI7XG5cbiAgICAgICAgLy8gTWFwcGluZyBkZXMgb3B0aW9ucyBhdmVjIGxlIHNlcnZpY2UgZGUgbCdBUEkgUkVTVFxuICAgICAgICBjb25zdCBvUGFyYW1zID0gbmV3IEdlb2NvZGVQYXJhbVJFU1QodGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gb1BhcmFtcy5nZXRQYXJhbXMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvID0gcGFyYW1zW2ldO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ICs9IFwiJlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdCArPSBvLmsgKyBcIj1cIiArIG8udjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5nZW9jb2RlTWV0aG9kIHx8ICh0aGlzLnNldHRpbmdzLmdlb2NvZGVNZXRob2QgIT09IFwic2VhcmNoXCIgJiYgdGhpcy5zZXR0aW5ncy5nZW9jb2RlTWV0aG9kICE9PSBcInJldmVyc2VcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGdlb2NvZGVNZXRob2Qgbm90IHZhbGlkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0U3RyaW5nID0gXCI/XCIgKyByZXF1ZXN0O1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnJlcXVlc3RTdHJpbmcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RTdHJpbmc7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgR2VvY29kZVJlcXVlc3RSRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Request/GeocodeRequestREST.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Request/model/GeocodeParamREST.js": -/*!****************************************************************!*\ - !*** ./src/Services/Geocode/Request/model/GeocodeParamREST.js ***! - \****************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST).\n * Permet le mapping avec les options du service.\n * @constructor\n * @alias Gp.Services.Route.Request.RouteParamREST\n * @param {Object} options - options\n *\n * @private\n */\nfunction GeocodeParamREST(options) {\n if (!(this instanceof GeocodeParamREST)) {\n throw new TypeError(\"GeocodeParamREST constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur GeocodeParamREST ()]\");\n\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n // methode de geocodage\n if (!this.options.geocodeMethod || this.options.geocodeMethod !== \"search\" && this.options.geocodeMethod !== \"reverse\") {\n throw new Error(\"Error geocodeMethod not valid\");\n }\n this.geocodeMethod = this.options.geocodeMethod;\n\n // mapping des options avec l'API REST\n this.query = typeof this.options !== \"undefined\" ? this.options.query : null;\n this.searchGeometry = this.options.searchGeometry || null;\n this.index = this.options.index || null;\n this.lon = this.options.position && this.options.position.lon ? this.options.position.lon : null;\n this.lat = this.options.position && this.options.position.lat ? this.options.position.lat : null;\n this.maxResp = this.options.maxResp || null;\n this.returnTrueGeometry = this.options.returnTrueGeometry || null;\n this.filters = this.options.filters || {};\n}\n\n/**\n * CLASSNAME\n */\nGeocodeParamREST.CLASSNAME = \"GeocodeParamREST\";\nGeocodeParamREST.prototype = {\n /**\n * @lends module:GeocodeParamREST#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: GeocodeParamREST,\n /**\n * Retourne les filtres\n * @returns {String} les filtres\n */\n getFilters: function getFilters() {\n var filters = {};\n for (var prop in this.filters) {\n if (this.filters.hasOwnProperty(prop)) {\n filters[prop] = this.filters[prop];\n }\n }\n return filters;\n },\n /**\n * Retourne l'index\n * @returns {String} l'index\n */\n getIndex: function getIndex() {\n if (this.index === undefined) {\n return null;\n }\n if (this.index === \"StreetAddress\") {\n return \"address\";\n } else if (this.index === \"CadastralParcel\") {\n return \"parcel\";\n } else if (this.index === \"PositionOfInterest\") {\n return \"poi\";\n } else if (this.index === \"location\") {\n return \"location\";\n }\n return this.index;\n },\n /**\n * Retourne la géométrie de recherche\n * @returns {String} la géométrie de recherche au format json\n */\n getSearchGeometry: function getSearchGeometry() {\n return JSON.stringify(this.searchGeometry);\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Array} liste de paramêtres\n */\nGeocodeParamREST.prototype.getParams = function () {\n var map = [];\n if (this.geocodeMethod === \"search\") {\n map.push({\n k: \"q\",\n v: this.query\n });\n }\n if (this.index) {\n map.push({\n k: \"index\",\n v: this.getIndex()\n });\n }\n if (this.geocodeMethod === \"reverse\" && this.searchGeometry) {\n map.push({\n k: \"searchgeom\",\n v: this.getSearchGeometry()\n });\n }\n if (this.lon && this.lat) {\n map.push({\n k: \"lon\",\n v: this.lon\n });\n map.push({\n k: \"lat\",\n v: this.lat\n });\n }\n if (this.maxResp) {\n map.push({\n k: \"limit\",\n v: this.maxResp\n });\n }\n if (this.returnTrueGeometry) {\n map.push({\n k: \"returntruegeometry\",\n v: this.returnTrueGeometry\n });\n }\n var filters = this.getFilters();\n for (var key in filters) {\n map.push({\n k: key,\n v: filters[key]\n });\n }\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeParamREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvbW9kZWwvR2VvY29kZVBhcmFtUkVTVC5qcz83NDNiIl0sIm5hbWVzIjpbIkdlb2NvZGVQYXJhbVJFU1QiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJnZW9jb2RlTWV0aG9kIiwiRXJyb3IiLCJxdWVyeSIsInNlYXJjaEdlb21ldHJ5IiwiaW5kZXgiLCJsb24iLCJwb3NpdGlvbiIsImxhdCIsIm1heFJlc3AiLCJyZXR1cm5UcnVlR2VvbWV0cnkiLCJmaWx0ZXJzIiwiQ0xBU1NOQU1FIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRGaWx0ZXJzIiwicHJvcCIsImhhc093blByb3BlcnR5IiwiZ2V0SW5kZXgiLCJ1bmRlZmluZWQiLCJnZXRTZWFyY2hHZW9tZXRyeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRQYXJhbXMiLCJtYXAiLCJwdXNoIiwiayIsInYiLCJrZXkiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsZ0JBQWdCQSxDQUFFQyxPQUFPLEVBQUU7RUFDaEMsSUFBSSxFQUFFLElBQUksWUFBWUQsZ0JBQWdCLENBQUMsRUFBRTtJQUNyQyxNQUFNLElBQUlFLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQztFQUN2RjtFQUVBLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLG9DQUFvQyxDQUFDOztFQUV2RDtBQUNKO0FBQ0E7RUFDSSxJQUFJLENBQUNMLE9BQU8sR0FBR0EsT0FBTyxJQUFJLENBQUMsQ0FBQzs7RUFFNUI7RUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDQSxPQUFPLENB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O0lBQ2IsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJLElBQUksQ0FBQ0MsT0FBTyxFQUFFO0lBQ2RlLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO01BQ0xDLENBQUMsRUFBRyxPQUFPO01BQ1hDLENBQUMsRUFBRyxJQUFJLENBQUNsQjtJQUNiLENBQUMsQ0FBQztFQUNOO0VBRUEsSUFBSSxJQUFJLENBQUNDLGtCQUFrQixFQUFFO0lBQ3pCYyxHQUFHLENBQUNDLElBQUksQ0FBQztNQUNMQyxDQUFDLEVBQUcsb0JBQW9CO01BQ3hCQyxDQUFDLEVBQUcsSUFBSSxDQUFDakI7SUFDYixDQUFDLENBQUM7RUFDTjtFQUVBLElBQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNJLFVBQVUsQ0FBQyxDQUFDO0VBQ2pDLEtBQUssSUFBSWEsR0FBRyxJQUFJakIsT0FBTyxFQUFFO0lBQ3JCYSxHQUFHLENBQUNDLElBQUksQ0FBQztNQUNMQyxDQUFDLEVBQUdFLEdBQUc7TUFDUEQsQ0FBQyxFQUFHaEIsT0FBTyxDQUFDaUIsR0FBRztJQUNuQixDQUFDLENBQUM7RUFDTjtFQUVBLE9BQU9KLEdBQUc7QUFDZCxDQUFDO0FBRWM5QiwrRUFBZ0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXF1ZXN0L21vZGVsL0dlb2NvZGVQYXJhbVJFU1QuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIENsYXNzZSBkZSBnZXN0aW9uIGRlcyBwYXJhbS4gZGVzIHJlcXXDqnRlcyBkdSBzZXJ2aWNlIGRlIGNhbGN1bCBkJ2l0aW5lcmFpcmUgKFJFU1QpLlxuICogICAgICBQZXJtZXQgbGUgbWFwcGluZyBhdmVjIGxlcyBvcHRpb25zIGR1IHNlcnZpY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Sb3V0ZS5SZXF1ZXN0LlJvdXRlUGFyYW1SRVNUXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBHZW9jb2RlUGFyYW1SRVNUIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGVQYXJhbVJFU1QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW9jb2RlUGFyYW1SRVNUIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIEdlb2NvZGVQYXJhbVJFU1QgKCldXCIpO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBlbiBwYXJhbcOqdHJlcyBkdSBjb25zdHJ1Y3RldXIuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIG1ldGhvZGUgZGUgZ2VvY29kYWdlXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZ2VvY29kZU1ldGhvZCB8fCAodGhpcy5vcHRpb25zLmdlb2NvZGVNZXRob2QgIT09IFwic2VhcmNoXCIgJiYgdGhpcy5vcHRpb25zLmdlb2NvZGVNZXRob2QgIT09IFwicmV2ZXJzZVwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBnZW9jb2RlTWV0aG9kIG5vdCB2YWxpZFwiKTtcbiAgICB9XG4gICAgdGhpcy5nZW9jb2RlTWV0aG9kID0gdGhpcy5vcHRpb25zLmdlb2NvZGVNZXRob2Q7XG5cbiAgICAvLyBtYXBwaW5nIGRlcyBvcHRpb25zIGF2ZWMgbCdBUEkgUkVTVFxuICAgIHRoaXMucXVlcnkgPSAodHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gXCJ1bmRlZmluZWRcIikgPyB0aGlzLm9wdGlvbnMucXVlcnkgOiBudWxsO1xuXG4gICAgdGhpcy5zZWFyY2hHZW9tZXRyeSA9IHRoaXMub3B0aW9ucy5zZWFyY2hHZW9tZXRyeSB8fCBudWxsO1xuXG4gICAgdGhpcy5pbmRleCA9IHRoaXMub3B0aW9ucy5pbmRleCB8fCBudWxsO1xuXG4gICAgdGhpcy5sb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxvbiA/IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sb24gOiBudWxsO1xuXG4gICAgdGhpcy5sYXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCA/IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgOiBudWxsO1xuXG4gICAgdGhpcy5tYXhSZXNwID0gdGhpcy5vcHRpb25zLm1heFJlc3AgfHwgbnVsbDtcblxuICAgIHRoaXMucmV0dXJuVHJ1ZUdlb21ldHJ5ID0gdGhpcy5vcHRpb25zLnJldHVyblRydWVHZW9tZXRyeSB8fCBudWxsO1xuXG4gICAgdGhpcy5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcnMgfHwge307XG59XG5cbi8qKlxuICogQ0xBU1NOQU1FXG4gKi9cbkdlb2NvZGVQYXJhbVJFU1QuQ0xBU1NOQU1FID0gXCJHZW9jb2RlUGFyYW1SRVNUXCI7XG5cbkdlb2NvZGVQYXJhbVJFU1QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpHZW9jb2RlUGFyYW1SRVNUI1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IEdlb2NvZGVQYXJhbVJFU1QsXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSBsZXMgZmlsdHJlc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGxlcyBmaWx0cmVzXG4gICAgICovXG4gICAgZ2V0RmlsdGVycyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpbHRlcnMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzW3Byb3BdID0gdGhpcy5maWx0ZXJzW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSBsJ2luZGV4XG4gICAgICogQHJldHVybnMge1N0cmluZ30gbCdpbmRleFxuICAgICAqL1xuICAgIGdldEluZGV4IDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gXCJTdHJlZXRBZGRyZXNzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImFkZHJlc3NcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID09PSBcIkNhZGFzdHJhbFBhcmNlbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJwYXJjZWxcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID09PSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJwb2lcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID09PSBcImxvY2F0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImxvY2F0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxhIGfDqW9tw6l0cmllIGRlIHJlY2hlcmNoZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGxhIGfDqW9tw6l0cmllIGRlIHJlY2hlcmNoZSBhdSBmb3JtYXQganNvblxuICAgICAqL1xuICAgIGdldFNlYXJjaEdlb21ldHJ5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5zZWFyY2hHZW9tZXRyeSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUYWJsZWF1IGRlIGNsZWZzL3ZhbGV1cnMgcG91ciBwYXJhbS5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9IGxpc3RlIGRlIHBhcmFtw6p0cmVzXG4gKi9cbkdlb2NvZGVQYXJhbVJFU1QucHJvdG90eXBlLmdldFBhcmFtcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWFwID0gW107XG5cbiAgICBpZiAodGhpcy5nZW9jb2RlTWV0aG9kID09PSBcInNlYXJjaFwiKSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcInFcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLnF1ZXJ5XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluZGV4KSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcImluZGV4XCIsXG4gICAgICAgICAgICB2IDogdGhpcy5nZXRJbmRleCgpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdlb2NvZGVNZXRob2QgPT09IFwicmV2ZXJzZVwiICYmIHRoaXMuc2VhcmNoR2VvbWV0cnkpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwic2VhcmNoZ2VvbVwiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0U2VhcmNoR2VvbWV0cnkoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb24gJiYgdGhpcy5sYXQpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwibG9uXCIsXG4gICAgICAgICAgICB2IDogdGhpcy5sb25cbiAgICAgICAgfSk7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcImxhdFwiLFxuICAgICAgICAgICAgdiA6IHRoaXMubGF0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heFJlc3ApIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwibGltaXRcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLm1heFJlc3BcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmV0dXJuVHJ1ZUdlb21ldHJ5KSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcInJldHVybnRydWVnZW9tZXRyeVwiLFxuICAgICAgICAgICAgdiA6IHRoaXMucmV0dXJuVHJ1ZUdlb21ldHJ5XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnMoKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmlsdGVycykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDoga2V5LFxuICAgICAgICAgICAgdiA6IGZpbHRlcnNba2V5XVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgR2VvY29kZVBhcmFtUkVTVDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Request/model/GeocodeParamREST.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Response/GeocodeResponseFactory.js": -/*!*****************************************************************!*\ - !*** ./src/Services/Geocode/Response/GeocodeResponseFactory.js ***! - \*****************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Formats/GeocodeResponseParser */ \"./src/Services/Geocode/Formats/GeocodeResponseParser.js\");\n/**\n * Factory pour générer une reponse JSON à partir d'un XML\n * (Factory)\n *\n * @module GeocodeResponseFactory\n * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory\n * @private\n */\n// import Logger from \"../../../Utils/LoggerByDefault\";\n\n\n\nvar GeocodeReponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Geocode\n *\n * @example\n * var options = {\n * response :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // data de type GeocodeResponse\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n data = options.response;\n } else {\n try {\n var parser = new _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n data = parser.parse(options.response);\n if (!data) {\n throw new Error(\"L'analyse de la réponse du service !?\");\n }\n } catch (e) {\n var message = e.message;\n if (typeof options.response === \"string\") {\n message += \"('\" + options.response + \"')\";\n } else {\n message += \"('\" + options.response.documentElement.innerHTML + \"')\";\n }\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", message),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].TYPE_SRVERR,\n status: 200 // FIXME : 200 ?\n }));\n\n return;\n }\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].TYPE_SRVERR,\n status: -1 // FIXME : status response\n }));\n\n return;\n }\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeReponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1Jlc3BvbnNlL0dlb2NvZGVSZXNwb25zZUZhY3RvcnkuanM/MDJjOCJdLCJuYW1lcyI6WyJHZW9jb2RlUmVwb25zZUZhY3RvcnkiLCJidWlsZCIsIm9wdGlvbnMiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsInBhcnNlciIsIkdlb2NvZGVSZXNwb25zZVBhcnNlciIsInBhcnNlIiwiRXJyb3IiLCJlIiwibWVzc2FnZSIsImRvY3VtZW50RWxlbWVudCIsImlubmVySFRNTCIsIm9uRXJyb3IiLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJNUmVzIiwiZ2V0TWVzc2FnZSIsInR5cGUiLCJUWVBFX1VOS0VSUiIsInN0YXR1cyIsImV4Y2VwdGlvblJlcG9ydCIsIlRZUEVfU1JWRVJSIiwib25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM0RDtBQUNSO0FBQ2lCO0FBRXJFLElBQUlBLHFCQUFxQixHQUFHO0VBRXhCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsS0FBSyxFQUFHLFNBQUFBLE1BQVVDLE9BQU8sRUFBRTtJQUN2QjtJQUNBLElBQUlDLElBQUksR0FBRyxJQUFJO0lBRWYsSUFBSUQsT0FBTyxDQUFDRSxRQUFRLEVBQUU7TUFDbEIsSUFBSUYsT0FBTyxDQUFDRyxXQUFXLEVBQUU7UUFDckJGLElBQUksR0FBR0QsT0FBTyxDQUFDRSxRQUFRO01BQzNCLENBQUMsTUFBTTtRQUNILElBQUk7VUFDQSxJQUFNRSxNQUFNLEdBQUcsSUFBSUMsc0VBQXFCLENBQUMsQ0FBQztVQUMxQ0osSUFBSSxHQUFHRyxNQUFNLENBQUNFLEtBQUssQ0FBQ04sT0FBTyxDQUFDRSxRQUFRLENBQUM7VUFFckMsSUFBSSxDQUFDRCxJQUFJLEVBQUU7WUFDUCxNQUFNLElBQUlNLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQztVQUM1RDtRQUNKLENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7VUFDUixJQUFJQyxPQUFPLEdBQUdELENBQUMsQ0FBQ0MsT0FBTztVQUN2QixJQUFJLE9BQU9ULE9BQU8sQ0FBQ0UsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUN0Q08sT0FBTyxJQUFJLElBQUksR0FBR1QsT0FBTyxDQUFDRSxRQUFRLEdBQUcsSUFBSTtVQUM3QyxDQUFDLE1BQU07WUFDSE8sT0FBTyxJQUFJLElBQUksR0FBR1QsT0FBTyxDQUFDRSxRQUFRLENBQUNRLGVBQWUsQ0FBQ0MsU0FBUyxHQUFHLElBQUk7VUFDdkU7VUFDQVgsT0FBTyxDQUFDWSxPQUFPLENBQUNDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQztZQUNqRE4sT0FBTyxFQUFHTyxnRUFBSSxDQUFDQyxVQUFVLENBQUMsMEJBQTBCLEVBQUVSLE9BQU8sQ0FBQztZQUM5RFMsSUFBSSxFQUFHSCxnRUFBWSxDQUFDSSxXQUFXO1lBQy9CQyxNQUFNLEVBQUcsQ0FBQztVQUNkLENBQUMsQ0FBQyxDQUFDO1VBQ0g7UUFDSjs7UUFFQTtRQUNBLElBQUluQixJQUFJLENBQUNvQixlQUFlLEVBQUU7VUFDdEJyQixPQUFPLENBQUNZLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDO1lBQ2pETixPQUFPLEVBQUdPLGdFQUFJLENBQUNDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRWhCLElBQUksQ0FBQ29CLGVBQWUsQ0FBQztZQUM3RUgsSUFBSSxFQUFHSCxnRUFBWSxDQUFDTyxXQUFXO1lBQy9CRixNQUFNLEVBQUcsR0FBRyxDQUFDO1VBQ2pCLENBQUMsQ0FBQyxDQUFDOztVQUNIO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTTtNQUNIcEIsT0FBTyxDQUFDWSxPQUFPLENBQUNDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQztRQUNqRE4sT0FBTyxFQUFHTyxnRUFBSSxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7UUFDbkRDLElBQUksRUFBR0gsZ0VBQVksQ0FBQ08sV0FBVztRQUMvQkYsTUFBTSxFQUFHLENBQUMsQ0FBQyxDQUFDO01BQ2hCLENBQUMsQ0FBQyxDQUFDOztNQUNIO0lBQ0o7SUFFQXBCLE9BQU8sQ0FBQ3VCLFNBQVMsQ0FBQ1YsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRWIsSUFBSSxDQUFDO0VBQy9DO0FBQ0osQ0FBQztBQUVjSCxvRkFBcUIiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXNwb25zZS9HZW9jb2RlUmVzcG9uc2VGYWN0b3J5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGYWN0b3J5IHBvdXIgZ8OpbsOpcmVyIHVuZSByZXBvbnNlIEpTT04gw6AgcGFydGlyIGQndW4gWE1MXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEdlb2NvZGVSZXNwb25zZUZhY3RvcnlcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5HZW9jb2RlLlJlc3BvbnNlLkdlb2NvZGVSZXNwb25zZUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbi8vIGltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEVycm9yU2VydmljZSBmcm9tIFwiLi4vLi4vLi4vRXhjZXB0aW9ucy9FcnJvclNlcnZpY2VcIjtcbmltcG9ydCBNUmVzIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IEdlb2NvZGVSZXNwb25zZVBhcnNlciBmcm9tIFwiLi4vRm9ybWF0cy9HZW9jb2RlUmVzcG9uc2VQYXJzZXJcIjtcblxudmFyIEdlb2NvZGVSZXBvbnNlRmFjdG9yeSA9IHtcblxuICAgIC8qKlxuICAgICAqIGludGVyZmFjZSB1bmlxdWVcbiAgICAgKlxuICAgICAqIEBtZXRob2QgYnVpbGRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGRlZmluaWVzIGRhbnMgbGUgY29tcG9zYW50IEdlb2NvZGVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIHJhd1Jlc3BvbnNlIDpcbiAgICAgKiAgICAgIHNjb3BlIDpcbiAgICAgKiAgICAgIG9uU3VjY2VzcyA6XG4gICAgICogICAgICBvbkVycm9yIDpcbiAgICAgKiAgIH07XG4gICAgICpcbiAgICAgKi9cbiAgICBidWlsZCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIGRhdGEgZGUgdHlwZSBHZW9jb2RlUmVzcG9uc2VcbiAgICAgICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgR2VvY29kZVJlc3BvbnNlUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzZXIucGFyc2Uob3B0aW9ucy5yZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMJ2FuYWx5c2UgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSAhP1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXNwb25zZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIignXCIgKyBvcHRpb25zLnJlc3BvbnNlICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIignXCIgKyBvcHRpb25zLnJlc3BvbnNlLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgKyBcIicpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9BTkFMWVNFXCIsIG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1VOS0VSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNpIGxhIHLDqXBvbnNlIGNvbnRlbmFpdCB1bmUgZXhjZXB0aW9uIHJlbnZvecOpZSBwYXIgbGUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmV4Y2VwdGlvblJlcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBkYXRhLmV4Y2VwdGlvblJlcG9ydCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogRXJyb3JTZXJ2aWNlLlRZUEVfU1JWRVJSLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogMjAwIC8vIEZJWE1FIDogMjAwID9cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIiksXG4gICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUixcbiAgICAgICAgICAgICAgICBzdGF0dXMgOiAtMSAvLyBGSVhNRSA6IHN0YXR1cyByZXNwb25zZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5vblN1Y2Nlc3MuY2FsbChvcHRpb25zLnNjb3BlLCBkYXRhKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBHZW9jb2RlUmVwb25zZUZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Response/GeocodeResponseFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Response/model/GeocodeResponse.js": -/*!****************************************************************!*\ - !*** ./src/Services/Geocode/Response/model/GeocodeResponse.js ***! - \****************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Array.} locations - locations array.\n *\n * @namespace\n * @alias Gp.Services.GeocodeResponse\n */\nfunction GeocodeResponse() {\n if (!(this instanceof GeocodeResponse)) {\n throw new TypeError(\"GeocodeResponse constructor cannot be called as a function.\");\n }\n this.locations = [];\n}\nGeocodeResponse.prototype = {\n constructor: GeocodeResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1Jlc3BvbnNlL21vZGVsL0dlb2NvZGVSZXNwb25zZS5qcz81OTdkIl0sIm5hbWVzIjpbIkdlb2NvZGVSZXNwb25zZSIsIlR5cGVFcnJvciIsImxvY2F0aW9ucyIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxlQUFlQSxDQUFBLEVBQUk7RUFDeEIsSUFBSSxFQUFFLElBQUksWUFBWUEsZUFBZSxDQUFDLEVBQUU7SUFDcEMsTUFBTSxJQUFJQyxTQUFTLENBQUMsNkRBQTZELENBQUM7RUFDdEY7RUFFQSxJQUFJLENBQUNDLFNBQVMsR0FBRyxFQUFFO0FBQ3ZCO0FBRUFGLGVBQWUsQ0FBQ0csU0FBUyxHQUFHO0VBRXhCQyxXQUFXLEVBQUdKO0FBRWxCLENBQUM7QUFFY0EsOEVBQWUiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXNwb25zZS9tb2RlbC9HZW9jb2RlUmVzcG9uc2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2Vzfmdlb2NvZGUgR3AuU2VydmljZXMuZ2VvY29kZSAoKX0gb3Ige0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35yZXZlcnNlR2VvY29kZSBHcC5TZXJ2aWNlcy5yZXZlcnNlR2VvY29kZSAoKX0gaW52b2NhdGlvbiB3aGVuIHN1Y2Nlc3NmdWwuIFJlY2VpdmVkIGFzIHRoZSBhcmd1bWVudCBvZiBvblN1Y2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHByb3BlcnR5IHtBcnJheS48R3AuU2VydmljZXMuR2VvY29kZS5HZW9jb2RlZExvY2F0aW9uPn0gbG9jYXRpb25zIC0gbG9jYXRpb25zIGFycmF5LlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5HZW9jb2RlUmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gR2VvY29kZVJlc3BvbnNlICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2VvY29kZVJlc3BvbnNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VvY29kZVJlc3BvbnNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbnMgPSBbXTtcbn1cblxuR2VvY29kZVJlc3BvbnNlLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yIDogR2VvY29kZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVSZXNwb25zZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Response/model/GeocodeResponse.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/Response/model/GeocodedLocation.js": -/*!*****************************************************************!*\ - !*** ./src/Services/Geocode/Response/model/GeocodedLocation.js ***! - \*****************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single location object returned by the underlying geocoding web service.\n *\n * @property {Gp.Point} position - Position of the location given in the requested coordinates system.\n * @property {String} type - location type \"StreetAddress\" (for an address), \"PositionOfInterest\" (for a place name) or \"CadastralParcel\" (for cadastral parcel).\n * @property {String} matchType - how geocoding is performed : \"street number\" (exact address), \"street enhanced\" (street number calculated by interpolation), \"street\" (only the street), \"city\" (only the city).\n * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match).\n * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service :\n *\n * *Common attributes : *\n *\n * - **trueGeometry** - the 'real life' geometry if different from 'Point' type.\n *\n * *if type === \"StreetAddress\" :*\n *\n * - **number** - Street number.\n * - **postalCode** - PostCode\n * - **street** - Street name\n * - **city** - City\n * - **houseNumberInfos** - additional street number information\n * - **inseeCode** - INSEE Code\n *\n *\n * *if type === \"PositionOfInterest\" :*\n *\n * - **type** - Place name type\n * - **postalCode** - PostCode\n * - **toponyme** - Toponyme\n * - **extraFields** - additional place name properties\n * - **inseeCode** - INSEE Code\n *\n *\n * *si type = \"CadastralParcel\" :*\n *\n * - **codeCommuneAbs** - when a parcel comes from a city that was absorbed by another, code of that old city. \"000\" otherwise.\n * - **codeArrondissement** - arrondissement\n * - **identifiant** - cadastral parcel code\n * - **feuille** - Parcel Sheet (eg. \"1\").\n * - **numero** - Parcel Number (eg. \"0041\")\n * - **section** - Parcel Section (eg. \"0D\").\n * - **nomCommune** - Parcel municipality name.\n * - **codeCommune** - Parcel municipality.\n * - **codeDepartement** - Parcel Department.\n *\n * @namespace\n * @alias Gp.Services.Geocode.GeocodedLocation\n */\nfunction GeocodedLocation() {\n if (!(this instanceof GeocodedLocation)) {\n throw new TypeError(\"GeocodedLocation constructor cannot be called as a function.\");\n }\n this.position = null;\n this.matchType = null;\n this.placeAttributes = {};\n this.type = null;\n this.accuracy = null;\n\n /**\n * Nom de la classe : \"GeocodedLocation\"\n * @type {String}\n */\n this.CLASSNAME = \"GeocodedLocation\";\n}\nGeocodedLocation.prototype = {\n constructor: GeocodedLocation\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodedLocation);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1Jlc3BvbnNlL21vZGVsL0dlb2NvZGVkTG9jYXRpb24uanM/ZThjNCJdLCJuYW1lcyI6WyJHZW9jb2RlZExvY2F0aW9uIiwiVHlwZUVycm9yIiwicG9zaXRpb24iLCJtYXRjaFR5cGUiLCJwbGFjZUF0dHJpYnV0ZXMiLCJ0eXBlIiwiYWNjdXJhY3kiLCJDTEFTU05BTUUiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsZ0JBQWdCQSxDQUFBLEVBQUk7RUFDekIsSUFBSSxFQUFFLElBQUksWUFBWUEsZ0JBQWdCLENBQUMsRUFBRTtJQUNyQyxNQUFNLElBQUlDLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQztFQUN2RjtFQUVBLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUk7RUFFcEIsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSTtFQUVyQixJQUFJLENBQUNDLGVBQWUsR0FBRyxDQUFDLENBQUM7RUFFekIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtFQUVoQixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJOztFQUVwQjtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsU0FBUyxHQUFHLGtCQUFrQjtBQUN2QztBQUVBUCxnQkFBZ0IsQ0FBQ1EsU0FBUyxHQUFHO0VBRXpCQyxXQUFXLEVBQUdUO0FBRWxCLENBQUM7QUFFY0EsK0VBQWdCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0dlb2NvZGUvUmVzcG9uc2UvbW9kZWwvR2VvY29kZWRMb2NhdGlvbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBTaW5nbGUgbG9jYXRpb24gb2JqZWN0IHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIGdlb2NvZGluZyB3ZWIgc2VydmljZS5cbiAqXG4gKiBAcHJvcGVydHkge0dwLlBvaW50fSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbiBnaXZlbiBpbiB0aGUgcmVxdWVzdGVkIGNvb3JkaW5hdGVzIHN5c3RlbS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0eXBlIC0gbG9jYXRpb24gdHlwZSBcIlN0cmVldEFkZHJlc3NcIiAoZm9yIGFuIGFkZHJlc3MpLCBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiIChmb3IgYSBwbGFjZSBuYW1lKSBvciBcIkNhZGFzdHJhbFBhcmNlbFwiIChmb3IgY2FkYXN0cmFsIHBhcmNlbCkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWF0Y2hUeXBlIC0gaG93IGdlb2NvZGluZyBpcyBwZXJmb3JtZWQgOiBcInN0cmVldCBudW1iZXJcIiAoZXhhY3QgYWRkcmVzcyksIFwic3RyZWV0IGVuaGFuY2VkXCIgKHN0cmVldCBudW1iZXIgY2FsY3VsYXRlZCBieSBpbnRlcnBvbGF0aW9uKSwgXCJzdHJlZXRcIiAob25seSB0aGUgc3RyZWV0KSwgXCJjaXR5XCIgKG9ubHkgdGhlIGNpdHkpLlxuICogQHByb3BlcnR5IHtGbG9hdH0gYWNjdXJhY3kgLSBBY2N1cmFjeSBvZiB0aGUgcmVzcG9uc2UgdG93YXJkcyB0aGUgcmVxdWVzdGVkIGxvY2F0aW9uIGJldHdlZW4gMCAodW5hY2N1cmF0ZSkgYW5kIDEgKGV4YWN0IG1hdGNoKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwbGFjZUF0dHJpYnV0ZXMgLSBBc3NvY2lhdGl2ZSBhcnJheSBtYXRjaGluZyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgd2l0aCB0aGVpciB2YWx1ZXMgZ2l2ZW4gYnkgdGhlIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgOlxuICpcbiAqICpDb21tb24gYXR0cmlidXRlcyA6ICpcbiAqXG4gKiAtICoqdHJ1ZUdlb21ldHJ5KiogLSB0aGUgJ3JlYWwgbGlmZScgZ2VvbWV0cnkgaWYgZGlmZmVyZW50IGZyb20gJ1BvaW50JyB0eXBlLlxuICpcbiAqICppZiB0eXBlID09PSBcIlN0cmVldEFkZHJlc3NcIiA6KlxuICpcbiAqIC0gKipudW1iZXIqKiAtIFN0cmVldCBudW1iZXIuXG4gKiAtICoqcG9zdGFsQ29kZSoqIC0gUG9zdENvZGVcbiAqIC0gKipzdHJlZXQqKiAtIFN0cmVldCBuYW1lXG4gKiAtICoqY2l0eSoqIC0gQ2l0eVxuICogLSAqKmhvdXNlTnVtYmVySW5mb3MqKiAtIGFkZGl0aW9uYWwgc3RyZWV0IG51bWJlciBpbmZvcm1hdGlvblxuICogLSAqKmluc2VlQ29kZSoqIC0gSU5TRUUgQ29kZVxuICpcbiAqXG4gKiAqaWYgdHlwZSA9PT0gXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiA6KlxuICpcbiAqIC0gKip0eXBlKiogLSBQbGFjZSBuYW1lIHR5cGVcbiAqIC0gKipwb3N0YWxDb2RlKiogLSBQb3N0Q29kZVxuICogLSAqKnRvcG9ueW1lKiogLSBUb3BvbnltZVxuICogLSAqKmV4dHJhRmllbGRzKiogLSBhZGRpdGlvbmFsIHBsYWNlIG5hbWUgcHJvcGVydGllc1xuICogLSAqKmluc2VlQ29kZSoqIC0gSU5TRUUgQ29kZVxuICpcbiAqXG4gKiAqc2kgdHlwZSA9IFwiQ2FkYXN0cmFsUGFyY2VsXCIgOipcbiAqXG4gKiAtICoqY29kZUNvbW11bmVBYnMqKiAtIHdoZW4gYSBwYXJjZWwgY29tZXMgZnJvbSBhIGNpdHkgdGhhdCB3YXMgYWJzb3JiZWQgYnkgYW5vdGhlciwgY29kZSBvZiB0aGF0IG9sZCBjaXR5LiBcIjAwMFwiIG90aGVyd2lzZS5cbiAqIC0gKipjb2RlQXJyb25kaXNzZW1lbnQqKiAtIGFycm9uZGlzc2VtZW50XG4gKiAtICoqaWRlbnRpZmlhbnQqKiAtIGNhZGFzdHJhbCBwYXJjZWwgY29kZVxuICogLSAqKmZldWlsbGUqKiAtIFBhcmNlbCBTaGVldCAoZWcuIFwiMVwiKS5cbiAqIC0gKipudW1lcm8qKiAtIFBhcmNlbCBOdW1iZXIgKGVnLiBcIjAwNDFcIilcbiAqIC0gKipzZWN0aW9uKiogLSBQYXJjZWwgU2VjdGlvbiAoZWcuIFwiMERcIikuXG4gKiAtICoqbm9tQ29tbXVuZSoqIC0gUGFyY2VsIG11bmljaXBhbGl0eSBuYW1lLlxuICogLSAqKmNvZGVDb21tdW5lKiogLSBQYXJjZWwgbXVuaWNpcGFsaXR5LlxuICogLSAqKmNvZGVEZXBhcnRlbWVudCoqIC0gUGFyY2VsIERlcGFydG1lbnQuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGUuR2VvY29kZWRMb2NhdGlvblxuICovXG5mdW5jdGlvbiBHZW9jb2RlZExvY2F0aW9uICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2VvY29kZWRMb2NhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlb2NvZGVkTG9jYXRpb24gY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcblxuICAgIHRoaXMubWF0Y2hUeXBlID0gbnVsbDtcblxuICAgIHRoaXMucGxhY2VBdHRyaWJ1dGVzID0ge307XG5cbiAgICB0aGlzLnR5cGUgPSBudWxsO1xuXG4gICAgdGhpcy5hY2N1cmFjeSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIDogXCJHZW9jb2RlZExvY2F0aW9uXCJcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJHZW9jb2RlZExvY2F0aW9uXCI7XG59XG5cbkdlb2NvZGVkTG9jYXRpb24ucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBHZW9jb2RlZExvY2F0aW9uXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVkTG9jYXRpb247XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Response/model/GeocodedLocation.js\n"); - -/***/ }), - -/***/ "./src/Services/Geocode/ReverseGeocode.js": -/*!************************************************!*\ - !*** ./src/Services/Geocode/ReverseGeocode.js ***! - \************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/GeocodeRequestFactory */ \"./src/Services/Geocode/Request/GeocodeRequestFactory.js\");\n/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/GeocodeResponseFactory */ \"./src/Services/Geocode/Response/GeocodeResponseFactory.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service de géocodage inverse du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.ReverseGeocode\n *\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs.\n * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité.\n * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité.\n *\n * @param {Object} [options.filters] - Les propriétés possibles de cet objet.\n * @param {String} [options.filters.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme\n * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête.\n * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"city\".\n * Il permet également de filtrer les toponymes avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"type\".\n * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés :\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n *\n * @param {Object} [options.searchGeometry] - Emprise dans laquelle on souhaite effectuer la recherche.\n * Les propriétés possibles de cet objet sont décrites ci-après.\n * @param {String} options.searchGeometry.type - Type de géometrie (Point|Circle|Linestring|Polygon)\n * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordonnées des points constituant la géométrie.\n * @param {Float} options.searchGeometry.radius - Rayon. Paramètre applicable uniquement pour le type 'Circle'.\n *\n * @param {String} [options.index = \"StreetAddress\"] - Type de l'objet recherché.\n * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress'\n * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. L'index 'location' permet une recherche\n * multi-indexes en regroupant les indexes 'PositionOfInterest' et 'StreetAddress'.\n * D'autres types pourront être rajoutés selon l'évolution du service.\n * Par défaut, index = 'StreetAddress'.\n *\n * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir.\n * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20s.\n *\n * @param {Boolean} [options.returnTrueGeometry] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés.\n * false par défaut.\n *\n * @example\n * var options = {\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * proxyURL : null,\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * index : 'StreetAddress',\n * searchGeometry : {\n * type : Circle,\n * coordinates : [48, 2],\n * radius : 100\n * },\n * position : {lon:2 , lat:48.5},\n * maximumResponses : 25,\n * };\n *\n */\nfunction ReverseGeocode(options_) {\n if (!(this instanceof ReverseGeocode)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"ReverseGeocode\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"ReverseGeocode\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.ReverseGeocode\");\n this.logger.trace(\"[Constructeur ReverseGeocode (options)]\");\n var options = this.patchOptionConvertor(options_);\n if (!options.serverUrl) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].ReverseGeocode.newUrl();\n if (options.oldReverseService) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].ReverseGeocode.url();\n }\n }\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, [options]);\n if (!options.searchGeometry) {\n if (!options.position) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"searchGeometry\"));\n }\n } else {\n this.options.searchGeometry = options.searchGeometry;\n }\n\n // on definit l'index par defaut\n if (!options.index) {\n this.options.index = options.index = \"StreetAddress\";\n }\n if (options.filters) {\n var filter = Object.keys(options.filters);\n for (var i = 0; i < filter.length; i++) {\n var key = filter[i];\n // on supprime les filtres vides\n if (typeof options.filters[key] === \"undefined\" || _typeof(options.filters[key]) === \"object\" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === \"string\" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) {\n delete this.options.filters[key];\n }\n }\n }\n this.options.position = options.position;\n this.options.index = options.index || \"StreetAddress\";\n this.options.maximumResponses = options.maximumResponses || 20;\n}\n\n/**\n * @lends module:ReverseGeocode#\n */\nReverseGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nReverseGeocode.prototype.constructor = ReverseGeocode;\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} options_ - options du service\n * @return {Object} - options\n */\nReverseGeocode.prototype.patchOptionConvertor = function (options_) {\n var options = options_;\n if (options.filterOptions) {\n this.logger.warn(\"The parameter 'filterOptions' is deprecated\");\n if (options.filterOptions.type) {\n this.logger.warn(\"The parameter 'filterOptions.type' is deprecated\");\n if (!options.index) {\n if (Array.isArray(options.filterOptions.type) && options.filterOptions.type.length > 0) {\n options.index = options.filterOptions.type[0];\n } else {\n options.index = options.filterOptions.type;\n }\n }\n delete options.filterOptions.type;\n }\n if (options.filterOptions.bbox) {\n this.logger.warn(\"The parameter 'filterOptions.bbox' is deprecated\");\n if (!options.searchGeometry) {\n // convertir la geometrie\n options.searchGeometry = this.bbox2Json(options.filterOptions.bbox);\n }\n delete options.filterOptions.bbox;\n }\n if (options.filterOptions.circle) {\n this.logger.warn(\"The parameter 'filterOptions.circle' is deprecated\");\n if (!options.searchGeometry) {\n // convertir la geometrie\n options.searchGeometry = this.circle2Json(options.filterOptions.circle);\n }\n delete options.filterOptions.circle;\n }\n if (options.filterOptions.polygon) {\n this.logger.warn(\"The parameter 'filterOptions.polygon' is deprecated\");\n if (!options.searchGeometry) {\n // convertir la geometrie\n options.searchGeometry = this.polygon2Json(options.filterOptions.polygon);\n }\n delete options.filterOptions.polygon;\n }\n if (!options.filters && Object.keys(options.filterOptions).length > 0) {\n options.filters = options.filterOptions;\n }\n delete options.filterOptions;\n }\n if (options.position) {\n if (options.position.x) {\n this.logger.warn(\"The parameter 'position.x' is deprecated\");\n if (!options.position.lon) {\n options.position.lon = options.position.x;\n }\n delete options.position.x;\n }\n if (options.position.y) {\n this.logger.warn(\"The parameter 'position.y' is deprecated\");\n if (!options.position.lat) {\n options.position.lat = options.position.y;\n }\n delete options.position.y;\n }\n }\n if (options.srs) {\n this.logger.warn(\"The parameter 'srs' is deprecated\");\n delete options.srs;\n }\n return options;\n};\n\n/**\n * (overwrite)\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nReverseGeocode.prototype.buildRequest = function (error, success) {\n var options = {\n httpMethod: this.options.httpMethod,\n // options specifiques du service\n geocodeMethod: \"reverse\",\n searchGeometry: this.options.searchGeometry,\n index: this.options.index,\n position: this.options.position,\n returnTrueGeometry: this.options.returnTrueGeometry,\n maxResp: this.options.maximumResponses,\n filters: this.options.filters\n };\n this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n\n // on teste si la requete a bien été construite !\n !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"))) : success.call(this, this.request);\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nReverseGeocode.prototype.analyzeResponse = function (error, success) {\n if (this.response) {\n var options = {\n response: this.response,\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this\n };\n _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Array} bbox - bbox\n * @return {Object} - geometrie au format json\n */\nReverseGeocode.prototype.bbox2Json = function (bbox) {\n return {\n type: \"Polygon\",\n coordinates: [[[bbox.left, bbox.top], [bbox.right, bbox.top], [bbox.right, bbox.bottom], [bbox.left, bbox.bottom], [bbox.left, bbox.top]]]\n };\n};\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} circle - circle\n * @return {Object} - geometrie au format json\n */\nReverseGeocode.prototype.circle2Json = function (circle) {\n return {\n type: \"Circle\",\n radius: circle.radius,\n coordinates: [circle.x, circle.y]\n };\n};\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Array} polygon - polygon\n * @return {Object} - geometrie au format json\n */\nReverseGeocode.prototype.polygon2Json = function (polygon) {\n var jsonGeom = {\n type: \"Polygon\",\n coordinates: [[]]\n };\n for (var i = 0; i < polygon.length; ++i) {\n jsonGeom.coordinates[0].push([polygon[i].x, polygon[i].y]);\n }\n return jsonGeom;\n};\n\n/**\n * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées.\n */\nReverseGeocode.geoEPSG = [\"EPSG:4326\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (ReverseGeocode);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JldmVyc2VHZW9jb2RlLmpzP2JiYjQiXSwibmFtZXMiOlsiUmV2ZXJzZUdlb2NvZGUiLCJvcHRpb25zXyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJvcHRpb25zIiwicGF0Y2hPcHRpb25Db252ZXJ0b3IiLCJzZXJ2ZXJVcmwiLCJEZWZhdWx0VXJsU2VydmljZSIsIm5ld1VybCIsIm9sZFJldmVyc2VTZXJ2aWNlIiwidXJsIiwiQ29tbW9uU2VydmljZSIsImFwcGx5Iiwic2VhcmNoR2VvbWV0cnkiLCJwb3NpdGlvbiIsIkVycm9yIiwiaW5kZXgiLCJmaWx0ZXJzIiwiZmlsdGVyIiwiT2JqZWN0Iiwia2V5cyIsImkiLCJsZW5ndGgiLCJrZXkiLCJfdHlwZW9mIiwiQXJyYXkiLCJpc0FycmF5IiwibWF4aW11bVJlc3BvbnNlcyIsInByb3RvdHlwZSIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwiZmlsdGVyT3B0aW9ucyIsIndhcm4iLCJ0eXBlIiwiYmJveCIsImJib3gySnNvbiIsImNpcmNsZSIsImNpcmNsZTJKc29uIiwicG9seWdvbiIsInBvbHlnb24ySnNvbiIsIngiLCJsb24iLCJ5IiwibGF0Iiwic3JzIiwiYnVpbGRSZXF1ZXN0IiwiZXJyb3IiLCJzdWNjZXNzIiwiaHR0cE1ldGhvZCIsImdlb2NvZGVNZXRob2QiLCJyZXR1cm5UcnVlR2VvbWV0cnkiLCJtYXhSZXNwIiwicmVxdWVzdCIsIkdlb2NvZGVSZXF1ZXN0RmFjdG9yeSIsImJ1aWxkIiwiY2FsbCIsIkVycm9yU2VydmljZSIsImFuYWx5emVSZXNwb25zZSIsInJlc3BvbnNlIiwicmF3UmVzcG9uc2UiLCJvbkVycm9yIiwib25TdWNjZXNzIiwic2NvcGUiLCJHZW9jb2RlUmVzcG9uc2VGYWN0b3J5IiwiY29vcmRpbmF0ZXMiLCJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJyYWRpdXMiLCJqc29uR2VvbSIsInB1c2giLCJnZW9FUFNHIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBaUQ7QUFDSDtBQUNXO0FBQ1o7QUFDUTtBQUNlO0FBQ0c7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsY0FBY0EsQ0FBRUMsUUFBUSxFQUFFO0VBQy9CLElBQUksRUFBRSxJQUFJLFlBQVlELGNBQWMsQ0FBQyxFQUFFO0lBQ25DLE1BQU0sSUFBSUUsU0FBUyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztFQUM1RTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsU0FBUyxHQUFHLGdCQUFnQjtFQUVqQyxJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLDRCQUE0QixDQUFDO0VBQzVELElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMseUNBQXlDLENBQUM7RUFFNUQsSUFBSUMsT0FBTyxHQUFHLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNWLFFBQVEsQ0FBQztFQUNqRCxJQUFJLENBQUNTLE9BQU8sQ0FBQ0UsU0FBUyxFQUFFO0lBQ3BCRixPQUFPLENBQUNFLFNBQVMsR0FBR0MsMERBQWlCLENBQUNiLGNBQWMsQ0FBQ2MsTUFBTSxDQUFDLENBQUM7SUFDN0QsSUFBSUosT0FBTyxDQUFDSyxpQkFBaUIsRUFBRTtNQUMzQkwsT0FBTyxDQUFDRSxTQUFTLEdBQUdDLDBEQUFpQixDQUFDYixjQUFjLENBQUNnQixHQUFHLENBQUMsQ0FBQztJQUM5RDtFQUNKOztFQUVBO0VBQ0FDLHNEQUFhLENBQUNDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQ1IsT0FBTyxDQUFDLENBQUM7RUFFcEMsSUFBSSxDQUFDQSxPQUFPLENBQUNTLGNBQWMsRUFBRTtJQUN6QixJQUFJLENBQUNULE9BQU8sQ0FBQ1UsUUFBUSxFQUFFO01BQ25CLE1BQU0sSUFBSUMsS0FBSyxDQUFDbEIsZ0VBQUMsQ0FBQ0MsVUFBVSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BFO0VBQ0osQ0FBQyxNQUFNO0lBQ0gsSUFBSSxDQUFDTSxPQUFPLENBQUNTLGNBQWMsR0FBR1QsT0FBTyxDQUFDUyxjQUFjO0VBQ3hEOztFQUVBO0VBQ0EsSUFBSSxDQUFDVCxPQUFPLENBQUNZLEtBQUssRUFBRTtJQUNoQixJQUFJLENBQUNaLE9BQU8sQ0FBQ1ksS0FBSyxHQUFHWixPQUFPLENBQUNZLEtBQUssR0FBRyxlQUFlO0VBQ3hEO0VBRUEsSUFBSVosT0FBTyxDQUFDYSxPQUFPLEVBQUU7SUFDakIsSUFBSUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ2hCLE9BQU8sQ0FBQ2EsT0FBTyxDQUFDO0lBQ3pDLEtBQUssSUFBSUksQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHSCxNQUFNLENBQUNJLE1BQU0sRUFBRUQsQ0FBQyxFQUFFLEVBQUU7TUFDcEMsSUFBSUUsR0FBRyxHQUFHTCxNQUFNLENBQUNHLENBQUMsQ0FBQztNQUNuQjtNQUNBLElBQUksT0FBT2pCLE9BQU8sQ0FBQ2EsT0FBTyxDQUFDTSxHQUFHLENBQUMsS0FBSyxXQUFXLElBQzFDQyxPQUFBLENBQU9wQixPQUFPLENBQUNhLE9BQU8sQ0FBQ00sR0FBRyxDQUFDLE1BQUssUUFBUSxJQUFJSixNQUFNLENBQUNDLElBQUksQ0FBQ2hCLE9BQU8sQ0FBQ2EsT0FBTyxDQUFDTSxHQUFHLENBQUMsQ0FBQyxDQUFDRCxNQUFNLEtBQUssQ0FBRSxJQUMzRixPQUFPbEIsT0FBTyxDQUFDYSxPQUFPLENBQUNNLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSW5CLE9BQU8sQ0FBQ2EsT0FBTyxDQUFDTSxHQUFHLENBQUMsQ0FBQ0QsTUFBTSxLQUFLLENBQUUsSUFDOUVHLEtBQUssQ0FBQ0MsT0FBTyxDQUFDdEIsT0FBTyxDQUFDYSxPQUFPLENBQUNNLEdBQUcsQ0FBQyxDQUFDLElBQUluQixPQUFPLENBQUNhLE9BQU8sQ0FBQ00sR0FBRyxDQUFDLENBQUNELE1BQU0sS0FBSyxDQUFFLEVBQzVFO1FBQ0UsT0FBTyxJQUFJLENBQUNsQixPQUFPLENBQUNhLE9BQU8sQ0FBQ00sR0FBRyxDQUFDO01BQ3BDO0lBQ0o7RUFDSjtFQUVBLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ1UsUUFBUSxHQUFHVixPQUFPLENBQUNVLFFBQVE7RUFDeEMsSUFBSSxDQUFDVixPQUFPLENBQUNZLEtBQUssR0FBR1osT0FBTyxDQUFDWSxLQUFLLElBQUksZUFBZTtFQUNyRCxJQUFJLENBQUNaLE9BQU8sQ0FBQ3VCLGdCQUFnQixHQUFHdkIsT0FBTyxDQUFDdUIsZ0JBQWdCLElBQUksRUFBRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQWpDLGNBQWMsQ0FBQ2tDLFNBQVMsR0FBR1QsTUFBTSxDQUFDVSxNQUFNLENBQUNsQixzREFBYSxDQUFDaUIsU0FBUyxFQUFFO0VBQzlEO0VBQ0E7QUFBQSxDQUNILENBQUM7O0FBRUY7QUFDQTtBQUNBO0FBQ0FsQyxjQUFjLENBQUNrQyxTQUFTLENBQUNFLFdBQVcsR0FBR3BDLGNBQWM7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBQSxjQUFjLENBQUNrQyxTQUFTLENBQUN2QixvQkFBb0IsR0FBRyxVQUFVVixRQUFRLEVBQUU7RUFDaEUsSUFBSVMsT0FBTyxHQUFHVCxRQUFRO0VBRXRCLElBQUlTLE9BQU8sQ0FBQzJCLGFBQWEsRUFBRTtJQUN2QixJQUFJLENBQUMvQixNQUFNLENBQUNnQyxJQUFJLENBQUMsNkNBQTZDLENBQUM7SUFFL0QsSUFBSTVCLE9BQU8sQ0FBQzJCLGFBQWEsQ0FBQ0UsSUFBSSxFQUFFO01BQzVCLElBQUksQ0FBQ2pDLE1BQU0sQ0FBQ2dDLElBQUksQ0FBQyxrREFBa0QsQ0FBQztNQUNwRSxJQUFJLENBQUM1QixPQUFPLENBQUNZLEtBQUssRUFBRTtRQUNoQixJQUFJUyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3RCLE9BQU8sQ0FBQzJCLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDLElBQUk3QixPQUFPLENBQUMyQixhQUFhLENBQUNFLElBQUksQ0FBQ1gsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUNwRmxCLE9BQU8sQ0FBQ1ksS0FBSyxHQUFHWixPQUFPLENBQUMyQixhQUFhLENBQUNFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQyxNQUFNO1VBQ0g3QixPQUFPLENBQUNZLEtBQUssR0FBR1osT0FBTyxDQUFDMkIsYUFBYSxDQUFDRSxJQUFJO1FBQzlDO01BQ0o7TUFDQSxPQUFPN0IsT0FBTyxDQUFDMkIsYUFBYSxDQUFDRSxJQUFJO0lBQ3JDO0lBRUEsSUFBSTdCLE9BQU8sQ0FBQzJCLGFBQWEsQ0FBQ0csSUFBSSxFQUFFO01BQzVCLElBQUksQ0FBQ2xDLE1BQU0sQ0FBQ2dDLElBQUksQ0FBQyxrREFBa0QsQ0FBQztNQUNwRSxJQUFJLENBQUM1QixPQUFPLENBQUNTLGNBQWMsRUFBRTtRQUN6QjtRQUNBVCxPQUFPLENBQUNTLGNBQWMsR0FBRyxJQUFJLENBQUNzQixTQUFTLENBQUMvQixPQUFPLENBQUMyQixhQUFhLENBQUNHLElBQUksQ0FBQztNQUN2RTtNQUNBLE9BQU85QixPQUFPLENBQUMyQixhQUFhLENBQUNHLElBQUk7SUFDckM7SUFFQSxJQUFJOUIsT0FBTyxDQUFDMkIsYUFBYSxDQUFDSyxNQUFNLEVBQUU7TUFDOUIsSUFBSSxDQUFDcEMsTUFBTSxDQUFDZ0MsSUFBSSxDQUFDLG9EQUFvRCxDQUFDO01BQ3RFLElBQUksQ0FBQzVCLE9BQU8sQ0FBQ1MsY0FBYyxFQUFFO1FBQ3pCO1FBQ0FULE9BQU8sQ0FBQ1MsY0FBYyxHQUFHLElBQUksQ0FBQ3dCLFdBQVcsQ0FBQ2pDLE9BQU8sQ0FBQzJCLGFBQWEsQ0FBQ0ssTUFBTSxDQUFDO01BQzNFO01BQ0EsT0FBT2hDLE9BQU8sQ0FBQzJCLGFBQWEsQ0FBQ0ssTUFBTTtJQUN2QztJQUVBLElBQUloQyxPQUFPLENBQUMyQixhQUFhLENBQUNPLE9BQU8sRUFBRTtNQUMvQixJQUFJLENBQUN0QyxNQUFNLENBQUNnQyxJQUFJLENBQUMscURBQXFELENBQUM7TUFDdkUsSUFBSSxDQUFDNUIsT0FBTyxDQUFDUyxjQUFjLEVBQUU7UUFDekI7UUFDQVQsT0FBTyxDQUFDUyxjQUFjLEdBQUcsSUFBSSxDQUFDMEIsWUFBWSxDQUFDbkMsT0FBTyxDQUFDMkIsYUFBYSxDQUFDTyxPQUFPLENBQUM7TUFDN0U7TUFDQSxPQUFPbEMsT0FBTyxDQUFDMkIsYUFBYSxDQUFDTyxPQUFPO0lBQ3hDO0lBRUEsSUFBSSxDQUFDbEMsT0FBTyxDQUFDYSxPQUFPLElBQUlFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDaEIsT0FBTyxDQUFDMkIsYUFBYSxDQUFDLENBQUNULE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDbkVsQixPQUFPLENBQUNhLE9BQU8sR0FBR2IsT0FBTyxDQUFDMkIsYUFBYTtJQUMzQztJQUVBLE9BQU8zQixPQUFPLENBQUMyQixhQUFhO0VBQ2hDO0VBRUEsSUFBSTNCLE9BQU8sQ0FBQ1UsUUFBUSxFQUFFO0lBQ2xCLElBQUlWLE9BQU8sQ0FBQ1UsUUFBUSxDQUFDMEIsQ0FBQyxFQUFFO01BQ3BCLElBQUksQ0FBQ3hDLE1BQU0sQ0FBQ2dDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQztNQUU1RCxJQUFJLENBQUM1QixPQUFPLENBQUNVLFFBQVEsQ0FBQzJCLEdBQUcsRUFBRTtRQUN2QnJDLE9BQU8sQ0FBQ1UsUUFBUSxDQUFDMkIsR0FBRyxHQUFHckMsT0FBTyxDQUFDVSxRQUFRLENBQUMwQixDQUFDO01BQzdDO01BQ0EsT0FBT3BDLE9BQU8sQ0FBQ1UsUUFBUSxDQUFDMEIsQ0FBQztJQUM3QjtJQUVBLElBQUlwQyxPQUFPLENBQUNVLFFBQVEsQ0FBQzRCLENBQUMsRUFBRTtNQUNwQixJQUFJLENBQUMxQyxNQUFNLENBQUNnQyxJQUFJLENBQUMsMENBQTBDLENBQUM7TUFFNUQsSUFBSSxDQUFDNUIsT0FBTyxDQUFDVSxRQUFRLENBQUM2QixHQUFHLEVBQUU7UUFDdkJ2QyxPQUFPLENBQUNVLFFBQVEsQ0FBQzZCLEdBQUcsR0FBR3ZDLE9BQU8sQ0FBQ1UsUUFBUSxDQUFDNEIsQ0FBQztNQUM3QztNQUNBLE9BQU90QyxPQUFPLENBQUNVLFFBQVEsQ0FBQzRCLENBQUM7SUFDN0I7RUFDSjtFQUVBLElBQUl0QyxPQUFPLENBQUN3QyxHQUFHLEVBQUU7SUFDYixJQUFJLENBQUM1QyxNQUFNLENBQUNnQyxJQUFJLENBQUMsbUNBQW1DLENBQUM7SUFDckQsT0FBTzVCLE9BQU8sQ0FBQ3dDLEdBQUc7RUFDdEI7RUFFQSxPQUFPeEMsT0FBTztBQUNsQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FWLGNBQWMsQ0FBQ2tDLFNBQVMsQ0FBQ2lCLFlBQVksR0FBRyxVQUFVQyxLQUFLLEVBQUVDLE9BQU8sRUFBRTtFQUM5RCxJQUFJM0MsT0FBTyxHQUFHO0lBQ1Y0QyxVQUFVLEVBQUcsSUFBSSxDQUFDNUMsT0FBTyxDQUFDNEMsVUFBVTtJQUNwQztJQUNBQyxhQUFhLEVBQUcsU0FBUztJQUN6QnBDLGNBQWMsRUFBRyxJQUFJLENBQUNULE9BQU8sQ0FBQ1MsY0FBYztJQUM1Q0csS0FBSyxFQUFHLElBQUksQ0FBQ1osT0FBTyxDQUFDWSxLQUFLO0lBQzFCRixRQUFRLEVBQUcsSUFBSSxDQUFDVixPQUFPLENBQUNVLFFBQVE7SUFDaENvQyxrQkFBa0IsRUFBRyxJQUFJLENBQUM5QyxPQUFPLENBQUM4QyxrQkFBa0I7SUFDcERDLE9BQU8sRUFBRyxJQUFJLENBQUMvQyxPQUFPLENBQUN1QixnQkFBZ0I7SUFDdkNWLE9BQU8sRUFBRyxJQUFJLENBQUNiLE9BQU8sQ0FBQ2E7RUFDM0IsQ0FBQztFQUVELElBQUksQ0FBQ21DLE9BQU8sR0FBR0Msc0VBQXFCLENBQUNDLEtBQUssQ0FBQ2xELE9BQU8sQ0FBQzs7RUFFbkQ7RUFDQyxDQUFDLElBQUksQ0FBQ2dELE9BQU8sR0FDUk4sS0FBSyxDQUFDUyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUlDLGdFQUFZLENBQUMzRCxnRUFBQyxDQUFDQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEdBQ3pFaUQsT0FBTyxDQUFDUSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQ0gsT0FBTyxDQUFDO0FBQzFDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTFELGNBQWMsQ0FBQ2tDLFNBQVMsQ0FBQzZCLGVBQWUsR0FBRyxVQUFVWCxLQUFLLEVBQUVDLE9BQU8sRUFBRTtFQUNqRSxJQUFJLElBQUksQ0FBQ1csUUFBUSxFQUFFO0lBQ2YsSUFBSXRELE9BQU8sR0FBRztNQUNWc0QsUUFBUSxFQUFHLElBQUksQ0FBQ0EsUUFBUTtNQUN4QkMsV0FBVyxFQUFHLElBQUksQ0FBQ3ZELE9BQU8sQ0FBQ3VELFdBQVc7TUFDdENDLE9BQU8sRUFBR2QsS0FBSztNQUNmZSxTQUFTLEVBQUdkLE9BQU87TUFDbkJlLEtBQUssRUFBRztJQUNaLENBQUM7SUFFREMsd0VBQXNCLENBQUNULEtBQUssQ0FBQ2xELE9BQU8sQ0FBQztFQUN6QyxDQUFDLE1BQU07SUFDSDBDLEtBQUssQ0FBQ1MsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJQyxnRUFBWSxDQUFDM0QsZ0VBQUMsQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztFQUM5RTtBQUNKLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FKLGNBQWMsQ0FBQ2tDLFNBQVMsQ0FBQ08sU0FBUyxHQUFHLFVBQVVELElBQUksRUFBRTtFQUNqRCxPQUFPO0lBQ0hELElBQUksRUFBRyxTQUFTO0lBQ2hCK0IsV0FBVyxFQUFHLENBQUMsQ0FDWCxDQUFDOUIsSUFBSSxDQUFDK0IsSUFBSSxFQUFFL0IsSUFBSSxDQUFDZ0MsR0FBRyxDQUFDLEVBQ3JCLENBQUNoQyxJQUFJLENBQUNpQyxLQUFLLEVBQUVqQyxJQUFJLENBQUNnQyxHQUFHLENBQUMsRUFDdEIsQ0FBQ2hDLElBQUksQ0FBQ2lDLEtBQUssRUFBRWpDLElBQUksQ0FBQ2tDLE1BQU0sQ0FBQyxFQUN6QixDQUFDbEMsSUFBSSxDQUFDK0IsSUFBSSxFQUFFL0IsSUFBSSxDQUFDa0MsTUFBTSxDQUFDLEVBQ3hCLENBQUNsQyxJQUFJLENBQUMrQixJQUFJLEVBQUUvQixJQUFJLENBQUNnQyxHQUFHLENBQUMsQ0FDeEI7RUFDTCxDQUFDO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQXhFLGNBQWMsQ0FBQ2tDLFNBQVMsQ0FBQ1MsV0FBVyxHQUFHLFVBQVVELE1BQU0sRUFBRTtFQUNyRCxPQUFPO0lBQ0hILElBQUksRUFBRyxRQUFRO0lBQ2ZvQyxNQUFNLEVBQUdqQyxNQUFNLENBQUNpQyxNQUFNO0lBQ3RCTCxXQUFXLEVBQUcsQ0FBQzVCLE1BQU0sQ0FBQ0ksQ0FBQyxFQUFFSixNQUFNLENBQUNNLENBQUM7RUFDckMsQ0FBQztBQUNMLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FoRCxjQUFjLENBQUNrQyxTQUFTLENBQUNXLFlBQVksR0FBRyxVQUFVRCxPQUFPLEVBQUU7RUFDdkQsSUFBSWdDLFFBQVEsR0FBRztJQUNYckMsSUFBSSxFQUFHLFNBQVM7SUFDaEIrQixXQUFXLEVBQUcsQ0FBQyxFQUFFO0VBQ3JCLENBQUM7RUFFRCxLQUFLLElBQUkzQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdpQixPQUFPLENBQUNoQixNQUFNLEVBQUUsRUFBRUQsQ0FBQyxFQUFFO0lBQ3JDaUQsUUFBUSxDQUFDTixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUNPLElBQUksQ0FBQyxDQUFDakMsT0FBTyxDQUFDakIsQ0FBQyxDQUFDLENBQUNtQixDQUFDLEVBQUVGLE9BQU8sQ0FBQ2pCLENBQUMsQ0FBQyxDQUFDcUIsQ0FBQyxDQUFDLENBQUM7RUFDOUQ7RUFFQSxPQUFPNEIsUUFBUTtBQUNuQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBNUUsY0FBYyxDQUFDOEUsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDO0FBRXZCOUUsNkVBQWMiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXZlcnNlR2VvY29kZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IENvbW1vblNlcnZpY2UgZnJvbSBcIi4uL0NvbW1vblNlcnZpY2VcIjtcbmltcG9ydCBEZWZhdWx0VXJsU2VydmljZSBmcm9tIFwiLi4vRGVmYXVsdFVybFNlcnZpY2VcIjtcbmltcG9ydCBHZW9jb2RlUmVxdWVzdEZhY3RvcnkgZnJvbSBcIi4vUmVxdWVzdC9HZW9jb2RlUmVxdWVzdEZhY3RvcnlcIjtcbmltcG9ydCBHZW9jb2RlUmVzcG9uc2VGYWN0b3J5IGZyb20gXCIuL1Jlc3BvbnNlL0dlb2NvZGVSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBBcHBlbCBkdSBzZXJ2aWNlIGRlIGfDqW9jb2RhZ2UgaW52ZXJzZSBkdSBHw6lvcG9ydGFpbCA6XG4gKiAgICAgZW52b2kgZGUgbGEgcmVxdcOqdGUgY29uc3RydWl0ZSBzZWxvbiBsZXMgcGFyYW3DqHRyZXMgZW4gb3B0aW9ucyxcbiAqICAgICDDqXZlbnR1ZWxsZW1lbnQgcGFyc2luZyBldCBhbmFseXNlICBkZSBsYSByw6lwb25zZSxcbiAqICAgICByZXRvdXIgZCd1bmUgcsOpcG9uc2UgZW4gcGFyYW3DqHRyZSBkZSBsYSBmb25jdGlvbiBvblN1Y2Nlc3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtHcC5TZXJ2aWNlcy5Db21tb25TZXJ2aWNlfVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJldmVyc2VHZW9jb2RlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlICgrIGxlcyBvcHRpb25zIGhlcml0w6llcylcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5wb3NpdGlvbiAtIFBvc2l0aW9uIGR1IHBvaW50IGRlIHLDqWbDqXJlbmNlIHBvdXIgbGUgY2FsY3VsIGRlIHByb3hpbWl0w6kgZXhwcmltw6llIGRhbnMgbGUgc3lzdMOobWUgZGUgcsOpZsOpcmVuY2Ugc3DDqWNpZmnDqSBwYXIgbGUgc3JzLlxuICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnBvc2l0aW9uLmxvbiAtIExvbmdpdHVkZSBkdSBwb2ludCBkZSByw6lmw6lyZW5jZSBwb3VyIGxlIGNhbGN1bCBkZSBwcm94aW1pdMOpLlxuICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnBvc2l0aW9uLmxhdCAtIExhdGl0dWRlIGR1IHBvaW50IGRlIHLDqWbDqXJlbmNlIHBvdXIgbGUgY2FsY3VsIGRlIHByb3hpbWl0w6kuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpbHRlcnNdIC0gTGVzIHByb3ByacOpdMOpcyBwb3NzaWJsZXMgZGUgY2V0IG9iamV0LlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmZpbHRlcnMuW3Byb3ByaWV0ZXMgZHUgZmlsdHJlXV0gLSBDcml0w6hyZSBzdXBwbMOpbWVudGFpcmUgcG91ciBmaWx0cmVyIGxhIHJlY2hlcmNoZSBzb3VzIGxhIGZvcm1lXG4gKiAgICAgIGQndW4gY291cGxlIGNsw6kvdmFsZXVyIMOgIGTDqWZpbmlyIHNlbG9uIGxlcyBwb3NzaWJpbGl0w6lzIGR1IHNlcnZldXIgYWpvdXTDqSDDoCBsYSByZXF1w6p0ZS5cbiAqICAgICAgTGUgc2VydmljZSBkZSBnw6lvY29kYWdlIGR1IEfDqW9wb3J0YWlsIHBlcm1ldCBkZSBmaWx0cmVyIGxlcyBhZHJlc3NlcyBwb3N0YWxlcyBhdmVjIGxlcyBwcm9wcmnDqXTDqXMgOlxuICogICAgICAgICAgXCJwb3N0YWxDb2RlXCIsIFwiaW5zZWVDb2RlXCIsIFwiY2l0eVwiLlxuICogICAgICBJbCBwZXJtZXQgw6lnYWxlbWVudCBkZSBmaWx0cmVyIGxlcyB0b3BvbnltZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIDpcbiAqICAgICAgICAgIFwicG9zdGFsQ29kZVwiLCBcImluc2VlQ29kZVwiLCBcInR5cGVcIi5cbiAqICAgICAgRW5maW4sIGlsIHBlcm1ldCBkZSBmaWx0cmVyIGxlcyBwYXJjZWxsZXMgY2FkYXN0cmFsZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIDpcbiAqICAgICAgICAgIFwiY29kZURlcGFydGVtZW50XCIsIFwiY29kZUNvbW11bmVcIiwgXCJub21Db21tdW5lXCIsIFwiY29kZUNvbW11bmVBYnNcIiwgXCJjb2RlQXJyb25kaXNzZW1lbnRcIiwgXCJzZWN0aW9uXCIsIFwibnVtZXJvXCIsIFwiZmV1aWxsZVwiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zZWFyY2hHZW9tZXRyeV0gLSBFbXByaXNlIGRhbnMgbGFxdWVsbGUgb24gc291aGFpdGUgZWZmZWN0dWVyIGxhIHJlY2hlcmNoZS5cbiAqICAgICAgTGVzIHByb3ByacOpdMOpcyBwb3NzaWJsZXMgZGUgY2V0IG9iamV0IHNvbnQgZMOpY3JpdGVzIGNpLWFwcsOocy5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkudHlwZSAgIC0gVHlwZSBkZSBnw6lvbWV0cmllIChQb2ludHxDaXJjbGV8TGluZXN0cmluZ3xQb2x5Z29uKVxuICogICAgICBAcGFyYW0ge0FycmF5LjxGbG9hdD58QXJyYXkuQXJyYXkuPEZsb2F0Pn0gb3B0aW9ucy5zZWFyY2hHZW9tZXRyeS5jb29yZGluYXRlcyAtIENvb3Jkb25uw6llcyBkZXMgcG9pbnRzIGNvbnN0aXR1YW50IGxhIGfDqW9tw6l0cmllLlxuICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnNlYXJjaEdlb21ldHJ5LnJhZGl1cyAgICAtIFJheW9uLiBQYXJhbcOodHJlIGFwcGxpY2FibGUgdW5pcXVlbWVudCBwb3VyIGxlIHR5cGUgJ0NpcmNsZScuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmluZGV4ID0gXCJTdHJlZXRBZGRyZXNzXCJdIC0gVHlwZSBkZSBsJ29iamV0IHJlY2hlcmNow6kuXG4gKiAgICAgIExlIHNlcnZpY2UgZGUgZ8Opb2NvZGFnZSBkdSBHw6lvcG9ydGFpbCBwZXJtZXQgZGUgcmVjaGVyY2hlciBkZXMgJ1Bvc2l0aW9uT2ZJbnRlcmVzdCcgcG91ciBkZXMgdG9wb255bWVzLCBkZXMgJ1N0cmVldEFkZHJlc3MnXG4gKiAgICAgIHBvdXIgZGVzIGFkcmVzc2VzIHBvc3RhbGVzIG91IGRlcyAnQ2FkYXN0cmFsUGFyY2VsJyBwb3VyIGRlcyBwYXJjZWxsZXMgY2FkYXN0cmFsZXMuIEwnaW5kZXggJ2xvY2F0aW9uJyBwZXJtZXQgdW5lIHJlY2hlcmNoZVxuICogICAgICBtdWx0aS1pbmRleGVzIGVuIHJlZ3JvdXBhbnQgbGVzIGluZGV4ZXMgJ1Bvc2l0aW9uT2ZJbnRlcmVzdCcgZXQgJ1N0cmVldEFkZHJlc3MnLlxuICogICAgICBEJ2F1dHJlcyB0eXBlcyBwb3Vycm9udCDDqnRyZSByYWpvdXTDqXMgc2Vsb24gbCfDqXZvbHV0aW9uIGR1IHNlcnZpY2UuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBpbmRleCA9ICdTdHJlZXRBZGRyZXNzJy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4aW11bVJlc3BvbnNlc10gLSBOb21icmUgZGUgcsOpcG9uc2VzIG1heGltYWwgcXVlIGwnb24gc291aGFpdGUgcmVjZXZvaXIuXG4gKiAgICAgIFBhcyBkZSB2YWxldXIgcGFyIGTDqWZhdXQuIFNpIGxlIHNlcnZldXIgY29uc3VsdMOpIGVzdCBjZWx1aSBkdSBHw6lvcG9ydGFpbCwgbGEgdmFsZXVyIHBhciBkw6lmYXV0IHNlcmEgZG9uYyBjZWxsZSBkdSBzZXJ2aWNlIDogMjBzLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmV0dXJuVHJ1ZUdlb21ldHJ5XSAtIEJvb2zDqWVuIGluZGlxdWFudCBzaSBsJ29uIHNvdWhhaXRlIHLDqWN1cMOpcmVyIGxhIGfDqW9tw6l0cmllIHZyYWllIGRlcyBvYmplY3RzIGfDqW9sb2NhbGlzw6lzLlxuICogICAgICBmYWxzZSBwYXIgZMOpZmF1dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgb3B0aW9ucyA9IHtcbiAqICAgICAgYXBpS2V5IDogbnVsbCxcbiAqICAgICAgc2VydmVyVXJsIDogJ2h0dHA6Ly9sb2NhbGhvc3Qvc2VydmljZS8nLFxuICogICAgICBwcm94eVVSTCA6IG51bGwsXG4gKiAgICAgIHRpbWVPdXQgOiAxMDAwMCwgLy8gbXNcbiAqICAgICAgcmF3UmVzcG9uc2UgOiBmYWxzZSwgLy8gdHJ1ZXxmYWxzZVxuICogICAgICBzY29wZSA6IG51bGwsIC8vIHRoaXNcbiAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAqICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7fSxcbiAqICAgICAgLy8gc3DDqWNpZmlxdWUgYXUgc2VydmljZVxuICogICAgICBpbmRleCA6ICdTdHJlZXRBZGRyZXNzJyxcbiAqICAgICAgc2VhcmNoR2VvbWV0cnkgOiB7XG4gKiAgICAgICAgICB0eXBlIDogQ2lyY2xlLFxuICogICAgICAgICAgY29vcmRpbmF0ZXMgOiBbNDgsIDJdLFxuICogICAgICAgICAgcmFkaXVzIDogMTAwXG4gKiAgICAgIH0sXG4gKiAgICAgIHBvc2l0aW9uIDoge2xvbjoyICwgbGF0OjQ4LjV9LFxuICogICAgICBtYXhpbXVtUmVzcG9uc2VzIDogMjUsXG4gKiAgIH07XG4gKlxuICovXG5mdW5jdGlvbiBSZXZlcnNlR2VvY29kZSAob3B0aW9uc18pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmV2ZXJzZUdlb2NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIiwgXCJSZXZlcnNlR2VvY29kZVwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9tIGRlIGxhIGNsYXNzZSAoaGVyaXRhZ2UpXG4gICAgICogRklYTUUgaW5zdGFuY2Ugb3UgY2xhc3NlID9cbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiUmV2ZXJzZUdlb2NvZGVcIjtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkdwLlNlcnZpY2VzLlJldmVyc2VHZW9jb2RlXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBSZXZlcnNlR2VvY29kZSAob3B0aW9ucyldXCIpO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLnBhdGNoT3B0aW9uQ29udmVydG9yKG9wdGlvbnNfKTtcbiAgICBpZiAoIW9wdGlvbnMuc2VydmVyVXJsKSB7XG4gICAgICAgIG9wdGlvbnMuc2VydmVyVXJsID0gRGVmYXVsdFVybFNlcnZpY2UuUmV2ZXJzZUdlb2NvZGUubmV3VXJsKCk7XG4gICAgICAgIGlmIChvcHRpb25zLm9sZFJldmVyc2VTZXJ2aWNlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnNlcnZlclVybCA9IERlZmF1bHRVcmxTZXJ2aWNlLlJldmVyc2VHZW9jb2RlLnVybCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwZWwgZHUgY29uc3RydWN0ZXVyIHBhciBoZXJpdGFnZVxuICAgIENvbW1vblNlcnZpY2UuYXBwbHkodGhpcywgW29wdGlvbnNdKTtcblxuICAgIGlmICghb3B0aW9ucy5zZWFyY2hHZW9tZXRyeSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwic2VhcmNoR2VvbWV0cnlcIikpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEdlb21ldHJ5ID0gb3B0aW9ucy5zZWFyY2hHZW9tZXRyeTtcbiAgICB9XG5cbiAgICAvLyBvbiBkZWZpbml0IGwnaW5kZXggcGFyIGRlZmF1dFxuICAgIGlmICghb3B0aW9ucy5pbmRleCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmluZGV4ID0gXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmlsdGVycykge1xuICAgICAgICB2YXIgZmlsdGVyID0gT2JqZWN0LmtleXMob3B0aW9ucy5maWx0ZXJzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWx0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBmaWx0ZXJbaV07XG4gICAgICAgICAgICAvLyBvbiBzdXBwcmltZSBsZXMgZmlsdHJlcyB2aWRlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlcnNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXJzW2tleV0gPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5maWx0ZXJzW2tleV0pLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuZmlsdGVyc1trZXldID09PSBcInN0cmluZ1wiICYmIG9wdGlvbnMuZmlsdGVyc1trZXldLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShvcHRpb25zLmZpbHRlcnNba2V5XSkgJiYgb3B0aW9ucy5maWx0ZXJzW2tleV0ubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0aW9ucy5maWx0ZXJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgIHRoaXMub3B0aW9ucy5pbmRleCA9IG9wdGlvbnMuaW5kZXggfHwgXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMgPSBvcHRpb25zLm1heGltdW1SZXNwb25zZXMgfHwgMjA7XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpSZXZlcnNlR2VvY29kZSNcbiAqL1xuUmV2ZXJzZUdlb2NvZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDb21tb25TZXJ2aWNlLnByb3RvdHlwZSwge1xuICAgIC8vIHRvZG9cbiAgICAvLyBnZXR0ZXIvc2V0dGVyXG59KTtcblxuLypcbiAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJldmVyc2VHZW9jb2RlO1xuXG4vKipcbiAqIFBhdGNoIHBvdXIgbGEgY29udmVydGlvbiBkZXMgb3B0aW9ucyB2ZXJzIGxlIG5vdXZlYXUgZm9ybWFsaXNtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc18gLSBvcHRpb25zIGR1IHNlcnZpY2VcbiAqIEByZXR1cm4ge09iamVjdH0gLSBvcHRpb25zXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5wYXRjaE9wdGlvbkNvbnZlcnRvciA9IGZ1bmN0aW9uIChvcHRpb25zXykge1xuICAgIHZhciBvcHRpb25zID0gb3B0aW9uc187XG5cbiAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zJyBpcyBkZXByZWNhdGVkXCIpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudHlwZScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pbmRleCkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsdGVyT3B0aW9ucy50eXBlKSAmJiBvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluZGV4ID0gb3B0aW9ucy5maWx0ZXJPcHRpb25zLnR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucy50eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5iYm94KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiVGhlIHBhcmFtZXRlciAnZmlsdGVyT3B0aW9ucy5iYm94JyBpcyBkZXByZWNhdGVkXCIpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNlYXJjaEdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gY29udmVydGlyIGxhIGdlb21ldHJpZVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkgPSB0aGlzLmJib3gySnNvbihvcHRpb25zLmZpbHRlck9wdGlvbnMuYmJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5maWx0ZXJPcHRpb25zLmJib3g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zLmNpcmNsZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMuY2lyY2xlJyBpcyBkZXByZWNhdGVkXCIpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNlYXJjaEdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gY29udmVydGlyIGxhIGdlb21ldHJpZVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkgPSB0aGlzLmNpcmNsZTJKc29uKG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5jaXJjbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5jaXJjbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zLnBvbHlnb24pIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zLnBvbHlnb24nIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2VhcmNoR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0aXIgbGEgZ2VvbWV0cmllXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hHZW9tZXRyeSA9IHRoaXMucG9seWdvbjJKc29uKG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5wb2x5Z29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmZpbHRlck9wdGlvbnMucG9seWdvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKG9wdGlvbnMuZmlsdGVyT3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXJzID0gb3B0aW9ucy5maWx0ZXJPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbi54KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiVGhlIHBhcmFtZXRlciAncG9zaXRpb24ueCcgaXMgZGVwcmVjYXRlZFwiKTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBvc2l0aW9uLmxvbikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucG9zaXRpb24ubG9uID0gb3B0aW9ucy5wb3NpdGlvbi54O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMucG9zaXRpb24ueDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdwb3NpdGlvbi55JyBpcyBkZXByZWNhdGVkXCIpO1xuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucG9zaXRpb24ubGF0KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wb3NpdGlvbi5sYXQgPSBvcHRpb25zLnBvc2l0aW9uLnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5wb3NpdGlvbi55O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3JzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdzcnMnIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnNycztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5idWlsZFJlcXVlc3QgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgaHR0cE1ldGhvZCA6IHRoaXMub3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAvLyBvcHRpb25zIHNwZWNpZmlxdWVzIGR1IHNlcnZpY2VcbiAgICAgICAgZ2VvY29kZU1ldGhvZCA6IFwicmV2ZXJzZVwiLFxuICAgICAgICBzZWFyY2hHZW9tZXRyeSA6IHRoaXMub3B0aW9ucy5zZWFyY2hHZW9tZXRyeSxcbiAgICAgICAgaW5kZXggOiB0aGlzLm9wdGlvbnMuaW5kZXgsXG4gICAgICAgIHBvc2l0aW9uIDogdGhpcy5vcHRpb25zLnBvc2l0aW9uLFxuICAgICAgICByZXR1cm5UcnVlR2VvbWV0cnkgOiB0aGlzLm9wdGlvbnMucmV0dXJuVHJ1ZUdlb21ldHJ5LFxuICAgICAgICBtYXhSZXNwIDogdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMsXG4gICAgICAgIGZpbHRlcnMgOiB0aGlzLm9wdGlvbnMuZmlsdGVyc1xuICAgIH07XG5cbiAgICB0aGlzLnJlcXVlc3QgPSBHZW9jb2RlUmVxdWVzdEZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG5cbiAgICAvLyBvbiB0ZXN0ZSBzaSBsYSByZXF1ZXRlIGEgYmllbiDDqXTDqSBjb25zdHJ1aXRlICFcbiAgICAoIXRoaXMucmVxdWVzdClcbiAgICAgICAgPyBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoXy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVFVRVNUX0JVSUxEXCIpKSlcbiAgICAgICAgOiBzdWNjZXNzLmNhbGwodGhpcywgdGhpcy5yZXF1ZXN0KTtcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIEFuYWx5c2UgZGUgbGEgcmVwb25zZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5hbmFseXplUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlIDogdGhpcy5yZXNwb25zZSxcbiAgICAgICAgICAgIHJhd1Jlc3BvbnNlIDogdGhpcy5vcHRpb25zLnJhd1Jlc3BvbnNlLFxuICAgICAgICAgICAgb25FcnJvciA6IGVycm9yLFxuICAgICAgICAgICAgb25TdWNjZXNzIDogc3VjY2VzcyxcbiAgICAgICAgICAgIHNjb3BlIDogdGhpc1xuICAgICAgICB9O1xuXG4gICAgICAgIEdlb2NvZGVSZXNwb25zZUZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFBhdGNoIHBvdXIgbGEgY29udmVydGlvbiBkZXMgb3B0aW9ucyB2ZXJzIGxlIG5vdXZlYXUgZm9ybWFsaXNtZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBiYm94IC0gYmJveFxuICogQHJldHVybiB7T2JqZWN0fSAtIGdlb21ldHJpZSBhdSBmb3JtYXQganNvblxuICovXG5SZXZlcnNlR2VvY29kZS5wcm90b3R5cGUuYmJveDJKc29uID0gZnVuY3Rpb24gKGJib3gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlIDogXCJQb2x5Z29uXCIsXG4gICAgICAgIGNvb3JkaW5hdGVzIDogW1tcbiAgICAgICAgICAgIFtiYm94LmxlZnQsIGJib3gudG9wXSxcbiAgICAgICAgICAgIFtiYm94LnJpZ2h0LCBiYm94LnRvcF0sXG4gICAgICAgICAgICBbYmJveC5yaWdodCwgYmJveC5ib3R0b21dLFxuICAgICAgICAgICAgW2Jib3gubGVmdCwgYmJveC5ib3R0b21dLFxuICAgICAgICAgICAgW2Jib3gubGVmdCwgYmJveC50b3BdXG4gICAgICAgIF1dXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGF0Y2ggcG91ciBsYSBjb252ZXJ0aW9uIGRlcyBvcHRpb25zIHZlcnMgbGUgbm91dmVhdSBmb3JtYWxpc21lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaXJjbGUgLSBjaXJjbGVcbiAqIEByZXR1cm4ge09iamVjdH0gLSBnZW9tZXRyaWUgYXUgZm9ybWF0IGpzb25cbiAqL1xuUmV2ZXJzZUdlb2NvZGUucHJvdG90eXBlLmNpcmNsZTJKc29uID0gZnVuY3Rpb24gKGNpcmNsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUgOiBcIkNpcmNsZVwiLFxuICAgICAgICByYWRpdXMgOiBjaXJjbGUucmFkaXVzLFxuICAgICAgICBjb29yZGluYXRlcyA6IFtjaXJjbGUueCwgY2lyY2xlLnldXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGF0Y2ggcG91ciBsYSBjb252ZXJ0aW9uIGRlcyBvcHRpb25zIHZlcnMgbGUgbm91dmVhdSBmb3JtYWxpc21lLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBvbHlnb24gLSBwb2x5Z29uXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gZ2VvbWV0cmllIGF1IGZvcm1hdCBqc29uXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5wb2x5Z29uMkpzb24gPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHZhciBqc29uR2VvbSA9IHtcbiAgICAgICAgdHlwZSA6IFwiUG9seWdvblwiLFxuICAgICAgICBjb29yZGluYXRlcyA6IFtbXV1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGpzb25HZW9tLmNvb3JkaW5hdGVzWzBdLnB1c2goW3BvbHlnb25baV0ueCwgcG9seWdvbltpXS55XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb25HZW9tO1xufTtcblxuLyoqXG4gKiBDb2RlcyBFUFNHIGfDqW9ncmFwaGlxdWVzIChsYXQvbG9uKS4gVXRpbGVzIGNhciBsZXMgY29vcmRvbm7DqWVzIGRvaXZlbnQgw6p0cmUgaW52ZXJzw6llcy5cbiAqL1xuUmV2ZXJzZUdlb2NvZGUuZ2VvRVBTRyA9IFtcIkVQU0c6NDMyNlwiXTtcblxuZXhwb3J0IGRlZmF1bHQgUmV2ZXJzZUdlb2NvZGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Geocode/ReverseGeocode.js\n"); - -/***/ }), - -/***/ "./src/Services/ProcessIsoCurve/ProcessIsoCurve.js": -/*!*********************************************************!*\ - !*** ./src/Services/ProcessIsoCurve/ProcessIsoCurve.js ***! - \*********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/ProcessIsoCurveRequest */ \"./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js\");\n/* harmony import */ var _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/ProcessIsoCurveResponseFactory */ \"./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service d'isochrone/distance du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.ProcessIsoCurve\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité.\n *\n * @param {String} options.outputFormat - Le format de la réponse du service iso : 'json' uniquement et par défaut.\n *\n * @param {Object} options.position - Point de départ du calcul.\n * Coordonnées exprimées en longitudes, latitudes (EPSG:4326)\n * @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance.\n * @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance.\n *\n * @param {String} options.srs - Projection.\n * Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et\n * dans lequel la géométrie de la courbe résultante sera exprimée.\n * Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ».\n *\n * @param {String} [options.graph = \"voiture\"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »).\n * La valeur par défaut est : «voiture»\n *\n * @param {Array.} [options.exclusions] - DEPRECATED: Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints.\n * Critères d'exclusions à appliquer pour le calcul.\n * On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte\n * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »).\n *\n * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities.\n * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement \"banned\".\n * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement \"wayType\".\n * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement \"=\".\n * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement \"autoroute\".\n *\n * @param {String} [options.method = \"time\"] - Méthode utilisée pour le calcul de la courbe iso.\n * Les valeurs possible sont \"time\" pour un calcul d'isochrone, \"distance\" pour un calcul d'isodistance.\n * Pas de valeur spécifié équivaut à un calcul d'isochrone.\n *\n * @param {String} [options.distanceUnit = \"m\"] - Indique si la distance doit être exprimée en km ou m dans la réponse (\"m\" or \"km\").\n *\n * @param {String} [options.timeUnit = \"second\"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse (\"standard\", \"second\", \"minute\", \"hour\"). Il peut-être formatté hh:mm::ss avec la valeur standard.\n *\n * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ».\n * Ce paramètre doit être renseigné si l'option \"méthod\" a la valeur \"time\".\n * Si l'option method n'est pas renseignée, ce paramètre doit être renseigné.\n *\n * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ».\n * Ce paramètre doit être renseigné si l'option \"méthod\" a la valeur \"DISTANCE\".\n * Si l'option \"method\" n'est pas renseignée, ce paramètre sera ignoré.\n *\n * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier.\n * Par défaut, la valeur « false » est appliquée.\n *\n * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier.\n * Par défaut, la valeur « false » est appliquée.\n *\n * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »).\n * Par défaut, la valeur « false » est appliquée.\n *\n * @example\n * var options = {\n * // options communes aux services\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * position : {\n * x : 2.3242664298058053,\n * y : 48.86118017324745\n * },\n * distance : 200,\n * [time : ]\n * method : \"distance\",\n * graph : \"voiture\",\n * reverse : false\n * };\n */\n\nfunction ProcessIsoCurve(options) {\n if (!(this instanceof ProcessIsoCurve)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"ProcessIsoCurve\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"ProcessIsoCurve\";\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.ProcessIsoCurve\");\n this.logger.trace(\"[Constructeur ProcessIsoCurve (options)]\");\n if (!options.position) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"position\"));\n }\n\n // on lance une exception afin d'eviter au service de le faire...\n if (options.position.x === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"position.x\"));\n }\n if (options.position.y === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"position.y\"));\n }\n if (!options.time && !options.distance) {\n throw new Error(\"Parameter (s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance\");\n }\n\n // si on a que le paramètre \"distance\" en entrée, on calcule une isodistance.\n // Le paramètre \"méthode\" doit pour avoir une réponse du service, être passé à \"distance\"\n if (!options.time && options.distance) {\n this.options.method = \"distance\";\n // on supprime l'éventuel attribut time, résidu d'un appel antérieur\n if (this.options.time) {\n delete this.options.time;\n }\n }\n\n // si on a que le paramètre \"time\" en entrée, on calcule une isochrone.\n // Le paramètre \"méthode\" doit pour avoir une réponse du service, être passé à \"time\"\n if (options.time && !options.distance) {\n this.options.method = \"time\";\n // on supprime l'éventuel attribut time, résidu d'un appel antérieur\n if (this.options.distance) {\n delete this.options.distance;\n }\n }\n\n // au cas où on a ni l'un, ni l'autre...\n this.options.method = this.options.method || \"time\";\n\n // options par defaut du service\n // TODO: modifier la ressource lors de la mise en production du service\n this.options.resource = options.resource || \"bdtopo-iso\";\n this.options.exclusions = options.exclusions || [];\n this.options.reverse = options.reverse || false;\n this.options.srs = options.srs || \"EPSG:4326\";\n this.options.distanceUnit = options.distanceUnit || \"m\";\n this.options.timeUnit = options.timeUnit || \"second\";\n\n // options depreciees\n if (options.smoothing) {\n this.logger.warn(\"options.smoothing is DEPRECATED\");\n }\n this.options.smoothing = false;\n if (options.holes) {\n this.logger.warn(\"options.holes is DEPRECATED\");\n }\n this.options.holes = false;\n\n // Gestion du graphe\n if (options.graph) {\n if (options.graph === \"Voiture\") {\n this.options.graph = \"car\";\n }\n if (options.graph === \"Pieton\") {\n this.options.graph = \"pedestrian\";\n }\n } else {\n this.options.graph = \"car\";\n }\n\n // Gestions des contraintes\n this.options.constraints = [];\n if (options.constraints) {\n if (Array.isArray(options.constraints)) {\n for (var k = 0; k < options.constraints.length; k++) {\n this.options.constraints.push(options.constraints[k]);\n }\n } else {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"constraints\"));\n }\n }\n\n // Gestion de l'ancien paramètre exclusions\n var constraintTunnel = {};\n var constraintPont = {};\n var constraintAutoroute = {};\n if (options.exclusions) {\n if (options.exclusions.length !== 0) {\n this.logger.warn(\"options.exclusions is DEPRECATED !!\");\n for (var c = 0; c < options.exclusions.length; c++) {\n if (typeof options.exclusions[c] === \"string\") {\n options.exclusions[c] = options.exclusions[c].toLowerCase();\n } else {\n // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions\n continue;\n }\n if (options.exclusions[c] === \"toll\") {\n constraintAutoroute.constraintType = \"banned\";\n constraintAutoroute.key = \"wayType\";\n constraintAutoroute.operator = \"=\";\n constraintAutoroute.value = \"autoroute\";\n this.options.constraints.push(constraintAutoroute);\n }\n if (options.exclusions[c] === \"tunnel\") {\n constraintTunnel.constraintType = \"banned\";\n constraintTunnel.key = \"wayType\";\n constraintTunnel.operator = \"=\";\n constraintTunnel.value = \"tunnel\";\n this.options.constraints.push(constraintTunnel);\n }\n if (options.exclusions[c] === \"bridge\") {\n constraintPont.constraintType = \"banned\";\n constraintPont.key = \"wayType\";\n constraintPont.operator = \"=\";\n constraintPont.value = \"pont\";\n this.options.constraints.push(constraintPont);\n }\n }\n }\n }\n\n // on passe l'option outputFormat en minuscules afin d'éviter des exceptions.\n this.options.outputFormat = typeof options.outputFormat === \"string\" ? options.outputFormat.toLowerCase() : \"json\";\n if (options.outputFormat && options.outputFormat !== \"json\") {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_NOT_SUPPORT\", \"outputFormat\"));\n }\n this.options.outputFormat = \"json\";\n\n // gestion de l'url du service par defaut\n // si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n if (!this.options.serverUrl) {\n // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone\n /* var urlFound = DefaultUrlService.ProcessIsoCurve.newUrl();\n if (this.options.oldIsoService) {\n urlFound = DefaultUrlService.ProcessIsoCurve.url();\n } */\n // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone\n var urlFound = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].ProcessIsoCurve.url();\n if (!urlFound) {\n throw new Error(\"Url by default not found !\");\n }\n this.options.serverUrl = urlFound;\n this.logger.trace(\"Serveur URL par defaut : \" + this.options.serverUrl);\n }\n}\n\n/**\n * @lends module:ProcessIsoCurve#\n */\nProcessIsoCurve.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nProcessIsoCurve.prototype.constructor = ProcessIsoCurve;\n\n/**\n * Création de la requête (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nProcessIsoCurve.prototype.buildRequest = function (error, success) {\n try {\n var oIsoCurve = new _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__[\"default\"](this.options);\n if (!oIsoCurve.processRequestString()) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"));\n }\n this.request = oIsoCurve.requestString;\n } catch (e) {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](e.message));\n return;\n }\n success.call(this, this.request);\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} onError - callback des erreurs\n * @param {Function} onSuccess - callback de succès de l'analyse de la réponse\n */\nProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) {\n if (this.response) {\n var options = {\n response: this.response,\n outputFormat: this.options.outputFormat,\n rawResponse: this.options.rawResponse,\n onSuccess: onSuccess,\n onError: onError,\n scope: this\n };\n _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurve);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUHJvY2Vzc0lzb0N1cnZlLmpzP2M1MDEiXSwibmFtZXMiOlsiUHJvY2Vzc0lzb0N1cnZlIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwiQ29tbW9uU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJwb3NpdGlvbiIsIkVycm9yIiwieCIsInkiLCJ0aW1lIiwiZGlzdGFuY2UiLCJtZXRob2QiLCJyZXNvdXJjZSIsImV4Y2x1c2lvbnMiLCJyZXZlcnNlIiwic3JzIiwiZGlzdGFuY2VVbml0IiwidGltZVVuaXQiLCJzbW9vdGhpbmciLCJ3YXJuIiwiaG9sZXMiLCJncmFwaCIsImNvbnN0cmFpbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiayIsImxlbmd0aCIsInB1c2giLCJjb25zdHJhaW50VHVubmVsIiwiY29uc3RyYWludFBvbnQiLCJjb25zdHJhaW50QXV0b3JvdXRlIiwiYyIsInRvTG93ZXJDYXNlIiwiY29uc3RyYWludFR5cGUiLCJrZXkiLCJvcGVyYXRvciIsInZhbHVlIiwib3V0cHV0Rm9ybWF0Iiwic2VydmVyVXJsIiwidXJsRm91bmQiLCJEZWZhdWx0VXJsU2VydmljZSIsInVybCIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwiYnVpbGRSZXF1ZXN0IiwiZXJyb3IiLCJzdWNjZXNzIiwib0lzb0N1cnZlIiwiUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCIsInByb2Nlc3NSZXF1ZXN0U3RyaW5nIiwicmVxdWVzdCIsInJlcXVlc3RTdHJpbmciLCJlIiwiY2FsbCIsIkVycm9yU2VydmljZSIsIm1lc3NhZ2UiLCJhbmFseXplUmVzcG9uc2UiLCJvbkVycm9yIiwib25TdWNjZXNzIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIs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QyxPQUFPLEVBQUVDLFNBQVMsRUFBRTtFQUN0RSxJQUFJLElBQUksQ0FBQ0MsUUFBUSxFQUFFO0lBQ2YsSUFBSXBFLE9BQU8sR0FBRztNQUNWb0UsUUFBUSxFQUFHLElBQUksQ0FBQ0EsUUFBUTtNQUN4QnhCLFlBQVksRUFBRyxJQUFJLENBQUM1QyxPQUFPLENBQUM0QyxZQUFZO01BQ3hDeUIsV0FBVyxFQUFHLElBQUksQ0FBQ3JFLE9BQU8sQ0FBQ3FFLFdBQVc7TUFDdENGLFNBQVMsRUFBR0EsU0FBUztNQUNyQkQsT0FBTyxFQUFHQSxPQUFPO01BQ2pCSSxLQUFLLEVBQUc7SUFDWixDQUFDO0lBRURDLGdGQUE4QixDQUFDQyxLQUFLLENBQUN4RSxPQUFPLENBQUM7RUFDakQsQ0FBQyxNQUFNO0lBQ0hrRSxPQUFPLENBQUNKLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQzdELGdFQUFDLENBQUNDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7RUFDaEY7QUFDSixDQUFDO0FBRWNKLDhFQUFlIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1Byb2Nlc3NJc29DdXJ2ZS9Qcm9jZXNzSXNvQ3VydmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IENvbW1vblNlcnZpY2UgZnJvbSBcIi4uL0NvbW1vblNlcnZpY2VcIjtcbmltcG9ydCBEZWZhdWx0VXJsU2VydmljZSBmcm9tIFwiLi4vRGVmYXVsdFVybFNlcnZpY2VcIjtcbmltcG9ydCBQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0IGZyb20gXCIuL1JlcXVlc3QvUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdFwiO1xuaW1wb3J0IFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlRmFjdG9yeSBmcm9tIFwiLi9SZXNwb25zZS9Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBBcHBlbCBkdSBzZXJ2aWNlIGQnaXNvY2hyb25lL2Rpc3RhbmNlIGR1IEfDqW9wb3J0YWlsIDpcbiAqICAgICBlbnZvaSBkZSBsYSByZXF1w6p0ZSBjb25zdHJ1aXRlIHNlbG9uIGxlcyBwYXJhbcOodHJlcyBlbiBvcHRpb25zLFxuICogICAgIMOpdmVudHVlbGxlbWVudCBwYXJzaW5nIGV0IGFuYWx5c2UgIGRlIGxhIHLDqXBvbnNlLFxuICogICAgIHJldG91ciBkJ3VuZSByw6lwb25zZSBlbiBwYXJhbcOodHJlIGRlIGxhIGZvbmN0aW9uIG9uU3VjY2Vzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0dwLlNlcnZpY2VzLkNvbW1vblNlcnZpY2V9XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuUHJvY2Vzc0lzb0N1cnZlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2UgKCsgbGVzIG9wdGlvbnMgaGVyaXTDqWVzKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnJlc291cmNlIC0gTGEgcmVzc291cmNlIHV0aWxpc8OpZSBwb3VyIGxlIGNhbGN1bC4gQ2UgcGFyYW3DqHRyZSBkZXZyYWl0IMOqdHJlIG9ibGlnYXRvaXJlIGNhciBpbCBsJ2VzdCBkYW5zIGwnYXBwZWwgYXUgc2VydmljZS4gTWFpcyBpbCBuZSBsJ2VzdCBwYXMgcG91ciBkZXMgcmFpc29ucyBkZSByw6l0cm9jb21wYXRpYmlsaXTDqS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5vdXRwdXRGb3JtYXQgLSBMZSBmb3JtYXQgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSBpc28gOiAnanNvbicgdW5pcXVlbWVudCBldCBwYXIgZMOpZmF1dC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5wb3NpdGlvbiAtIFBvaW50IGRlIGTDqXBhcnQgZHUgY2FsY3VsLlxuICogICAgICBDb29yZG9ubsOpZXMgZXhwcmltw6llcyBlbiBsb25naXR1ZGVzLCBsYXRpdHVkZXMgKEVQU0c6NDMyNilcbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi54IC0gQWJjaXNzZSBkdSBwb2ludCBkZSBkw6lwYXJ0IGR1IGNhbGN1bCBkJ2lzb2Nocm9uZS9kaXN0YW5jZS5cbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi55IC0gT3Jkb25uw6llIGR1IHBvaW50IGRlIGTDqXBhcnQgZHUgY2FsY3VsIGQnaXNvY2hyb25lL2Rpc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnNycyAtIFByb2plY3Rpb24uXG4gKiAgICAgIFN5c3TDqG1lIGRlIGNvb3Jkb25uw6llcyBkYW5zIGxlcXVlbCBsZXMgY29vcmRvbm7DqWVzIGR1IHBvaW50IMKrIGxvY2F0aW9uIMK7IHNvbnQgZXhwcmltw6llcyBldFxuICogICAgICBkYW5zIGxlcXVlbCBsYSBnw6lvbcOpdHJpZSBkZSBsYSBjb3VyYmUgcsOpc3VsdGFudGUgc2VyYSBleHByaW3DqWUuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBsZSBzeXN0w6htZSBkZSBjb29yZG9ubsOpZXMgdXRpbGlzw6kgc2VyYSDCqyBFUFNHOjQzMjYgwrsuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmdyYXBoID0gXCJ2b2l0dXJlXCJdIC0gTm9tIGR1IGdyYXBoZSDDoCB1dGlsaXNlciBwb3VyIGxlIGNhbGN1bCAowqsgUGlldG9uIMK7IG91IMKrIFZvaXR1cmUgwrspLlxuICogICAgICBMYSB2YWxldXIgcGFyIGTDqWZhdXQgZXN0IDogwqt2b2l0dXJlwrtcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBbb3B0aW9ucy5leGNsdXNpb25zXSAtIERFUFJFQ0FURUQ6IENlIHBhcmFtw6h0cmUgZXN0IGNvbnNlcnbDqSBwb3VyIHVuZSByw6l0cm9jb21wYXRpYmlsaXTDqSBkZSBsJ2FwaS4gTGUgbm91dmVhdSBwYXJhbcOodHJlIMOgIHV0aWxpc2VyIGVzdCBvcHRpb25zLmNvbnN0cmFpbnRzLlxuICogICAgICBDcml0w6hyZXMgZCdleGNsdXNpb25zIMOgIGFwcGxpcXVlciBwb3VyIGxlIGNhbGN1bC5cbiAqICAgICAgT24gcHLDqWNpc2UgaWNpIGxlIHR5cGUgZGUgdHJvbsOnb25zIHF1ZSBsJ29uIG5lIHZldXQgcGFzIHF1ZSBsJ2lzb2Nocm9uZS9kaXN0YW5jZSBlbXBydW50ZVxuICogICAgICAodmFsZXVycyBwb3NzaWJsZXMgOiDCqyB0b2xsIMK7ICjDqXZpdGVyIGxlcyBww6lhZ2VzKSwgwqsgYnJpZGdlIMK7LCDCqyB0dW5uZWwgwrspLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0W119IFtvcHRpb25zLmNvbnN0cmFpbnRzXSAtIENyaXTDqHJlcyBkZSBjb250cmFpbnRlcyDDoCBhcHBsaXF1ZXIgc3VyIHVuIGl0aW7DqXJhaXJlLiBMZXMgdmFsZXVycyBkaXNwb25pYmxlcyBkw6lwZW5kZW50IGRlIGxhIHJlc3NvdXJjZSB1dGlsaXPDqWUuIElsIGVzdCBkb25jIHV0aWxlIGRlIHJlZ2FyZGVyIGxlIGdldENhcGFiaWxpdGllcy5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLmNvbnN0cmFpbnRUeXBlXSAtIFR5cGUgZGUgbGEgY29udHJhaW50ZS4gR8OpbsOpcmFsZW1lbnQgXCJiYW5uZWRcIi5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLmtleV0gLSBDbMOpIGRlIGxhIGNvbnRyYWludGUuIEfDqW7DqXJhbGVtZW50IFwid2F5VHlwZVwiLlxuICogICAgICBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29uc3RyYWludHMub3BlcmF0b3JdIC0gT3DDqXJhdGV1ciBkZSBsYSBjb250cmFpbnRlLiBHw6luw6lyYWxlbWVudCBcIj1cIi5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLnZhbHVlXSAtIFZhbGV1ciBkZSBsYSBjb250cmFpbnRlLiBHw6luw6lyYWxlbWVudCBcImF1dG9yb3V0ZVwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXRob2QgPSBcInRpbWVcIl0gLSBNw6l0aG9kZSB1dGlsaXPDqWUgcG91ciBsZSBjYWxjdWwgZGUgbGEgY291cmJlIGlzby5cbiAqICAgICAgTGVzIHZhbGV1cnMgcG9zc2libGUgc29udCBcInRpbWVcIiBwb3VyIHVuIGNhbGN1bCBkJ2lzb2Nocm9uZSwgXCJkaXN0YW5jZVwiIHBvdXIgdW4gY2FsY3VsIGQnaXNvZGlzdGFuY2UuXG4gKiAgICAgIFBhcyBkZSB2YWxldXIgc3DDqWNpZmnDqSDDqXF1aXZhdXQgw6AgdW4gY2FsY3VsIGQnaXNvY2hyb25lLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kaXN0YW5jZVVuaXQgPSBcIm1cIl0gLSBJbmRpcXVlIHNpIGxhIGRpc3RhbmNlIGRvaXQgw6p0cmUgZXhwcmltw6llIGVuIGttIG91IG0gZGFucyBsYSByw6lwb25zZSAoXCJtXCIgb3IgXCJrbVwiKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGltZVVuaXQgPSBcInNlY29uZFwiXSAtIEluZGlxdWUgc2kgbGEgZHVyw6llIGRvaXQgw6p0cmUgZXhwcmltw6llIGVuIHNlY29uZGUsIG1pbnV0ZSBvdSBoZXVyZSBkYW5zIGxhIHLDqXBvbnNlIChcInN0YW5kYXJkXCIsIFwic2Vjb25kXCIsIFwibWludXRlXCIsIFwiaG91clwiKS4gSWwgcGV1dC3DqnRyZSBmb3JtYXR0w6kgaGg6bW06OnNzIGF2ZWMgbGEgdmFsZXVyIHN0YW5kYXJkLlxuICpcbiAqIEBwYXJhbSB7RmxvYXR9IG9wdGlvbnMudGltZSAtIER1csOpZSBtYXhpbXVtIChleHByaW3DqWUgZW4gc2Vjb25kZXMpIMOgIHV0aWxpc2VyIHBvdXIgbGUgY2FsY3VsIGRlIGxhIGNvdXJiZSDDoCBwYXJ0aXIgZHUgb3UganVzcXUnYXUgcG9pbnQgwqsgbG9jYXRpb24gwrsuXG4gKiAgICAgIENlIHBhcmFtw6h0cmUgZG9pdCDDqnRyZSByZW5zZWlnbsOpIHNpIGwnb3B0aW9uIFwibcOpdGhvZFwiIGEgbGEgdmFsZXVyIFwidGltZVwiLlxuICogICAgICBTaSBsJ29wdGlvbiBtZXRob2Qgbidlc3QgcGFzIHJlbnNlaWduw6llLCBjZSBwYXJhbcOodHJlIGRvaXQgw6p0cmUgcmVuc2VpZ27DqS5cbiAqXG4gKiBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLmRpc3RhbmNlIC0gRGlzdGFuY2UgbWF4aW11bSAoZXhwcmltw6llIGVuIG1ldHJlcykgw6AgdXRpbGlzZXIgcG91ciBsZSBjYWxjdWwgZGUgbGEgY291cmJlIMOgIHBhcnRpciBkdSBvdSBqJ3VzcXUnYXUgcG9pbnQgwqsgbG9jYXRpb24gwrsuXG4gKiAgICAgIENlIHBhcmFtw6h0cmUgZG9pdCDDqnRyZSByZW5zZWlnbsOpIHNpIGwnb3B0aW9uIFwibcOpdGhvZFwiIGEgbGEgdmFsZXVyIFwiRElTVEFOQ0VcIi5cbiAqICAgICAgU2kgbCdvcHRpb24gXCJtZXRob2RcIiBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUsIGNlIHBhcmFtw6h0cmUgc2VyYSBpZ25vcsOpLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmV2ZXJzZSA9IGZhbHNlXSAtIEluZGlxdWUgc2kgbGEgZ8Opb23DqXRyaWUgcsOpc3VsdGFudGUgZG9pdCDDqnRyZSBsaXNzw6llICjCqyB0cnVlIMK7KSBwb3VyIG5lIHBhcyBhdm9pciBkJ2VmZmV0IGQnZXNjYWxpZXIuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBsYSB2YWxldXIgwqsgZmFsc2UgwrsgZXN0IGFwcGxpcXXDqWUuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zbW9vdGhpbmcgPSBmYWxzZV0gLSBJbmRpcXVlIHNpIGxhIGfDqW9tw6l0cmllIHLDqXN1bHRhbnRlIGRvaXQgw6p0cmUgbGlzc8OpZSAowqsgdHJ1ZSDCuykgcG91ciBuZSBwYXMgYXZvaXIgZCdlZmZldCBkJ2VzY2FsaWVyLlxuICogICAgICBQYXIgZMOpZmF1dCwgbGEgdmFsZXVyIMKrIGZhbHNlIMK7IGVzdCBhcHBsaXF1w6llLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZXMgPSBmYWxzZV0gLSBJbmRpcXVlIHNpIGxhIGfDqW9tw6l0cmllIHLDqXN1bHRhbnRlIChzdXJmYWNlKSBkb2l0IMOqdHJlIHJldG91cm7DqWUgYXZlYyBkZXMgdHJvdXMgKMKrIHRydWUgwrspLlxuICogICAgICBQYXIgZMOpZmF1dCwgbGEgdmFsZXVyIMKrIGZhbHNlIMK7IGVzdCBhcHBsaXF1w6llLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBvcHRpb25zID0ge1xuICogICAgICAvLyBvcHRpb25zIGNvbW11bmVzIGF1eCBzZXJ2aWNlc1xuICogICAgICBhcGlLZXkgOiBudWxsLFxuICogICAgICBzZXJ2ZXJVcmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zZXJ2aWNlLycsXG4gKiAgICAgIHByb3RvY29sIDogJ0pTT05QJywgLy8gSlNPTlB8WEhSXG4gKiAgICAgIHByb3h5VVJMIDogbnVsbCxcbiAqICAgICAgaHR0cE1ldGhvZCA6ICdHRVQnLCAvLyBHRVR8UE9TVFxuICogICAgICB0aW1lT3V0IDogMTAwMDAsIC8vIG1zXG4gKiAgICAgIHJhd1Jlc3BvbnNlIDogZmFsc2UsIC8vIHRydWV8ZmFsc2VcbiAqICAgICAgc2NvcGUgOiBudWxsLCAvLyB0aGlzXG4gKiAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXNwb25zZSkge30sXG4gKiAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gKiAgICAgIC8vIHNww6ljaWZpcXVlIGF1IHNlcnZpY2VcbiAqICAgICAgcG9zaXRpb24gOiB7XG4gKiAgICAgICAgICAgeCA6IDIuMzI0MjY2NDI5ODA1ODA1MyxcbiAqICAgICAgICAgICB5IDogNDguODYxMTgwMTczMjQ3NDVcbiAqICAgICAgfSxcbiAqICAgICAgZGlzdGFuY2UgOiAyMDAsXG4gKiAgICAgIFt0aW1lIDogXVxuICogICAgICBtZXRob2QgOiBcImRpc3RhbmNlXCIsXG4gKiAgICAgIGdyYXBoIDogXCJ2b2l0dXJlXCIsXG4gKiAgICAgIHJldmVyc2UgOiBmYWxzZVxuICogIH07XG4gKi9cblxuZnVuY3Rpb24gUHJvY2Vzc0lzb0N1cnZlIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb2Nlc3NJc29DdXJ2ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfLmdldE1lc3NhZ2UoXCJDTEFTU19DT05TVFJVQ1RPUlwiLCBcIlByb2Nlc3NJc29DdXJ2ZVwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9tIGRlIGxhIGNsYXNzZSAoaGVyaXRhZ2UpXG4gICAgICogRklYTUUgaW5zdGFuY2Ugb3UgY2xhc3NlID9cbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiUHJvY2Vzc0lzb0N1cnZlXCI7XG5cbiAgICAvLyBhcHBlbCBkdSBjb25zdHJ1Y3RldXIgcGFyIGhlcml0YWdlXG4gICAgQ29tbW9uU2VydmljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiR3AuU2VydmljZXMuUHJvY2Vzc0lzb0N1cnZlXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBQcm9jZXNzSXNvQ3VydmUgKG9wdGlvbnMpXVwiKTtcblxuICAgIGlmICghb3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcInBvc2l0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvLyBvbiBsYW5jZSB1bmUgZXhjZXB0aW9uIGFmaW4gZCdldml0ZXIgYXUgc2VydmljZSBkZSBsZSBmYWlyZS4uLlxuICAgIGlmIChvcHRpb25zLnBvc2l0aW9uLnggPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX01JU1NJTkdcIiwgXCJwb3NpdGlvbi54XCIpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbi55ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwicG9zaXRpb24ueVwiKSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnRpbWUgJiYgIW9wdGlvbnMuZGlzdGFuY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIChzKSAnZGlzdGFuY2UnIG1pc3NpbmcuIFBhcmFtZXRlciB0aW1lIHRvIGNhbGN1bGF0ZSBhbiBpc29jaHJvbmUsIHBhcmFtZXRlciBkaXN0YW5jZSBmb3IgYW4gaXNvZGlzdGFuY2VcIik7XG4gICAgfVxuXG4gICAgLy8gc2kgb24gYSBxdWUgbGUgcGFyYW3DqHRyZSBcImRpc3RhbmNlXCIgZW4gZW50csOpZSwgb24gY2FsY3VsZSB1bmUgaXNvZGlzdGFuY2UuXG4gICAgLy8gTGUgcGFyYW3DqHRyZSBcIm3DqXRob2RlXCIgZG9pdCBwb3VyIGF2b2lyIHVuZSByw6lwb25zZSBkdSBzZXJ2aWNlLCDDqnRyZSBwYXNzw6kgw6AgXCJkaXN0YW5jZVwiXG4gICAgaWYgKCFvcHRpb25zLnRpbWUgJiYgb3B0aW9ucy5kaXN0YW5jZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0aG9kID0gXCJkaXN0YW5jZVwiO1xuICAgICAgICAvLyBvbiBzdXBwcmltZSBsJ8OpdmVudHVlbCBhdHRyaWJ1dCB0aW1lLCByw6lzaWR1IGQndW4gYXBwZWwgYW50w6lyaWV1clxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRpbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNpIG9uIGEgcXVlIGxlIHBhcmFtw6h0cmUgXCJ0aW1lXCIgZW4gZW50csOpZSwgb24gY2FsY3VsZSB1bmUgaXNvY2hyb25lLlxuICAgIC8vIExlIHBhcmFtw6h0cmUgXCJtw6l0aG9kZVwiIGRvaXQgcG91ciBhdm9pciB1bmUgcsOpcG9uc2UgZHUgc2VydmljZSwgw6p0cmUgcGFzc8OpIMOgIFwidGltZVwiXG4gICAgaWYgKG9wdGlvbnMudGltZSAmJiAhb3B0aW9ucy5kaXN0YW5jZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0aG9kID0gXCJ0aW1lXCI7XG4gICAgICAgIC8vIG9uIHN1cHByaW1lIGwnw6l2ZW50dWVsIGF0dHJpYnV0IHRpbWUsIHLDqXNpZHUgZCd1biBhcHBlbCBhbnTDqXJpZXVyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuZGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhdSBjYXMgb8O5IG9uIGEgbmkgbCd1biwgbmkgbCdhdXRyZS4uLlxuICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kIHx8IFwidGltZVwiO1xuXG4gICAgLy8gb3B0aW9ucyBwYXIgZGVmYXV0IGR1IHNlcnZpY2VcbiAgICAvLyBUT0RPOiBtb2RpZmllciBsYSByZXNzb3VyY2UgbG9ycyBkZSBsYSBtaXNlIGVuIHByb2R1Y3Rpb24gZHUgc2VydmljZVxuICAgIHRoaXMub3B0aW9ucy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2UgfHwgXCJiZHRvcG8taXNvXCI7XG4gICAgdGhpcy5vcHRpb25zLmV4Y2x1c2lvbnMgPSBvcHRpb25zLmV4Y2x1c2lvbnMgfHwgW107XG4gICAgdGhpcy5vcHRpb25zLnJldmVyc2UgPSBvcHRpb25zLnJldmVyc2UgfHwgZmFsc2U7XG4gICAgdGhpcy5vcHRpb25zLnNycyA9IG9wdGlvbnMuc3JzIHx8IFwiRVBTRzo0MzI2XCI7XG4gICAgdGhpcy5vcHRpb25zLmRpc3RhbmNlVW5pdCA9IG9wdGlvbnMuZGlzdGFuY2VVbml0IHx8IFwibVwiO1xuICAgIHRoaXMub3B0aW9ucy50aW1lVW5pdCA9IG9wdGlvbnMudGltZVVuaXQgfHwgXCJzZWNvbmRcIjtcblxuICAgIC8vIG9wdGlvbnMgZGVwcmVjaWVlc1xuICAgIGlmIChvcHRpb25zLnNtb290aGluZykge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwib3B0aW9ucy5zbW9vdGhpbmcgaXMgREVQUkVDQVRFRFwiKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLnNtb290aGluZyA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmhvbGVzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJvcHRpb25zLmhvbGVzIGlzIERFUFJFQ0FURURcIik7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy5ob2xlcyA9IGZhbHNlO1xuXG4gICAgLy8gR2VzdGlvbiBkdSBncmFwaGVcbiAgICBpZiAob3B0aW9ucy5ncmFwaCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ncmFwaCA9PT0gXCJWb2l0dXJlXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ncmFwaCA9IFwiY2FyXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZ3JhcGggPT09IFwiUGlldG9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ncmFwaCA9IFwicGVkZXN0cmlhblwiO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyYXBoID0gXCJjYXJcIjtcbiAgICB9XG5cbiAgICAvLyBHZXN0aW9ucyBkZXMgY29udHJhaW50ZXNcbiAgICB0aGlzLm9wdGlvbnMuY29uc3RyYWludHMgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5jb25zdHJhaW50cykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBvcHRpb25zLmNvbnN0cmFpbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2gob3B0aW9ucy5jb25zdHJhaW50c1trXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVFlQRVwiLCBcImNvbnN0cmFpbnRzXCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlc3Rpb24gZGUgbCdhbmNpZW4gcGFyYW3DqHRyZSBleGNsdXNpb25zXG4gICAgdmFyIGNvbnN0cmFpbnRUdW5uZWwgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludFBvbnQgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludEF1dG9yb3V0ZSA9IHt9O1xuICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVzaW9ucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJvcHRpb25zLmV4Y2x1c2lvbnMgaXMgREVQUkVDQVRFRCAhIVwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb3B0aW9ucy5leGNsdXNpb25zLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGNsdXNpb25zW2NdID0gb3B0aW9ucy5leGNsdXNpb25zW2NdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbmUgY3LDqWUgcGFzIHVuZSBlcnJldXIgcG91ciByw6l0cm8tY29tcGF0aWJpbGl0w6kgYXZlYyBsZXMgYW5jaWVubmVzIHZlcnNpb25zXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcInRvbGxcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5rZXkgPSBcIndheVR5cGVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5vcGVyYXRvciA9IFwiPVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLnZhbHVlID0gXCJhdXRvcm91dGVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludEF1dG9yb3V0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwidHVubmVsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC5jb25zdHJhaW50VHlwZSA9IFwiYmFubmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwub3BlcmF0b3IgPSBcIj1cIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC52YWx1ZSA9IFwidHVubmVsXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRUdW5uZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcImJyaWRnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFBvbnQua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250Lm9wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LnZhbHVlID0gXCJwb250XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRQb250KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbiBwYXNzZSBsJ29wdGlvbiBvdXRwdXRGb3JtYXQgZW4gbWludXNjdWxlcyBhZmluIGQnw6l2aXRlciBkZXMgZXhjZXB0aW9ucy5cbiAgICB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0ID0gKHR5cGVvZiBvcHRpb25zLm91dHB1dEZvcm1hdCA9PT0gXCJzdHJpbmdcIikgPyBvcHRpb25zLm91dHB1dEZvcm1hdC50b0xvd2VyQ2FzZSgpIDogXCJqc29uXCI7XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0Rm9ybWF0ICYmIG9wdGlvbnMub3V0cHV0Rm9ybWF0ICE9PSBcImpzb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTk9UX1NVUFBPUlRcIiwgXCJvdXRwdXRGb3JtYXRcIikpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0ID0gXCJqc29uXCI7XG5cbiAgICAvLyBnZXN0aW9uIGRlIGwndXJsIGR1IHNlcnZpY2UgcGFyIGRlZmF1dFxuICAgIC8vIHNpIGwndXJsIG4nZXN0IHBhcyByZW5zZWlnbsOpZSwgaWwgZmF1dCB1dGlsaXNlciBsZXMgdXJscyBwYXIgZGVmYXV0XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VydmVyVXJsKSB7XG4gICAgICAgIC8vIENvZGUgY29tbWVudMOpIDogUmVsZWFzZSBiZXRhIHNlcnZpY2VzIERJRkZVU0lPTiB1bmlxdWVtZW50IDogb24gdGFwZSBzdXIgbCdhbnZjaWVuIHNlcnZpY2UgZCdpc29jaHJvbmVcbiAgICAgICAgLyogdmFyIHVybEZvdW5kID0gRGVmYXVsdFVybFNlcnZpY2UuUHJvY2Vzc0lzb0N1cnZlLm5ld1VybCgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9sZElzb1NlcnZpY2UpIHtcbiAgICAgICAgICAgIHVybEZvdW5kID0gRGVmYXVsdFVybFNlcnZpY2UuUHJvY2Vzc0lzb0N1cnZlLnVybCgpO1xuICAgICAgICB9ICovXG4gICAgICAgIC8vIFJlbGVhc2UgYmV0YSBzZXJ2aWNlcyBESUZGVVNJT04gdW5pcXVlbWVudCA6IG9uIHRhcGUgc3VyIGwnYW52Y2llbiBzZXJ2aWNlIGQnaXNvY2hyb25lXG4gICAgICAgIHZhciB1cmxGb3VuZCA9IERlZmF1bHRVcmxTZXJ2aWNlLlByb2Nlc3NJc29DdXJ2ZS51cmwoKTtcbiAgICAgICAgaWYgKCF1cmxGb3VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXJsIGJ5IGRlZmF1bHQgbm90IGZvdW5kICFcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnNlcnZlclVybCA9IHVybEZvdW5kO1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlNlcnZldXIgVVJMIHBhciBkZWZhdXQgOiBcIiArIHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOlByb2Nlc3NJc29DdXJ2ZSNcbiAqL1xuUHJvY2Vzc0lzb0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5Qcm9jZXNzSXNvQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHJvY2Vzc0lzb0N1cnZlO1xuXG4vKipcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZSAob3ZlcndyaXRlKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblByb2Nlc3NJc29DdXJ2ZS5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9Jc29DdXJ2ZSA9IG5ldyBQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0KHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGlmICghb0lzb0N1cnZlLnByb2Nlc3NSZXF1ZXN0U3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFUVVFU1RfQlVJTERcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gb0lzb0N1cnZlLnJlcXVlc3RTdHJpbmc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoZS5tZXNzYWdlKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWNjZXNzLmNhbGwodGhpcywgdGhpcy5yZXF1ZXN0KTtcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIEFuYWx5c2UgZGUgbGEgcmVwb25zZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3MgLSBjYWxsYmFjayBkZSBzdWNjw6hzIGRlIGwnYW5hbHlzZSBkZSBsYSByw6lwb25zZVxuICovXG5Qcm9jZXNzSXNvQ3VydmUucHJvdG90eXBlLmFuYWx5emVSZXNwb25zZSA9IGZ1bmN0aW9uIChvbkVycm9yLCBvblN1Y2Nlc3MpIHtcbiAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlIDogdGhpcy5yZXNwb25zZSxcbiAgICAgICAgICAgIG91dHB1dEZvcm1hdCA6IHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQsXG4gICAgICAgICAgICByYXdSZXNwb25zZSA6IHRoaXMub3B0aW9ucy5yYXdSZXNwb25zZSxcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IG9uU3VjY2VzcyxcbiAgICAgICAgICAgIG9uRXJyb3IgOiBvbkVycm9yLFxuICAgICAgICAgICAgc2NvcGUgOiB0aGlzXG4gICAgICAgIH07XG5cbiAgICAgICAgUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2VGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9uRXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzSXNvQ3VydmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/ProcessIsoCurve.js\n"); - -/***/ }), - -/***/ "./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js": -/*!************************************************************************!*\ - !*** ./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js ***! - \************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/ProcessIsoCurveParam */ \"./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js\");\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance.\n * Les requêtes peuvent être en mode GET ou POST,\n * et le format de sorti est en JSON.\n *\n * @constructor\n * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest\n * @param {Object} options - options\n *\n * @example\n * var options = {\n * httpMethod : 'GET', // GET|POST\n * // spécifique au service\n * position : {\n * x : 2.3242664298058053,\n * y : 48.86118017324745\n * },\n * graph : \"car\",\n * method : 'time',\n * time : 1000, //distance : 200\n * reverse : false,\n * srs : 'EPSG:4326'\n * };\n *\n * try {\n *\n * var oIsoCurve = new ProcessIsoCurveRequest (options);\n * if (!oIsoCurve.processRequestString ()) {\n * // error\n * }\n *\n * var request = oIsoCurve.requestString;\n *\n * } catch (e) {\n * // error\n * }\n * @private\n */\nfunction ProcessIsoCurveRequest(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"ProcessIsoCurveRequest\");\n this.logger.trace(\"[Constructeur ProcessIsoCurveRequest ()]\");\n if (!(this instanceof ProcessIsoCurveRequest)) {\n throw new TypeError(\"ProcessIsoCurveRequest constructor cannot be called as a function.\");\n }\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n /**\n * Liste des options\n */\n this.settings = options;\n\n /**\n * Mode HTPP.\n * Par defaut, \"GET\".\n * @type {String}\n */\n this.mode = this.settings.httpMethod || \"GET\";\n}\nProcessIsoCurveRequest.prototype = {\n /**\n * @lends module:ProcessIsoCurveRequest#\n */\n\n /**\n * Requête\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: ProcessIsoCurveRequest,\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out :\n * // (http://wxs.ign.fr/KEY/isochrone?)\n * // resource=&\n * // point=&\n * // costValue=&\n * // costType=&\n * // profile=&\n * // constraints=&\n * // direction=&\n * // crs=\n *\n * // POST out :\n * {\n * resource: \"bduni-idf-pgr\",\n * point: \"2.337306,48.849319\",\n * costValue: 100,\n * costType: \"time\",\n * profile: \"car\",\n * constraints: [{\n * constraintType: \"banned\",\n * key: \"ways_type\",\n * operator: \"=\",\n * value: \"autoroute\"\n * }]\n * }\n *\n * @returns {String} request\n */\n processRequestString: function processRequestString() {\n var request = \"\";\n var i = 0;\n switch (this.mode) {\n case \"GET\":\n this.logger.trace(\"Process GET Request\");\n\n // Mapping des options avec le service de l'API REST\n var oParams = new _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.settings);\n var params = oParams.getParams();\n for (i = 0; i < params.length; i++) {\n var o = params[i];\n if (request) {\n request += \"&\";\n }\n request += o.k + \"=\" + o.v;\n }\n break;\n case \"POST\":\n this.logger.trace(\"Process POST Request\");\n // creation du JSON\n var postRequest = {};\n postRequest.resource = this.settings.resource;\n postRequest.point = this.settings.position.x + \",\" + this.settings.position.y;\n if (this.settings.method === \"distance\") {\n postRequest.costType = \"distance\";\n postRequest.costValue = this.settings.distance;\n } else {\n postRequest.costType = \"time\";\n postRequest.costValue = this.settings.time;\n }\n postRequest.profile = this.settings.graph;\n if (this.settings.reverse) {\n postRequest.direction = \"arrival\";\n } else {\n postRequest.direction = \"departure\";\n }\n postRequest.constraints = this.settings.constraints;\n postRequest.distanceUnit = this.settings.distanceUnit;\n postRequest.timeUnit = this.settings.timeUnit;\n postRequest.crs = this.settings.srs;\n\n // conversion en chaîne de caractères\n request = JSON.stringify(postRequest);\n break;\n default:\n this.logger.error(\"No other HTTP method supported by the service !\");\n }\n this.logger.trace(request);\n this.requestString = request;\n return this.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVxdWVzdC9Qcm9jZXNzSXNvQ3VydmVSZXF1ZXN0LmpzPzcwMzQiXSwibmFtZXMiOlsiUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCIsIm9wdGlvbnMiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsIlR5cGVFcnJvciIsIkVycm9yIiwiXyIsImdldE1lc3NhZ2UiLCJzZXR0aW5ncyIsIm1vZGUiLCJodHRwTWV0aG9kIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJyZXF1ZXN0IiwiaSIsIm9QYXJhbXMiLCJQcm9jZXNzSXNvQ3VydmVQYXJhbSIsInBhcmFtcyIsImdldFBhcmFtcyIsImxlbmd0aCIsIm8iLCJrIiwidiIsInBvc3RSZXF1ZXN0IiwicmVzb3VyY2UiLCJwb2ludCIsInBvc2l0aW9uIiwieCIsInkiLCJtZXRob2QiLCJjb3N0VHlwZSIsImNvc3RWYWx1ZSIsImRpc3RhbmNlIiwidGltZSIsInByb2ZpbGUiLCJncmFwaCIsInJldmVyc2UiLCJkaXJlY3Rpb24iLCJjb25zdHJhaW50cyIsImRpc3RhbmNlVW5pdCIsInRpbWVVbml0IiwiY3JzIiwic3JzIiwiSlNPTiIsInN0cmluZ2lmeSIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFvRDtBQUNIO0FBQ2U7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLHNCQUFzQkEs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LFNBQVMsR0FBRyxJQUFJLENBQUN6QixRQUFRLENBQUMyQixJQUFJO1FBQzlDO1FBRUFWLFdBQVcsQ0FBQ1csT0FBTyxHQUFHLElBQUksQ0FBQzVCLFFBQVEsQ0FBQzZCLEtBQUs7UUFFekMsSUFBSSxJQUFJLENBQUM3QixRQUFRLENBQUM4QixPQUFPLEVBQUU7VUFDdkJiLFdBQVcsQ0FBQ2MsU0FBUyxHQUFHLFNBQVM7UUFDckMsQ0FBQyxNQUFNO1VBQ0hkLFdBQVcsQ0FBQ2MsU0FBUyxHQUFHLFdBQVc7UUFDdkM7UUFFQWQsV0FBVyxDQUFDZSxXQUFXLEdBQUcsSUFBSSxDQUFDaEMsUUFBUSxDQUFDZ0MsV0FBVztRQUVuRGYsV0FBVyxDQUFDZ0IsWUFBWSxHQUFHLElBQUksQ0FBQ2pDLFFBQVEsQ0FBQ2lDLFlBQVk7UUFFckRoQixXQUFXLENBQUNpQixRQUFRLEdBQUcsSUFBSSxDQUFDbEMsUUFBUSxDQUFDa0MsUUFBUTtRQUU3Q2pCLFdBQVcsQ0FBQ2tCLEdBQUcsR0FBRyxJQUFJLENBQUNuQyxRQUFRLENBQUNvQyxHQUFHOztRQUVuQztRQUNBN0IsT0FBTyxHQUFHOEIsSUFBSSxDQUFDQyxTQUFTLENBQUNyQixXQUFXLENBQUM7UUFDckM7TUFFSjtRQUNJLElBQUksQ0FBQ3pCLE1BQU0sQ0FBQytDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQztJQUM1RTtJQUVBLElBQUksQ0FBQy9DLE1BQU0sQ0FBQ0csS0FBSyxDQUFDWSxPQUFPLENBQUM7SUFDMUIsSUFBSSxDQUFDSCxhQUFhLEdBQUdHLE9BQU87SUFFNUIsT0FBTyxJQUFJLENBQUNILGFBQWE7RUFDN0I7QUFDSixDQUFDO0FBRWNkLHFGQUFzQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVxdWVzdC9Qcm9jZXNzSXNvQ3VydmVSZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBfIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IFByb2Nlc3NJc29DdXJ2ZVBhcmFtIGZyb20gXCIuL21vZGVsL1Byb2Nlc3NJc29DdXJ2ZVBhcmFtXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBzdXIgbGUgc2VydmljZSBkZSBjYWxjdWwgZCdpc29zY2hyb25lL2lzb2Rpc3RhbmNlLlxuICogIExlcyByZXF1w6p0ZXMgcGV1dmVudCDDqnRyZSBlbiBtb2RlIEdFVCBvdSBQT1NULFxuICogIGV0IGxlIGZvcm1hdCBkZSBzb3J0aSBlc3QgZW4gSlNPTi5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Qcm9jZXNzSXNvQ3VydmUuUmVxdWVzdC5Qcm9jZXNzSXNvQ3VydmVSZXF1ZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIGh0dHBNZXRob2QgOiAnR0VUJywgLy8gR0VUfFBPU1RcbiAqICAgICAgLy8gc3DDqWNpZmlxdWUgYXUgc2VydmljZVxuICogICAgICBwb3NpdGlvbiA6IHtcbiAqICAgICAgICAgIHggOiAyLjMyNDI2NjQyOTgwNTgwNTMsXG4gKiAgICAgICAgICB5IDogNDguODYxMTgwMTczMjQ3NDVcbiAqICAgICAgfSxcbiAqICAgICAgZ3JhcGggOiBcImNhclwiLFxuICogICAgICBtZXRob2QgOiAndGltZScsXG4gKiAgICAgIHRpbWUgOiAxMDAwLCAvL2Rpc3RhbmNlIDogMjAwXG4gKiAgICAgIHJldmVyc2UgOiBmYWxzZSxcbiAqICAgICAgc3JzIDogJ0VQU0c6NDMyNidcbiAqICB9O1xuICpcbiAqIHRyeSB7XG4gKlxuICogICAgICB2YXIgb0lzb0N1cnZlID0gbmV3IFByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QgKG9wdGlvbnMpO1xuICogICAgICBpZiAoIW9Jc29DdXJ2ZS5wcm9jZXNzUmVxdWVzdFN0cmluZyAoKSkge1xuICogICAgICAgICAgLy8gZXJyb3JcbiAqICAgICAgfVxuICpcbiAqICAgICAgdmFyIHJlcXVlc3QgPSBvSXNvQ3VydmUucmVxdWVzdFN0cmluZztcbiAqXG4gKiB9IGNhdGNoIChlKSB7XG4gKiAgICAgIC8vIGVycm9yXG4gKiB9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0IChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdFwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCAoKV1cIik7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICAvLyBleGlzdGFuY2UgZGVzIG9wdGlvbnNcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwib3B0aW9uc1wiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGUgZGVzIG9wdGlvbnNcbiAgICAgKi9cbiAgICB0aGlzLnNldHRpbmdzID0gb3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIE1vZGUgSFRQUC5cbiAgICAgKiBQYXIgZGVmYXV0LCBcIkdFVFwiLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5odHRwTWV0aG9kIHx8IFwiR0VUXCI7XG59XG5cblByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0I1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUmVxdcOqdGVcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHJlcXVlc3RTdHJpbmcgOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IFByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rpb24gZGUgbGEgcmVxdcOqdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEdFVCAgb3V0IDpcbiAgICAgKiAgIC8vICAoaHR0cDovL3d4cy5pZ24uZnIvS0VZL2lzb2Nocm9uZT8pXG4gICAgICogICAvLyAgcmVzb3VyY2U9JlxuICAgICAqICAgLy8gIHBvaW50PSZcbiAgICAgKiAgIC8vICBjb3N0VmFsdWU9JlxuICAgICAqICAgLy8gIGNvc3RUeXBlPSZcbiAgICAgKiAgIC8vICBwcm9maWxlPSZcbiAgICAgKiAgIC8vICBjb25zdHJhaW50cz0mXG4gICAgICogICAvLyAgZGlyZWN0aW9uPSZcbiAgICAgKiAgIC8vICBjcnM9XG4gICAgICpcbiAgICAgKiAvLyBQT1NUIG91dCA6XG4gICAgICoge1xuICAgICAqICByZXNvdXJjZTogXCJiZHVuaS1pZGYtcGdyXCIsXG4gICAgICogIHBvaW50OiBcIjIuMzM3MzA2LDQ4Ljg0OTMxOVwiLFxuICAgICAqICBjb3N0VmFsdWU6IDEwMCxcbiAgICAgKiAgY29zdFR5cGU6IFwidGltZVwiLFxuICAgICAqICBwcm9maWxlOiBcImNhclwiLFxuICAgICAqICBjb25zdHJhaW50czogW3tcbiAgICAgKiAgICAgIGNvbnN0cmFpbnRUeXBlOiBcImJhbm5lZFwiLFxuICAgICAqICAgICAga2V5OiBcIndheXNfdHlwZVwiLFxuICAgICAqICAgICAgb3BlcmF0b3I6IFwiPVwiLFxuICAgICAqICAgICAgdmFsdWU6IFwiYXV0b3JvdXRlXCJcbiAgICAgKiAgfV1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RTdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXF1ZXN0ID0gXCJcIjtcbiAgICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwiR0VUXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJQcm9jZXNzIEdFVCBSZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgLy8gTWFwcGluZyBkZXMgb3B0aW9ucyBhdmVjIGxlIHNlcnZpY2UgZGUgbCdBUEkgUkVTVFxuICAgICAgICAgICAgICAgIHZhciBvUGFyYW1zID0gbmV3IFByb2Nlc3NJc29DdXJ2ZVBhcmFtKHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBvUGFyYW1zLmdldFBhcmFtcygpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHBhcmFtc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgKz0gXCImXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCArPSBvLmsgKyBcIj1cIiArIG8udjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIlBPU1RcIjpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlByb2Nlc3MgUE9TVCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgIC8vIGNyZWF0aW9uIGR1IEpTT05cbiAgICAgICAgICAgICAgICB2YXIgcG9zdFJlcXVlc3QgPSB7fTtcblxuICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LnJlc291cmNlID0gdGhpcy5zZXR0aW5ncy5yZXNvdXJjZTtcblxuICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LnBvaW50ID0gdGhpcy5zZXR0aW5ncy5wb3NpdGlvbi54ICsgXCIsXCIgKyB0aGlzLnNldHRpbmdzLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5tZXRob2QgPT09IFwiZGlzdGFuY2VcIikge1xuICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jb3N0VHlwZSA9IFwiZGlzdGFuY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QuY29zdFZhbHVlID0gdGhpcy5zZXR0aW5ncy5kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jb3N0VHlwZSA9IFwidGltZVwiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jb3N0VmFsdWUgPSB0aGlzLnNldHRpbmdzLnRpbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QucHJvZmlsZSA9IHRoaXMuc2V0dGluZ3MuZ3JhcGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5yZXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LmRpcmVjdGlvbiA9IFwiYXJyaXZhbFwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LmRpcmVjdGlvbiA9IFwiZGVwYXJ0dXJlXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QuY29uc3RyYWludHMgPSB0aGlzLnNldHRpbmdzLmNvbnN0cmFpbnRzO1xuXG4gICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QuZGlzdGFuY2VVbml0ID0gdGhpcy5zZXR0aW5ncy5kaXN0YW5jZVVuaXQ7XG5cbiAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC50aW1lVW5pdCA9IHRoaXMuc2V0dGluZ3MudGltZVVuaXQ7XG5cbiAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jcnMgPSB0aGlzLnNldHRpbmdzLnNycztcblxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gZW4gY2hhw65uZSBkZSBjYXJhY3TDqHJlc1xuICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeShwb3N0UmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJObyBvdGhlciBIVFRQIG1ldGhvZCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZpY2UgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLnJlcXVlc3RTdHJpbmcgPSByZXF1ZXN0O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RTdHJpbmc7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js\n"); - -/***/ }), - -/***/ "./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js": -/*!****************************************************************************!*\ - !*** ./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js ***! - \****************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n *\n * Classe de gestion des param. des requêtes du service de calcul des iso.\n * Permet le mapping avec les options du service.\n *\n * @constructor\n * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam\n * @param {Object} options - options\n * @private\n *\n */\nfunction ProcessIsoCurveParam(options) {\n if (!(this instanceof ProcessIsoCurveParam)) {\n throw new TypeError(\"ProcessIsoCurveParam constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur ProcessIsoCurveParam ()]\");\n\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n // mapping des options avec l'API REST\n\n /** Identifiant de l’isochrone */\n this.id = this.options.id;\n\n /** Resource */\n this.resource = this.options.resource;\n\n /** Coordonnées de départ (ou arrivée si le reverse est à true). */\n this.point = this.options.position;\n\n /** projection (code EPSG comme epsg:4326 ou wgs84) */\n this.crs = this.options.srs;\n\n /**\n * Profil de véhicule à utiliser pour le calcul.\n * Voiture ou Pieton\n */\n this.profile = this.options.graph;\n\n /** Liste des règles de restrictions à utiliser */\n this.constraints = this.options.constraints;\n this.reverse = this.options.reverse;\n this.timeUnit = this.options.timeUnit;\n this.distanceUnit = this.options.distanceUnit;\n\n /**\n * \"time\" pour isochrone ou \"distance\" for isodistance.\n * Par defaut, time...\n */\n if (this.options.method === \"distance\") {\n this.costType = \"distance\";\n this.costValue = this.options.distance;\n } else {\n this.costType = \"time\";\n this.costValue = this.options.time;\n }\n}\n\n/**\n * CLASSNAME\n */\nProcessIsoCurveParam.CLASSNAME = \"ProcessIsoCurveParam\";\nProcessIsoCurveParam.prototype = {\n /**\n * @lends module:ProcessIsoCurveParam#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: ProcessIsoCurveParam,\n /**\n * Retourne le point\n * @returns {String} x,y\n */\n getLocation: function getLocation() {\n return this.point.x + \",\" + this.point.y;\n },\n /**\n * Retourne l'unité de la distance\n * @returns {String}\n */\n getDistanceUnit: function getDistanceUnit() {\n if (this.distanceUnit === \"m\") {\n return \"meter\";\n }\n if (this.distanceUnit === \"km\") {\n return \"kilometer\";\n }\n return \"\";\n },\n /**\n * Retourne la liste des contraintes\n * @returns {String}\n */\n getConstraints: function getConstraints() {\n var constraintArray = [];\n if (this.constraints.length !== 0) {\n for (var k = 0; k < this.constraints.length; k++) {\n constraintArray.push(JSON.stringify(this.constraints[k]));\n }\n }\n return constraintArray.join(\"|\");\n },\n /**\n * Retourne la direction\n * @returns {String}\n */\n getDirection: function getDirection() {\n if (this.reverse) {\n return \"arrival\";\n } else {\n return \"departure\";\n }\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Object[]} KVP\n */\nProcessIsoCurveParam.prototype.getParams = function () {\n var map = [];\n map.push({\n k: \"resource\",\n v: this.resource\n });\n map.push({\n k: \"point\",\n v: this.getLocation()\n });\n map.push({\n k: \"direction\",\n v: this.getDirection()\n });\n map.push({\n k: \"costType\",\n v: this.costType\n });\n map.push({\n k: \"costValue\",\n v: this.costValue\n });\n map.push({\n k: \"profile\",\n v: this.profile\n });\n map.push({\n k: \"timeUnit\",\n v: this.timeUnit\n });\n map.push({\n k: \"distanceUnit\",\n v: this.getDistanceUnit()\n });\n if (this.crs) {\n map.push({\n k: \"crs\",\n v: this.crs\n });\n }\n if (this.constraints) {\n map.push({\n k: \"constraints\",\n v: this.getConstraints()\n });\n }\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveParam);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVxdWVzdC9tb2RlbC9Qcm9jZXNzSXNvQ3VydmVQYXJhbS5qcz85NzI1Il0sIm5hbWVzIjpbIlByb2Nlc3NJc29DdXJ2ZVBhcmFtIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiaWQiLCJyZXNvdXJjZSIsInBvaW50IiwicG9zaXRpb24iLCJjcnMiLCJzcnMiLCJwcm9maWxlIiwiZ3JhcGgiLCJjb25zdHJhaW50cyIsInJldmVyc2UiLCJ0aW1lVW5pdCIsImRpc3RhbmNlVW5pdCIsIm1ldGhvZCIsImNvc3RUeXBlIiwiY29zdFZhbHVlIiwiZGlzdGFuY2UiLCJ0aW1lIiwiQ0xBU1NOQU1FIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRMb2NhdGlvbiIsIngiLCJ5IiwiZ2V0RGlzdGFuY2VVbml0IiwiZ2V0Q29uc3RyYWludHMiLCJjb25zdHJhaW50QXJyYXkiLCJsZW5ndGgiLCJrIiwicHVzaCIsIkpTT04iLCJzdHJpbmdpZnkiLCJqb2luIiwiZ2V0RGlyZWN0aW9uIiwiZ2V0UGFyYW1zIiwibWFwIiwidiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0Esb0JBQW9CQSxDQUFFQyxPQUFPLEVBQUU7RUFDcEMsSUFBSSxFQUFFLElBQUksWUFBWUQsb0JBQW9CLENBQUMsRUFBRTtJQUN6QyxNQUFNLElBQUlFLFNBQVMsQ0FBQyxrRUFBa0UsQ0FBQztFQUMzRjtFQUVBLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLHdDQUF3QyxDQUFDOztFQUUzRDtBQUNKO0FB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QUM7SUFDTEQsQ0FBQyxFQUFHLGNBQWM7SUFDbEJRLENBQUMsRUFBRyxJQUFJLENBQUNaLGVBQWUsQ0FBQztFQUM3QixDQUFDLENBQUM7RUFFRixJQUFJLElBQUksQ0FBQ25CLEdBQUcsRUFBRTtJQUNWOEIsR0FBRyxDQUFDTixJQUFJLENBQUM7TUFDTEQsQ0FBQyxFQUFHLEtBQUs7TUFDVFEsQ0FBQyxFQUFHLElBQUksQ0FBQy9CO0lBQ2IsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJLElBQUksQ0FBQ0ksV0FBVyxFQUFFO0lBQ2xCMEIsR0FBRyxDQUFDTixJQUFJLENBQUM7TUFDTEQsQ0FBQyxFQUFHLGFBQWE7TUFDakJRLENBQUMsRUFBRyxJQUFJLENBQUNYLGNBQWMsQ0FBQztJQUM1QixDQUFDLENBQUM7RUFDTjtFQUVBLE9BQU9VLEdBQUc7QUFDZCxDQUFDO0FBRWN6QyxtRkFBb0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvUHJvY2Vzc0lzb0N1cnZlL1JlcXVlc3QvbW9kZWwvUHJvY2Vzc0lzb0N1cnZlUGFyYW0uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgcGFyYW0uIGRlcyByZXF1w6p0ZXMgZHUgc2VydmljZSBkZSBjYWxjdWwgZGVzIGlzby5cbiAqIFBlcm1ldCBsZSBtYXBwaW5nIGF2ZWMgbGVzIG9wdGlvbnMgZHUgc2VydmljZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Qcm9jZXNzSXNvQ3VydmUuUmVxdWVzdC5Qcm9jZXNzSXNvQ3VydmVQYXJhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuZnVuY3Rpb24gUHJvY2Vzc0lzb0N1cnZlUGFyYW0gKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvY2Vzc0lzb0N1cnZlUGFyYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9jZXNzSXNvQ3VydmVQYXJhbSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBQcm9jZXNzSXNvQ3VydmVQYXJhbSAoKV1cIik7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25zIGVuIHBhcmFtw6p0cmVzIGR1IGNvbnN0cnVjdGV1ci5cbiAgICAgKi9cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gbWFwcGluZyBkZXMgb3B0aW9ucyBhdmVjIGwnQVBJIFJFU1RcblxuICAgIC8qKiBJZGVudGlmaWFudCBkZSBs4oCZaXNvY2hyb25lICovXG4gICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZDtcblxuICAgIC8qKiBSZXNvdXJjZSAqL1xuICAgIHRoaXMucmVzb3VyY2UgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2U7XG5cbiAgICAvKiogQ29vcmRvbm7DqWVzIGRlIGTDqXBhcnQgKG91IGFycml2w6llIHNpIGxlIHJldmVyc2UgZXN0IMOgIHRydWUpLiAqL1xuICAgIHRoaXMucG9pbnQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG5cbiAgICAvKiogcHJvamVjdGlvbiAoY29kZSBFUFNHIGNvbW1lIGVwc2c6NDMyNiBvdSB3Z3M4NCkgKi9cbiAgICB0aGlzLmNycyA9IHRoaXMub3B0aW9ucy5zcnM7XG5cbiAgICAvKipcbiAgICAgKiBQcm9maWwgZGUgdsOpaGljdWxlIMOgIHV0aWxpc2VyIHBvdXIgbGUgY2FsY3VsLlxuICAgICAqIFZvaXR1cmUgb3UgUGlldG9uXG4gICAgICovXG4gICAgdGhpcy5wcm9maWxlID0gdGhpcy5vcHRpb25zLmdyYXBoO1xuXG4gICAgLyoqIExpc3RlIGRlcyByw6hnbGVzIGRlIHJlc3RyaWN0aW9ucyDDoCB1dGlsaXNlciAqL1xuICAgIHRoaXMuY29uc3RyYWludHMgPSB0aGlzLm9wdGlvbnMuY29uc3RyYWludHM7XG5cbiAgICB0aGlzLnJldmVyc2UgPSB0aGlzLm9wdGlvbnMucmV2ZXJzZTtcblxuICAgIHRoaXMudGltZVVuaXQgPSB0aGlzLm9wdGlvbnMudGltZVVuaXQ7XG5cbiAgICB0aGlzLmRpc3RhbmNlVW5pdCA9IHRoaXMub3B0aW9ucy5kaXN0YW5jZVVuaXQ7XG5cbiAgICAvKipcbiAgICAgKiBcInRpbWVcIiBwb3VyIGlzb2Nocm9uZSBvdSBcImRpc3RhbmNlXCIgZm9yIGlzb2Rpc3RhbmNlLlxuICAgICAqIFBhciBkZWZhdXQsIHRpbWUuLi5cbiAgICAgKi9cbiAgICBpZiAodGhpcy5vcHRpb25zLm1ldGhvZCA9PT0gXCJkaXN0YW5jZVwiKSB7XG4gICAgICAgIHRoaXMuY29zdFR5cGUgPSBcImRpc3RhbmNlXCI7XG4gICAgICAgIHRoaXMuY29zdFZhbHVlID0gdGhpcy5vcHRpb25zLmRpc3RhbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29zdFR5cGUgPSBcInRpbWVcIjtcbiAgICAgICAgdGhpcy5jb3N0VmFsdWUgPSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ0xBU1NOQU1FXG4gKi9cblByb2Nlc3NJc29DdXJ2ZVBhcmFtLkNMQVNTTkFNRSA9IFwiUHJvY2Vzc0lzb0N1cnZlUGFyYW1cIjtcblxuUHJvY2Vzc0lzb0N1cnZlUGFyYW0ucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpQcm9jZXNzSXNvQ3VydmVQYXJhbSNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBQcm9jZXNzSXNvQ3VydmVQYXJhbSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxlIHBvaW50XG4gICAgICogQHJldHVybnMge1N0cmluZ30geCx5XG4gICAgICovXG4gICAgZ2V0TG9jYXRpb24gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50LnggKyBcIixcIiArIHRoaXMucG9pbnQueTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbCd1bml0w6kgZGUgbGEgZGlzdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERpc3RhbmNlVW5pdCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzdGFuY2VVbml0ID09PSBcIm1cIikge1xuICAgICAgICAgICAgcmV0dXJuIFwibWV0ZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXN0YW5jZVVuaXQgPT09IFwia21cIikge1xuICAgICAgICAgICAgcmV0dXJuIFwia2lsb21ldGVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxhIGxpc3RlIGRlcyBjb250cmFpbnRlc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Q29uc3RyYWludHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25zdHJhaW50QXJyYXkgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRBcnJheS5wdXNoKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uc3RyYWludHNba10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uc3RyYWludEFycmF5LmpvaW4oXCJ8XCIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSBsYSBkaXJlY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERpcmVjdGlvbiA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV2ZXJzZSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYXJyaXZhbFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiZGVwYXJ0dXJlXCI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqIFRhYmxlYXUgZGUgY2xlZnMvdmFsZXVycyBwb3VyIHBhcmFtLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3RbXX0gS1ZQXG4gKi9cblByb2Nlc3NJc29DdXJ2ZVBhcmFtLnByb3RvdHlwZS5nZXRQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IFtdO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJyZXNvdXJjZVwiLFxuICAgICAgICB2IDogdGhpcy5yZXNvdXJjZVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJwb2ludFwiLFxuICAgICAgICB2IDogdGhpcy5nZXRMb2NhdGlvbigpXG4gICAgfSk7XG5cbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImRpcmVjdGlvblwiLFxuICAgICAgICB2IDogdGhpcy5nZXREaXJlY3Rpb24oKVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjb3N0VHlwZVwiLFxuICAgICAgICB2IDogdGhpcy5jb3N0VHlwZVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjb3N0VmFsdWVcIixcbiAgICAgICAgdiA6IHRoaXMuY29zdFZhbHVlXG4gICAgfSk7XG5cbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcInByb2ZpbGVcIixcbiAgICAgICAgdiA6IHRoaXMucHJvZmlsZVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJ0aW1lVW5pdFwiLFxuICAgICAgICB2IDogdGhpcy50aW1lVW5pdFxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJkaXN0YW5jZVVuaXRcIixcbiAgICAgICAgdiA6IHRoaXMuZ2V0RGlzdGFuY2VVbml0KClcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNycykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmNyc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJjb25zdHJhaW50c1wiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0Q29uc3RyYWludHMoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc0lzb0N1cnZlUGFyYW07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js\n"); - -/***/ }), - -/***/ "./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js": -/*!*********************************************************************************!*\ - !*** ./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js ***! - \*********************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/ProcessIsoCurveResponse */ \"./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js\");\n\n\n\n\n\n/**\n * Factory pour générer une reponse JSON à partir d'un JSON\n * (Factory)\n *\n * @module ProcessIsoCurveResponseFactory\n * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory\n * @private\n */\nvar ProcessIsoCurveResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant ProcessIsoCurve\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"ProcessIsoCurveResponseFactory\");\n logger.trace([\"ProcessIsoCurveResponseFactory::build()\"]);\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n logger.trace(\"analyze response : json\");\n var JSONResponse;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // analyse de la reponse\n // création de l'objet de réponse\n data = new _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n\n // remplissage de l'objet créé avec les attribtuts de la réponse du service\n if (JSONResponse) {\n if (JSONResponse.costType === \"distance\") {\n data.time = \"\";\n data.distance = JSONResponse.costValue;\n } else {\n data.time = JSONResponse.costValue;\n data.distance = \"\";\n }\n data.message = \"\";\n data.id = \"\";\n data.srs = JSONResponse.crs;\n data.geometry = JSONResponse.geometry;\n var coords = JSONResponse.point.split(\",\");\n if (data.location) {\n data.location.x = coords[0];\n data.location.y = coords[1];\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", options.response)));\n return;\n }\n\n // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !!\n // ex. Key does not exist or has expired\n // mais le statut est 403, l'erreur est donc remontée plus tôt.\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n }\n }\n } else {\n // si la réponse est vide, on appelle le callback d'erreur\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n\n // si tout s'est bien passé, on appelle le callback de succès\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVzcG9uc2UvUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2VGYWN0b3J5LmpzP2RkNTAiXSwibmFtZXMiOlsiUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIkpTT05SZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsIlByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlIiwiY29zdFR5cGUiLCJ0aW1lIiwiZGlzdGFuY2UiLCJjb3N0VmFsdWUiLCJtZXNzYWdlIiwiaWQiLCJzcnMiLCJjcnMiLCJnZW9tZXRyeSIsImNvb3JkcyIsInBvaW50Iiwic3BsaXQiLCJsb2NhdGlvbiIsIngiLCJ5Iiwib25FcnJvciIsImNhbGwiLCJzY29wZSIsIkVycm9yU2VydmljZSIsIk1SZXMiLCJnZXRNZXNzYWdlIiwiZXhjZXB0aW9uUmVwb3J0IiwidHlwZSIsIlRZUEVfU1JWRVJSIiwic3RhdHVzIiwib25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9EO0FBQ0E7QUFDUTtBQUNVOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsOEJBQThCLEdBQUc7RUFFakM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLEtBQUssRUFBRyxTQUFBQSxNQUFVQyxPQUFPLEVBQUU7SUFDdkI7SUFDQSxJQUFJQyxNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUMvREYsTUFBTSxDQUFDRyxLQUFLLENBQUMsQ0FBQyx5Q0FB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QztFQUMvQztBQUNKLENBQUM7QUFFY1AsNkZBQThCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1Byb2Nlc3NJc29DdXJ2ZS9SZXNwb25zZS9Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBNUmVzIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IEVycm9yU2VydmljZSBmcm9tIFwiLi4vLi4vLi4vRXhjZXB0aW9ucy9FcnJvclNlcnZpY2VcIjtcbmltcG9ydCBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZSBmcm9tIFwiLi9tb2RlbC9Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZVwiO1xuXG4vKipcbiAqIEZhY3RvcnkgcG91ciBnw6luw6lyZXIgdW5lIHJlcG9uc2UgSlNPTiDDoCBwYXJ0aXIgZCd1biBKU09OXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlRmFjdG9yeVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlByb2Nlc3NJc29DdXJ2ZS5SZXNwb25zZS5Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBQcm9jZXNzSXNvQ3VydmVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6XG4gICAgICogICAgICByYXdSZXNwb25zZSA6XG4gICAgICogICAgICBzY29wZSA6XG4gICAgICogICAgICBvblN1Y2Nlc3MgOlxuICAgICAqICAgICAgb25FcnJvciA6XG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDogcmF3XCIpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDoganNvblwiKTtcblxuICAgICAgICAgICAgICAgIHZhciBKU09OUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlc3BvbnNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIEpTT05SZXNwb25zZSA9IEpTT04ucGFyc2Uob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgSlNPTlJlc3BvbnNlID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbmFseXNlIGRlIGxhIHJlcG9uc2VcbiAgICAgICAgICAgICAgICAvLyBjcsOpYXRpb24gZGUgbCdvYmpldCBkZSByw6lwb25zZVxuICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UoKTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbXBsaXNzYWdlIGRlIGwnb2JqZXQgY3LDqcOpIGF2ZWMgbGVzIGF0dHJpYnR1dHMgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChKU09OUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05SZXNwb25zZS5jb3N0VHlwZSA9PT0gXCJkaXN0YW5jZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRpbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kaXN0YW5jZSA9IEpTT05SZXNwb25zZS5jb3N0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRpbWUgPSBKU09OUmVzcG9uc2UuY29zdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kaXN0YW5jZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmlkID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zcnMgPSBKU09OUmVzcG9uc2UuY3JzO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmdlb21ldHJ5ID0gSlNPTlJlc3BvbnNlLmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29vcmRzID0gSlNPTlJlc3BvbnNlLnBvaW50LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubG9jYXRpb24ueCA9IGNvb3Jkc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubG9jYXRpb24ueSA9IGNvb3Jkc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9BTkFMWVNFXCIsIG9wdGlvbnMucmVzcG9uc2UpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpbmZvIDogZW4gY2FzIGRlIHByb2Jsw6htZXMgZGUgZHJvaXRzIChjbMOpIGludmFsaWRlIG91IGF1dHJlKSwgbGEgcsOpcG9uc2UgZXN0IGF1IGZvcm1hdCBYTUwgISFcbiAgICAgICAgICAgICAgICAvLyBleC4gPEV4Y2VwdGlvblJlcG9ydD48RXhjZXB0aW9uIGV4Y2VwdGlvbkNvZGU9XCJNaXNzaW5nUGFyYW1ldGVyXCI+S2V5IGRvZXMgbm90IGV4aXN0IG9yIGhhcyBleHBpcmVkPC9FeGNlcHRpb24+PC9FeGNlcHRpb25SZXBvcnQ+XG4gICAgICAgICAgICAgICAgLy8gbWFpcyBsZSBzdGF0dXQgZXN0IDQwMywgbCdlcnJldXIgZXN0IGRvbmMgcmVtb250w6llIHBsdXMgdMO0dC5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5leGNlcHRpb25SZXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05cIiwgZGF0YS5leGNlcHRpb25SZXBvcnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IDIwMFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzaSBsYSByw6lwb25zZSBlc3QgdmlkZSwgb24gYXBwZWxsZSBsZSBjYWxsYmFjayBkJ2VycmV1clxuICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VNUFRZXCIpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaSB0b3V0IHMnZXN0IGJpZW4gcGFzc8OpLCBvbiBhcHBlbGxlIGxlIGNhbGxiYWNrIGRlIHN1Y2PDqHNcbiAgICAgICAgb3B0aW9ucy5vblN1Y2Nlc3MuY2FsbChvcHRpb25zLnNjb3BlLCBkYXRhKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js": -/*!********************************************************************************!*\ - !*** ./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js ***! - \********************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Float} distance - distance (expressed in meters) used for the request.\n * @property {Float} time - time (expressed in seconds) used for the request.\n * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve.\n * @property {String} id - request id (used by underlying webservice).\n * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in \"srs\" coordinates system).\n * @property {String} message - message\n * @property {String} srs - Identifier of the coordinates system used for the isocurve.\n *\n * @namespace\n * @alias Gp.Services.IsoCurveResponse\n *\n */\nfunction ProcessIsoCurveResponse() {\n if (!(this instanceof ProcessIsoCurveResponse)) {\n throw new TypeError(\"ProcessIsoCurveResponse constructor cannot be called as a function.\");\n }\n this.message = null;\n this.id = null;\n this.location = {};\n this.location.x = null;\n this.location.y = null;\n this.srs = null;\n this.geometry = null;\n this.time = null;\n this.distance = null;\n}\nProcessIsoCurveResponse.prototype = {\n constructor: ProcessIsoCurveResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVzcG9uc2UvbW9kZWwvUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UuanM/OTMyNCJdLCJuYW1lcyI6WyJQcm9jZXNzSXNvQ3VydmVSZXNwb25zZSIsIlR5cGVFcnJvciIsIm1lc3NhZ2UiLCJpZCIsImxvY2F0aW9uIiwieCIsInkiLCJzcnMiLCJnZW9tZXRyeSIsInRpbWUiLCJkaXN0YW5jZSIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLHVCQUF1QkEsQ0FBQSxFQUFJO0VBQ2hDLElBQUksRUFBRSxJQUFJLFlBQVlBLHVCQUF1QixDQUFDLEVBQUU7SUFDNUMsTUFBTSxJQUFJQyxTQUFTLENBQUMscUVBQXFFLENBQUM7RUFDOUY7RUFFQSxJQUFJLENBQUNDLE9BQU8sR0FBRyxJQUFJO0VBRW5CLElBQUksQ0FBQ0MsRUFBRSxHQUFHLElBQUk7RUFFZCxJQUFJLENBQUNDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSSxDQUFDQSxRQUFRLENBQUNDLENBQUMsR0FBRyxJQUFJO0VBQ3RCLElBQUksQ0FBQ0QsUUFBUSxDQUFDRSxDQUFDLEdBQUcsSUFBSTtFQUV0QixJQUFJLENBQUNDLEdBQUcsR0FBRyxJQUFJO0VBRWYsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtFQUVwQixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0VBRWhCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUk7QUFDeEI7QUFFQVYsdUJBQXVCLENBQUNXLFNBQVMsR0FBRztFQUVoQ0MsV0FBVyxFQUFHWjtBQUVsQixDQUFDO0FBRWNBLHNGQUF1QiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVzcG9uc2UvbW9kZWwvUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2Vzfmlzb0N1cnZlIEdwLlNlcnZpY2VzLmlzb0N1cnZlICgpfSBpbnZvY2F0aW9uIHdoZW4gc3VjY2Vzc2Z1bC4gUmVjZWl2ZWQgYXMgdGhlIGFyZ3VtZW50IG9mIG9uU3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0Zsb2F0fSBkaXN0YW5jZSAtIGRpc3RhbmNlIChleHByZXNzZWQgaW4gbWV0ZXJzKSB1c2VkIGZvciB0aGUgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHRpbWUgLSB0aW1lIChleHByZXNzZWQgaW4gc2Vjb25kcykgdXNlZCBmb3IgdGhlIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge09iamVjdH0gZ2VvbWV0cnkgLSBHZW9tZXRyeSAoZXhwcmVzc2VkIGluIFtHZW9KU09OXXtAbGluayBodHRwOi8vZ2VvanNvbi5vcmcvfSkgb2YgdGhlIGlzb2N1cnZlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGlkIC0gcmVxdWVzdCBpZCAodXNlZCBieSB1bmRlcmx5aW5nIHdlYnNlcnZpY2UpLlxuICogQHByb3BlcnR5IHtHcC5Qb2ludH0gbG9jYXRpb24gLSBQb3NpdGlvbiBvZiB0aGUgc3RhcnQgb3IgZW5kIHBvaW50IHVzZWQgZm9yIHRoZSByZXF1ZXN0IChleHByZXNzZWQgaW4gXCJzcnNcIiBjb29yZGluYXRlcyBzeXN0ZW0pLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc3JzIC0gSWRlbnRpZmllciBvZiB0aGUgY29vcmRpbmF0ZXMgc3lzdGVtIHVzZWQgZm9yIHRoZSBpc29jdXJ2ZS5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZVxuICpcbiAqL1xuZnVuY3Rpb24gUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UgKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcblxuICAgIHRoaXMuaWQgPSBudWxsO1xuXG4gICAgdGhpcy5sb2NhdGlvbiA9IHt9O1xuICAgIHRoaXMubG9jYXRpb24ueCA9IG51bGw7XG4gICAgdGhpcy5sb2NhdGlvbi55ID0gbnVsbDtcblxuICAgIHRoaXMuc3JzID0gbnVsbDtcblxuICAgIHRoaXMuZ2VvbWV0cnkgPSBudWxsO1xuXG4gICAgdGhpcy50aW1lID0gbnVsbDtcblxuICAgIHRoaXMuZGlzdGFuY2UgPSBudWxsO1xufVxuXG5Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Request/RouteRequestFactory.js": -/*!***********************************************************!*\ - !*** ./src/Services/Route/Request/RouteRequestFactory.js ***! - \***********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RouteRequestREST */ \"./src/Services/Route/Request/RouteRequestREST.js\");\n\n\n\n\n/**\n * Creation d'une requête REST en mode POST ou GET\n * (Factory)\n *\n * @module RouteRequestFactory\n * @alias Gp.Services.Route.Request.RouteRequestFactory\n * @private\n */\nvar RouteRequestFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * // utilisation avec les callback\n * var options = {\n * (...)\n * onSuccess : function (response) {},\n * onError : function (error) {},\n * // spécifique au service\n * startPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * endPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * provideBbox : false,\n * exclusions : [\"bridge\", \"tunnel\", \"toll\"],\n * distanceUnit : \"km\",\n * graph : \"Voiture\",\n * geometryInInstructions : false,\n * routePreference : \"fastest\"\n * };\n * RouteRequestFactory.build(options);\n *\n * // utilisation sans callback\n * var options = {...};\n * try {\n * var result = RouteRequestFactory.build(options);\n * if (! result) { throw new Error(\"...\"):}\n * } catch (e) {\n * // todo\n * }\n * @returns {String} request\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"RouteRequestFactory\");\n logger.trace([\"RouteRequestFactory::build()\"]);\n var request = null;\n var settings = options || {};\n\n // gestion des callback\n var bOnError = !!(options.onError !== null && typeof options.onError === \"function\");\n var message = null;\n\n // FIXME les exceptions ne sont pas 'catchées' sur le constructeur !\n var myReq = new _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](settings);\n if (!myReq.processRequestString()) {\n message = \"Error process request (rest) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n request = myReq.requestString;\n return request;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteRequestFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L1JvdXRlUmVxdWVzdEZhY3RvcnkuanM/MWQzMCJdLCJuYW1lcyI6WyJSb3V0ZVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJyZXF1ZXN0Iiwic2V0dGluZ3MiLCJiT25FcnJvciIsIm9uRXJyb3IiLCJtZXNzYWdlIiwibXlSZXEiLCJSb3V0ZVJlcXVlc3RSRVNUIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJFcnJvciIsInJlcXVlc3RTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9EO0FBQ1E7QUFDVjs7QUFFbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLG1CQUFtQixHQUFHO0VBRXRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsS0FBSyxFQUFHLFNBQUFBLE1BQVVDLE9BQU8sRUFBRTtJQUN2QjtJQUNBLElBQUlDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLHFCQUFxQixDQUFDO0lBQ3BERixNQUFNLENBQUNHLEtBQUssQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFOUMsSUFBSUMsT0FBTyxHQUFHLElBQUk7SUFFbEIsSUFBSUMsUUFBUSxHQUFHTixPQUFPLElBQUksQ0FBQyxDQUFDOztJQUU1QjtJQUNBLElBQUlPLFFBQVEsR0FBRyxDQUFDLEVBQUVQLE9BQU8sQ0FBQ1EsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPUixPQUFPLENBQUNRLE9BQU8sS0FBSyxVQUFVLENBQUM7SUFFcEYsSUFBSUMsT0FBTyxHQUFHLElBQUk7O0lBRWxCO0lBQ0EsSUFBSUMsS0FBSyxHQUFHLElBQUlDLHlEQUFnQixDQUFDTCxRQUFRLENBQUM7SUFDMUMsSUFBSSxDQUFDSSxLQUFLLENBQUNFLG9CQUFvQixDQUFDLENBQUMsRUFBRTtNQUMvQkgsT0FBTyxHQUFHLGdDQUFnQztNQUMxQyxJQUFJRixRQUFRLEVBQUU7UUFDVlAsT0FBTyxDQUFDUSxPQUFPLENBQUNLLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQ04sT0FBTyxDQUFDLENBQUM7UUFDOUQ7TUFDSjtNQUNBLE1BQU0sSUFBSU8sS0FBSyxDQUFDUCxPQUFPLENBQUM7SUFDNUI7SUFDQUosT0FBTyxHQUFHSyxLQUFLLENBQUNPLGFBQWE7SUFFN0IsT0FBT1osT0FBTztFQUNsQjtBQUNKLENBQUM7QUFFY1Asa0ZBQW1CIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1JvdXRlL1JlcXVlc3QvUm91dGVSZXF1ZXN0RmFjdG9yeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEVycm9yU2VydmljZSBmcm9tIFwiLi4vLi4vLi4vRXhjZXB0aW9ucy9FcnJvclNlcnZpY2VcIjtcbmltcG9ydCBSb3V0ZVJlcXVlc3RSRVNUIGZyb20gXCIuL1JvdXRlUmVxdWVzdFJFU1RcIjtcblxuLyoqXG4gKiBDcmVhdGlvbiBkJ3VuZSByZXF1w6p0ZSBSRVNUIGVuIG1vZGUgUE9TVCBvdSBHRVRcbiAqIChGYWN0b3J5KVxuICpcbiAqIEBtb2R1bGUgUm91dGVSZXF1ZXN0RmFjdG9yeVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJvdXRlLlJlcXVlc3QuUm91dGVSZXF1ZXN0RmFjdG9yeVxuICogQHByaXZhdGVcbiAqL1xudmFyIFJvdXRlUmVxdWVzdEZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBSb3V0ZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIC8vIHV0aWxpc2F0aW9uIGF2ZWMgbGVzIGNhbGxiYWNrXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgICguLi4pXG4gICAgICogICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHt9LFxuICAgICAqICAgICAgb25FcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gICAgICogICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlXG4gICAgICogICAgICBzdGFydFBvaW50IDoge1xuICAgICAqICAgICAgICAgIHggOiA0Mi4xMTIxLFxuICAgICAqICAgICAgICAgIHkgOiAxLjU1NTdcbiAgICAgKiAgICAgIH0sXG4gICAgICogICAgICBlbmRQb2ludCA6IHtcbiAgICAgKiAgICAgICAgICB4IDogNDIuMTEyMSxcbiAgICAgKiAgICAgICAgICB5IDogMS41NTU3XG4gICAgICogICAgICB9LFxuICAgICAqICAgICAgcHJvdmlkZUJib3ggOiBmYWxzZSxcbiAgICAgKiAgICAgIGV4Y2x1c2lvbnMgOiBbXCJicmlkZ2VcIiwgXCJ0dW5uZWxcIiwgXCJ0b2xsXCJdLFxuICAgICAqICAgICAgZGlzdGFuY2VVbml0IDogXCJrbVwiLFxuICAgICAqICAgICAgZ3JhcGggOiBcIlZvaXR1cmVcIixcbiAgICAgKiAgICAgIGdlb21ldHJ5SW5JbnN0cnVjdGlvbnMgOiBmYWxzZSxcbiAgICAgKiAgICAgIHJvdXRlUHJlZmVyZW5jZSA6IFwiZmFzdGVzdFwiXG4gICAgICogICB9O1xuICAgICAqICAgUm91dGVSZXF1ZXN0RmFjdG9yeS5idWlsZChvcHRpb25zKTtcbiAgICAgKlxuICAgICAqICAgLy8gdXRpbGlzYXRpb24gc2FucyBjYWxsYmFja1xuICAgICAqICAgdmFyIG9wdGlvbnMgPSB7Li4ufTtcbiAgICAgKiAgIHRyeSB7XG4gICAgICogICAgICB2YXIgcmVzdWx0ID0gUm91dGVSZXF1ZXN0RmFjdG9yeS5idWlsZChvcHRpb25zKTtcbiAgICAgKiAgICAgIGlmICghIHJlc3VsdCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIuLi5cIik6fVxuICAgICAqICAgfSBjYXRjaCAoZSkge1xuICAgICAqICAgICAgLy8gdG9kb1xuICAgICAqICAgfVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJlcXVlc3RcbiAgICAgKi9cbiAgICBidWlsZCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIGxvZ2dlclxuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIlJvdXRlUmVxdWVzdEZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJSb3V0ZVJlcXVlc3RGYWN0b3J5OjpidWlsZCgpXCJdKTtcblxuICAgICAgICB2YXIgcmVxdWVzdCA9IG51bGw7XG5cbiAgICAgICAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICAvLyBnZXN0aW9uIGRlcyBjYWxsYmFja1xuICAgICAgICB2YXIgYk9uRXJyb3IgPSAhIShvcHRpb25zLm9uRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25FcnJvciA9PT0gXCJmdW5jdGlvblwiKTtcblxuICAgICAgICB2YXIgbWVzc2FnZSA9IG51bGw7XG5cbiAgICAgICAgLy8gRklYTUUgbGVzIGV4Y2VwdGlvbnMgbmUgc29udCBwYXMgJ2NhdGNow6llcycgc3VyIGxlIGNvbnN0cnVjdGV1ciAhXG4gICAgICAgIHZhciBteVJlcSA9IG5ldyBSb3V0ZVJlcXVlc3RSRVNUKHNldHRpbmdzKTtcbiAgICAgICAgaWYgKCFteVJlcS5wcm9jZXNzUmVxdWVzdFN0cmluZygpKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJFcnJvciBwcm9jZXNzIHJlcXVlc3QgKHJlc3QpICFcIjtcbiAgICAgICAgICAgIGlmIChiT25FcnJvcikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0ID0gbXlSZXEucmVxdWVzdFN0cmluZztcblxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZVJlcXVlc3RGYWN0b3J5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Route/Request/RouteRequestFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Request/RouteRequestREST.js": -/*!********************************************************!*\ - !*** ./src/Services/Route/Request/RouteRequestREST.js ***! - \********************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/RouteParamREST */ \"./src/Services/Route/Request/model/RouteParamREST.js\");\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire\n * (uniquement en GET)\n *\n * @constructor\n * @alias Gp.Services.Route.Request.RouteRequestREST\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * var options = {\n * (...)\n * };\n *\n * @private\n */\nfunction RouteRequestREST(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"RouteRequestREST\");\n this.logger.trace(\"[Constructeur RouteRequestREST ()]\");\n if (!(this instanceof RouteRequestREST)) {\n throw new TypeError(\"RouteRequestREST constructor cannot be called as a function.\");\n }\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n /** liste des options */\n this.settings = options;\n}\nRouteRequestREST.prototype = {\n /**\n * @lends module:RouteRequestREST#\n */\n\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: RouteRequestREST,\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838\n * // POST out : Not yet supported method POST !\n * @returns {String} request\n */\n processRequestString: function processRequestString() {\n // INFO\n // construction simple sans template...,\n // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE !\n this.logger.warn(\" PROTOTYPE !\");\n\n // Mapping des options avec le service de l'API REST\n var oParams = new _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.settings);\n var params = oParams.getParams();\n var request = \"\";\n for (var i = 0; i < params.length; i++) {\n var o = params[i];\n if (request) {\n request += \"&\";\n }\n request += o.k + \"=\" + o.v;\n }\n\n // Exemple :\n // http://wxs.ign.fr/KEY/itineraire/rest/route.json?\n // origin=&\n // destination=&\n // waypoints=&\n // method=DISTANCE&\n // graph=Pieton&\n // graphName=Pieton&\n // exclusions=&\n // tolerance=10&\n // srs=\n\n this.logger.trace(request);\n this.requestString = request;\n return this.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteRequestREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L1JvdXRlUmVxdWVzdFJFU1QuanM/MjBlZCJdLCJuYW1lcyI6WyJSb3V0ZVJlcXVlc3RSRVNUIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiVHlwZUVycm9yIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInNldHRpbmdzIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJ3YXJuIiwib1BhcmFtcyIsIlJvdXRlUGFyYW1SRVNUIiwicGFyYW1zIiwiZ2V0UGFyYW1zIiwicmVxdWVzdCIsImkiLCJsZW5ndGgiLCJvIiwiayIsInYiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQW9EO0FBQ0g7QUFDRzs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxnQkFBZ0JBLENBQUVDLE9BQU8sRUFBRTtFQUNoQyxJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLGtCQUFrQixDQUFDO0VBQ2xELElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsb0NBQW9DLENBQUM7RUFFdkQsSUFBSSxFQUFFLElBQUksWUFBWUwsZ0JBQWdCLENBQUMsRUFBRTtJQUNyQyxNQUFNLElBQUlNLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQztFQUN2Rjs7RUFFQTtFQUNBLElBQUksQ0FBQ0wsT0FBTyxFQUFFO0lBQ1YsTUFBTSxJQUFJTSxLQUFLLENBQUNDLGdFQUFDLENBQUNDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7RUFDM0Q7O0VBRUE7RUFDQSxJQUFJLENBQUNDLFFBQVEsR0FBR1QsT0FBTztBQUMzQjtBQUVBRCxnQkFBZ0IsQ0FBQ1csU0FBUyxHQUFHO0VBRXpCO0FBQ0o7QUFDQTs7RUFFSTtBQUNKO0FBQ0E7QUFDQTtFQUNJQyxhQUFhLEVBQUcsSUFBSTtFQUVwQjtBQUNKO0FBQ0E7RUFDSUMsV0FBVyxFQUFHYixnQkFBZ0I7RUFFOUI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJYyxvQkFBb0IsRUFBRyxTQUFBQSxxQkFBQSxFQUFZO0lBQy9CO0lBQ0E7SUFDQTtJQUNBLElBQUksQ0FBQ1osTUFBTSxDQUFDYSxJQUFJLENBQUMsY0FBYyxDQUFDOztJQUVoQztJQUNBLElBQUlDLE9BQU8sR0FBRyxJQUFJQyw2REFBYyxDQUFDLElBQUksQ0FBQ1AsUUFBUSxDQUFDO0lBQy9DLElBQUlRLE1BQU0sR0FBR0YsT0FBTyxDQUFDRyxTQUFTLENBQUMsQ0FBQztJQUVoQyxJQUFJQyxPQUFPLEdBQUcsRUFBRTtJQUNoQixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0gsTUFBTSxDQUFDSSxNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO01BQ3BDLElBQUlFLENBQUMsR0FBR0wsTUFBTSxDQUFDRyxDQUFDLENBQUM7TUFDakIsSUFBSUQsT0FBTyxFQUFFO1FBQ1RBLE9BQU8sSUFBSSxHQUFHO01BQ2xCO01BQ0FBLE9BQU8sSUFBSUcsQ0FBQyxDQUFDQyxDQUFDLEdBQUcsR0FBRyxHQUFHRCxDQUFDLENBQUNFLENBQUM7SUFDOUI7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQSxJQUFJLENBQUN2QixNQUFNLENBQUNHLEtBQUssQ0FBQ2UsT0FBTyxDQUFDO0lBQzFCLElBQUksQ0FBQ1IsYUFBYSxHQUFHUSxPQUFPO0lBRTVCLE9BQU8sSUFBSSxDQUFDUixhQUFhO0VBQzdCO0FBQ0osQ0FBQztBQUVjWiwrRUFBZ0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvUm91dGUvUmVxdWVzdC9Sb3V0ZVJlcXVlc3RSRVNULmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBfIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IFJvdXRlUGFyYW1SRVNUIGZyb20gXCIuL21vZGVsL1JvdXRlUGFyYW1SRVNUXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFJFU1Qgc3VyIGxlIHNlcnZpY2UgZGUgY2FsY3VsIGQnaXRpbmVyYWlyZVxuICogKHVuaXF1ZW1lbnQgZW4gR0VUKVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJvdXRlLlJlcXVlc3QuUm91dGVSZXF1ZXN0UkVTVFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGRlZmluaWVzIGRhbnMgbGUgY29tcG9zYW50IFJvdXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIHZhciBvcHRpb25zID0ge1xuICogICAgICAoLi4uKVxuICogfTtcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBSb3V0ZVJlcXVlc3RSRVNUIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiUm91dGVSZXF1ZXN0UkVTVFwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgUm91dGVSZXF1ZXN0UkVTVCAoKV1cIik7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUm91dGVSZXF1ZXN0UkVTVCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJvdXRlUmVxdWVzdFJFU1QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICAvLyBleGlzdGFuY2UgZGVzIG9wdGlvbnNcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwib3B0aW9uc1wiKSk7XG4gICAgfVxuXG4gICAgLyoqIGxpc3RlIGRlcyBvcHRpb25zICovXG4gICAgdGhpcy5zZXR0aW5ncyA9IG9wdGlvbnM7XG59XG5cblJvdXRlUmVxdWVzdFJFU1QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpSb3V0ZVJlcXVlc3RSRVNUI1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogcmVxdWVzdFxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmVxdWVzdFN0cmluZyA6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogUm91dGVSZXF1ZXN0UkVTVCxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGlvbiBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR0VUICBvdXQgOiBvcmlnaW49Mi40MTY5MDczNTM4MDk1MTMsNDguODQ2NTc3MjE0MjI5NyZkZXN0aW5hdGlvbj0yLjQyNDgwMzc3NzE0OTM2NzMsNDguODQ1OTEzNTMxNjE4MzhcbiAgICAgKiAvLyBQT1NUIG91dCA6IE5vdCB5ZXQgc3VwcG9ydGVkIG1ldGhvZCBQT1NUICFcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RTdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gY29uc3RydWN0aW9uIHNpbXBsZSBzYW5zIHRlbXBsYXRlLi4uLFxuICAgICAgICAvLyBtYWlzIGVuIGF0dGVuZGFudCBxdWUgbGVzIHNlcnZpY2VzIHNvaWVudCBmaXjDqXMsIG9uIHRhZ2d1ZSBjZSBjb21wb3NhbnQgZW4gbW9kZSBQUk9UT1RZUEUgIVxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiIFBST1RPVFlQRSAhXCIpO1xuXG4gICAgICAgIC8vIE1hcHBpbmcgZGVzIG9wdGlvbnMgYXZlYyBsZSBzZXJ2aWNlIGRlIGwnQVBJIFJFU1RcbiAgICAgICAgdmFyIG9QYXJhbXMgPSBuZXcgUm91dGVQYXJhbVJFU1QodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIHZhciBwYXJhbXMgPSBvUGFyYW1zLmdldFBhcmFtcygpO1xuXG4gICAgICAgIHZhciByZXF1ZXN0ID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvID0gcGFyYW1zW2ldO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ICs9IFwiJlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdCArPSBvLmsgKyBcIj1cIiArIG8udjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4ZW1wbGUgOlxuICAgICAgICAvLyAgaHR0cDovL3d4cy5pZ24uZnIvS0VZL2l0aW5lcmFpcmUvcmVzdC9yb3V0ZS5qc29uP1xuICAgICAgICAvLyAgb3JpZ2luPSZcbiAgICAgICAgLy8gIGRlc3RpbmF0aW9uPSZcbiAgICAgICAgLy8gIHdheXBvaW50cz0mXG4gICAgICAgIC8vICBtZXRob2Q9RElTVEFOQ0UmXG4gICAgICAgIC8vICBncmFwaD1QaWV0b24mXG4gICAgICAgIC8vICBncmFwaE5hbWU9UGlldG9uJlxuICAgICAgICAvLyAgZXhjbHVzaW9ucz0mXG4gICAgICAgIC8vICB0b2xlcmFuY2U9MTAmXG4gICAgICAgIC8vICBzcnM9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UocmVxdWVzdCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFN0cmluZyA9IHJlcXVlc3Q7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdFN0cmluZztcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZVJlcXVlc3RSRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Route/Request/RouteRequestREST.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Request/model/RouteParamREST.js": -/*!************************************************************!*\ - !*** ./src/Services/Route/Request/model/RouteParamREST.js ***! - \************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST).\n * Permet le mapping avec les options du service.\n * @constructor\n * @alias Gp.Services.Route.Request.RouteParamREST\n * @param {Object} options - options\n *\n * @private\n */\nfunction RouteParamREST(options) {\n if (!(this instanceof RouteParamREST)) {\n throw new TypeError(\"RouteParamREST constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur RouteParamREST ()]\");\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n // mapping des options avec l'API REST\n\n /** Ressource utilisée */\n this.resource = this.options.resource;\n\n /** Coordonnées du point de départ. */\n this.start = this.options.startPoint.x + \",\" + this.options.startPoint.y;\n\n /** Coordonnées du point d’arrivée. */\n this.end = this.options.endPoint.x + \",\" + this.options.endPoint.y;\n\n /** Coordonnées des étapes point de départ. */\n this.intermediates = this.options.viaPoints;\n\n /** Nom du profile à utiliser */\n this.profile = this.options.graph;\n\n /** projection (code EPSG comme epsg:4326 ou wgs84) */\n this.crs = this.options.srs;\n\n /** Liste des contraintes */\n this.constraints = this.options.constraints;\n\n /** Nom de l'optimisation à utiliser */\n this.optimization = this.options.routePreference;\n\n /** Format de sortie (résumé de l’itinéraire) */\n this.getSteps = this.options.geometryInInstructions ? \"true\" : \"false\";\n\n /** Unité des distances */\n this.distanceUnit = this.options.distanceUnit;\n\n /** Unité des durées */\n this.timeUnit = this.options.timeUnit;\n\n /** Attributs des voies */\n this.waysAttributes = this.options.waysAttributes;\n}\n\n/**\n * CLASSNAME\n */\nRouteParamREST.CLASSNAME = \"RouteParamREST\";\nRouteParamREST.prototype = {\n /**\n * @lends module:RouteParamREST#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: RouteParamREST,\n /**\n * Retourne une liste de points\n * @returns {String} une liste de points (sep '|')\n */\n getIntermediates: function getIntermediates() {\n var array = [];\n if (this.intermediates.length !== 0) {\n for (var i = 0; i < this.intermediates.length; i++) {\n var obj = this.intermediates[i];\n array.push(obj.x + \",\" + obj.y);\n }\n }\n return array.join(\"|\");\n },\n /**\n * Retourne une liste d'attributs\n * @returns {String} une liste d'attributs (sep '|')\n */\n getWaysAttributes: function getWaysAttributes() {\n return this.waysAttributes.join(\"|\");\n },\n /**\n * Retourne un profile\n * @returns {String} profile\n */\n getProfile: function getProfile() {\n return this.profile;\n },\n /**\n * Retourne un distanceUnit\n * @returns {String} distanceUnit\n */\n getDistanceUnit: function getDistanceUnit() {\n if (this.distanceUnit === \"m\") {\n return \"meter\";\n }\n if (this.distanceUnit === \"km\") {\n return \"kilometer\";\n }\n return \"\";\n },\n /**\n * Retourne une optimisation\n * @returns {String} optimization\n */\n getOptimization: function getOptimization() {\n if (this.optimization) {\n return this.optimization;\n } else {\n return \"\";\n }\n },\n /**\n * Retourne la liste des constraints\n * @returns {String} une liste des constraints (sep '|')\n */\n getConstraints: function getConstraints() {\n var constraintArray = [];\n if (this.constraints.length !== 0) {\n for (var k = 0; k < this.constraints.length; k++) {\n constraintArray.push(JSON.stringify(this.constraints[k]));\n }\n }\n return constraintArray.join(\"|\");\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Array} liste de paramêtres\n */\nRouteParamREST.prototype.getParams = function () {\n var map = [];\n map.push({\n k: \"resource\",\n v: this.resource\n });\n map.push({\n k: \"start\",\n v: this.start\n });\n map.push({\n k: \"end\",\n v: this.end\n });\n map.push({\n k: \"geometryFormat\",\n v: \"geojson\"\n });\n if (this.optimization) {\n map.push({\n k: \"optimization\",\n v: this.getOptimization()\n });\n }\n if (this.intermediates) {\n map.push({\n k: \"intermediates\",\n v: this.getIntermediates()\n });\n }\n if (this.profile) {\n map.push({\n k: \"profile\",\n v: this.getProfile()\n });\n }\n if (this.constraints) {\n map.push({\n k: \"constraints\",\n v: this.getConstraints()\n });\n }\n if (this.crs) {\n map.push({\n k: \"crs\",\n v: this.crs\n });\n }\n if (this.distanceUnit) {\n map.push({\n k: \"distanceUnit\",\n v: this.getDistanceUnit()\n });\n }\n if (this.timeUnit) {\n map.push({\n k: \"timeUnit\",\n v: this.timeUnit\n });\n }\n if (this.waysAttributes) {\n map.push({\n k: \"waysAttributes\",\n v: this.getWaysAttributes()\n });\n }\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteParamREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L21vZGVsL1JvdXRlUGFyYW1SRVNULmpzPzczODMiXSwibmFtZXMiOlsiUm91dGVQYXJhbVJFU1QiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJyZXNvdXJjZSIsInN0YXJ0Iiwic3RhcnRQb2ludCIsIngiLCJ5IiwiZW5kIiwiZW5kUG9pbnQiLCJpbnRlcm1lZGlhdGVzIiwidmlhUG9pbnRzIiwicHJvZmlsZSIsImdyYXBoIiwiY3JzIiwic3JzIiwiY29uc3RyYWludHMiLCJvcHRpbWl6YXRpb24iLCJyb3V0ZVByZWZlcmVuY2UiLCJnZXRTdGVwcyIsImdlb21ldHJ5SW5JbnN0cnVjdGlvbnMiLCJkaXN0YW5jZVVuaXQiLCJ0aW1lVW5pdCIsIndheXNBdHRyaWJ1dGVzIiwiQ0xBU1NOQU1FIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRJbnRlcm1lZGlhdGVzIiwiYXJyYXkiLCJsZW5ndGgiLCJpIiwib2JqIiwicHVzaCIsImpvaW4iLCJnZXRXYXlzQXR0cmlidXRlcyIsImdldFByb2ZpbGUiLCJnZXREaXN0YW5jZVVuaXQiLCJnZXRPcHRpbWl6YXRpb24iLCJnZXRDb25zdHJhaW50cyIsImNvbnN0cmFpbnRBcnJheSIsImsiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0UGFyYW1zIiwibWFwIiwidiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxjQUFjQSxDQUFFQyxPQUFPLEVBQUU7RUFDOUIsSUFBSSxFQUFFLElBQUksWUFBWUQsY0FBYyxDQUFDLEVBQUU7SUFDbkMsTUFBTSxJQUFJRSxTQUFTLENBQUMsNERBQTRELENBQUM7RUFDckY7RUFFQSxJQUFJLENBQUNDLE1BQU0sR0FBR0Ms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QztFQUNOO0VBRUEsSUFBSSxJQUFJLENBQUN4QixHQUFHLEVBQUU7SUFDVjhCLEdBQUcsQ0FBQ1osSUFBSSxDQUFDO01BQ0xRLENBQUMsRUFBRyxLQUFLO01BQ1RLLENBQUMsRUFBRyxJQUFJLENBQUMvQjtJQUNiLENBQUMsQ0FBQztFQUNOO0VBRUEsSUFBSSxJQUFJLENBQUNPLFlBQVksRUFBRTtJQUNuQnVCLEdBQUcsQ0FBQ1osSUFBSSxDQUFDO01BQ0xRLENBQUMsRUFBRyxjQUFjO01BQ2xCSyxDQUFDLEVBQUcsSUFBSSxDQUFDVCxlQUFlLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJLElBQUksQ0FBQ2QsUUFBUSxFQUFFO0lBQ2ZzQixHQUFHLENBQUNaLElBQUksQ0FBQztNQUNMUSxDQUFDLEVBQUcsVUFBVTtNQUNkSyxDQUFDLEVBQUcsSUFBSSxDQUFDdkI7SUFDYixDQUFDLENBQUM7RUFDTjtFQUVBLElBQUksSUFBSSxDQUFDQyxjQUFjLEVBQUU7SUFDckJxQixHQUFHLENBQUNaLElBQUksQ0FBQztNQUNMUSxDQUFDLEVBQUcsZ0JBQWdCO01BQ3BCSyxDQUFDLEVBQUcsSUFBSSxDQUFDWCxpQkFBaUIsQ0FBQztJQUMvQixDQUFDLENBQUM7RUFDTjtFQUVBLE9BQU9VLEdBQUc7QUFDZCxDQUFDO0FBRWNoRCw2RUFBYyIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L21vZGVsL1JvdXRlUGFyYW1SRVNULmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgcGFyYW0uIGRlcyByZXF1w6p0ZXMgZHUgc2VydmljZSBkZSBjYWxjdWwgZCdpdGluZXJhaXJlIChSRVNUKS5cbiAqICAgICAgUGVybWV0IGxlIG1hcHBpbmcgYXZlYyBsZXMgb3B0aW9ucyBkdSBzZXJ2aWNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuUm91dGUuUmVxdWVzdC5Sb3V0ZVBhcmFtUkVTVFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gUm91dGVQYXJhbVJFU1QgKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUm91dGVQYXJhbVJFU1QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSb3V0ZVBhcmFtUkVTVCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBSb3V0ZVBhcmFtUkVTVCAoKV1cIik7XG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBlbiBwYXJhbcOqdHJlcyBkdSBjb25zdHJ1Y3RldXIuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIG1hcHBpbmcgZGVzIG9wdGlvbnMgYXZlYyBsJ0FQSSBSRVNUXG5cbiAgICAvKiogUmVzc291cmNlIHV0aWxpc8OpZSAqL1xuICAgIHRoaXMucmVzb3VyY2UgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2U7XG5cbiAgICAvKiogQ29vcmRvbm7DqWVzIGR1IHBvaW50IGRlIGTDqXBhcnQuICovXG4gICAgdGhpcy5zdGFydCA9IHRoaXMub3B0aW9ucy5zdGFydFBvaW50LnggKyBcIixcIiArIHRoaXMub3B0aW9ucy5zdGFydFBvaW50Lnk7XG5cbiAgICAvKiogQ29vcmRvbm7DqWVzIGR1IHBvaW50IGTigJlhcnJpdsOpZS4gKi9cbiAgICB0aGlzLmVuZCA9IHRoaXMub3B0aW9ucy5lbmRQb2ludC54ICsgXCIsXCIgKyB0aGlzLm9wdGlvbnMuZW5kUG9pbnQueTtcblxuICAgIC8qKiBDb29yZG9ubsOpZXMgZGVzIMOpdGFwZXMgcG9pbnQgZGUgZMOpcGFydC4gKi9cbiAgICB0aGlzLmludGVybWVkaWF0ZXMgPSB0aGlzLm9wdGlvbnMudmlhUG9pbnRzO1xuXG4gICAgLyoqIE5vbSBkdSBwcm9maWxlIMOgIHV0aWxpc2VyICovXG4gICAgdGhpcy5wcm9maWxlID0gdGhpcy5vcHRpb25zLmdyYXBoO1xuXG4gICAgLyoqIHByb2plY3Rpb24gKGNvZGUgRVBTRyBjb21tZSBlcHNnOjQzMjYgb3Ugd2dzODQpICovXG4gICAgdGhpcy5jcnMgPSB0aGlzLm9wdGlvbnMuc3JzO1xuXG4gICAgLyoqIExpc3RlIGRlcyBjb250cmFpbnRlcyAqL1xuICAgIHRoaXMuY29uc3RyYWludHMgPSB0aGlzLm9wdGlvbnMuY29uc3RyYWludHM7XG5cbiAgICAvKiogTm9tIGRlIGwnb3B0aW1pc2F0aW9uIMOgIHV0aWxpc2VyICovXG4gICAgdGhpcy5vcHRpbWl6YXRpb24gPSB0aGlzLm9wdGlvbnMucm91dGVQcmVmZXJlbmNlO1xuXG4gICAgLyoqIEZvcm1hdCBkZSBzb3J0aWUgKHLDqXN1bcOpIGRlIGzigJlpdGluw6lyYWlyZSkgKi9cbiAgICB0aGlzLmdldFN0ZXBzID0gKHRoaXMub3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuXG4gICAgLyoqIFVuaXTDqSBkZXMgZGlzdGFuY2VzICovXG4gICAgdGhpcy5kaXN0YW5jZVVuaXQgPSB0aGlzLm9wdGlvbnMuZGlzdGFuY2VVbml0O1xuXG4gICAgLyoqIFVuaXTDqSBkZXMgZHVyw6llcyAqL1xuICAgIHRoaXMudGltZVVuaXQgPSB0aGlzLm9wdGlvbnMudGltZVVuaXQ7XG5cbiAgICAvKiogQXR0cmlidXRzIGRlcyB2b2llcyAqL1xuICAgIHRoaXMud2F5c0F0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnMud2F5c0F0dHJpYnV0ZXM7XG59XG5cbi8qKlxuICogQ0xBU1NOQU1FXG4gKi9cblJvdXRlUGFyYW1SRVNULkNMQVNTTkFNRSA9IFwiUm91dGVQYXJhbVJFU1RcIjtcblxuUm91dGVQYXJhbVJFU1QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpSb3V0ZVBhcmFtUkVTVCNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBSb3V0ZVBhcmFtUkVTVCxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIHVuZSBsaXN0ZSBkZSBwb2ludHNcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1bmUgbGlzdGUgZGUgcG9pbnRzIChzZXAgJ3wnKVxuICAgICAqL1xuICAgIGdldEludGVybWVkaWF0ZXMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5pbnRlcm1lZGlhdGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmludGVybWVkaWF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5pbnRlcm1lZGlhdGVzW2ldO1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gob2JqLnggKyBcIixcIiArIG9iai55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheS5qb2luKFwifFwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgdW5lIGxpc3RlIGQnYXR0cmlidXRzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdW5lIGxpc3RlIGQnYXR0cmlidXRzIChzZXAgJ3wnKVxuICAgICAqL1xuICAgIGdldFdheXNBdHRyaWJ1dGVzIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53YXlzQXR0cmlidXRlcy5qb2luKFwifFwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgdW4gcHJvZmlsZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHByb2ZpbGVcbiAgICAgKi9cbiAgICBnZXRQcm9maWxlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9maWxlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSB1biBkaXN0YW5jZVVuaXRcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBkaXN0YW5jZVVuaXRcbiAgICAgKi9cbiAgICBnZXREaXN0YW5jZVVuaXQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3RhbmNlVW5pdCA9PT0gXCJtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm1ldGVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlzdGFuY2VVbml0ID09PSBcImttXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImtpbG9tZXRlclwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSB1bmUgb3B0aW1pc2F0aW9uXG4gICAgICogQHJldHVybnMge1N0cmluZ30gb3B0aW1pemF0aW9uXG4gICAgICovXG4gICAgZ2V0T3B0aW1pemF0aW9uIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpbWl6YXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGltaXphdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxhIGxpc3RlIGRlcyBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVuZSBsaXN0ZSBkZXMgY29uc3RyYWludHMgKHNlcCAnfCcpXG4gICAgICovXG4gICAgZ2V0Q29uc3RyYWludHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25zdHJhaW50QXJyYXkgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRBcnJheS5wdXNoKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uc3RyYWludHNba10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uc3RyYWludEFycmF5LmpvaW4oXCJ8XCIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGFibGVhdSBkZSBjbGVmcy92YWxldXJzIHBvdXIgcGFyYW0uXG4gKlxuICogQHJldHVybnMge0FycmF5fSBsaXN0ZSBkZSBwYXJhbcOqdHJlc1xuICovXG5Sb3V0ZVBhcmFtUkVTVC5wcm90b3R5cGUuZ2V0UGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSBbXTtcblxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwicmVzb3VyY2VcIixcbiAgICAgICAgdiA6IHRoaXMucmVzb3VyY2VcbiAgICB9KTtcblxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwic3RhcnRcIixcbiAgICAgICAgdiA6IHRoaXMuc3RhcnRcbiAgICB9KTtcblxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiZW5kXCIsXG4gICAgICAgIHYgOiB0aGlzLmVuZFxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJnZW9tZXRyeUZvcm1hdFwiLFxuICAgICAgICB2IDogXCJnZW9qc29uXCJcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGltaXphdGlvbikge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJvcHRpbWl6YXRpb25cIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmdldE9wdGltaXphdGlvbigpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwiaW50ZXJtZWRpYXRlc1wiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0SW50ZXJtZWRpYXRlcygpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2ZpbGUpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwicHJvZmlsZVwiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0UHJvZmlsZSgpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzKSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcImNvbnN0cmFpbnRzXCIsXG4gICAgICAgICAgICB2IDogdGhpcy5nZXRDb25zdHJhaW50cygpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNycykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmNyc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXN0YW5jZVVuaXQpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwiZGlzdGFuY2VVbml0XCIsXG4gICAgICAgICAgICB2IDogdGhpcy5nZXREaXN0YW5jZVVuaXQoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aW1lVW5pdCkge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJ0aW1lVW5pdFwiLFxuICAgICAgICAgICAgdiA6IHRoaXMudGltZVVuaXRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2F5c0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwid2F5c0F0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmdldFdheXNBdHRyaWJ1dGVzKClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlUGFyYW1SRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Route/Request/model/RouteParamREST.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Response/RouteResponseFactory.js": -/*!*************************************************************!*\ - !*** ./src/Services/Route/Response/RouteResponseFactory.js ***! - \*************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/RouteResponse */ \"./src/Services/Route/Response/model/RouteResponse.js\");\n/* harmony import */ var _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model/RouteInstruction */ \"./src/Services/Route/Response/model/RouteInstruction.js\");\n\n\n\n\n\n\n/**\n * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON\n * (Factory)\n *\n * @module RouteResponseFactory\n * @alias Gp.Services.Route.Response.RouteResponseFactory\n * @private\n */\nvar RouteResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"RouteResponseFactory\");\n logger.trace(\"RouteResponseFactory::build()\");\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n logger.trace(\"analyze response : json\");\n var JSONResponse;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // construction de l'objet réponse JSON\n if (JSONResponse) {\n // le service renvoie t il une erreur ?\n if (JSONResponse.message) {\n // ex. {\"message\":\"message not null\", \"status\":\"ERROR\"}\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", JSONResponse.message)));\n return;\n }\n var legs = [];\n var legSteps = [];\n var steps = [];\n data = new _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n if (data.hasOwnProperty(\"totalTime\")) {\n data.totalTime = parseFloat(JSONResponse.duration);\n }\n if (data.hasOwnProperty(\"totalDistance\")) {\n data.totalDistance = parseFloat(JSONResponse.distance);\n }\n if (data.hasOwnProperty(\"bbox\")) {\n data.bbox.left = parseFloat(JSONResponse.bbox[0]);\n data.bbox.bottom = parseFloat(JSONResponse.bbox[1]);\n data.bbox.right = parseFloat(JSONResponse.bbox[2]);\n data.bbox.top = parseFloat(JSONResponse.bbox[3]);\n }\n if (data.hasOwnProperty(\"routeGeometry\") && !options.geometryInInstructions) {\n data.routeGeometry = JSONResponse.geometry;\n }\n if (data.hasOwnProperty(\"routeInstructions\") && options.geometryInInstructions) {\n var legList = JSONResponse.portions;\n var i;\n if (Array.isArray(legList) && legList.length) {\n for (i = 0; i < legList.length; i++) {\n legs.push(legList[i]);\n }\n }\n if (legs.length) {\n for (i = 0; i < legs.length; i++) {\n legSteps.push(legs[i].steps);\n }\n }\n if (legSteps.length) {\n for (i = 0; i < legSteps.length; i++) {\n steps = steps.concat(legSteps[i]);\n }\n }\n steps.forEach(function (step) {\n data.routeInstructions.push(new _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__[\"default\"]());\n data.routeInstructions[data.routeInstructions.length - 1].duration = step.duration;\n data.routeInstructions[data.routeInstructions.length - 1].distance = step.distance;\n data.routeInstructions[data.routeInstructions.length - 1].code = \"\";\n data.routeInstructions[data.routeInstructions.length - 1].instruction = \"\";\n data.routeInstructions[data.routeInstructions.length - 1].geometry = step.geometry;\n\n // on ne souhaite pas de ce type de valeur...\n if (step.name === \"Valeur non renseignée\") {\n step.name = \"\";\n }\n switch (step.instruction.type) {\n case \"turn\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Tourner\";\n break;\n case \"new name\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Continuer tout droit\";\n break;\n case \"depart\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Départ\";\n break;\n case \"arrive\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Arrivée\";\n break;\n case \"merge\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Rejoindre\";\n break;\n case \"ramp\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Prendre la bretelle\";\n break;\n case \"on ramp\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Prendre la bretelle\";\n break;\n case \"off ramp\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Prendre la sortie\";\n break;\n case \"fork\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Sur la bifurcation, prendre\";\n break;\n case \"end of road\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"À la fin de la route, prendre\";\n break;\n case \"use lane\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Utiliser la file\";\n break;\n case \"continue\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Continuer\";\n break;\n case \"roundabout\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Au rond-point\";\n break;\n case \"rotary\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Au rond-point\";\n break;\n case \"roundabout turn\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Au rond point, tourner\";\n break;\n case \"notification\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"\";\n break;\n default:\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"?\" + step.instruction.type + \"?\";\n break;\n }\n if (step.instruction.modifier) {\n switch (step.instruction.modifier) {\n case \"uturn\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction = \"Faire demi-tour\";\n break;\n case \"sharp right\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" complètement à droite\";\n break;\n case \"right\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" à droite\";\n break;\n case \"slight right\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" légèrement à droite\";\n break;\n case \"straight\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction = \"Continuer tout droit\";\n break;\n case \"slight left\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" lègèrement à gauche\";\n break;\n case \"left\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" à gauche\";\n break;\n case \"sharp left\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" complètement à gauche\";\n break;\n default:\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" ?\" + step.instruction.modifier + \"?\";\n break;\n }\n }\n if (step.instruction.exit) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"\".concat(step.instruction.exit, \"e sortie\");\n }\n if (step.attributes.name) {\n if (step.attributes.name.nom_1_droite || step.attributes.name.toponyme) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" sur\";\n }\n if (step.attributes.name.nom_1_droite) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" \".concat(step.attributes.name.nom_1_droite);\n }\n if (step.attributes.name.toponyme) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" \".concat(step.attributes.name.toponyme);\n }\n }\n });\n }\n }\n if (!data) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", \"json\")));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION_2\")));\n return;\n }\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9Sb3V0ZVJlc3BvbnNlRmFjdG9yeS5qcz8zMTg2Il0sIm5hbWVzIjpbIlJvdXRlUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIkpTT05SZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsIm1lc3NhZ2UiLCJvbkVycm9yIiwiY2FsbCIsInNjb3BlIiwiRXJyb3JTZXJ2aWNlIiwiTVJlcyIsImdldE1lc3NhZ2UiLCJsZWdzIiwibGVnU3RlcHMiLCJzdGVwcyIsIlJvdXRlUmVzcG9uc2UiLCJoYXNPd25Qcm9wZXJ0eSIsInRvdGFsVGltZSIsInBhcnNlRmxvYXQiLCJkdXJhdGlvbiIsInRvdGFsRGlzdGFuY2UiLCJkaXN0YW5jZSIsImJib3giLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJ0b3AiLCJnZW9tZXRyeUluSW5zdHJ1Y3Rpb25zIiwicm91dGVHZW9tZXRyeSIsImdlb21ldHJ5IiwibGVnTGlzdCIsInBvcnRpb25zIiwiaSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInB1c2giLCJjb25jYXQiLCJmb3JFYWNoIiwic3RlcCIsInJvdXRlSW5zdHJ1Y3Rpb25zIiwiUm91dGVJbnN0cnVjdGlvbiIsImNvZGUiLCJpbnN0cnVjdGlvbiIsIm5hbWUiLCJ0eXBlIiwibW9kaWZpZXIiLCJleGl0IiwiYXR0cmlidXRlcyIsIm5vbV8xX2Ryb2l0ZSIsInRvcG9ueW1lIiwiZXhjZXB0aW9uUmVwb3J0Iiwib25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0Q7QUFDQTtBQUNRO0FBQ1Y7QUFDTTs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLG9C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Q2hHO0lBQ0o7SUFFQWpCLE9BQU8sQ0FBQzBELFNBQVMsQ0FBQzdDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUVULElBQUksQ0FBQztFQUMvQztBQUNKLENBQUM7QUFFY1AsbUZBQW9CIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1JvdXRlL1Jlc3BvbnNlL1JvdXRlUmVzcG9uc2VGYWN0b3J5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgTVJlcyBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgUm91dGVSZXNwb25zZSBmcm9tIFwiLi9tb2RlbC9Sb3V0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgUm91dGVJbnN0cnVjdGlvbiBmcm9tIFwiLi9tb2RlbC9Sb3V0ZUluc3RydWN0aW9uXCI7XG5cbi8qKlxuICogRmFjdG9yeSBwb3VyIGfDqW7DqXJlciB1bmUgcmVwb25zZSBKU09OIMOgIHBhcnRpciBkJ3VuIFhNTCBvdSBkJ3VuIEpTT05cbiAqIChGYWN0b3J5KVxuICpcbiAqIEBtb2R1bGUgUm91dGVSZXNwb25zZUZhY3RvcnlcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Sb3V0ZS5SZXNwb25zZS5Sb3V0ZVJlc3BvbnNlRmFjdG9yeVxuICogQHByaXZhdGVcbiAqL1xudmFyIFJvdXRlUmVzcG9uc2VGYWN0b3J5ID0ge1xuXG4gICAgLyoqXG4gICAgICogaW50ZXJmYWNlIHVuaXF1ZVxuICAgICAqXG4gICAgICogQG1ldGhvZCBidWlsZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZGVmaW5pZXMgZGFucyBsZSBjb21wb3NhbnQgUm91dGVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6XG4gICAgICogICAgICByYXdSZXNwb25zZSA6XG4gICAgICogICAgICBzY29wZSA6XG4gICAgICogICAgICBvblN1Y2Nlc3MgOlxuICAgICAqICAgICAgb25FcnJvciA6XG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJSb3V0ZVJlc3BvbnNlRmFjdG9yeVwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiUm91dGVSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIik7XG5cbiAgICAgICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiByYXdcIik7XG4gICAgICAgICAgICAgICAgZGF0YSA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiBqc29uXCIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIEpTT05SZXNwb25zZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgSlNPTlJlc3BvbnNlID0gSlNPTi5wYXJzZShvcHRpb25zLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBKU09OUmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdGlvbiBkZSBsJ29iamV0IHLDqXBvbnNlIEpTT05cbiAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxlIHNlcnZpY2UgcmVudm9pZSB0IGlsIHVuZSBlcnJldXIgP1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4LiB7XCJtZXNzYWdlXCI6XCJtZXNzYWdlIG5vdCBudWxsXCIsIFwic3RhdHVzXCI6XCJFUlJPUlwifVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBKU09OUmVzcG9uc2UubWVzc2FnZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbGVncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVnU3RlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBSb3V0ZVJlc3BvbnNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJ0b3RhbFRpbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudG90YWxUaW1lID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwidG90YWxEaXN0YW5jZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50b3RhbERpc3RhbmNlID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuZGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJiYm94XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJib3gubGVmdCA9IHBhcnNlRmxvYXQoSlNPTlJlc3BvbnNlLmJib3hbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5iYm94LmJvdHRvbSA9IHBhcnNlRmxvYXQoSlNPTlJlc3BvbnNlLmJib3hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5iYm94LnJpZ2h0ID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuYmJveFsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJib3gudG9wID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuYmJveFszXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInJvdXRlR2VvbWV0cnlcIikgJiYgIW9wdGlvbnMuZ2VvbWV0cnlJbkluc3RydWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUdlb21ldHJ5ID0gSlNPTlJlc3BvbnNlLmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJyb3V0ZUluc3RydWN0aW9uc1wiKSAmJiBvcHRpb25zLmdlb21ldHJ5SW5JbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZWdMaXN0ID0gSlNPTlJlc3BvbnNlLnBvcnRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZWdMaXN0KSAmJiBsZWdMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZWdMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ3MucHVzaChsZWdMaXN0W2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdTdGVwcy5wdXNoKGxlZ3NbaV0uc3RlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWdTdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVnU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBzdGVwcy5jb25jYXQobGVnU3RlcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnMucHVzaChuZXcgUm91dGVJbnN0cnVjdGlvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uZHVyYXRpb24gPSBzdGVwLmR1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kaXN0YW5jZSA9IHN0ZXAuZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmNvZGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmdlb21ldHJ5ID0gc3RlcC5nZW9tZXRyeTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG5lIHNvdWhhaXRlIHBhcyBkZSBjZSB0eXBlIGRlIHZhbGV1ci4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLm5hbWUgPT09IFwiVmFsZXVyIG5vbiByZW5zZWlnbsOpZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAubmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGVwLmluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInR1cm5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIlRvdXJuZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibmV3IG5hbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIkNvbnRpbnVlciB0b3V0IGRyb2l0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRlcGFydFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiRMOpcGFydFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJpdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIkFycml2w6llXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lcmdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJSZWpvaW5kcmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmFtcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiUHJlbmRyZSBsYSBicmV0ZWxsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJvbiByYW1wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJQcmVuZHJlIGxhIGJyZXRlbGxlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZiByYW1wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJQcmVuZHJlIGxhIHNvcnRpZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb3JrXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJTdXIgbGEgYmlmdXJjYXRpb24sIHByZW5kcmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kIG9mIHJvYWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIsOAIGxhIGZpbiBkZSBsYSByb3V0ZSwgcHJlbmRyZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1c2UgbGFuZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiVXRpbGlzZXIgbGEgZmlsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjb250aW51ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiQ29udGludWVyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJvdW5kYWJvdXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIkF1IHJvbmQtcG9pbnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicm90YXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJBdSByb25kLXBvaW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJvdW5kYWJvdXQgdHVyblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiQXUgcm9uZCBwb2ludCwgdG91cm5lclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJub3RpZmljYXRpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCI/XCIgKyBzdGVwLmluc3RydWN0aW9uLnR5cGUgKyBcIj9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmluc3RydWN0aW9uLm1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RlcC5pbnN0cnVjdGlvbi5tb2RpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInV0dXJuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uID0gXCJGYWlyZSBkZW1pLXRvdXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaGFycCByaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIiBjb21wbMOodGVtZW50IMOgIGRyb2l0ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiIMOgIGRyb2l0ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNsaWdodCByaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIiBsw6lnw6hyZW1lbnQgw6AgZHJvaXRlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RyYWlnaHRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gPSBcIkNvbnRpbnVlciB0b3V0IGRyb2l0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2xpZ2h0IGxlZnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCIgbMOoZ8OocmVtZW50IMOgIGdhdWNoZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCIgw6AgZ2F1Y2hlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2hhcnAgbGVmdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIiBjb21wbMOodGVtZW50IMOgIGdhdWNoZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCIgP1wiICsgc3RlcC5pbnN0cnVjdGlvbi5tb2RpZmllciArIFwiP1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuaW5zdHJ1Y3Rpb24uZXhpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gYCR7c3RlcC5pbnN0cnVjdGlvbi5leGl0fWUgc29ydGllYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC5hdHRyaWJ1dGVzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuYXR0cmlidXRlcy5uYW1lLm5vbV8xX2Ryb2l0ZSB8fCBzdGVwLmF0dHJpYnV0ZXMubmFtZS50b3BvbnltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiIHN1clwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuYXR0cmlidXRlcy5uYW1lLm5vbV8xX2Ryb2l0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IGAgJHtzdGVwLmF0dHJpYnV0ZXMubmFtZS5ub21fMV9kcm9pdGV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmF0dHJpYnV0ZXMubmFtZS50b3BvbnltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IGAgJHtzdGVwLmF0dHJpYnV0ZXMubmFtZS50b3BvbnltZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0VcIiwgXCJqc29uXCIpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaSBsYSByw6lwb25zZSBjb250ZW5haXQgdW5lIGV4Y2VwdGlvbiByZW52b3nDqWUgcGFyIGxlIHNlcnZpY2VcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5leGNlcHRpb25SZXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTl8yXCIpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMub25TdWNjZXNzLmNhbGwob3B0aW9ucy5zY29wZSwgZGF0YSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUm91dGVSZXNwb25zZUZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Route/Response/RouteResponseFactory.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Response/model/RouteInstruction.js": -/*!***************************************************************!*\ - !*** ./src/Services/Route/Response/model/RouteInstruction.js ***! - \***************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single Route Instruction object.\n *\n * @property {String} code - Instruction code :\n *\n * - \"F\" : Straight forward\n * - \"B\" : U-turn\n * - \"L\" : turn left\n * - \"R\" : turn right\n * - \"BL\" : turn left strongly\n * - \"BR\" : turn right strongly\n * - \"FL\" : turn lightly to the left\n * - \"FR\" : turn lightly to the right\n * - \"round_about_entry\" : round about entry\n * - \"round_about_exit\" : round about exit\n *\n * @property {String} instruction - Instruction text : translated code + street name\n * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street.\n * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter.\n * @property {Float} duration - Instruction duration in seconds.\n *\n * @namespace\n * @alias Gp.Services.Route.RouteInstruction\n */\nfunction RouteInstruction() {\n if (!(this instanceof RouteInstruction)) {\n throw new TypeError(\"RouteInstruction constructor cannot be called as a function.\");\n }\n this.duration = null;\n this.distance = null;\n this.code = null;\n this.instruction = null;\n this.geometry = null; // FIXME can be null if option 'geometryInInstructions' is false !\n}\n\nRouteInstruction.prototype = {\n constructor: RouteInstruction\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteInstruction);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZUluc3RydWN0aW9uLmpzPzFlOTciXSwibmFtZXMiOlsiUm91dGVJbnN0cnVjdGlvbiIsIlR5cGVFcnJvciIsImR1cmF0aW9uIiwiZGlzdGFuY2UiLCJjb2RlIiwiaW5zdHJ1Y3Rpb24iLCJnZW9tZXRyeSIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLGdCQUFnQkEsQ0FBQSxFQUFJO0VBQ3pCLElBQUksRUFBRSxJQUFJLFlBQVlBLGdCQUFnQixDQUFDLEVBQUU7SUFDckMsTUFBTSxJQUFJQyxTQUFTLENBQUMsOERBQThELENBQUM7RUFDdkY7RUFFQSxJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBRXBCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUk7RUFFcEIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtFQUVoQixJQUFJLENBQUNDLFdBQVcsR0FBRyxJQUFJO0VBRXZCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFCOztBQUVBTixnQkFBZ0IsQ0FBQ08sU0FBUyxHQUFHO0VBRXpCQyxXQUFXLEVBQUdSO0FBRWxCLENBQUM7QUFFY0EsK0VBQWdCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1JvdXRlL1Jlc3BvbnNlL21vZGVsL1JvdXRlSW5zdHJ1Y3Rpb24uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogU2luZ2xlIFJvdXRlIEluc3RydWN0aW9uIG9iamVjdC5cbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY29kZSAtIEluc3RydWN0aW9uIGNvZGUgOlxuICpcbiAqIC0gXCJGXCIgOiBTdHJhaWdodCBmb3J3YXJkXG4gKiAtIFwiQlwiIDogVS10dXJuXG4gKiAtIFwiTFwiIDogdHVybiBsZWZ0XG4gKiAtIFwiUlwiIDogdHVybiByaWdodFxuICogLSBcIkJMXCIgOiB0dXJuIGxlZnQgc3Ryb25nbHlcbiAqIC0gXCJCUlwiIDogdHVybiByaWdodCBzdHJvbmdseVxuICogLSBcIkZMXCIgOiB0dXJuIGxpZ2h0bHkgdG8gdGhlIGxlZnRcbiAqIC0gXCJGUlwiIDogdHVybiBsaWdodGx5IHRvIHRoZSByaWdodFxuICogLSBcInJvdW5kX2Fib3V0X2VudHJ5XCIgOiByb3VuZCBhYm91dCBlbnRyeVxuICogLSBcInJvdW5kX2Fib3V0X2V4aXRcIiA6IHJvdW5kIGFib3V0IGV4aXRcbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaW5zdHJ1Y3Rpb24gLSBJbnN0cnVjdGlvbiB0ZXh0IDogdHJhbnNsYXRlZCBjb2RlICsgc3RyZWV0IG5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBnZW9tZXRyeSAtIEdlb21ldHJ5IChleHByZXNzZWQgaW4gW0dlb0pTT05de0BsaW5rIGh0dHA6Ly9nZW9qc29uLm9yZy99KSBvZiB0aGUgc3RyZWV0LlxuICogQHByb3BlcnR5IHtGbG9hdH0gZGlzdGFuY2UgLSBMZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLiBFeHByZXNzZWQgaW4ga20gb3IgbSwgZGVwZW5kaW5nIG9uIGRpc3RhbmNlVW5pdCBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge0Zsb2F0fSBkdXJhdGlvbiAtIEluc3RydWN0aW9uIGR1cmF0aW9uIGluIHNlY29uZHMuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJvdXRlLlJvdXRlSW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gUm91dGVJbnN0cnVjdGlvbiAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJvdXRlSW5zdHJ1Y3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSb3V0ZUluc3RydWN0aW9uIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG5cbiAgICB0aGlzLmRpc3RhbmNlID0gbnVsbDtcblxuICAgIHRoaXMuY29kZSA9IG51bGw7XG5cbiAgICB0aGlzLmluc3RydWN0aW9uID0gbnVsbDtcblxuICAgIHRoaXMuZ2VvbWV0cnkgPSBudWxsOyAvLyBGSVhNRSBjYW4gYmUgbnVsbCBpZiBvcHRpb24gJ2dlb21ldHJ5SW5JbnN0cnVjdGlvbnMnIGlzIGZhbHNlICFcbn1cblxuUm91dGVJbnN0cnVjdGlvbi5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IFJvdXRlSW5zdHJ1Y3Rpb25cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgUm91dGVJbnN0cnVjdGlvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Route/Response/model/RouteInstruction.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Response/model/RouteResponse.js": -/*!************************************************************!*\ - !*** ./src/Services/Route/Response/model/RouteResponse.js ***! - \************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call.\n * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route.\n * @property {Array.} routeInstructions - Instructions of the route.\n * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to \"km\" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by \" Km\" (e.g. : \"19.6 Km\"). If distanceUnit parameter was set to \"m\", totalDistance is a string containing the total distance expressed in meters (e.g. : \"19599.14\").\n * @property {Float} totalTime - Route duration in seconds.\n *\n * @namespace\n * @alias Gp.Services.RouteResponse\n */\nfunction RouteResponse() {\n if (!(this instanceof RouteResponse)) {\n throw new TypeError(\"RouteResponse constructor cannot be called as a function.\");\n }\n this.totalTime = null;\n this.totalDistance = null;\n this.bbox = {\n left: null,\n right: null,\n top: null,\n bottom: null\n };\n this.routeGeometry = null; // FIXME can be null if option 'geometryInInstructions' is true !\n\n this.routeInstructions = [];\n}\nRouteResponse.prototype = {\n constructor: RouteResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZVJlc3BvbnNlLmpzPzg5ZTciXSwibmFtZXMiOlsiUm91dGVSZXNwb25zZSIsIlR5cGVFcnJvciIsInRvdGFsVGltZSIsInRvdGFsRGlzdGFuY2UiLCJiYm94IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwicm91dGVHZW9tZXRyeSIsInJvdXRlSW5zdHJ1Y3Rpb25zIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsYUFBYUEsQ0FBQSxFQUFJO0VBQ3RCLElBQUksRUFBRSxJQUFJLFlBQVlBLGFBQWEsQ0FBQyxFQUFFO0lBQ2xDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLDJEQUEyRCxDQUFDO0VBQ3BGO0VBRUEsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSTtFQUVyQixJQUFJLENBQUNDLGFBQWEsR0FBRyxJQUFJO0VBRXpCLElBQUksQ0FBQ0MsSUFBSSxHQUFHO0lBQ1JDLElBQUksRUFBRyxJQUFJO0lBQ1hDLEtBQUssRUFBRyxJQUFJO0lBQ1pDLEdBQUcsRUFBRyxJQUFJO0lBQ1ZDLE1BQU0sRUFBRztFQUNiLENBQUM7RUFFRCxJQUFJLENBQUNDLGFBQWEsR0FBRyxJQUFJLENBQUMsQ0FBQzs7RUFFM0IsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxFQUFFO0FBQy9CO0FBRUFWLGFBQWEsQ0FBQ1csU0FBUyxHQUFHO0VBRXRCQyxXQUFXLEVBQUdaO0FBRWxCLENBQUM7QUFFY0EsNEVBQWEiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvUm91dGUvUmVzcG9uc2UvbW9kZWwvUm91dGVSZXNwb25zZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2VzfnJvdXRlIEdwLlNlcnZpY2VzLnJvdXRlICgpfSBpbnZvY2F0aW9uIHdoZW4gc3VjY2Vzc2Z1bC4gUmVjZWl2ZWQgYXMgdGhlIGFyZ3VtZW50IG9mIG9uU3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0dwLkJCb3h9IGJib3ggLSBCb3VuZGluZyBCb3ggb2YgdGhlIHJvdXRlLiBHaXZlbiB3aGVuIHByb3ZpZGVCQm94IHBhcmFtZXRlciBpcyB1c2VkIGluIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcHJvcGVydHkge09iamVjdH0gcm91dGVHZW9tZXRyeSAtIEdlb21ldHJ5IChleHByZXNzZWQgaW4gW0dlb0pTT05de0BsaW5rIGh0dHA6Ly9nZW9qc29uLm9yZy99KSBvZiB0aGUgcm91dGUuXG4gKiBAcHJvcGVydHkge0FycmF5LjxHcC5TZXJ2aWNlcy5Sb3V0ZS5Sb3V0ZUluc3RydWN0aW9uPn0gcm91dGVJbnN0cnVjdGlvbnMgLSBJbnN0cnVjdGlvbnMgb2YgdGhlIHJvdXRlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRvdGFsRGlzdGFuY2UgLSBMZW5ndGggb2YgdGhlIHJvdXRlLiBJZiBkaXN0YW5jZVVuaXQgcGFyYW1ldGVyIHdhcyBzZXQgdG8gXCJrbVwiIChkZWZhdWx0KSwgdG90YWxEaXN0YW5jZSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSB0b3RhbCBkaXN0YW5jZSBleHByZXNzZWQgaW4ga2lsb21ldGVycywgZm9sbG93ZWQgYnkgXCIgS21cIiAoZS5nLiA6IFwiMTkuNiBLbVwiKS4gSWYgZGlzdGFuY2VVbml0IHBhcmFtZXRlciB3YXMgc2V0IHRvIFwibVwiLCB0b3RhbERpc3RhbmNlIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRvdGFsIGRpc3RhbmNlIGV4cHJlc3NlZCBpbiBtZXRlcnMgKGUuZy4gOiBcIjE5NTk5LjE0XCIpLlxuICogQHByb3BlcnR5IHtGbG9hdH0gdG90YWxUaW1lIC0gUm91dGUgZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuUm91dGVSZXNwb25zZVxuICovXG5mdW5jdGlvbiBSb3V0ZVJlc3BvbnNlICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUm91dGVSZXNwb25zZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJvdXRlUmVzcG9uc2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvdGFsVGltZSA9IG51bGw7XG5cbiAgICB0aGlzLnRvdGFsRGlzdGFuY2UgPSBudWxsO1xuXG4gICAgdGhpcy5iYm94ID0ge1xuICAgICAgICBsZWZ0IDogbnVsbCxcbiAgICAgICAgcmlnaHQgOiBudWxsLFxuICAgICAgICB0b3AgOiBudWxsLFxuICAgICAgICBib3R0b20gOiBudWxsXG4gICAgfTtcblxuICAgIHRoaXMucm91dGVHZW9tZXRyeSA9IG51bGw7IC8vIEZJWE1FIGNhbiBiZSBudWxsIGlmIG9wdGlvbiAnZ2VvbWV0cnlJbkluc3RydWN0aW9ucycgaXMgdHJ1ZSAhXG5cbiAgICB0aGlzLnJvdXRlSW5zdHJ1Y3Rpb25zID0gW107XG59XG5cblJvdXRlUmVzcG9uc2UucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBSb3V0ZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlUmVzcG9uc2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Route/Response/model/RouteResponse.js\n"); - -/***/ }), - -/***/ "./src/Services/Route/Route.js": -/*!*************************************!*\ - !*** ./src/Services/Route/Route.js ***! - \*************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/RouteRequestFactory */ \"./src/Services/Route/Request/RouteRequestFactory.js\");\n/* harmony import */ var _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/RouteResponseFactory */ \"./src/Services/Route/Response/RouteResponseFactory.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service d'itinéraire du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n *\n * @alias Gp.Services.Route\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité.\n *\n * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'json' uniquement et par défaut.\n *\n * @param {String} [options.routePreference = \"fastest\"] - Mode de calcul à utiliser :\n * - le plus rapide « fastest »\n * - le plus court « shortest »\n * Par défaut : « fastest ».\n *\n * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326)\n * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire.\n * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire.\n *\n * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326)\n * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire.\n * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire.\n *\n * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau.\n * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float}\n *\n * @param {String} [options.graph = \"voiture\"] - Type de graphe utilisé : \"Voiture\" ou \"Pieton\".\n * Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non.\n * Par défaut, c'est la valeur \"Voiture\" qui sera utilisée.\n *\n * @param {String[]} [options.exclusions] - DEPRECATED: Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre \"avoidFeature\" d'OpenLS)\n * On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte\n * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »).\n * Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints\n *\n * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities.\n * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement \"banned\".\n * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement \"wayType\".\n * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement \"=\".\n * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement \"autoroute\".\n *\n * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions.\n * (correspond au paramètre \"provideGeometry\" d'OpenLS) Par défaut : false.\n *\n * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse.\n * Par défaut : true.\n *\n * @param {String} [options.distanceUnit = \"m\"] - Indique si la distance doit être exprimée en km ou m dans la réponse.\n * Par défaut : m.\n * @param {String} [options.timeUnit = \"second\"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse. Il peut-être formatté hh:mm::ss avec la valeur standard.\n * Les valeurs possibles sont \"standard\", \"second\", \"minute\" ou \"hour\".\n * Par défaut : \"standard\".\n *\n * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés.\n * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'.\n *\n * @param {String[]} [options.waysAttributes] - Nom des attributs des voies. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities.\n *\n * @example\n * var options = {\n * // options communes aux services\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'XHR',\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * resource : 'bdtopo'\n * outputFormat : 'json',\n * startPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * endPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * provideBbox : true,\n * exclusions : [\"Bridge\", \"Tunnel\", \"Toll\"],\n * distanceUnit : \"km\",\n * graph : \"Voiture\",\n * geometryInInstructions : true,\n * routePreference : \"fastest\"\n * };\n *\n */\nfunction Route(options) {\n if (!(this instanceof Route)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Route\"));\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"Route\";\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.Route\");\n this.logger.trace(\"[Constructeur Route (options)]\");\n if (!options.startPoint) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"startPoint\"));\n }\n\n // on lance une exception afin d'eviter au service de le faire...\n if (options.startPoint.x === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"startPoint.x\"));\n }\n if (options.startPoint.y === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"startPoint.y\"));\n }\n if (!options.endPoint) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"endPoint\"));\n }\n\n // on lance une exception afin d'eviter au service de le faire...\n if (options.endPoint.x === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"endPoint.x\"));\n }\n if (options.endPoint.y === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"endPoint.y\"));\n }\n\n // options par defaut\n\n // on passe l'option outputFormat en minuscules afin d'éviter des exceptions.\n if (options.outputFormat && options.outputFormat !== \"json\") {\n this.logger.warn(\"options.outputFormat could only be json\");\n }\n this.options.outputFormat = \"json\";\n this.options.resource = options.resource || \"bdtopo-osrm\";\n this.options.startPoint = options.startPoint;\n this.options.endPoint = options.endPoint;\n this.options.viaPoints = options.viaPoints || [];\n this.options.routePreference = options.routePreference || \"fastest\";\n /** Gestion des anciennes valeurs de graph */\n if (options.graph) {\n if (options.graph === \"Voiture\") {\n this.options.graph = \"car\";\n }\n if (options.graph === \"Pieton\") {\n this.options.graph = \"pedestrian\";\n }\n } else {\n this.options.graph = \"car\";\n }\n this.options.constraints = [];\n if (options.constraints) {\n if (Array.isArray(options.constraints)) {\n for (var k = 0; k < options.constraints.length; k++) {\n this.options.constraints.push(options.constraints[k]);\n }\n } else {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"constraints\"));\n }\n }\n\n /** Gestion de l'ancien paramètre exclusion */\n var constraintTunnel = {};\n var constraintPont = {};\n var constraintAutoroute = {};\n if (options.exclusions) {\n if (options.exclusions.length !== 0) {\n this.logger.warn(\"options.exclusions is DEPRECATED !!\");\n for (var c = 0; c < options.exclusions.length; c++) {\n if (typeof options.exclusions[c] === \"string\") {\n options.exclusions[c] = options.exclusions[c].toLowerCase();\n } else {\n // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions\n continue;\n }\n if (options.exclusions[c] === \"toll\") {\n constraintAutoroute.constraintType = \"banned\";\n constraintAutoroute.key = \"wayType\";\n constraintAutoroute.operator = \"=\";\n constraintAutoroute.value = \"autoroute\";\n this.options.constraints.push(constraintAutoroute);\n }\n if (options.exclusions[c] === \"tunnel\") {\n constraintTunnel.constraintType = \"banned\";\n constraintTunnel.key = \"wayType\";\n constraintTunnel.operator = \"=\";\n constraintTunnel.value = \"tunnel\";\n this.options.constraints.push(constraintTunnel);\n }\n if (options.exclusions[c] === \"bridge\") {\n constraintPont.constraintType = \"banned\";\n constraintPont.key = \"wayType\";\n constraintPont.operator = \"=\";\n constraintPont.value = \"pont\";\n this.options.constraints.push(constraintPont);\n }\n }\n }\n }\n this.options.geometryInInstructions = options.geometryInInstructions || false;\n this.options.provideBbox = options.provideBbox || true;\n this.options.distanceUnit = options.distanceUnit || \"m\";\n this.options.timeUnit = options.timeUnit || \"second\";\n this.options.expectedStartTime = null; // FIXME not yet implemented !\n this.options.srs = options.srs || \"EPSG:4326\";\n this.options.waysAttributes = options.waysAttributes || [];\n\n // gestion de l'url du service par defaut\n // si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n if (!this.options.serverUrl) {\n // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire\n /* var UrlByDefault = DefaultUrlService.Route.newUrl();\n if (this.options.oldRouteService) {\n UrlByDefault = DefaultUrlService.Route.url();\n } */\n // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire\n var UrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Route.url();\n if (!UrlByDefault) {\n throw new Error(\"Url by default not found !\");\n }\n this.options.serverUrl = UrlByDefault;\n this.logger.trace(\"Serveur URL par defaut : \" + this.options.serverUrl);\n }\n}\n\n/**\n * @lends module:Route#\n */\nRoute.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nRoute.prototype.constructor = Route;\n\n/**\n * (overwrite)\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nRoute.prototype.buildRequest = function (error, success) {\n var options = {\n // spécifique au service\n resource: this.options.resource,\n startPoint: this.options.startPoint,\n endPoint: this.options.endPoint,\n viaPoints: this.options.viaPoints,\n provideBbox: this.options.provideBbox,\n constraints: this.options.constraints,\n distanceUnit: this.options.distanceUnit,\n timeUnit: this.options.timeUnit,\n graph: this.options.graph,\n geometryInInstructions: this.options.geometryInInstructions,\n routePreference: this.options.routePreference,\n srs: this.options.srs,\n waysAttributes: this.options.waysAttributes\n };\n this.request = _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n\n // on teste si la requete a bien été construite !\n if (!this.request) {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\")));\n } else {\n success.call(this, this.request);\n }\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nRoute.prototype.analyzeResponse = function (error, success) {\n // INFO\n // Factory pour masquer la complexité du retour du service\n\n if (this.response) {\n var options = {\n distanceUnit: this.options.distanceUnit,\n timeUnit: this.options.timeUnit,\n response: this.response,\n outputFormat: this.options.outputFormat,\n // utile pour parser la string en mode XHR : JSON ou XML !\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this,\n geometryInInstructions: this.options.geometryInInstructions\n };\n _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Route);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9Sb3V0ZS5qcz9lYjIwIl0sIm5hbWVzIjpbIlJvdXRlIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwiQ29tbW9uU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJzdGFydFBvaW50IiwiRXJyb3IiLCJ4IiwieSIsImVuZFBvaW50Iiwib3V0cHV0Rm9ybWF0Iiwid2FybiIsInJlc291cmNlIiwidmlhUG9pbnRzIiwicm91dGVQcmVmZXJlbmNlIiwiZ3JhcGgiLCJjb25zdHJhaW50cyIsIkFycmF5IiwiaXNBcnJheSIsImsiLCJsZW5ndGgiLCJwdXNoIiwiY29uc3RyYWludFR1bm5lbCIsImNvbnN0cmFpbnRQb250IiwiY29uc3RyYWludEF1dG9yb3V0ZSIsImV4Y2x1c2lvbnMiLCJjIiwidG9Mb3dlckNhc2UiLCJjb25zdHJhaW50VHlwZSIsImtleSIsIm9wZXJhdG9yIiwidmFsdWUiLCJnZW9tZXRyeUluSW5zdHJ1Y3Rpb25zIiwicHJvdmlkZUJib3giLCJkaXN0YW5jZVVuaXQiLCJ0aW1lVW5pdCIsImV4cGVjdGVkU3RhcnRUaW1lIiwic3JzIiwid2F5c0F0dHJpYnV0ZXMiLCJzZXJ2ZXJVcmwiLCJVcmxCeURlZmF1bHQiLCJEZWZhdWx0VXJsU2VydmljZSIsInVybCIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwiYnVpbGRSZXF1ZXN0IiwiZXJyb3IiLCJzdWNjZXNzIiwicmVxdWVzdCIsIlJvdXRlUmVxdWVzdEZhY3RvcnkiLCJidWlsZCIsImNhbGwiLCJFcnJvclNlcnZpY2UiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsInJhd1Jlc3BvbnNlIiwib25FcnJvciIsIm9uU3VjY2VzcyIsInNjb3BlIiwiUm91dGVSZXNwb25zZUZh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QUMsQ0FBQztFQUM3RSxDQUFDLE1BQU07SUFDSHFELE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUNILE9BQU8sQ0FBQztFQUNwQztBQUNKLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTFELEtBQUssQ0FBQ21ELFNBQVMsQ0FBQ1ksZUFBZSxHQUFHLFVBQVVQLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQ3hEO0VBQ0E7O0VBRUEsSUFBSSxJQUFJLENBQUNPLFFBQVEsRUFBRTtJQUNmLElBQUkvRCxPQUFPLEdBQUc7TUFDVnlDLFlBQVksRUFBRyxJQUFJLENBQUN6QyxPQUFPLENBQUN5QyxZQUFZO01BQ3hDQyxRQUFRLEVBQUcsSUFBSSxDQUFDMUMsT0FBTyxDQUFDMEMsUUFBUTtNQUNoQ3FCLFFBQVEsRUFBRyxJQUFJLENBQUNBLFFBQVE7TUFDeEI5QyxZQUFZLEVBQUcsSUFBSSxDQUFDakIsT0FBTyxDQUFDaUIsWUFBWTtNQUFFO01BQzFDK0MsV0FBVyxFQUFHLElBQUksQ0FBQ2hFLE9BQU8sQ0FBQ2dFLFdBQVc7TUFDdENDLE9BQU8sRUFBR1YsS0FBSztNQUNmVyxTQUFTLEVBQUdWLE9BQU87TUFDbkJXLEtBQUssRUFBRyxJQUFJO01BQ1o1QixzQkFBc0IsRUFBRyxJQUFJLENBQUN2QyxPQUFPLENBQUN1QztJQUMxQyxDQUFDO0lBRUQ2QixzRUFBb0IsQ0FBQ1QsS0FBSyxDQUFDM0QsT0FBTyxDQUFDO0VBQ3ZDLENBQUMsTUFBTTtJQUNIdUQsS0FBSyxDQUFDSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUlDLGdFQUFZLENBQUMzRCxnRUFBQyxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0VBQzlFO0FBQ0osQ0FBQztBQUVjSixvRUFBSyIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9Sb3V0ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgQ29tbW9uU2VydmljZSBmcm9tIFwiLi4vQ29tbW9uU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuLi9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IFJvdXRlUmVxdWVzdEZhY3RvcnkgZnJvbSBcIi4vUmVxdWVzdC9Sb3V0ZVJlcXVlc3RGYWN0b3J5XCI7XG5pbXBvcnQgUm91dGVSZXNwb25zZUZhY3RvcnkgZnJvbSBcIi4vUmVzcG9uc2UvUm91dGVSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBBcHBlbCBkdSBzZXJ2aWNlIGQnaXRpbsOpcmFpcmUgZHUgR8Opb3BvcnRhaWwgOlxuICogICAgIGVudm9pIGRlIGxhIHJlcXXDqnRlIGNvbnN0cnVpdGUgc2Vsb24gbGVzIHBhcmFtw6h0cmVzIGVuIG9wdGlvbnMsXG4gKiAgICAgw6l2ZW50dWVsbGVtZW50IHBhcnNpbmcgZXQgYW5hbHlzZSAgZGUgbGEgcsOpcG9uc2UsXG4gKiAgICAgcmV0b3VyIGQndW5lIHLDqXBvbnNlIGVuIHBhcmFtw6h0cmUgZGUgbGEgZm9uY3Rpb24gb25TdWNjZXNzLlxuICpcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Sb3V0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyB7R3AuU2VydmljZXMuQ29tbW9uU2VydmljZX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBzcMOpY2lmaXF1ZXMgYXUgc2VydmljZSAoKyBsZXMgb3B0aW9ucyBoZXJpdMOpZXMpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucmVzb3VyY2UgLSBMYSByZXNzb3VyY2UgdXRpbGlzw6llIHBvdXIgbGUgY2FsY3VsLiBDZSBwYXJhbcOodHJlIGRldnJhaXQgw6p0cmUgb2JsaWdhdG9pcmUgY2FyIGlsIGwnZXN0IGRhbnMgbCdhcHBlbCBhdSBzZXJ2aWNlLiBNYWlzIGlsIG5lIGwnZXN0IHBhcyBwb3VyIGRlcyByYWlzb25zIGRlIHLDqXRyb2NvbXBhdGliaWxpdMOpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLm91dHB1dEZvcm1hdCAtIExlIGZvcm1hdCBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIGl0aW5lcmFpcmUgOiAnanNvbicgdW5pcXVlbWVudCBldCBwYXIgZMOpZmF1dC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucm91dGVQcmVmZXJlbmNlID0gXCJmYXN0ZXN0XCJdIC0gTW9kZSBkZSBjYWxjdWwgw6AgdXRpbGlzZXIgOlxuICogLSBsZSBwbHVzIHJhcGlkZSDCqyBmYXN0ZXN0IMK7XG4gKiAtIGxlIHBsdXMgY291cnQgwqsgc2hvcnRlc3QgwrtcbiAqIFBhciBkw6lmYXV0IDogwqsgZmFzdGVzdCDCuy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5zdGFydFBvaW50IC0gUG9pbnQgZGUgZMOpcGFydCBkdSBjYWxjdWwuIENvb3Jkb25uw6llcyBleHByaW3DqWVzIGVuIGxvbmdpdHVkZXMsIGxhdGl0dWRlcyAoRVBTRzo0MzI2KVxuICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5zdGFydFBvaW50LnggLSBBYmNpc3NlIGR1IHBvaW50IGRlIGTDqXBhcnQgZHUgY2FsY3VsIGQnaXRpbsOpcmFpcmUuXG4gKiBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnN0YXJ0UG9pbnQueSAtIE9yZG9ubsOpZSBkdSBwb2ludCBkZSBkw6lwYXJ0IGR1IGNhbGN1bCBkJ2l0aW7DqXJhaXJlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmVuZFBvaW50IC0gUG9pbnQgZCdhcnJpdsOpZSBkdSBjYWxjdWwuIENvb3Jkb25uw6llcyBleHByaW3DqWVzIGVuIGxvbmdpdHVkZXMsIGxhdGl0dWRlcyAoRVBTRzo0MzI2KVxuICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5lbmRQb2ludC54IC0gQWJjaXNzZSBkdSBwb2ludCBkJ2Fycml2w6llIGR1IGNhbGN1bCBkJ2l0aW7DqXJhaXJlLlxuICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5lbmRQb2ludC55IC0gT3Jkb25uw6llIGR1IHBvaW50IGQnYXJyaXbDqWUgZHUgY2FsY3VsIGQnaXRpbsOpcmFpcmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbXX0gW29wdGlvbnMudmlhUG9pbnRzXSAtIExpc3RlIGRlIHBvaW50ICh7eDpGbG9hdCx5OkZsb2F0fSkgaW50ZXJtw6lkYWlyZXMgcXVlIGwnaXRpbsOpcmFpcmUgZG9pdCBlbXBydW50ZXIgZGFucyBsJ29yZHJlIGR1IHRhYmxlYXUuXG4gKiAgICAgIENvb3Jkb25uw6llcyBleHByaW3DqWVzIGVuIGxvbmdpdHVkZXMsIGxhdGl0dWRlcyAoRVBTRzo0MzI2KSA6e3g6ZmxvYXQsIHk6ZmxvYXR9XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmdyYXBoID0gXCJ2b2l0dXJlXCJdIC0gVHlwZSBkZSBncmFwaGUgdXRpbGlzw6kgOiBcIlZvaXR1cmVcIiBvdSBcIlBpZXRvblwiLlxuICogICAgICBEw6l0ZXJtaW5lIGxlIHByb2ZpbCBkZSB2aXRlc3NlcyB1dGlsaXPDqSBwb3VyIGxlIGNhbGN1bCBhaW5zaSBxdWUgbGVzIHRyb27Dp29ucyBhdXRvcmlzw6lzIG91IG5vbi5cbiAqICAgICAgUGFyIGTDqWZhdXQsIGMnZXN0IGxhIHZhbGV1ciBcIlZvaXR1cmVcIiBxdWkgc2VyYSB1dGlsaXPDqWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmdbXX0gW29wdGlvbnMuZXhjbHVzaW9uc10gLSBERVBSRUNBVEVEOiBDcml0w6hyZXMgZCdleGNsdXNpb25zIMOgIGFwcGxpcXVlciBwb3VyIGxlIGNhbGN1bC4gKGNvcnJlc3BvbmQgYXUgcGFyYW3DqHRyZSBcImF2b2lkRmVhdHVyZVwiIGQnT3BlbkxTKVxuICogICAgICBPbiBwcsOpY2lzZSBpY2kgbGUgdHlwZSBkZSB0cm9uw6dvbnMgcXVlIGwnb24gbmUgdmV1dCBwYXMgcXVlIGwnaXRpbsOpcmFpcmUgZW1wcnVudGVcbiAqICAgICAgKHZhbGV1cnMgcG9zc2libGVzIDogwqsgdG9sbCDCuyAow6l2aXRlciBsZXMgcMOpYWdlcyksIMKrIGJyaWRnZSDCuywgwqsgdHVubmVsIMK7KS5cbiAqICAgICAgQ2UgcGFyYW3DqHRyZSBlc3QgY29uc2VydsOpIHBvdXIgdW5lIHLDqXRyb2NvbXBhdGliaWxpdMOpIGRlIGwnYXBpLiBMZSBub3V2ZWF1IHBhcmFtw6h0cmUgw6AgdXRpbGlzZXIgZXN0IG9wdGlvbnMuY29uc3RyYWludHNcbiAqXG4gKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5jb25zdHJhaW50c10gLSBDcml0w6hyZXMgZGUgY29udHJhaW50ZXMgw6AgYXBwbGlxdWVyIHN1ciB1biBpdGluw6lyYWlyZS4gTGVzIHZhbGV1cnMgZGlzcG9uaWJsZXMgZMOpcGVuZGVudCBkZSBsYSByZXNzb3VyY2UgdXRpbGlzw6llLiBJbCBlc3QgZG9uYyB1dGlsZSBkZSByZWdhcmRlciBsZSBnZXRDYXBhYmlsaXRpZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29uc3RyYWludHMuY29uc3RyYWludFR5cGVdIC0gVHlwZSBkZSBsYSBjb250cmFpbnRlLiBHw6luw6lyYWxlbWVudCBcImJhbm5lZFwiLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLmtleV0gLSBDbMOpIGRlIGxhIGNvbnRyYWludGUuIEfDqW7DqXJhbGVtZW50IFwid2F5VHlwZVwiLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLm9wZXJhdG9yXSAtIE9ww6lyYXRldXIgZGUgbGEgY29udHJhaW50ZS4gR8OpbsOpcmFsZW1lbnQgXCI9XCIuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29uc3RyYWludHMudmFsdWVdIC0gVmFsZXVyIGRlIGxhIGNvbnRyYWludGUuIEfDqW7DqXJhbGVtZW50IFwiYXV0b3JvdXRlXCIuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zID0gZmFsc2VdIC0gSW5kaXF1ZSBzaSBsYSBnw6lvbcOpdHJpZSBkZSBsJ2l0aW7DqXJhaXJlIGRvaXQgw6p0cmUgcmVwcmlzZSBtb3JjZWF1IHBhciBtb3JjZWF1IGRhbnMgbGVzIGluc3RydWN0aW9ucy5cbiAqICAgICAgKGNvcnJlc3BvbmQgYXUgcGFyYW3DqHRyZSBcInByb3ZpZGVHZW9tZXRyeVwiIGQnT3BlbkxTKSBQYXIgZMOpZmF1dCA6IGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHJvdmlkZUJib3ggPSB0cnVlXSAtIEluZGlxdWUgc2kgbGVzIGluc3RydWN0aW9ucyBkb2l2ZW50IMOqdHJlIGxvY2FsaXPDqWVzIHBhciB1bmUgYmJveCBkYW5zIGxhIHLDqXBvbnNlLlxuICogICAgICBQYXIgZMOpZmF1dCA6IHRydWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRpc3RhbmNlVW5pdCA9IFwibVwiXSAtIEluZGlxdWUgc2kgbGEgZGlzdGFuY2UgZG9pdCDDqnRyZSBleHByaW3DqWUgZW4ga20gb3UgbSBkYW5zIGxhIHLDqXBvbnNlLlxuICogICAgICBQYXIgZMOpZmF1dCA6IG0uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGltZVVuaXQgPSBcInNlY29uZFwiXSAtIEluZGlxdWUgc2kgbGEgZHVyw6llIGRvaXQgw6p0cmUgZXhwcmltw6llIGVuIHNlY29uZGUsIG1pbnV0ZSBvdSBoZXVyZSBkYW5zIGxhIHLDqXBvbnNlLiBJbCBwZXV0LcOqdHJlIGZvcm1hdHTDqSBoaDptbTo6c3MgYXZlYyBsYSB2YWxldXIgc3RhbmRhcmQuXG4gKiAgICAgIExlcyB2YWxldXJzIHBvc3NpYmxlcyBzb250IFwic3RhbmRhcmRcIiwgXCJzZWNvbmRcIiwgXCJtaW51dGVcIiBvdSBcImhvdXJcIi5cbiAqICAgICAgUGFyIGTDqWZhdXQgOiBcInN0YW5kYXJkXCIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNyc10gLSBTeXN0w6htZSBkZSBjb29yZG9ubsOpZXMgZGFucyBsZXF1ZWwgbGVzIHBhcmFtw6h0cmVzIGfDqW9ncmFwaGlxdWVzIGVuIGVudHLDqWUgZXQgbGEgcsOpcG9uc2UgZHUgc2VydmljZSBzb250IGV4cHJpbcOpcy5cbiAqICAgICAgUGFzIGRlIHZhbGV1ciBwYXIgZMOpZmF1dC4gU2kgbGUgc2VydmV1ciBjb25zdWx0w6kgZXN0IGNlbHVpIGR1IEfDqW9wb3J0YWlsLCBsYSB2YWxldXIgcGFyIGTDqWZhdXQgc2VyYSBkb25jIGNlbGxlIGR1IHNlcnZpY2UgOiAnRVBTRzo0MzI2Jy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBbb3B0aW9ucy53YXlzQXR0cmlidXRlc10gLSBOb20gZGVzIGF0dHJpYnV0cyBkZXMgdm9pZXMuIExlcyB2YWxldXJzIGRpc3BvbmlibGVzIGTDqXBlbmRlbnQgZGUgbGEgcmVzc291cmNlIHV0aWxpc8OpZS4gSWwgZXN0IGRvbmMgdXRpbGUgZGUgcmVnYXJkZXIgbGUgZ2V0Q2FwYWJpbGl0aWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIC8vIG9wdGlvbnMgY29tbXVuZXMgYXV4IHNlcnZpY2VzXG4gKiAgICAgIGFwaUtleSA6IG51bGwsXG4gKiAgICAgIHNlcnZlclVybCA6ICdodHRwOi8vbG9jYWxob3N0L3NlcnZpY2UvJyxcbiAqICAgICAgcHJvdG9jb2wgOiAnWEhSJyxcbiAqICAgICAgcHJveHlVUkwgOiBudWxsLFxuICogICAgICBodHRwTWV0aG9kIDogJ0dFVCcsIC8vIEdFVHxQT1NUXG4gKiAgICAgIHRpbWVPdXQgOiAxMDAwMCwgLy8gbXNcbiAqICAgICAgcmF3UmVzcG9uc2UgOiBmYWxzZSwgLy8gdHJ1ZXxmYWxzZVxuICogICAgICBzY29wZSA6IG51bGwsIC8vIHRoaXNcbiAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAqICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7fSxcbiAqICAgICAgLy8gc3DDqWNpZmlxdWUgYXUgc2VydmljZVxuICogICAgICByZXNvdXJjZSA6ICdiZHRvcG8nXG4gKiAgICAgIG91dHB1dEZvcm1hdCA6ICdqc29uJyxcbiAqICAgICAgc3RhcnRQb2ludCA6IHtcbiAqICAgICAgICAgIHggOiA0Mi4xMTIxLFxuICogICAgICAgICAgeSA6IDEuNTU1N1xuICogICAgICB9LFxuICogICAgICBlbmRQb2ludCA6IHtcbiAqICAgICAgICAgIHggOiA0Mi4xMTIxLFxuICogICAgICAgICAgeSA6IDEuNTU1N1xuICogICAgICB9LFxuICogICAgICBwcm92aWRlQmJveCA6IHRydWUsXG4gKiAgICAgIGV4Y2x1c2lvbnMgOiBbXCJCcmlkZ2VcIiwgXCJUdW5uZWxcIiwgXCJUb2xsXCJdLFxuICogICAgICBkaXN0YW5jZVVuaXQgOiBcImttXCIsXG4gKiAgICAgIGdyYXBoIDogXCJWb2l0dXJlXCIsXG4gKiAgICAgIGdlb21ldHJ5SW5JbnN0cnVjdGlvbnMgOiB0cnVlLFxuICogICAgICByb3V0ZVByZWZlcmVuY2UgOiBcImZhc3Rlc3RcIlxuICogIH07XG4gKlxuICovXG5mdW5jdGlvbiBSb3V0ZSAob3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSb3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfLmdldE1lc3NhZ2UoXCJDTEFTU19DT05TVFJVQ1RPUlwiLCBcIlJvdXRlXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiUm91dGVcIjtcblxuICAgIC8vIGFwcGVsIGR1IGNvbnN0cnVjdGV1ciBwYXIgaGVyaXRhZ2VcbiAgICBDb21tb25TZXJ2aWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJHcC5TZXJ2aWNlcy5Sb3V0ZVwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgUm91dGUgKG9wdGlvbnMpXVwiKTtcblxuICAgIGlmICghb3B0aW9ucy5zdGFydFBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwic3RhcnRQb2ludFwiKSk7XG4gICAgfVxuXG4gICAgLy8gb24gbGFuY2UgdW5lIGV4Y2VwdGlvbiBhZmluIGQnZXZpdGVyIGF1IHNlcnZpY2UgZGUgbGUgZmFpcmUuLi5cbiAgICBpZiAob3B0aW9ucy5zdGFydFBvaW50LnggPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX01JU1NJTkdcIiwgXCJzdGFydFBvaW50LnhcIikpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0YXJ0UG9pbnQueSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcInN0YXJ0UG9pbnQueVwiKSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmVuZFBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwiZW5kUG9pbnRcIikpO1xuICAgIH1cblxuICAgIC8vIG9uIGxhbmNlIHVuZSBleGNlcHRpb24gYWZpbiBkJ2V2aXRlciBhdSBzZXJ2aWNlIGRlIGxlIGZhaXJlLi4uXG4gICAgaWYgKG9wdGlvbnMuZW5kUG9pbnQueCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcImVuZFBvaW50LnhcIikpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmVuZFBvaW50LnkgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX01JU1NJTkdcIiwgXCJlbmRQb2ludC55XCIpKTtcbiAgICB9XG5cbiAgICAvLyBvcHRpb25zIHBhciBkZWZhdXRcblxuICAgIC8vIG9uIHBhc3NlIGwnb3B0aW9uIG91dHB1dEZvcm1hdCBlbiBtaW51c2N1bGVzIGFmaW4gZCfDqXZpdGVyIGRlcyBleGNlcHRpb25zLlxuICAgIGlmIChvcHRpb25zLm91dHB1dEZvcm1hdCAmJiBvcHRpb25zLm91dHB1dEZvcm1hdCAhPT0gXCJqc29uXCIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIm9wdGlvbnMub3V0cHV0Rm9ybWF0IGNvdWxkIG9ubHkgYmUganNvblwiKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCA9IFwianNvblwiO1xuXG4gICAgdGhpcy5vcHRpb25zLnJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZSB8fCBcImJkdG9wby1vc3JtXCI7XG4gICAgdGhpcy5vcHRpb25zLnN0YXJ0UG9pbnQgPSBvcHRpb25zLnN0YXJ0UG9pbnQ7XG4gICAgdGhpcy5vcHRpb25zLmVuZFBvaW50ID0gb3B0aW9ucy5lbmRQb2ludDtcbiAgICB0aGlzLm9wdGlvbnMudmlhUG9pbnRzID0gb3B0aW9ucy52aWFQb2ludHMgfHwgW107XG4gICAgdGhpcy5vcHRpb25zLnJvdXRlUHJlZmVyZW5jZSA9IG9wdGlvbnMucm91dGVQcmVmZXJlbmNlIHx8IFwiZmFzdGVzdFwiO1xuICAgIC8qKiBHZXN0aW9uIGRlcyBhbmNpZW5uZXMgdmFsZXVycyBkZSBncmFwaCAqL1xuICAgIGlmIChvcHRpb25zLmdyYXBoKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmdyYXBoID09PSBcIlZvaXR1cmVcIikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyYXBoID0gXCJjYXJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5ncmFwaCA9PT0gXCJQaWV0b25cIikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyYXBoID0gXCJwZWRlc3RyaWFuXCI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ3JhcGggPSBcImNhclwiO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMuY29uc3RyYWludHMgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5jb25zdHJhaW50cykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBvcHRpb25zLmNvbnN0cmFpbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2gob3B0aW9ucy5jb25zdHJhaW50c1trXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVFlQRVwiLCBcImNvbnN0cmFpbnRzXCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBHZXN0aW9uIGRlIGwnYW5jaWVuIHBhcmFtw6h0cmUgZXhjbHVzaW9uICovXG4gICAgdmFyIGNvbnN0cmFpbnRUdW5uZWwgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludFBvbnQgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludEF1dG9yb3V0ZSA9IHt9O1xuICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVzaW9ucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJvcHRpb25zLmV4Y2x1c2lvbnMgaXMgREVQUkVDQVRFRCAhIVwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb3B0aW9ucy5leGNsdXNpb25zLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGNsdXNpb25zW2NdID0gb3B0aW9ucy5leGNsdXNpb25zW2NdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbmUgY3LDqWUgcGFzIHVuZSBlcnJldXIgcG91ciByw6l0cm8tY29tcGF0aWJpbGl0w6kgYXZlYyBsZXMgYW5jaWVubmVzIHZlcnNpb25zXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcInRvbGxcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5rZXkgPSBcIndheVR5cGVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5vcGVyYXRvciA9IFwiPVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLnZhbHVlID0gXCJhdXRvcm91dGVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludEF1dG9yb3V0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwidHVubmVsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC5jb25zdHJhaW50VHlwZSA9IFwiYmFubmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwub3BlcmF0b3IgPSBcIj1cIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC52YWx1ZSA9IFwidHVubmVsXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRUdW5uZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcImJyaWRnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFBvbnQua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250Lm9wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LnZhbHVlID0gXCJwb250XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRQb250KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMuZ2VvbWV0cnlJbkluc3RydWN0aW9ucyA9IG9wdGlvbnMuZ2VvbWV0cnlJbkluc3RydWN0aW9ucyB8fCBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMucHJvdmlkZUJib3ggPSBvcHRpb25zLnByb3ZpZGVCYm94IHx8IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLmRpc3RhbmNlVW5pdCA9IG9wdGlvbnMuZGlzdGFuY2VVbml0IHx8IFwibVwiO1xuICAgIHRoaXMub3B0aW9ucy50aW1lVW5pdCA9IG9wdGlvbnMudGltZVVuaXQgfHwgXCJzZWNvbmRcIjtcbiAgICB0aGlzLm9wdGlvbnMuZXhwZWN0ZWRTdGFydFRpbWUgPSBudWxsOyAvLyBGSVhNRSBub3QgeWV0IGltcGxlbWVudGVkICFcbiAgICB0aGlzLm9wdGlvbnMuc3JzID0gb3B0aW9ucy5zcnMgfHwgXCJFUFNHOjQzMjZcIjtcbiAgICB0aGlzLm9wdGlvbnMud2F5c0F0dHJpYnV0ZXMgPSBvcHRpb25zLndheXNBdHRyaWJ1dGVzIHx8IFtdO1xuXG4gICAgLy8gZ2VzdGlvbiBkZSBsJ3VybCBkdSBzZXJ2aWNlIHBhciBkZWZhdXRcbiAgICAvLyBzaSBsJ3VybCBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUsIGlsIGZhdXQgdXRpbGlzZXIgbGVzIHVybHMgcGFyIGRlZmF1dFxuICAgIGlmICghdGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgICAvLyBDb2RlIGNvbW1lbnTDqSA6IFJlbGVhc2UgYmV0YSBzZXJ2aWNlcyBESUZGVVNJT04gdW5pcXVlbWVudCA6IG9uIHRhcGUgc3VyIGwnYW52Y2llbiBzZXJ2aWNlIGQnaXRpbsOpcmFpcmVcbiAgICAgICAgLyogdmFyIFVybEJ5RGVmYXVsdCA9IERlZmF1bHRVcmxTZXJ2aWNlLlJvdXRlLm5ld1VybCgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9sZFJvdXRlU2VydmljZSkge1xuICAgICAgICAgICAgVXJsQnlEZWZhdWx0ID0gRGVmYXVsdFVybFNlcnZpY2UuUm91dGUudXJsKCk7XG4gICAgICAgIH0gKi9cbiAgICAgICAgLy8gUmVsZWFzZSBiZXRhIHNlcnZpY2VzIERJRkZVU0lPTiB1bmlxdWVtZW50IDogb24gdGFwZSBzdXIgbCdhbnZjaWVuIHNlcnZpY2UgZCdpdGluw6lyYWlyZVxuICAgICAgICB2YXIgVXJsQnlEZWZhdWx0ID0gRGVmYXVsdFVybFNlcnZpY2UuUm91dGUudXJsKCk7XG5cbiAgICAgICAgaWYgKCFVcmxCeURlZmF1bHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVybCBieSBkZWZhdWx0IG5vdCBmb3VuZCAhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwgPSBVcmxCeURlZmF1bHQ7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiU2VydmV1ciBVUkwgcGFyIGRlZmF1dCA6IFwiICsgdGhpcy5vcHRpb25zLnNlcnZlclVybCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsZW5kcyBtb2R1bGU6Um91dGUjXG4gKi9cblJvdXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5Sb3V0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSb3V0ZTtcblxuLyoqXG4gKiAob3ZlcndyaXRlKVxuICogQ3LDqWF0aW9uIGRlIGxhIHJlcXXDqnRlXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAqL1xuUm91dGUucHJvdG90eXBlLmJ1aWxkUmVxdWVzdCA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlXG4gICAgICAgIHJlc291cmNlIDogdGhpcy5vcHRpb25zLnJlc291cmNlLFxuICAgICAgICBzdGFydFBvaW50IDogdGhpcy5vcHRpb25zLnN0YXJ0UG9pbnQsXG4gICAgICAgIGVuZFBvaW50IDogdGhpcy5vcHRpb25zLmVuZFBvaW50LFxuICAgICAgICB2aWFQb2ludHMgOiB0aGlzLm9wdGlvbnMudmlhUG9pbnRzLFxuICAgICAgICBwcm92aWRlQmJveCA6IHRoaXMub3B0aW9ucy5wcm92aWRlQmJveCxcbiAgICAgICAgY29uc3RyYWludHMgOiB0aGlzLm9wdGlvbnMuY29uc3RyYWludHMsXG4gICAgICAgIGRpc3RhbmNlVW5pdCA6IHRoaXMub3B0aW9ucy5kaXN0YW5jZVVuaXQsXG4gICAgICAgIHRpbWVVbml0IDogdGhpcy5vcHRpb25zLnRpbWVVbml0LFxuICAgICAgICBncmFwaCA6IHRoaXMub3B0aW9ucy5ncmFwaCxcbiAgICAgICAgZ2VvbWV0cnlJbkluc3RydWN0aW9ucyA6IHRoaXMub3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zLFxuICAgICAgICByb3V0ZVByZWZlcmVuY2UgOiB0aGlzLm9wdGlvbnMucm91dGVQcmVmZXJlbmNlLFxuICAgICAgICBzcnMgOiB0aGlzLm9wdGlvbnMuc3JzLFxuICAgICAgICB3YXlzQXR0cmlidXRlcyA6IHRoaXMub3B0aW9ucy53YXlzQXR0cmlidXRlc1xuICAgIH07XG5cbiAgICB0aGlzLnJlcXVlc3QgPSBSb3V0ZVJlcXVlc3RGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuXG4gICAgLy8gb24gdGVzdGUgc2kgbGEgcmVxdWV0ZSBhIGJpZW4gw6l0w6kgY29uc3RydWl0ZSAhXG4gICAgaWYgKCF0aGlzLnJlcXVlc3QpIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVRVUVTVF9CVUlMRFwiKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLnJlcXVlc3QpO1xuICAgIH1cbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIEFuYWx5c2UgZGUgbGEgcmVwb25zZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblJvdXRlLnByb3RvdHlwZS5hbmFseXplUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAvLyBJTkZPXG4gICAgLy8gRmFjdG9yeSBwb3VyIG1hc3F1ZXIgbGEgY29tcGxleGl0w6kgZHUgcmV0b3VyIGR1IHNlcnZpY2VcblxuICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgZGlzdGFuY2VVbml0IDogdGhpcy5vcHRpb25zLmRpc3RhbmNlVW5pdCxcbiAgICAgICAgICAgIHRpbWVVbml0IDogdGhpcy5vcHRpb25zLnRpbWVVbml0LFxuICAgICAgICAgICAgcmVzcG9uc2UgOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgICAgICAgb3V0cHV0Rm9ybWF0IDogdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCwgLy8gdXRpbGUgcG91ciBwYXJzZXIgbGEgc3RyaW5nIGVuIG1vZGUgWEhSIDogSlNPTiBvdSBYTUwgIVxuICAgICAgICAgICAgcmF3UmVzcG9uc2UgOiB0aGlzLm9wdGlvbnMucmF3UmVzcG9uc2UsXG4gICAgICAgICAgICBvbkVycm9yIDogZXJyb3IsXG4gICAgICAgICAgICBvblN1Y2Nlc3MgOiBzdWNjZXNzLFxuICAgICAgICAgICAgc2NvcGUgOiB0aGlzLFxuICAgICAgICAgICAgZ2VvbWV0cnlJbkluc3RydWN0aW9ucyA6IHRoaXMub3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zXG4gICAgICAgIH07XG5cbiAgICAgICAgUm91dGVSZXNwb25zZUZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Route/Route.js\n"); - -/***/ }), - -/***/ "./src/Services/Services.js": -/*!**********************************!*\ - !*** ./src/Services/Services.js ***! - \**********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Config_Config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Config/Config */ \"./src/Services/Config/Config.js\");\n/* harmony import */ var _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Alti/Alti */ \"./src/Services/Alti/Alti.js\");\n/* harmony import */ var _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Geocode/Geocode */ \"./src/Services/Geocode/Geocode.js\");\n/* harmony import */ var _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Geocode/ReverseGeocode */ \"./src/Services/Geocode/ReverseGeocode.js\");\n/* harmony import */ var _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AutoComplete/AutoComplete */ \"./src/Services/AutoComplete/AutoComplete.js\");\n/* harmony import */ var _Route_Route__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Route/Route */ \"./src/Services/Route/Route.js\");\n/* harmony import */ var _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ProcessIsoCurve/ProcessIsoCurve */ \"./src/Services/ProcessIsoCurve/ProcessIsoCurve.js\");\n/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"point|circle|bbox\" }] */\n\n/**\n* Geoportal web services invocation namespace.\n*\n* @module Services\n* @alias Gp.Services\n*/\n\n\n\n\n\n\n\nvar Services = {\n /**\n * Access to Geoportal resources metadata availables with one ore several keys\n *\n * @method getConfig\n * @param {Object} options - Options for function call.\n * @param {String} [options.apiKey] - Access key(s) (\",\" as separator, no spaces) to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}\n * @param {String} [options.customConfigFile] - path to a local config file. Overload the apiKey parameter\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if \"rawResponse\" parameter is set to true : a String will be returned.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n */\n getConfig: function getConfig(options) {\n var configService = new _Config_Config__WEBPACK_IMPORTED_MODULE_0__[\"default\"](options);\n configService.call();\n },\n /**\n * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.
\n * Two use cases are availables :
\n * 1. getting elevations of the given points : don't use the options.sampling parameter ;
\n * 2. getting a regular set of elevations along the given points : use the options.sampling parameter.\n *\n * @method getAltitude\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {Array.} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter.\n * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.
\n * If not used, only elevations of these positions will be returned.\n * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST'. Only use if you know what you are doing.\n * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing.\n */\n getAltitude: function getAltitude(options) {\n var altiService = new _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__[\"default\"](options);\n altiService.call();\n },\n /**\n * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}.\n *\n * @example\n * Gp.Services.geocode ({\n * apiKey : \"carte\",\n * location : \"73 avenue de Paris, Saint-Mandé\",\n * // traitement des resultats\n * onSuccess : function (result) {\n * console.log(\"found (x:\"+result.position.x+\", y:\"+result.position.y+\")\") ;\n * }\n * }) ;\n *\n *\n * @method geocode\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} [options.index=\"StreetAddress\"] - Geographical identifier type to search. Values currently availables are : \"PositionOfInterest\" for place names, \"StreetAddress\" for address search, \"CadastralParcel\" for Cadastral parcels search, \"location\" for a multi-index search on \"StreetAddress\" and \"PositionOfInterest\". Default is \"StreetAddress\".\n * @param {String} options.query - Geographic identifier to locate.\n * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given.\n * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be \"String\".\n *

\n * Properties availables for address search :
\n * \"postalCode\", \"inseeCode\" and \"city\".\n *

\n * Properties availables for place names search :
\n * \"postalCode\", \"inseeCode\" and \"type\".\n *

\n * Properties availables for cadastral parcels search :
\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided.\n * @param {Boolean} [options.returnTrueGeometry=false] - Set this parameter to true if you wish to have the true geometrie returned.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n geocode: function geocode(options) {\n var geocodeService = new _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__[\"default\"](options);\n geocodeService.call();\n },\n /**\n * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}.\n *\n * @method reverseGeocode\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} [options.index=\"StreetAddress\"] - Geographical identifier type to search. Values currently availables are : \"PositionOfInterest\" for place names, \"StreetAddress\" for address search, \"CadastralParcel\" for Cadastral parcels search, \"location\" for a multi-index search on \"StreetAddress\" and \"PositionOfInterest\". Default is \"StreetAddress\".\n * @param {Object} options.position - Reference position where to search geographical identifiers.\n * @param {Float} options.position.lon - Longitude\n * @param {Float} options.position.lat - Latitude\n * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given.\n * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be \"String\".\n *

\n * Properties availables for address search :
\n * \"postalCode\", \"inseeCode\" and \"city\".\n *

\n * Properties availables for place names search :
\n * \"postalCode\", \"inseeCode\" and \"type\".\n *

\n * Properties availables for cadastral parcels search :
\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n * @param {Object} [options.searchGeometry] - Location where to perform the search.\n * @param {String} options.searchGeometry.type - Geometry type (Point|Circle|Linestring|Polygon)\n * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordinates\n * @param {Float} [options.searchGeometry.radius] - Radius (only for type 'Circle')\n * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n reverseGeocode: function reverseGeocode(options) {\n var reverseGeocodeService = new _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__[\"default\"](options);\n reverseGeocodeService.call();\n },\n /**\n * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html}\n *\n * @method autoComplete\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} options.text - Text input to complete.\n * @param {Array.} [options.filterOptions.type = \"StreetAddress\"] - Suggestion types to provide : address (\"StreetAddress\") and/or place name (\"PositionOfInterest\").\n * @param {Array.} [options.filterOptions.territory] - Places where to limit the search of suggestions : \"METROPOLE\" (Corsica and metropolitan France), \"DOMTOM\" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31']\n * @param {Number} [options.maximumResponses = 10] - Maximum number of responses.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n autoComplete: function autoComplete(options) {\n var autoCompleteService = new _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__[\"default\"](options);\n autoCompleteService.call();\n },\n /**\n * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}.\n *\n * @method route\n * @param {Object} options - Options for function call.\n * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} [options.routePreference = \"fastest\"] - Indicates the way to compute the route : \"fastest\" (time optimisation) or \"shortest\" (distance optimisation). Available values are in the GetCapabilities.\n * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude). Available bbox are in the GetCapabilities.\n * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude). Available bbox are in the GetCapabilities.\n * @param {Array.} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude). Available bbox are in the GetCapabilities.\n * @param {String} [options.graph = \"Voiture\"] - User profile to use to compute the route : \"Voiture\" (using a vehicule) or \"Pieton\" (pedestrian). Has an influence on the kind of roads the route may use and the average speed. Available bbox are in the GetCapabilities.\n * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features (\"toll\", \"bridge\" or \"tunnel\").\n * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions.\n * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response.\n * @param {String} [options.distanceUnit = \"m\"] - The unit used to provide distances in the response (\"meter\" or \"kilometer\").\n * @param {String} [options.timeUnit = \"second\"] - The unit used to provide duration in the response (\"standard\", \"second\", \"minute\", \"hour\").\n * @param {Array.} [options.waysAttributes] - Way Attributes to add in the response. Available values are in the GetCapabilities.\n * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.outputFormat='json'] - Output format (\"json\" or \"xml\") to use for underlying webService. Only use if you know what you are doing.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n route: function route(options) {\n var routeService = new _Route_Route__WEBPACK_IMPORTED_MODULE_5__[\"default\"](options);\n routeService.call();\n },\n /**\n * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}.\n *\n * @method isoCurve\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities.\n * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude).\n * @param {String} [options.graph = \"Voiture\"] - User profile to use to compute the isoCurve : \"Voiture\" (using a vehicule) or \"Pieton\" (pedestrian). Has an influence on the kind of roads to use and the average speed. Available values are in the GetCapabilities.\n * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features (\"toll\", \"bridge\" or \"tunnel\").\n * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities.\n * @param {String} [options.method = \"time\"] - Computing method to use : \"time\" (using a duration as a constraint) or \"distance\" (using a distance as a constraint). Available values are in the GetCapabilities.\n * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to \"time\".\n * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to \"distance\".\n * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing.\n * @param {String} [options.distanceUnit = \"km\"] - The unit used to provide distances in the response (\"m\" or \"km\").\n * @param {String} [options.timeUnit = \"second\"] - The unit used to provide duration in the response (\"standard\", \"second\", \"minute\", \"hour\").\n * @param {Boolean} [options.smoothing = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry to be smoothed.\n * @param {Boolean} [options.holes = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.outputFormat='json'] - Output format (\"json\") to use for underlying webService. Only use if you know what you are doing.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n isoCurve: function isoCurve(options) {\n var processIsoCurveService = new _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__[\"default\"](options);\n processIsoCurveService.call();\n }\n};\n\n/**\n * Point object.\n *\n * @namespace\n * @alias Gp.Point\n *\n * @property {Float} x - Point abscissa\n * @property {Float} y - Point ordinate\n */\nvar point = {};\n\n/**\n * Circle object.\n *\n * @namespace\n * @alias Gp.Circle\n *\n * @property {Float} x - Circle center abscissa.\n * @property {Float} y - Circle center ordinate.\n * @property {Float} radius - Circle radius.\n */\nvar circle = {};\n\n/**\n * Bounding box object, expressed with four coordinates.\n *\n * @namespace\n * @alias Gp.BBox\n *\n * @property {Float} left - minimum abscissa\n * @property {Float} right - maximum abscissa\n * @property {Float} bottom - minimum ordinate\n * @property {Float} top - maximum ordinate\n */\nvar bbox = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Services);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9TZXJ2aWNlcy5qcz83NjZmIl0sIm5hbWVzIjpbIlNlcnZpY2VzIiwiZ2V0Q29uZmlnIiwib3B0aW9ucyIsImNvbmZpZ1NlcnZpY2UiLCJDb25maWciLCJjYWxsIiwiZ2V0QWx0aXR1ZGUiLCJhbHRpU2VydmljZSIsIkFsdGkiLCJnZW9jb2RlIiwiZ2VvY29kZVNlcnZpY2UiLCJHZW9jb2RlIiwicmV2ZXJzZUdlb2NvZGUiLCJyZXZlcnNlR2VvY29kZVNlcnZpY2UiLCJSZXZlcnNlR2VvY29kZSIsImF1dG9Db21wbGV0ZSIsImF1dG9Db21wbGV0ZVNlcnZpY2UiLCJBdXRvQ29tcGxldGUiLCJyb3V0ZSIsInJvdXRlU2VydmljZSIsIlJvdXRlIiwiaXNvQ3VydmUiLCJwcm9jZXNzSXNvQ3VydmVTZXJ2aWNlIiwiUHJvY2Vzc0lzb0N1cnZlIiwicG9pbnQiLCJjaXJjbGUiLCJiYm94Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3FDO0FBQ047QUFDUztBQUNjO0FBQ0M7QUFDckI7QUFDOEI7QUFFaEUsSUFBSUEsUUFBUSxHQUFHO0VBQ1g7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxTQUFTLEVBQUcsU0FBQUEsVUFBVUMsT0FBTyxFQUFFO0lBQzNCLElBQUlDLGFBQWEsR0FBRyxJQUFJQyxzREFBTSxDQUFDRixPQUFPLENBQUM7SUFDdkNDLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDLENBQUM7RUFDeEIsQ0FBQztFQUNEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LElBQUlDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlDLElBQUksR0FBRyxDQUFDLENBQUM7QUFFRTFCLHVFQUFRIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1NlcnZpY2VzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJwb2ludHxjaXJjbGV8YmJveFwiIH1dICovXG5cbi8qKlxuKiBHZW9wb3J0YWwgd2ViIHNlcnZpY2VzIGludm9jYXRpb24gbmFtZXNwYWNlLlxuKlxuKiBAbW9kdWxlIFNlcnZpY2VzXG4qIEBhbGlhcyBHcC5TZXJ2aWNlc1xuKi9cbmltcG9ydCBDb25maWcgZnJvbSBcIi4vQ29uZmlnL0NvbmZpZ1wiO1xuaW1wb3J0IEFsdGkgZnJvbSBcIi4vQWx0aS9BbHRpXCI7XG5pbXBvcnQgR2VvY29kZSBmcm9tIFwiLi9HZW9jb2RlL0dlb2NvZGVcIjtcbmltcG9ydCBSZXZlcnNlR2VvY29kZSBmcm9tIFwiLi9HZW9jb2RlL1JldmVyc2VHZW9jb2RlXCI7XG5pbXBvcnQgQXV0b0NvbXBsZXRlIGZyb20gXCIuL0F1dG9Db21wbGV0ZS9BdXRvQ29tcGxldGVcIjtcbmltcG9ydCBSb3V0ZSBmcm9tIFwiLi9Sb3V0ZS9Sb3V0ZVwiO1xuaW1wb3J0IFByb2Nlc3NJc29DdXJ2ZSBmcm9tIFwiLi9Qcm9jZXNzSXNvQ3VydmUvUHJvY2Vzc0lzb0N1cnZlXCI7XG5cbnZhciBTZXJ2aWNlcyA9IHtcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG8gR2VvcG9ydGFsIHJlc291cmNlcyBtZXRhZGF0YSBhdmFpbGFibGVzIHdpdGggb25lIG9yZSBzZXZlcmFsIGtleXNcbiAgICAgKlxuICAgICAqIEBtZXRob2QgZ2V0Q29uZmlnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hcGlLZXldIC0gQWNjZXNzIGtleShzKSAoXCIsXCIgYXMgc2VwYXJhdG9yLCBubyBzcGFjZXMpIHRvIEdlb3BvcnRhbCBwbGF0Zm9ybSwgb2J0YWluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL3NlcnZpY2VzLXdlYn1cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY3VzdG9tQ29uZmlnRmlsZV0gLSBwYXRoIHRvIGEgbG9jYWwgY29uZmlnIGZpbGUuIE92ZXJsb2FkIHRoZSBhcGlLZXkgcGFyYW1ldGVyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblN1Y2Nlc3MgLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZ2V0dGluZyBzdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2UuIFRha2VzIGEge0BsaW5rIEdwLlNlcnZpY2VzLkdldENvbmZpZ1Jlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgZXhjZXB0IGlmIFwicmF3UmVzcG9uc2VcIiBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUgOiBhIFN0cmluZyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmFpbHVyZV0gLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdW5zdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2VzICh0aW1lT3V0LCBtaXNzaW5nIHJpZ2h0cywgLi4uKS4gVGFrZXMgYSB7QGxpbmsgR3AuRXJyb3J9IG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVPdXQ9MF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFib3ZlIHdoaWNoIGEgdGltZU91dCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIHdpdGggb25GYWlsdXJlIGNhbGxiYWNrIChzZWUgYWJvdmUpLiBEZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGltZU91dCB3aWxsIG5vdCBiZSBoYW5kbGVkLlxuICAgICAqL1xuICAgIGdldENvbmZpZyA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBjb25maWdTZXJ2aWNlID0gbmV3IENvbmZpZyhvcHRpb25zKTtcbiAgICAgICAgY29uZmlnU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXR0aW5nIGVsZXZhdGlvbnMgaW4gb3IgYWxvbmcgb2Ygb25lIG9yIHNldmVyYWwgcG9pbnRzIG9uIGZyZW5jaCB0ZXJyaXRvcmllcyB1c2luZyB0aGUgW2VsZXZhdGlvbiBzZXJ2aWNlcyBvZiB0aGUgR2VvcG9ydGFsIFBsYXRmb3JtXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9kb2N1bWVudGF0aW9uL2dlb3NlcnZpY2VzL2FsdGkuaHRtbH0uPGJyLz5cbiAgICAgKiBUd28gdXNlIGNhc2VzIGFyZSBhdmFpbGFibGVzIDo8YnIvPlxuICAgICAqIDEuIGdldHRpbmcgZWxldmF0aW9ucyBvZiB0aGUgZ2l2ZW4gcG9pbnRzIDogZG9uJ3QgdXNlIHRoZSBvcHRpb25zLnNhbXBsaW5nIHBhcmFtZXRlciA7PGJyLz5cbiAgICAgKiAyLiBnZXR0aW5nIGEgcmVndWxhciBzZXQgb2YgZWxldmF0aW9ucyBhbG9uZyB0aGUgZ2l2ZW4gcG9pbnRzIDogdXNlIHRoZSBvcHRpb25zLnNhbXBsaW5nIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgZ2V0QWx0aXR1ZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm0sIG9idGFpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9zZXJ2aWNlcy13ZWJ9LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIC0gQXJyYXkgb2YgcG9zaXRpb25zICh7bG9uOmZsb2F0LCBsYXQ6ZmxvYXR9KSBleHByZXNzZWQgaW4gQ1JTOjg0IGNvb3JkaW5hdGVzIHN5c3RlbSwgd2hlcmUgdG8gZ2V0IGVsZXZhdGlvbnMuIDUwIHBvc2l0aW9ucyBtYXhpbXVtIG1heSBiZSBnaXZlbi4gMiBwb3NpdGlvbnMgbWluaW11bSBhcmUgcmVxdWlyZWQgaWYgeW91IHVzZSB0aGUgb3B0aW9ucy5zYW1wbGluZyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNhbXBsaW5nXSAtIE51bWJlciBvZiBwb2ludHMgdG8gdXNlIChiZXR3ZWVuIDIgYW5kIDUwMDApIGluIG9yZGVyIHRvIGNvbXB1dGUgYW4gZWxldmF0aW9uIHBhdGguIFRoZSBwb2ludHMgZ2l2ZW4gd2l0aCB0aGUgb3B0aW9ucy5wb3NpdGlvbnMgcGFyYW1ldGVyIGFyZSB1c2VkIHRvIGZpeCB0aGUgcGxhbmltZXRyaWMgcGF0aCBhbG9uZyB3aGljaCB0aGUgZWxldmF0aW9ucyB3aWxsIGJlIGNvbXB1dGVkLjxici8+XG4gICAgICogSWYgbm90IHVzZWQsIG9ubHkgZWxldmF0aW9ucyBvZiB0aGVzZSBwb3NpdGlvbnMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnpvbmx5PWZhbHNlXSAtIFNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGlmIHlvdSBvbmx5IHdhbnQgdG8gaGF2ZSBlbGV2YXRpb25zIHJldHVybmVkIHdpdGhvdXQgY29ycmVzcG9uZGluZyBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuQWx0aVJlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIsIGV4Y2VwdCBpZiBcInJhd1Jlc3BvbnNlXCIgaXMgc2V0IHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GYWlsdXJlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyB1bnN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZXMgKHRpbWVPdXQsIG1pc3NpbmcgcmlnaHRzLCAuLi4pLiBUYWtlcyBhIHtAbGluayBHcC5FcnJvcn0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dD0wXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgYWJvdmUgd2hpY2ggYSB0aW1lT3V0IHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBvbkZhaWx1cmUgY2FsbGJhY2sgKHNlZSBhYm92ZSkuIERlZmF1bHQgdmFsdWUgaXMgMCB3aGljaCBtZWFucyB0aW1lT3V0IHdpbGwgbm90IGJlIGhhbmRsZWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybD1odHRwIChzKTovL3d4cy5pZ24uZnIvQVBJS0VZL2FsdGkvcmVzdC9lbGV2YXRpb24uanNvbl0gLSBXZWIgc2VydmljZSBVUkwuIElmIHVzZWQsIG9wdGlvbnMuYXBpS2V5IHBhcmFtZXRlciBpcyBpZ25vcmVkLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbCA9IHRydWVdIC0gVXNlIG9mIEhUVFBTIG9yIEhUVFAgcHJvdG9jb2wgdG8gcmVxdWVzdCB0aGUgc2VydmljZXMuIEhUVFBTIGJ5IGRlZmF1bHQgKHNzbD10cnVlKS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJvdG9jb2w9WEhSXSAtIFByb3RvY29sIHVzZWQgdG8gaGFuZGxlIGRpYWxvZyB3aXRoIHdlYiBzZXJ2aWNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdKU09OUCcgKHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUH0pIGFuZCAnWEhSJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hNTEh0dHBSZXF1ZXN0fSkuIE9ubHkgWEhSIHByb3RvY29sIGlzIHN1cHBvcnRlZCBpbiBhIE5vZGVKUyBlbnZpcm9ubWVudC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaHR0cE1ldGhvZD1HRVRdIC0gSFRUUCBtZXRob2QgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdHRVQnIGFuZCAnUE9TVCcuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veG1sXCJdIC0gQ29udGVudC1UeXBlIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZSBpbiBjYXNlIG9mIGEgWEhSIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSBhbmQgaWYgbWV0aG9kIEhUVFAgaXMgUE9TVC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFwaT0nUkVTVCddIC0gV2hhdCBBUEkgdG8gdXNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgOiAnUkVTVCcuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3V0cHV0Rm9ybWF0PSd4bWwnXSAtIE91dHB1dCBmb3JtYXQgZm9yIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgcmVzcG9uc2UgOiAneG1sJyBvciAnanNvbicuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKi9cbiAgICBnZXRBbHRpdHVkZSA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBhbHRpU2VydmljZSA9IG5ldyBBbHRpKG9wdGlvbnMpO1xuICAgICAgICBhbHRpU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXR0aW5nIHBvc2l0b24gb2YgYSBnZW9ncmFwaGljIGlkZW50aWZpZXIgKHBsYWNlcyBuYW1lcywgYWRkcmVzcywgY2FkYXN0cmFsIHBhcmNlbCwgb3RoZXIuLi4pIHVzaW5nIHRoZSBbZ2VvY29kaW5nIHdlYiBzZXJ2aWNlIG9mIHRoZSBHZW9wb3J0YWwgUGxhdGZvcm1de0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL2RvY3VtZW50YXRpb24vZ2Vvc2VydmljZXMvZ2VvY29kYWdlLmh0bWx9LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBHcC5TZXJ2aWNlcy5nZW9jb2RlICh7XG4gICAgICogICAgIGFwaUtleSA6IFwiY2FydGVcIixcbiAgICAgKiAgICAgbG9jYXRpb24gOiBcIjczIGF2ZW51ZSBkZSBQYXJpcywgU2FpbnQtTWFuZMOpXCIsXG4gICAgICogICAgIC8vIHRyYWl0ZW1lbnQgZGVzIHJlc3VsdGF0c1xuICAgICAqICAgICBvblN1Y2Nlc3MgIDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coXCJmb3VuZCAoeDpcIityZXN1bHQucG9zaXRpb24ueCtcIiwgeTpcIityZXN1bHQucG9zaXRpb24ueStcIilcIikgO1xuICAgICAqICAgICB9XG4gICAgICogfSkgO1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGdlb2NvZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm0sIG9idGFpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9zZXJ2aWNlcy13ZWJ9LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pbmRleD1cIlN0cmVldEFkZHJlc3NcIl0gLSBHZW9ncmFwaGljYWwgaWRlbnRpZmllciB0eXBlIHRvIHNlYXJjaC4gVmFsdWVzIGN1cnJlbnRseSBhdmFpbGFibGVzIGFyZSA6IFwiUG9zaXRpb25PZkludGVyZXN0XCIgZm9yIHBsYWNlIG5hbWVzLCBcIlN0cmVldEFkZHJlc3NcIiBmb3IgYWRkcmVzcyBzZWFyY2gsIFwiQ2FkYXN0cmFsUGFyY2VsXCIgZm9yIENhZGFzdHJhbCBwYXJjZWxzIHNlYXJjaCwgXCJsb2NhdGlvblwiIGZvciBhIG11bHRpLWluZGV4IHNlYXJjaCBvbiBcIlN0cmVldEFkZHJlc3NcIiBhbmQgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIi4gRGVmYXVsdCBpcyBcIlN0cmVldEFkZHJlc3NcIi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5xdWVyeSAtIEdlb2dyYXBoaWMgaWRlbnRpZmllciB0byBsb2NhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpbHRlcnNdIC0gQWRkaXRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHRvIHNlYXJjaC4gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZSBnaXZlbi5cbiAgICAgKiAgICAgIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5maWx0ZXJzLltwcm9wXV0gLSBBZGRpdGlvbm5hbCBwcm9wZXJ0aWVzIHRvIGZpbHRlciBzZWFyY2guIFByb3BlcnRpZXMgZGVwZW5kcyBvbiBvcHRpb25zLmluZGV4LCBhbmQgdmFsdWVzIHR5cGUgc2hvdWxkIGJlIFwiU3RyaW5nXCIuXG4gICAgICogICAgICA8YnIvPjxici8+XG4gICAgICogICAgICBQcm9wZXJ0aWVzIGF2YWlsYWJsZXMgZm9yIGFkZHJlc3Mgc2VhcmNoIDo8YnIvPlxuICAgICAqICAgICAgXCJwb3N0YWxDb2RlXCIsIFwiaW5zZWVDb2RlXCIgYW5kIFwiY2l0eVwiLlxuICAgICAqICAgICAgPGJyLz48YnIvPlxuICAgICAqICAgICAgUHJvcGVydGllcyBhdmFpbGFibGVzIGZvciBwbGFjZSBuYW1lcyBzZWFyY2ggOjxici8+XG4gICAgICogICAgICBcInBvc3RhbENvZGVcIiwgXCJpbnNlZUNvZGVcIiBhbmQgXCJ0eXBlXCIuXG4gICAgICogICAgICA8YnIvPjxici8+XG4gICAgICogICAgICBQcm9wZXJ0aWVzIGF2YWlsYWJsZXMgZm9yIGNhZGFzdHJhbCBwYXJjZWxzIHNlYXJjaCA6PGJyLz5cbiAgICAgKiAgICAgIFwiY29kZURlcGFydGVtZW50XCIsIFwiY29kZUNvbW11bmVcIiwgXCJub21Db21tdW5lXCIsIFwiY29kZUNvbW11bmVBYnNcIiwgXCJjb2RlQXJyb25kaXNzZW1lbnRcIiwgXCJzZWN0aW9uXCIsIFwibnVtZXJvXCIsIFwiZmV1aWxsZVwiLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzPTIwXSAtIE1heGltdW0gbnVtYmVyIG9mIHJlc3BvbnNlcy4gRGVmYXVsdCB1bmRlcmx5aW5nIHNlcnZpY2UgdmFsdWUgYXBwbGllcyAoMjApIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldHVyblRydWVHZW9tZXRyeT1mYWxzZV0gLSBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpZiB5b3Ugd2lzaCB0byBoYXZlIHRoZSB0cnVlIGdlb21ldHJpZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuR2VvY29kZVJlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgZXhjZXB0IGlmIFwicmF3UmVzcG9uc2VcIiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkZhaWx1cmVdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHVuc3VjY2Vzc2Z1bCBzZXJ2aWNlIHJlc3BvbnNlcyAodGltZU91dCwgbWlzc2luZyByaWdodHMsIC4uLikuIFRha2VzIGEge0BsaW5rIEdwLkVycm9yfSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aW1lT3V0PTBdIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhYm92ZSB3aGljaCBhIHRpbWVPdXQgcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCB3aXRoIG9uRmFpbHVyZSBjYWxsYmFjayAoc2VlIGFib3ZlKS4gRGVmYXVsdCB2YWx1ZSBpcyAwIHdoaWNoIG1lYW5zIHRpbWVPdXQgd2lsbCBub3QgYmUgaGFuZGxlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2VydmVyVXJsPWh0dHAgKHMpOi8vd3hzLmlnbi5mci9BUElLRVkvZ2VvcG9ydGFpbC9vbHNdIC0gV2ViIHNlcnZpY2UgVVJMLiBJZiB1c2VkLCBvcHRpb25zLmFwaUtleSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zc2wgPSB0cnVlXSAtIFVzZSBvZiBIVFRQUyBvciBIVFRQIHByb3RvY29sIHRvIHJlcXVlc3QgdGhlIHNlcnZpY2VzLiBIVFRQUyBieSBkZWZhdWx0IChzc2w9dHJ1ZSkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICovXG4gICAgZ2VvY29kZSA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBnZW9jb2RlU2VydmljZSA9IG5ldyBHZW9jb2RlKG9wdGlvbnMpO1xuICAgICAgICBnZW9jb2RlU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2aW5nIGdlb2dyYXBoaWNhbCBpZGVudGlmaWVycyAocGxhY2UgbmFtZXMsIGFkZHJlc3MsIGNhZGFzdHJhbCBwYXJjZWxzLCAuLi4pIG5lYXIgYSBnaXZlbiBwb3NpdGlvbiwgdXNpbmcgdGhlIFtyZXZlcnNlIGdlb2NvZGluZyB3ZWIgc2VydmljZSBvZiB0aGUgR2VvcG9ydGFsIFBsYXRmb3JtXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9kb2N1bWVudGF0aW9uL2dlb3NlcnZpY2VzL2dlb2NvZGFnZS1pbnZlcnNlLmh0bWx9LlxuICAgICAqXG4gICAgICogQG1ldGhvZCByZXZlcnNlR2VvY29kZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5hcGlLZXkgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybSwgb2J0YWluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL3NlcnZpY2VzLXdlYn0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmluZGV4PVwiU3RyZWV0QWRkcmVzc1wiXSAtIEdlb2dyYXBoaWNhbCBpZGVudGlmaWVyIHR5cGUgdG8gc2VhcmNoLiBWYWx1ZXMgY3VycmVudGx5IGF2YWlsYWJsZXMgYXJlIDogXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiBmb3IgcGxhY2UgbmFtZXMsIFwiU3RyZWV0QWRkcmVzc1wiIGZvciBhZGRyZXNzIHNlYXJjaCwgXCJDYWRhc3RyYWxQYXJjZWxcIiBmb3IgQ2FkYXN0cmFsIHBhcmNlbHMgc2VhcmNoLCBcImxvY2F0aW9uXCIgZm9yIGEgbXVsdGktaW5kZXggc2VhcmNoIG9uIFwiU3RyZWV0QWRkcmVzc1wiIGFuZCBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLiBEZWZhdWx0IGlzIFwiU3RyZWV0QWRkcmVzc1wiLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnBvc2l0aW9uIC0gUmVmZXJlbmNlIHBvc2l0aW9uIHdoZXJlIHRvIHNlYXJjaCBnZW9ncmFwaGljYWwgaWRlbnRpZmllcnMuXG4gICAgICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnBvc2l0aW9uLmxvbiAtIExvbmdpdHVkZVxuICAgICAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBMYXRpdHVkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maWx0ZXJzXSAtIEFkZGl0aW9uYWwgZmlsdGVycyB0byBhcHBseSB0byBzZWFyY2guIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUgZ2l2ZW4uXG4gICAgICogICAgICBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZmlsdGVycy5bcHJvcF1dIC0gQWRkaXRpb25uYWwgcHJvcGVydGllcyB0byBmaWx0ZXIgc2VhcmNoLiBQcm9wZXJ0aWVzIGRlcGVuZHMgb24gb3B0aW9ucy5pbmRleCwgYW5kIHZhbHVlcyB0eXBlIHNob3VsZCBiZSBcIlN0cmluZ1wiLlxuICAgICAqICAgICAgPGJyLz48YnIvPlxuICAgICAqICAgICAgUHJvcGVydGllcyBhdmFpbGFibGVzIGZvciBhZGRyZXNzIHNlYXJjaCA6PGJyLz5cbiAgICAgKiAgICAgIFwicG9zdGFsQ29kZVwiLCBcImluc2VlQ29kZVwiIGFuZCBcImNpdHlcIi5cbiAgICAgKiAgICAgIDxici8+PGJyLz5cbiAgICAgKiAgICAgIFByb3BlcnRpZXMgYXZhaWxhYmxlcyBmb3IgcGxhY2UgbmFtZXMgc2VhcmNoIDo8YnIvPlxuICAgICAqICAgICAgXCJwb3N0YWxDb2RlXCIsIFwiaW5zZWVDb2RlXCIgYW5kIFwidHlwZVwiLlxuICAgICAqICAgICAgPGJyLz48YnIvPlxuICAgICAqICAgICAgUHJvcGVydGllcyBhdmFpbGFibGVzIGZvciBjYWRhc3RyYWwgcGFyY2VscyBzZWFyY2ggOjxici8+XG4gICAgICogICAgICBcImNvZGVEZXBhcnRlbWVudFwiLCBcImNvZGVDb21tdW5lXCIsIFwibm9tQ29tbXVuZVwiLCBcImNvZGVDb21tdW5lQWJzXCIsIFwiY29kZUFycm9uZGlzc2VtZW50XCIsIFwic2VjdGlvblwiLCBcIm51bWVyb1wiLCBcImZldWlsbGVcIi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2VhcmNoR2VvbWV0cnldIC0gTG9jYXRpb24gd2hlcmUgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAqICAgICAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkudHlwZSAtIEdlb21ldHJ5IHR5cGUgKFBvaW50fENpcmNsZXxMaW5lc3RyaW5nfFBvbHlnb24pXG4gICAgICogICAgICBAcGFyYW0ge0FycmF5LjxGbG9hdD58QXJyYXkuQXJyYXkuPEZsb2F0Pn0gb3B0aW9ucy5zZWFyY2hHZW9tZXRyeS5jb29yZGluYXRlcyAtIENvb3JkaW5hdGVzXG4gICAgICogICAgICBAcGFyYW0ge0Zsb2F0fSBbb3B0aW9ucy5zZWFyY2hHZW9tZXRyeS5yYWRpdXNdIC0gUmFkaXVzIChvbmx5IGZvciB0eXBlICdDaXJjbGUnKVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzPTIwXSAtIE1heGltdW0gbnVtYmVyIG9mIHJlc3BvbnNlcy4gRGVmYXVsdCB1bmRlcmx5aW5nIHNlcnZpY2UgdmFsdWUgYXBwbGllcyAoMjApIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuR2VvY29kZVJlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgZXhjZXB0IGlmIFwicmF3UmVzcG9uc2VcIiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkZhaWx1cmVdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHVuc3VjY2Vzc2Z1bCBzZXJ2aWNlIHJlc3BvbnNlcyAodGltZU91dCwgbWlzc2luZyByaWdodHMsIC4uLikuIFRha2VzIGEge0BsaW5rIEdwLkVycm9yfSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aW1lT3V0PTBdIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhYm92ZSB3aGljaCBhIHRpbWVPdXQgcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCB3aXRoIG9uRmFpbHVyZSBjYWxsYmFjayAoc2VlIGFib3ZlKS4gRGVmYXVsdCB2YWx1ZSBpcyAwIHdoaWNoIG1lYW5zIHRpbWVPdXQgd2lsbCBub3QgYmUgaGFuZGxlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2VydmVyVXJsPWh0dHAgKHMpOi8vd3hzLmlnbi5mci9BUElLRVkvZ2VvcG9ydGFpbC9vbHNdIC0gV2ViIHNlcnZpY2UgVVJMLiBJZiB1c2VkLCBvcHRpb25zLmFwaUtleSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zc2wgPSB0cnVlXSAtIFVzZSBvZiBIVFRQUyBvciBIVFRQIHByb3RvY29sIHRvIHJlcXVlc3QgdGhlIHNlcnZpY2VzLiBIVFRQUyBieSBkZWZhdWx0IChzc2w9dHJ1ZSkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICovXG4gICAgcmV2ZXJzZUdlb2NvZGUgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgcmV2ZXJzZUdlb2NvZGVTZXJ2aWNlID0gbmV3IFJldmVyc2VHZW9jb2RlKG9wdGlvbnMpO1xuICAgICAgICByZXZlcnNlR2VvY29kZVNlcnZpY2UuY2FsbCgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0dGluZyBzdWdnZXN0aW9ucyBvZiBwcm9iYWJsZSBwbGFjZXMgbmFtZXMgb3IgYWRkcmVzcyBiYXNlZCBvbiB1bmNvbXBsZXRlIHRleHRzLCB1c2luZyB0aGUgW2F1dG9jb21wbGV0aW9uIHNlcnZpY2Ugb2YgdGhlIEdlb3BvcnRhbCBQbGF0Zm9ybV17QGxpbmsgaHR0cHM6Ly9nZW9zZXJ2aWNlcy5pZ24uZnIvZG9jdW1lbnRhdGlvbi9nZW9zZXJ2aWNlcy9hdXRvY29tcGxldGlvbi5odG1sfVxuICAgICAqXG4gICAgICogQG1ldGhvZCBhdXRvQ29tcGxldGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm0sIG9idGFpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9zZXJ2aWNlcy13ZWJ9LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRleHQgLSBUZXh0IGlucHV0IHRvIGNvbXBsZXRlLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IFtvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZSA9IFwiU3RyZWV0QWRkcmVzc1wiXSAtIFN1Z2dlc3Rpb24gdHlwZXMgdG8gcHJvdmlkZSA6IGFkZHJlc3MgKFwiU3RyZWV0QWRkcmVzc1wiKSBhbmQvb3IgcGxhY2UgbmFtZSAoXCJQb3NpdGlvbk9mSW50ZXJlc3RcIikuXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMuZmlsdGVyT3B0aW9ucy50ZXJyaXRvcnldIC0gUGxhY2VzIHdoZXJlIHRvIGxpbWl0IHRoZSBzZWFyY2ggb2Ygc3VnZ2VzdGlvbnMgOiBcIk1FVFJPUE9MRVwiIChDb3JzaWNhIGFuZCBtZXRyb3BvbGl0YW4gRnJhbmNlKSwgXCJET01UT01cIiAoRnJlbmNoIG92ZXJzZWFzIGRlcGFydG1lbnRzIGFuZCB0ZXJyaXRvcmllcyksIG9yIGFuIElOU0VFIGNvZGUgb2YgYSBkZXBhcnRtZW50LiBObyBsaW1pdGF0aW9uIGJ5IGRlZmF1bHQuIEZvciBpbnN0YW5jZSA6IFsnTUVUUk9QT0xFJywgJzMxJ11cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4aW11bVJlc3BvbnNlcyA9IDEwXSAtIE1heGltdW0gbnVtYmVyIG9mIHJlc3BvbnNlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlUmVzcG9uc2V9IG9iamVjdCBhcyBhIHBhcmFtZXRlciBleGNlcHQgaWYgXCJyYXdSZXNwb25zZVwiIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmFpbHVyZV0gLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdW5zdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2VzICh0aW1lT3V0LCBtaXNzaW5nIHJpZ2h0cywgLi4uKS4gVGFrZXMgYSB7QGxpbmsgR3AuRXJyb3J9IG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVPdXQ9MF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFib3ZlIHdoaWNoIGEgdGltZU91dCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIHdpdGggb25GYWlsdXJlIGNhbGxiYWNrIChzZWUgYWJvdmUpLiBEZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGltZU91dCB3aWxsIG5vdCBiZSBoYW5kbGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zZXJ2ZXJVcmw9aHR0cCAocyk6Ly93eHMuaWduLmZyL0FQSUtFWS9vbHMvYXBpcy9jb21wbGV0aW9uXSAtIFdlYiBzZXJ2aWNlIFVSTC4gSWYgdXNlZCwgb3B0aW9ucy5hcGlLZXkgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3NsID0gdHJ1ZV0gLSBVc2Ugb2YgSFRUUFMgb3IgSFRUUCBwcm90b2NvbCB0byByZXF1ZXN0IHRoZSBzZXJ2aWNlcy4gSFRUUFMgYnkgZGVmYXVsdCAoc3NsPXRydWUpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm90b2NvbD1YSFJdIC0gUHJvdG9jb2wgdXNlZCB0byBoYW5kbGUgZGlhbG9nIHdpdGggd2ViIHNlcnZpY2UuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0pTT05QJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT05QfSkgYW5kICdYSFInICh7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE1MSHR0cFJlcXVlc3R9KS4gT25seSBYSFIgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGluIGEgTm9kZUpTIGVudmlyb25tZW50LiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJveHlVUkxdIC0gUHJveHkgVVJMIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZS4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jYWxsYmFja1N1ZmZpeF0gLSBDYWxsYmFjayBmdW5jdGlvbiBuYW1lIHN1ZmZpeCB0byB1c2UgaW4gY2FzZSBvZiBhIEpTT05QIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSwgdG8gc2V0IHlvdXIgb3duIHN1ZmZpeCBpbnN0ZWFkIG9mIGF1dG8taW5jcmVtZW50LiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ1hIUicgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5odHRwTWV0aG9kPUdFVF0gLSBIVFRQIG1ldGhvZCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgaW4gY2FzZSBvZiBhIFhIUiBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0dFVCcgYW5kICdQT1NUJy4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94bWxcIl0gLSBDb250ZW50LVR5cGUgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpIGFuZCBpZiBtZXRob2QgSFRUUCBpcyBQT1NULiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ0pTT05QJyB2YWx1ZS4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmF3UmVzcG9uc2U9ZmFsc2VdIC0gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGltcGxpZXMgeW91IHdhbnQgdG8gaGFuZGxlIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGJ5IHlvdXJzZWxmIDogaXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhbiB1bnBhcnNlZCBTdHJpbmcgaW4gb25TdWNjZXNzIGNhbGxiYWNrIHBhcmFtZXRlci4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uQmVmb3JlUGFyc2VdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHNlcnZpY2UgcmVzcG9uc2UgYmVmb3JlIHBhcnNpbmcgKGFzIGFuIHVucGFyc2VkIFN0cmluZykuIFRha2VzIGEgU3RyaW5nIGFzIGEgcGFyYW1ldGVyICh0aGUgcmF3IHNlcnZpY2UgcmVzcG9uc2UpLiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgd2lsbCBiZSBwYXJzZWQgYXMgdGhlIHNlcnZpY2UgcmVzcG9uc2UuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKi9cbiAgICBhdXRvQ29tcGxldGUgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgYXV0b0NvbXBsZXRlU2VydmljZSA9IG5ldyBBdXRvQ29tcGxldGUob3B0aW9ucyk7XG4gICAgICAgIGF1dG9Db21wbGV0ZVNlcnZpY2UuY2FsbCgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0dGluZyBhIHJvdXRlIGZyb20gb25lIHBvaW50IHRvIGFub3RoZXIgdXNpbmcgdGhlIFtyb3V0ZSBzZXJ2aWNlIG9mIHRoZSBHZW9wb3J0YWwgUGxhdGZvcm1de0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL2RvY3VtZW50YXRpb24vZ2Vvc2VydmljZXMvaXRpbmVyYWlyZXMuaHRtbH0uXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHJvdXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnJlc291cmNlIC0gUmVzb3VyY2UgdXNlZCB0byBjb21wdXRlIHRoZSByb3V0ZS4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5hcGlLZXkgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybSwgb2J0YWluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL3NlcnZpY2VzLXdlYn0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnJvdXRlUHJlZmVyZW5jZSA9IFwiZmFzdGVzdFwiXSAtIEluZGljYXRlcyB0aGUgd2F5IHRvIGNvbXB1dGUgdGhlIHJvdXRlIDogXCJmYXN0ZXN0XCIgKHRpbWUgb3B0aW1pc2F0aW9uKSBvciBcInNob3J0ZXN0XCIgKGRpc3RhbmNlIG9wdGltaXNhdGlvbikuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtHcC5Qb2ludH0gb3B0aW9ucy5zdGFydFBvaW50IC0gU3RhcnQgcG9pbnQgb2YgdGhlIHJvdXRlLiBFeHByZXNzZWQgaW4gQ1JTOjg0IGNvb3JkaW5hdGVzIHN5c3RlbSAoc3RhcnRQb2ludC54IGNvcnJlc3BvbmRzIHRvIGxvbmdpdHVkZSwgc3RhcnRQb2ludC55IGNvcnJlc3BvbmRzIHRvIGxhdGl0dWRlKS4gQXZhaWxhYmxlIGJib3ggYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtHcC5Qb2ludH0gb3B0aW9ucy5lbmRQb2ludCAtIEVuZCBwb2ludCBvZiB0aGUgcm91dGUuIEV4cHJlc3NlZCBpbiBDUlM6ODQgY29vcmRpbmF0ZXMgc3lzdGVtIChlbmRQb2ludC54IGNvcnJlc3BvbmRzIHRvIGxvbmdpdHVkZSwgZW5kUG9pbnQueSBjb3JyZXNwb25kcyB0byBsYXRpdHVkZSkuIEF2YWlsYWJsZSBiYm94IGFyZSBpbiB0aGUgR2V0Q2FwYWJpbGl0aWVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPEdwLlBvaW50Pn0gW29wdGlvbnMudmlhUG9pbnRzXSAtIE9yZGVyZWQgdmlhIFBvaW50cyBvZiB0aGUgcm91dGUuIEV4cHJlc3NlZCBpbiBDUlM6ODQgY29vcmRpbmF0ZXMgc3lzdGVtICh2aWFQb2ludHNbaV0ueCBjb3JyZXNwb25kcyB0byBsb25naXR1ZGUsIHZpYVBvaW50c1tpXS55IGNvcnJlc3BvbmRzIHRvIGxhdGl0dWRlKS4gQXZhaWxhYmxlIGJib3ggYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmdyYXBoID0gXCJWb2l0dXJlXCJdIC0gVXNlciBwcm9maWxlIHRvIHVzZSB0byBjb21wdXRlIHRoZSByb3V0ZSA6IFwiVm9pdHVyZVwiICh1c2luZyBhIHZlaGljdWxlKSBvciBcIlBpZXRvblwiIChwZWRlc3RyaWFuKS4gSGFzIGFuIGluZmx1ZW5jZSBvbiB0aGUga2luZCBvZiByb2FkcyB0aGUgcm91dGUgbWF5IHVzZSBhbmQgdGhlIGF2ZXJhZ2Ugc3BlZWQuIEF2YWlsYWJsZSBiYm94IGFyZSBpbiB0aGUgR2V0Q2FwYWJpbGl0aWVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IFtvcHRpb25zLmV4Y2x1c2lvbnNdIC0gREVQUkVDQVRFRDogdXNlIG9wdGlvbnMuY29uc3RyYWludHMuIEluZGljYXRlcyBpZiByb3V0ZSBoYXMgdG8gYXZvaWQgc29tZSBmZWF0dXJlcyAoXCJ0b2xsXCIsIFwiYnJpZGdlXCIgb3IgXCJ0dW5uZWxcIikuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zID0gZmFsc2VdIC0gSW5kaWNhdGVzIGlmIHJvdXRlIGdlb21ldHJ5IGhhcyB0byBiZSBhbHNvIHJldHVybmVkIHdpdGggcm91dGUgaW5zdHJ1Y3Rpb25zLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHJvdmlkZUJvdW5kaW5nQm94ID0gdHJ1ZV0gLSBJbmRpY2F0ZXMgaWYgcm91dGUgaW5zdHJ1Y3Rpb25zIGhhcyB0byBiZSBsb2NhbGlzZWQgd2l0aCBhIEJCT1ggaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kaXN0YW5jZVVuaXQgPSBcIm1cIl0gLSBUaGUgdW5pdCB1c2VkIHRvIHByb3ZpZGUgZGlzdGFuY2VzIGluIHRoZSByZXNwb25zZSAoXCJtZXRlclwiIG9yIFwia2lsb21ldGVyXCIpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1lVW5pdCA9IFwic2Vjb25kXCJdIC0gVGhlIHVuaXQgdXNlZCB0byBwcm92aWRlIGR1cmF0aW9uIGluIHRoZSByZXNwb25zZSAoXCJzdGFuZGFyZFwiLCBcInNlY29uZFwiLCBcIm1pbnV0ZVwiLCBcImhvdXJcIikuXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMud2F5c0F0dHJpYnV0ZXNdIC0gV2F5IEF0dHJpYnV0ZXMgdG8gYWRkIGluIHRoZSByZXNwb25zZS4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBbb3B0aW9ucy5jb25zdHJhaW50c10gLSBDb25zdHJhaW50cyB1c2VkICh7J2NvbnN0cmFpbnRUeXBlJzonYmFubmVkJywna2V5Jzond2F5c190eXBlJywnb3BlcmF0b3InOic9JywndmFsdWUnOidhdXRvcm91dGUnfSkuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblN1Y2Nlc3MgLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZ2V0dGluZyBzdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2UuIFRha2VzIGEge0BsaW5rIEdwLlNlcnZpY2VzLlJvdXRlUmVzcG9uc2V9IG9iamVjdCBhcyBhIHBhcmFtZXRlciBleGNlcHQgaWYgXCJyYXdSZXNwb25zZVwiIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmFpbHVyZV0gLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdW5zdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2VzICh0aW1lT3V0LCBtaXNzaW5nIHJpZ2h0cywgLi4uKS4gVGFrZXMgYSB7QGxpbmsgR3AuRXJyb3J9IG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVPdXQ9MF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFib3ZlIHdoaWNoIGEgdGltZU91dCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIHdpdGggb25GYWlsdXJlIGNhbGxiYWNrIChzZWUgYWJvdmUpLiBEZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGltZU91dCB3aWxsIG5vdCBiZSBoYW5kbGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5vdXRwdXRGb3JtYXQ9J2pzb24nXSAtIE91dHB1dCBmb3JtYXQgKFwianNvblwiIG9yIFwieG1sXCIpIHRvIHVzZSBmb3IgdW5kZXJseWluZyB3ZWJTZXJ2aWNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybD1odHRwIChzKTovL3d4cy5pZ24uZnIvQVBJS0VZL2l0aW5lcmFpcmUvcmVzdC9yb3V0ZS5qc29uXSAtIFdlYiBzZXJ2aWNlIFVSTC4gSWYgdXNlZCwgb3B0aW9ucy5hcGlLZXkgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3NsID0gdHJ1ZV0gLSBVc2Ugb2YgSFRUUFMgb3IgSFRUUCBwcm90b2NvbCB0byByZXF1ZXN0IHRoZSBzZXJ2aWNlcy4gSFRUUFMgYnkgZGVmYXVsdCAoc3NsPXRydWUpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm90b2NvbD1YSFJdIC0gUHJvdG9jb2wgdXNlZCB0byBoYW5kbGUgZGlhbG9nIHdpdGggd2ViIHNlcnZpY2UuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0pTT05QJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT05QfSkgYW5kICdYSFInICh7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE1MSHR0cFJlcXVlc3R9KS4gT25seSBYSFIgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGluIGEgTm9kZUpTIGVudmlyb25tZW50LiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJveHlVUkxdIC0gUHJveHkgVVJMIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZS4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jYWxsYmFja1N1ZmZpeF0gLSBDYWxsYmFjayBmdW5jdGlvbiBuYW1lIHN1ZmZpeCB0byB1c2UgaW4gY2FzZSBvZiBhIEpTT05QIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSwgdG8gc2V0IHlvdXIgb3duIHN1ZmZpeCBpbnN0ZWFkIG9mIGF1dG8taW5jcmVtZW50LiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ1hIUicgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5odHRwTWV0aG9kPUdFVF0gLSBIVFRQIG1ldGhvZCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgaW4gY2FzZSBvZiBhIFhIUiBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0dFVCcgYW5kICdQT1NUJy4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94bWxcIl0gLSBDb250ZW50LVR5cGUgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpIGFuZCBpZiBtZXRob2QgSFRUUCBpcyBQT1NULiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ0pTT05QJyB2YWx1ZS4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmF3UmVzcG9uc2U9ZmFsc2VdIC0gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGltcGxpZXMgeW91IHdhbnQgdG8gaGFuZGxlIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGJ5IHlvdXJzZWxmIDogaXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhbiB1bnBhcnNlZCBTdHJpbmcgaW4gb25TdWNjZXNzIGNhbGxiYWNrIHBhcmFtZXRlci4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uQmVmb3JlUGFyc2VdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHNlcnZpY2UgcmVzcG9uc2UgYmVmb3JlIHBhcnNpbmcgKGFzIGFuIHVucGFyc2VkIFN0cmluZykuIFRha2VzIGEgU3RyaW5nIGFzIGEgcGFyYW1ldGVyICh0aGUgcmF3IHNlcnZpY2UgcmVzcG9uc2UpLiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgd2lsbCBiZSBwYXJzZWQgYXMgdGhlIHNlcnZpY2UgcmVzcG9uc2UuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKi9cbiAgICByb3V0ZSA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciByb3V0ZVNlcnZpY2UgPSBuZXcgUm91dGUob3B0aW9ucyk7XG4gICAgICAgIHJvdXRlU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDb21wdXRpbmcgYSBzZXQgb2YgcGxhY2VzIChjdXJ2ZSkgcmVhY2hhYmxlIGZyb20gYSBnaXZlbiBwb2ludCAob3IgZnJvbSB3aGVyZSB0byBzdGFydCB0byByZWFjaCBhIGdpdmVuIHBvaW50KSB3aXRoaW4gYSB0aW1lIG9yIGRpc3RhbmNlIGNvbnN0cmFpbnQgdXNpbmcgdGhlIFtpc29jaHJvbmUgc2VydmljZSBvZiB0aGUgR2VvcG9ydGFsIFBsYXRmb3JtXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9kb2N1bWVudGF0aW9uL2dlb3NlcnZpY2VzL2lzb2Nocm9uZXMuaHRtbH0uXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGlzb0N1cnZlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmFwaUtleSAtIEFjY2VzcyBrZXkgdG8gR2VvcG9ydGFsIHBsYXRmb3JtLCBvYnRhaW5lZCBbaGVyZV17QGxpbmsgaHR0cHM6Ly9nZW9zZXJ2aWNlcy5pZ24uZnIvc2VydmljZXMtd2VifS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5yZXNvdXJjZSAtIFJlc291cmNlIHVzZWQgdG8gY29tcHV0ZSB0aGUgcm91dGUuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtHcC5Qb2ludH0gb3B0aW9ucy5wb3NpdGlvbiAtIFN0YXJ0IG9yIEFycml2YWwgKG9wdGlvbnMucmV2ZXJzZT09PXRydWUpIFBvaW50IGZvciB0aGUgY29tcHV0aW5nLiBFeHByZXNzZWQgaW4gQ1JTOjg0IGNvb3JkaW5hdGVzIHN5c3RlbSAocG9zaXRpb24ueCBjb3JyZXNwb25kcyB0byBsb25naXR1ZGUsIHBvc2l0aW9uLnkgY29ycmVzcG9uZHMgdG8gbGF0aXR1ZGUpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5ncmFwaCA9IFwiVm9pdHVyZVwiXSAtIFVzZXIgcHJvZmlsZSB0byB1c2UgdG8gY29tcHV0ZSB0aGUgaXNvQ3VydmUgOiBcIlZvaXR1cmVcIiAodXNpbmcgYSB2ZWhpY3VsZSkgb3IgXCJQaWV0b25cIiAocGVkZXN0cmlhbikuIEhhcyBhbiBpbmZsdWVuY2Ugb24gdGhlIGtpbmQgb2Ygcm9hZHMgdG8gdXNlIGFuZCB0aGUgYXZlcmFnZSBzcGVlZC4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBbb3B0aW9ucy5leGNsdXNpb25zXSAtIERFUFJFQ0FURUQ6IHVzZSBvcHRpb25zLmNvbnN0cmFpbnRzLiBJbmRpY2F0ZXMgaWYgcm91dGUgaGFzIHRvIGF2b2lkIHNvbWUgZmVhdHVyZXMgKFwidG9sbFwiLCBcImJyaWRnZVwiIG9yIFwidHVubmVsXCIpLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IFtvcHRpb25zLmNvbnN0cmFpbnRzXSAtIENvbnN0cmFpbnRzIHVzZWQgKHsnY29uc3RyYWludFR5cGUnOidiYW5uZWQnLCdrZXknOid3YXlzX3R5cGUnLCdvcGVyYXRvcic6Jz0nLCd2YWx1ZSc6J2F1dG9yb3V0ZSd9KS4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWV0aG9kID0gXCJ0aW1lXCJdIC0gQ29tcHV0aW5nIG1ldGhvZCB0byB1c2UgOiBcInRpbWVcIiAodXNpbmcgYSBkdXJhdGlvbiBhcyBhIGNvbnN0cmFpbnQpIG9yIFwiZGlzdGFuY2VcIiAodXNpbmcgYSBkaXN0YW5jZSBhcyBhIGNvbnN0cmFpbnQpLiBBdmFpbGFibGUgdmFsdWVzIGFyZSBpbiB0aGUgR2V0Q2FwYWJpbGl0aWVzLlxuICAgICAqIEBwYXJhbSB7RmxvYXR9IG9wdGlvbnMudGltZSAtIE1heGltdW0gZHVyYXRpb24gKGV4cHJlc3NlZCBpbiBzZWNvbmRzKSB0byB1c2Ugd2hlbiBvcHRpb25zLm1ldGhvZCBpcyBzZXQgdG8gXCJ0aW1lXCIuXG4gICAgICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5kaXN0YW5jZSAtIE1heGltdW0gZGlzdGFuY2UgKGV4cHJlc3NlZCBpbiBtZXRlcnMpIHRvIHVzZSB3aGVuIG9wdGlvbnMubWV0aG9kIGlzIHNldCB0byBcImRpc3RhbmNlXCIuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZXZlcnNlID0gZmFsc2VdIC0gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgaWYgeW91IHdhbnQgb3B0aW9ucy5wb3NpdGlvbiB0byBiZSB0aGUgZGVzdGluYXRpb24gKGluc3RlYWQgb2YgZGVwYXJ0dXJlKSBmb3IgdGhlIGNvbXB1dGluZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZGlzdGFuY2VVbml0ID0gXCJrbVwiXSAtIFRoZSB1bml0IHVzZWQgdG8gcHJvdmlkZSBkaXN0YW5jZXMgaW4gdGhlIHJlc3BvbnNlIChcIm1cIiBvciBcImttXCIpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1lVW5pdCA9IFwic2Vjb25kXCJdIC0gVGhlIHVuaXQgdXNlZCB0byBwcm92aWRlIGR1cmF0aW9uIGluIHRoZSByZXNwb25zZSAoXCJzdGFuZGFyZFwiLCBcInNlY29uZFwiLCBcIm1pbnV0ZVwiLCBcImhvdXJcIikuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zbW9vdGhpbmcgPSBmYWxzZV0gLSBERVBSRUNBVEVEOiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgcmVzdWx0aW5nIGdlb21ldHJ5IHRvIGJlIHNtb290aGVkLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZXMgPSBmYWxzZV0gLSBERVBSRUNBVEVEOiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgcmVzdWx0aW5nIGdlb21ldHJ5IChwb2x5Z29uKSB0byBoYXZlIGhvbGVzIGlmIHBlcnRpbmVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZX0gb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGV4Y2VwdCBpZiBcInJhd1Jlc3BvbnNlXCIgaXMgc2V0IHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GYWlsdXJlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyB1bnN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZXMgKHRpbWVPdXQsIG1pc3NpbmcgcmlnaHRzLCAuLi4pLiBUYWtlcyBhIHtAbGluayBHcC5FcnJvcn0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dD0wXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgYWJvdmUgd2hpY2ggYSB0aW1lT3V0IHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBvbkZhaWx1cmUgY2FsbGJhY2sgKHNlZSBhYm92ZSkuIERlZmF1bHQgdmFsdWUgaXMgMCB3aGljaCBtZWFucyB0aW1lT3V0IHdpbGwgbm90IGJlIGhhbmRsZWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm91dHB1dEZvcm1hdD0nanNvbiddIC0gT3V0cHV0IGZvcm1hdCAoXCJqc29uXCIpIHRvIHVzZSBmb3IgdW5kZXJseWluZyB3ZWJTZXJ2aWNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybD1odHRwIChzKTovL3d4cy5pZ24uZnIvQVBJS0VZL2lzb2Nocm9uZS9pc29jaHJvbmUuanNvbl0gLSBXZWIgc2VydmljZSBVUkwuIElmIHVzZWQsIG9wdGlvbnMuYXBpS2V5IHBhcmFtZXRlciBpcyBpZ25vcmVkLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbCA9IHRydWVdIC0gVXNlIG9mIEhUVFBTIG9yIEhUVFAgcHJvdG9jb2wgdG8gcmVxdWVzdCB0aGUgc2VydmljZXMuIEhUVFBTIGJ5IGRlZmF1bHQgKHNzbD10cnVlKS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJvdG9jb2w9WEhSXSAtIFByb3RvY29sIHVzZWQgdG8gaGFuZGxlIGRpYWxvZyB3aXRoIHdlYiBzZXJ2aWNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdKU09OUCcgKHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUH0pIGFuZCAnWEhSJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hNTEh0dHBSZXF1ZXN0fSkuIE9ubHkgWEhSIHByb3RvY29sIGlzIHN1cHBvcnRlZCBpbiBhIE5vZGVKUyBlbnZpcm9ubWVudC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaHR0cE1ldGhvZD1HRVRdIC0gSFRUUCBtZXRob2QgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdHRVQnIGFuZCAnUE9TVCcuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veG1sXCJdIC0gQ29udGVudC1UeXBlIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZSBpbiBjYXNlIG9mIGEgWEhSIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSBhbmQgaWYgbWV0aG9kIEhUVFAgaXMgUE9TVC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICovXG4gICAgaXNvQ3VydmUgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgcHJvY2Vzc0lzb0N1cnZlU2VydmljZSA9IG5ldyBQcm9jZXNzSXNvQ3VydmUob3B0aW9ucyk7XG4gICAgICAgIHByb2Nlc3NJc29DdXJ2ZVNlcnZpY2UuY2FsbCgpO1xuICAgIH1cbn07XG5cbi8qKlxuICogUG9pbnQgb2JqZWN0LlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5Qb2ludFxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHggLSBQb2ludCBhYnNjaXNzYVxuICogQHByb3BlcnR5IHtGbG9hdH0geSAtIFBvaW50IG9yZGluYXRlXG4gKi9cbnZhciBwb2ludCA9IHt9O1xuXG4vKipcbiAqIENpcmNsZSBvYmplY3QuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLkNpcmNsZVxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHggLSBDaXJjbGUgY2VudGVyIGFic2Npc3NhLlxuICogQHByb3BlcnR5IHtGbG9hdH0geSAtIENpcmNsZSBjZW50ZXIgb3JkaW5hdGUuXG4gKiBAcHJvcGVydHkge0Zsb2F0fSByYWRpdXMgLSBDaXJjbGUgcmFkaXVzLlxuICovXG52YXIgY2lyY2xlID0ge307XG5cbi8qKlxuICogQm91bmRpbmcgYm94IG9iamVjdCwgZXhwcmVzc2VkIHdpdGggZm91ciBjb29yZGluYXRlcy5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuQkJveFxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGxlZnQgLSBtaW5pbXVtIGFic2Npc3NhXG4gKiBAcHJvcGVydHkge0Zsb2F0fSByaWdodCAtIG1heGltdW0gYWJzY2lzc2FcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGJvdHRvbSAtIG1pbmltdW0gb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHRvcCAtIG1heGltdW0gb3JkaW5hdGVcbiAqL1xudmFyIGJib3ggPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgU2VydmljZXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Services.js\n"); - -/***/ }), - -/***/ "./src/Utils/Helper.js": -/*!*****************************!*\ - !*** ./src/Utils/Helper.js ***! - \*****************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Classe utilitaire\n *\n * @module Helper\n * @alias Gp.Helper\n */\nvar Helper = {\n /**\n * concatenation des parametres key/value dans les urls\n *\n * @method normalyzeParameters\n * @static\n * @param {Object} params - tableau de clef/valeur\n *\n * @example\n * Gp.Utils.Helper.normalyzeParameters ({\n * key1:value1,\n * key2:value2,\n * key3:value3\n * });\n * // out : \"key1=value1&key2=value2&key3=value3\"\n *\n * @returns {String} retourne les paramètres concaténés\n */\n normalyzeParameters: function normalyzeParameters(params) {\n var myParams = null;\n if (params) {\n var tabParams = [];\n for (var key in params) {\n if (params.hasOwnProperty(key)) {\n var value = params[key];\n if (!value) {\n value = \"\";\n }\n tabParams.push(key + \"=\" + value);\n }\n }\n myParams = tabParams.join(\"&\");\n }\n return myParams;\n },\n /**\n * Concaténation et encodage des urls.\n *\n * @method normalyzeUrl\n * @static\n * @param {String} url - url\n * @param {Object|String} params - tableau de clef/valeur ou string\n * @param {Boolean} encode - true|false, false par defaut\n *\n * @example\n * Gp.Utils.Helper.normalyzeUrl (url, {\n * key1:value1,\n * key2=:value2,\n * key3:value3\n * });\n * // out : \"url?key1=value1&key2=value2&key3=value3\"\n *\n * @returns {String} retourne une url normalisée\n */\n normalyzeUrl: function normalyzeUrl(url, params, encode) {\n var myUrl = url;\n if (url) {\n var k = url.indexOf(\"?\");\n if (k === -1) {\n // pas de ? et KVP\n myUrl += \"?\";\n }\n if (k !== -1 && k !== url.length - 1) {\n // KVP\n myUrl += \"&\";\n }\n }\n if (params) {\n if (typeof params === \"string\") {\n myUrl += params;\n } else {\n myUrl += this.normalyzeParameters(params);\n }\n }\n if (encode) {\n // FIXME bonne idée ?\n myUrl = encodeURIComponent(myUrl);\n }\n return myUrl;\n },\n /**\n * Indentation d'une chaine\n *\n * @method indent\n * @static\n * @param {Number} n - nombre de tabulation\n * @param {String} msg - chaine\n *\n * @example\n * Gp.Utils.Helper.indent (2, \"message à indenter\")\n * // out\n * // ........message à indenter\n *\n * @returns {String} retourne une chaine indentée\n */\n indent: function indent(n, msg) {\n var num = n || 0;\n return new Array(num + 1).join(\"\\t\") + msg;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Helper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9VdGlscy9IZWxwZXIuanM/ODAzNSJdLCJuYW1lcyI6WyJIZWxwZXIiLCJub3JtYWx5emVQYXJhbWV0ZXJzIiwicGFyYW1zIiwibXlQYXJhbXMiLCJ0YWJQYXJhbXMiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInZhbHVlIiwicHVzaCIsImpvaW4iLCJub3JtYWx5emVVcmwiLCJ1cmwiLCJlbmNvZGUiLCJteVVybCIsImsiLCJpbmRleE9mIiwibGVuZ3RoIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaW5kZW50IiwibiIsIm1zZyIsIm51bSIsIkFycmF5Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLE1BQU0sR0FBRztFQUVUO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsbUJBQW1CLEVBQUcsU0FBQUEsb0JBQVVDLE1BQU0sRUFBRTtJQUNwQyxJQUFJQyxRQUFRLEdBQUcsSUFBSTtJQUVuQixJQUFJRCxNQUFNLEVBQUU7TUFDUixJQUFJRSxTQUFTLEdBQUcsRUFBRTtNQUNsQixLQUFLLElBQUlDLEdBQUcsSUFBSUgsTUFBTSxFQUFFO1FBQ3BCLElBQUlBLE1BQU0sQ0FBQ0ksY0FBYyxDQUFDRCxHQUFHLENBQUMsRUFBRTtVQUM1QixJQUFJRSxLQUFLLEdBQUdMLE1BQU0sQ0FBQ0csR0FBRyxDQUFDO1VBQ3ZCLElBQUksQ0FBQ0UsS0FBSyxFQUFFO1lBQ1JBLEtBQUssR0FBRyxFQUFFO1VBQ2Q7VUFDQUgsU0FBUyxDQUFDSSxJQUFJLENBQUNILEdBQUcsR0FBRyxHQUFHLEdBQUdFLEtBQUssQ0FBQztRQUNyQztNQUNKO01BRUFKLFFBQVEsR0FBR0MsU0FBUyxDQUFDSyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDO0lBRUEsT0FBT04sUUFBUTtFQUNuQixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSU8sWUFBWSxFQUFHLFNBQUFBLGFBQVVDLEdBQUcsRUFBRVQsTUFBTSxFQUFFVSxNQUFNLEVBQUU7SUFDMUMsSUFBSUMsS0FBSyxHQUFHRixHQUFHO0lBRWYsSUFBSUEsR0FBRyxFQUFFO01BQ0wsSUFBSUcsQ0FBQyxHQUFHSCxHQUFHLENBQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUM7TUFDeEIsSUFBSUQsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQUU7UUFDWkQsS0FBSyxJQUFJLEdBQUc7TUFDaEI7TUFFQSxJQUFJQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUlBLENBQUMsS0FBS0gsR0FBRyxDQUFDSyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQUU7UUFDcENILEtBQUssSUFBSSxHQUFHO01BQ2hCO0lBQ0o7SUFFQSxJQUFJWCxNQUFNLEVBQUU7TUFDUixJQUFJLE9BQU9BLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUJXLEtBQUssSUFBSVgsTUFBTTtNQUNuQixDQUFDLE1BQU07UUFDSFcsS0FBSyxJQUFJLElBQUksQ0FBQ1osbUJBQW1CLENBQUNDLE1BQU0sQ0FBQztNQUM3QztJQUNKO0lBRUEsSUFBSVUsTUFBTSxFQUFFO01BQ1I7TUFDQUMsS0FBSyxHQUFHSSxrQkFBa0IsQ0FBQ0osS0FBSyxDQUFDO0lBQ3JDO0lBRUEsT0FBT0EsS0FBSztFQUNoQixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lLLE1BQU0sRUFBRyxTQUFBQSxPQUFVQyxDQUFDLEVBQUVDLEdBQUcsRUFBRTtJQUN2QixJQUFJQyxHQUFHLEdBQUdGLENBQUMsSUFBSSxDQUFDO0lBQ2hCLE9BQU8sSUFBSUcsS0FBSyxDQUFDRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBR1csR0FBRztFQUM5QztBQUNKLENBQUM7QUFFY3BCLHFFQUFNIiwiZmlsZSI6Ii4vc3JjL1V0aWxzL0hlbHBlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3NlIHV0aWxpdGFpcmVcbiAqXG4gKiBAbW9kdWxlIEhlbHBlclxuICogQGFsaWFzIEdwLkhlbHBlclxuICovXG52YXIgSGVscGVyID0ge1xuXG4gICAgLyoqXG4gICAgICogY29uY2F0ZW5hdGlvbiBkZXMgcGFyYW1ldHJlcyBrZXkvdmFsdWUgZGFucyBsZXMgdXJsc1xuICAgICAqXG4gICAgICogQG1ldGhvZCBub3JtYWx5emVQYXJhbWV0ZXJzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSB0YWJsZWF1IGRlIGNsZWYvdmFsZXVyXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBHcC5VdGlscy5IZWxwZXIubm9ybWFseXplUGFyYW1ldGVycyAoe1xuICAgICAqICAgICAgICAga2V5MTp2YWx1ZTEsXG4gICAgICogICAgICAgICBrZXkyOnZhbHVlMixcbiAgICAgKiAgICAgICAgIGtleTM6dmFsdWUzXG4gICAgICogIH0pO1xuICAgICAqICAvLyBvdXQgOiBcImtleTE9dmFsdWUxJmtleTI9dmFsdWUyJmtleTM9dmFsdWUzXCJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJldG91cm5lIGxlcyBwYXJhbcOodHJlcyBjb25jYXTDqW7DqXNcbiAgICAgKi9cbiAgICBub3JtYWx5emVQYXJhbWV0ZXJzIDogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgbXlQYXJhbXMgPSBudWxsO1xuXG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciB0YWJQYXJhbXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWJQYXJhbXMucHVzaChrZXkgKyBcIj1cIiArIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG15UGFyYW1zID0gdGFiUGFyYW1zLmpvaW4oXCImXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG15UGFyYW1zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25jYXTDqW5hdGlvbiBldCBlbmNvZGFnZSBkZXMgdXJscy5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgbm9ybWFseXplVXJsXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSB1cmxcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHBhcmFtcyAtIHRhYmxlYXUgZGUgY2xlZi92YWxldXIgb3Ugc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmNvZGUgLSB0cnVlfGZhbHNlLCBmYWxzZSBwYXIgZGVmYXV0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBHcC5VdGlscy5IZWxwZXIubm9ybWFseXplVXJsICh1cmwsIHtcbiAgICAgKiAgICAgICAgIGtleTE6dmFsdWUxLFxuICAgICAqICAgICAgICAga2V5Mj06dmFsdWUyLFxuICAgICAqICAgICAgICAga2V5Mzp2YWx1ZTNcbiAgICAgKiAgfSk7XG4gICAgICogIC8vIG91dCA6IFwidXJsP2tleTE9dmFsdWUxJmtleTI9dmFsdWUyJmtleTM9dmFsdWUzXCJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJldG91cm5lIHVuZSB1cmwgbm9ybWFsaXPDqWVcbiAgICAgKi9cbiAgICBub3JtYWx5emVVcmwgOiBmdW5jdGlvbiAodXJsLCBwYXJhbXMsIGVuY29kZSkge1xuICAgICAgICB2YXIgbXlVcmwgPSB1cmw7XG5cbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgdmFyIGsgPSB1cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgICAgICBpZiAoayA9PT0gLTEpIHsgLy8gcGFzIGRlID8gZXQgS1ZQXG4gICAgICAgICAgICAgICAgbXlVcmwgKz0gXCI/XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChrICE9PSAtMSAmJiBrICE9PSB1cmwubGVuZ3RoIC0gMSkgeyAvLyBLVlBcbiAgICAgICAgICAgICAgICBteVVybCArPSBcIiZcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgbXlVcmwgKz0gcGFyYW1zO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBteVVybCArPSB0aGlzLm5vcm1hbHl6ZVBhcmFtZXRlcnMocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmNvZGUpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FIGJvbm5lIGlkw6llID9cbiAgICAgICAgICAgIG15VXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KG15VXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBteVVybDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5kZW50YXRpb24gZCd1bmUgY2hhaW5lXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGluZGVudFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbiAtIG5vbWJyZSBkZSB0YWJ1bGF0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIGNoYWluZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBHcC5VdGlscy5IZWxwZXIuaW5kZW50ICgyLCBcIm1lc3NhZ2Ugw6AgaW5kZW50ZXJcIilcbiAgICAgKiAvLyBvdXRcbiAgICAgKiAvLyAuLi4uLi4uLm1lc3NhZ2Ugw6AgaW5kZW50ZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJldG91cm5lIHVuZSBjaGFpbmUgaW5kZW50w6llXG4gICAgICovXG4gICAgaW5kZW50IDogZnVuY3Rpb24gKG4sIG1zZykge1xuICAgICAgICB2YXIgbnVtID0gbiB8fCAwO1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5KG51bSArIDEpLmpvaW4oXCJcXHRcIikgKyBtc2c7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgSGVscGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Utils/Helper.js\n"); - -/***/ }), - -/***/ "./src/Utils/LoggerByDefault.js": -/*!**************************************!*\ - !*** ./src/Utils/LoggerByDefault.js ***! - \**************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! loglevel */ \"./node_modules/loglevel/lib/loglevel.js\");\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\n\nvar LoggerByDefault = {\n /**\n * logger statique\n *\n * @static\n * @param {String} name - nom du logger\n * @returns {Object} retourne un logger\n */\n getLogger: function getLogger(name) {\n // Substitute global constants configured at compile time\n // cf. webpack.config.js\n // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ?\n \"false\".match(/true/) ? loglevel__WEBPACK_IMPORTED_MODULE_0__[\"disableAll\"]() : loglevel__WEBPACK_IMPORTED_MODULE_0__[\"enableAll\"]();\n var logname = name || \"default\";\n return loglevel__WEBPACK_IMPORTED_MODULE_0__[\"getLogger\"](logname);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (LoggerByDefault);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9VdGlscy9Mb2dnZXJCeURlZmF1bHQuanM/ODFmMyJdLCJuYW1lcyI6WyJMb2dnZXJCeURlZmF1bHQiLCJnZXRMb2dnZXIiLCJuYW1lIiwibWF0Y2giLCJMb2ciLCJsb2duYW1lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBZ0M7QUFFaEMsSUFBSUEsZUFBZSxHQUFHO0VBQ2xCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLFNBQVMsRUFBRyxTQUFBQSxVQUFVQyxJQUFJLEVBQUU7SUFDeEI7SUFDQTtJQUNBO0lBQ0MsZ0JBQWdCLENBQUNDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBSUMsbURBQWMsQ0FBQyxDQUFDLEdBQUdBLGtEQUFhLENBQUMsQ0FBQztJQUNyRSxJQUFJQyxPQUFPLEdBQUdILElBQUksSUFBSSxTQUFTO0lBQy9CLE9BQU9FLGtEQUFhLENBQUNDLE9BQU8sQ0FBQztFQUNqQztBQUNKLENBQUM7QUFFY0wsOEVBQWUiLCJmaWxlIjoiLi9zcmMvVXRpbHMvTG9nZ2VyQnlEZWZhdWx0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgTG9nIGZyb20gXCJsb2dsZXZlbFwiO1xuXG52YXIgTG9nZ2VyQnlEZWZhdWx0ID0ge1xuICAgIC8qKlxuICAgICAqIGxvZ2dlciBzdGF0aXF1ZVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gbm9tIGR1IGxvZ2dlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHJldG91cm5lIHVuIGxvZ2dlclxuICAgICAqL1xuICAgIGdldExvZ2dlciA6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIFN1YnN0aXR1dGUgZ2xvYmFsIGNvbnN0YW50cyBjb25maWd1cmVkIGF0IGNvbXBpbGUgdGltZVxuICAgICAgICAvLyBjZi4gd2VicGFjay5jb25maWcuanNcbiAgICAgICAgLy8gRklYTUUgaG93dG9kbyAhPyBEZWZpbmVXZWJwYWNrUGx1Z2luID8gRW52aXJvbm1lbnRXZWJwYWNrUGx1Z2luID9cbiAgICAgICAgKFwiX19QUk9EVUNUSU9OX19cIi5tYXRjaCgvdHJ1ZS8pKSA/IExvZy5kaXNhYmxlQWxsKCkgOiBMb2cuZW5hYmxlQWxsKCk7XG4gICAgICAgIHZhciBsb2duYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAgICAgcmV0dXJuIExvZy5nZXRMb2dnZXIobG9nbmFtZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nZ2VyQnlEZWZhdWx0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Utils/LoggerByDefault.js\n"); - -/***/ }), - -/***/ "./src/Utils/MessagesResources.js": -/*!****************************************!*\ - !*** ./src/Utils/MessagesResources.js ***! - \****************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée.\n *\n * @example\n * MessagesResources.getMessage(\"ERROR_PARAM_MISSING\", \"x\", \"y\", \"z\")));\n * // --> output : Parameter(s) 'x - y - z' missing\n *\n * @module MessagesResources\n * @alias Gp.Utils.MessagesResources\n * @private\n */\nvar MessagesResources = {\n // Paramètres\n PARAM_MISSING: \"Parameter(s) '%var%' missing\",\n PARAM_EMPTY: \"Parameter(s) '%var%' empty\",\n PARAM_TYPE: \"Wrong type(s) for parameter(s) '%var%'\",\n PARAM_FORMAT: \"Parameter(s) '%var%' not correctly formatted\",\n PARAM_NOT_SUPPORT: \"Value(s) for parameter(s) '%var%' not supported\",\n PARAM_NOT_SUPPORT_NODEJS: \"Value(s) for parameter(s) '%var%' not supported to NodeJS\",\n PARAM_UNKNOWN: \"Value(s) for parameter(s) '%var%' unknown\",\n // Services\n // Requête\n SERVICE_REQUEST_BUILD: \"An error occurred during the request building of the service\",\n SERVICE_REQUEST_EMPTY: \"The request sent to the service is empty\",\n // Réponse\n SERVICE_RESPONSE_EXCEPTION: \"The service returned an exception : '%var%'\",\n SERVICE_RESPONSE_EXCEPTION_2: \"The service returned an exception\",\n SERVICE_RESPONSE_ANALYSE: \"An error occurred while parsing the response '%var%' of the service\",\n SERVICE_RESPONSE_ANALYSE_2: \"An unknown error occurred while parsing the response\",\n SERVICE_RESPONSE_EMPTY: \"The response of the service is empty\",\n SERVICE_RESPONSE_EMPTY_2: \"The response from the service could not be analyzed or is empty\",\n SERVICE_RESPONSE_FORMAT: \"The format of the service response is not supported (handled format(s) : '%var%')\",\n SERVICE_RESPONSE_FORMAT_2: \"The format of the service response is not supported\",\n SERVICE_RESPONSE_FORMAT_3: \"No suggestion matching the search\",\n // Classes\n CLASS_CONSTRUCTOR: \"'%var%' constructor cannot be called as a function.\",\n /**\n * Fonction qui va retourner le message d'erreur associé à la clé donnée\n *\n * @method getMessage\n * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM)\n * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée\n * @return {String} message - String contenant le message de l'exception\n */\n getMessage: function getMessage(clef, parametres) {\n // param de la fonction uniquement pour la documentation...\n\n if (Object.keys(arguments).length === 0) {\n return \"Message indefined !\";\n }\n var params = Array.prototype.slice.call(arguments);\n var key = params.shift();\n var args = params;\n var message = this[key];\n try {\n if (Array.isArray(args) && args.length > 0) {\n message = message.replace(\"%var%\", args.join(\" - \"));\n } else {\n message = message.replace(\"%var%\", \"%var% (not specified)\");\n }\n } catch (e) {\n // error de string.replace()\n }\n return message;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (MessagesResources);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9VdGlscy9NZXNzYWdlc1Jlc291cmNlcy5qcz9lYWY1Il0sIm5hbWVzIjpbIk1lc3NhZ2VzUmVzb3VyY2VzIiwiUEFSQU1fTUlTU0lORyIsIlBBUkFNX0VNUFRZIiwiUEFSQU1fVFlQRSIsIlBBUkFNX0ZPUk1BVCIsIlBBUkFNX05PVF9TVVBQT1JUIiwiUEFSQU1fTk9UX1NVUFBPUlRfTk9ERUpTIiwiUEFSQU1fVU5LTk9XTiIsIlNFUlZJQ0VfUkVRVUVTVF9CVUlMRCIsIlNFUlZJQ0VfUkVRVUVTVF9FTVBUWSIsIlNFUlZJQ0VfUkVTUE9OU0VfRVhDRVBUSU9OIiwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05fMiIsIlNFUlZJQ0VfUkVTUE9OU0VfQU5BTFlTRSIsIlNFUlZJQ0VfUkVTUE9OU0VfQU5BTFlTRV8yIiwiU0VSVklDRV9SRVNQT05TRV9FTVBUWSIsIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlfMiIsIlNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUIiwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfMiIsIlNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUXzMiLCJDTEFTU19DT05TVFJVQ1RPUiIsImdldE1lc3NhZ2UiLCJjbGVmIiwicGFyYW1ldHJlcyIsIk9iamVjdCIsImtleXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJwYXJhbXMiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImtleSIsInNoaWZ0IiwiYXJncyIsIm1lc3NhZ2UiLCJpc0FycmF5IiwicmVwbGFjZSIsImpvaW4iLCJlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxpQkFBaUIsR0FBRztFQUVwQjtFQUNBQyxhQUFhLEVBQUcsOEJBQThCO0VBQzlDQyxXQUFXLEVBQUcsNEJBQTRCO0VBQzFDQyxVQUFVLEVBQUcsd0NBQXdDO0VBQ3JEQyxZQUFZLEVBQUcsOENBQThDO0VBQzdEQyxpQkFBaUIsRUFBRyxpREFBaUQ7RUFDckVDLHdCQUF3QixFQUFHLDJEQUEyRDtFQUN0RkMsYUFBYSxFQUFHLDJDQUEyQztFQUUzRDtFQUNBO0VBQ0FDLHFCQUFxQixFQUFHLDhEQUE4RDtFQUN0RkMscUJBQXFCLEVBQUcsMENBQTBDO0VBRWxFO0VBQ0FDLDBCQUEwQixFQUFHLDZDQUE2QztFQUMxRUMsNEJBQTRCLEVBQUcsbUNBQW1DO0VBQ2xFQyx3QkFBd0IsRUFBRyxxRUFBcUU7RUFDaEdDLDBCQUEwQixFQUFHLHNEQUFzRDtFQUNuRkMsc0JBQXNCLEVBQUcsc0NBQXNDO0VBQy9EQyx3QkFBd0IsRUFBRyxpRUFBaUU7RUFDNUZDLHVCQUF1QixFQUFHLG1GQUFtRjtFQUM3R0MseUJBQXlCLEVBQUcscURBQXFEO0VBQ2pGQyx5QkFBeUIsRUFBRyxtQ0FBbUM7RUFFL0Q7RUFDQUMsaUJBQWlCLEVBQUcscURBQXFEO0VBRXpFO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsVUFBVSxFQUFHLFNBQUFBLFdBQVVDLElBQUksRUFBRUMsVUFBVSxFQUFFO0lBQ3JDOztJQUVBLElBQUlDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNyQyxPQUFPLHFCQUFxQjtJQUNoQztJQUVBLElBQUlDLE1BQU0sR0FBR0MsS0FBSyxDQUFDQyxTQUFTLENBQUNDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDTixTQUFTLENBQUM7SUFDbEQsSUFBSU8sR0FBRyxHQUFHTCxNQUFNLENBQUNNLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLElBQUlDLElBQUksR0FBR1AsTUFBTTtJQUVqQixJQUFJUSxPQUFPLEdBQUcsSUFBSSxDQUFDSCxHQUFHLENBQUM7SUFFdkIsSUFBSTtNQUNBLElBQUlKLEtBQUssQ0FBQ1EsT0FBTyxDQUFDRixJQUFJLENBQUMsSUFBSUEsSUFBSSxDQUFDUixNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3hDUyxPQUFPLEdBQUdBLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLE9BQU8sRUFBRUgsSUFBSSxDQUFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7TUFDeEQsQ0FBQyxNQUFNO1FBQ0hILE9BQU8sR0FBR0EsT0FBTyxDQUFDRSxPQUFPLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDO01BQy9EO0lBQ0osQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtNQUNSO0lBQUE7SUFJSixPQUFPSixPQUFPO0VBQ2xCO0FBQ0osQ0FBQztBQUVjbkMsZ0ZBQWlCIiwiZmlsZSI6Ii4vc3JjL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgZXJyZXVycyBxdWkgcGVybWVyIGQnYXNzb2NpZXIgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBsJ2V4Y2VwdGlvbiBsYW5jw6llLlxuICpcbiAqIEBleGFtcGxlXG4gKiBNZXNzYWdlc1Jlc291cmNlcy5nZXRNZXNzYWdlKFwiRVJST1JfUEFSQU1fTUlTU0lOR1wiLCBcInhcIiwgXCJ5XCIsIFwielwiKSkpO1xuICogLy8gLS0+IG91dHB1dCA6IFBhcmFtZXRlcihzKSAneCAtIHkgLSB6JyBtaXNzaW5nXG4gKlxuICogQG1vZHVsZSBNZXNzYWdlc1Jlc291cmNlc1xuICogQGFsaWFzIEdwLlV0aWxzLk1lc3NhZ2VzUmVzb3VyY2VzXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgTWVzc2FnZXNSZXNvdXJjZXMgPSB7XG5cbiAgICAvLyBQYXJhbcOodHJlc1xuICAgIFBBUkFNX01JU1NJTkcgOiBcIlBhcmFtZXRlcihzKSAnJXZhciUnIG1pc3NpbmdcIixcbiAgICBQQVJBTV9FTVBUWSA6IFwiUGFyYW1ldGVyKHMpICcldmFyJScgZW1wdHlcIixcbiAgICBQQVJBTV9UWVBFIDogXCJXcm9uZyB0eXBlKHMpIGZvciBwYXJhbWV0ZXIocykgJyV2YXIlJ1wiLFxuICAgIFBBUkFNX0ZPUk1BVCA6IFwiUGFyYW1ldGVyKHMpICcldmFyJScgbm90IGNvcnJlY3RseSBmb3JtYXR0ZWRcIixcbiAgICBQQVJBTV9OT1RfU1VQUE9SVCA6IFwiVmFsdWUocykgZm9yIHBhcmFtZXRlcihzKSAnJXZhciUnIG5vdCBzdXBwb3J0ZWRcIixcbiAgICBQQVJBTV9OT1RfU1VQUE9SVF9OT0RFSlMgOiBcIlZhbHVlKHMpIGZvciBwYXJhbWV0ZXIocykgJyV2YXIlJyBub3Qgc3VwcG9ydGVkIHRvIE5vZGVKU1wiLFxuICAgIFBBUkFNX1VOS05PV04gOiBcIlZhbHVlKHMpIGZvciBwYXJhbWV0ZXIocykgJyV2YXIlJyB1bmtub3duXCIsXG5cbiAgICAvLyBTZXJ2aWNlc1xuICAgIC8vIFJlcXXDqnRlXG4gICAgU0VSVklDRV9SRVFVRVNUX0JVSUxEIDogXCJBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHJlcXVlc3QgYnVpbGRpbmcgb2YgdGhlIHNlcnZpY2VcIixcbiAgICBTRVJWSUNFX1JFUVVFU1RfRU1QVFkgOiBcIlRoZSByZXF1ZXN0IHNlbnQgdG8gdGhlIHNlcnZpY2UgaXMgZW1wdHlcIixcblxuICAgIC8vIFLDqXBvbnNlXG4gICAgU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT04gOiBcIlRoZSBzZXJ2aWNlIHJldHVybmVkIGFuIGV4Y2VwdGlvbiA6ICcldmFyJSdcIixcbiAgICBTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTl8yIDogXCJUaGUgc2VydmljZSByZXR1cm5lZCBhbiBleGNlcHRpb25cIixcbiAgICBTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0UgOiBcIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgdGhlIHJlc3BvbnNlICcldmFyJScgb2YgdGhlIHNlcnZpY2VcIixcbiAgICBTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0VfMiA6IFwiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSByZXNwb25zZVwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRU1QVFkgOiBcIlRoZSByZXNwb25zZSBvZiB0aGUgc2VydmljZSBpcyBlbXB0eVwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlfMiA6IFwiVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UgY291bGQgbm90IGJlIGFuYWx5emVkIG9yIGlzIGVtcHR5XCIsXG4gICAgU0VSVklDRV9SRVNQT05TRV9GT1JNQVQgOiBcIlRoZSBmb3JtYXQgb2YgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgbm90IHN1cHBvcnRlZCAoaGFuZGxlZCBmb3JtYXQocykgOiAnJXZhciUnKVwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUXzIgOiBcIlRoZSBmb3JtYXQgb2YgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgbm90IHN1cHBvcnRlZFwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUXzMgOiBcIk5vIHN1Z2dlc3Rpb24gbWF0Y2hpbmcgdGhlIHNlYXJjaFwiLFxuXG4gICAgLy8gQ2xhc3Nlc1xuICAgIENMQVNTX0NPTlNUUlVDVE9SIDogXCInJXZhciUnIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIixcblxuICAgIC8qKlxuICAgICAqIEZvbmN0aW9uIHF1aSB2YSByZXRvdXJuZXIgbGUgbWVzc2FnZSBkJ2VycmV1ciBhc3NvY2nDqSDDoCBsYSBjbMOpIGRvbm7DqWVcbiAgICAgKlxuICAgICAqIEBtZXRob2QgZ2V0TWVzc2FnZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGVmIC0gQ2xlZiBkZSBsJ2VycmV1ciAoZXggOiBFUlJPUl9QQVJBTSlcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBwYXJhbWV0cmVzIC0gUGFyYW3DqHRyZXMvdmFyaWFibGVzIGNvbmNlcm7DqXMgcGFyIGxlIG1lc3NhZ2UgZCdlcnJldXIgYXNzb2Npw6kgw6AgbGEgY2xlZiBkb25uw6llXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBtZXNzYWdlIC0gU3RyaW5nIGNvbnRlbmFudCBsZSBtZXNzYWdlIGRlIGwnZXhjZXB0aW9uXG4gICAgICovXG4gICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChjbGVmLCBwYXJhbWV0cmVzKSB7XG4gICAgICAgIC8vIHBhcmFtIGRlIGxhIGZvbmN0aW9uIHVuaXF1ZW1lbnQgcG91ciBsYSBkb2N1bWVudGF0aW9uLi4uXG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFyZ3VtZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJNZXNzYWdlIGluZGVmaW5lZCAhXCI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyYW1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgdmFyIGtleSA9IHBhcmFtcy5zaGlmdCgpO1xuICAgICAgICB2YXIgYXJncyA9IHBhcmFtcztcblxuICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXNba2V5XTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShcIiV2YXIlXCIsIGFyZ3Muam9pbihcIiAtIFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoXCIldmFyJVwiLCBcIiV2YXIlIChub3Qgc3BlY2lmaWVkKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gZXJyb3IgZGUgc3RyaW5nLnJlcGxhY2UoKVxuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlc1Jlc291cmNlcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Utils/MessagesResources.js\n"); - -/***/ }), - -/***/ 0: -/*!**********************!*\ - !*** multi ./src/Gp ***! - \**********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! /var/www/geoportail/geoportal-access-lib/src/Gp */"./src/Gp.js"); - - -/***/ }), - -/***/ "node-fetch": -/*!***********************************************************************************!*\ - !*** external {"commonjs2":"node-fetch","commonjs":"node-fetch","amd":"require"} ***! - \***********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = __WEBPACK_EXTERNAL_MODULE_node_fetch__;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcIm5vZGUtZmV0Y2hcIixcImNvbW1vbmpzXCI6XCJub2RlLWZldGNoXCIsXCJhbWRcIjpcInJlcXVpcmVcIn0/YWJiZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJub2RlLWZldGNoLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX25vZGVfZmV0Y2hfXzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///node-fetch\n"); - -/***/ }), - -/***/ "xmldom": -/*!***************************************************************************!*\ - !*** external {"commonjs2":"xmldom","commonjs":"xmldom","amd":"require"} ***! - \***************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = __WEBPACK_EXTERNAL_MODULE_xmldom__;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInhtbGRvbVwiLFwiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiYW1kXCI6XCJyZXF1aXJlXCJ9P2E2YmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoieG1sZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3htbGRvbV9fOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///xmldom\n"); - -/***/ }) - -/******/ })["default"]; -}); \ No newline at end of file diff --git a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js deleted file mode 100644 index e9e8bd81..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js +++ /dev/null @@ -1,10814 +0,0 @@ -/*! - * @brief Geoportal resources access library - * - * This software is released under the licence CeCILL-B (Free BSD compatible) - * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt - * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt - * @see http://www.cecill.info/ - * - * copyright CeCILL-B - * copyright IGN - * @author IGN - * @version 3.4.0-beta2 - * @date 27/10/2023 - * - */ -/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE - * @version v4.2.4 - */ - -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("node-fetch"), require("xmldom")); - else if(typeof define === 'function' && define.amd) - define("Gp", ["require", "require"], factory); - else if(typeof exports === 'object') - exports["Gp"] = factory(require("node-fetch"), require("xmldom")); - else - root["Gp"] = factory(root[undefined], root[undefined]); -})(this, function(__WEBPACK_EXTERNAL_MODULE__14__, __WEBPACK_EXTERNAL_MODULE__15__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(1); - - -/***/ }), -/* 1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesVersion", function() { return servicesVersion; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesDate", function() { return servicesDate; }); -/* harmony import */ var _Services_Services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); -/* harmony import */ var _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(32); -/* harmony import */ var _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33); -/* harmony import */ var _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(46); -/* harmony import */ var _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(47); -/* harmony import */ var _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(59); -/* harmony import */ var _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(53); -/* harmony import */ var _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(54); -/* harmony import */ var _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(3); -/* harmony import */ var _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(10); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(17); -/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(8); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(18); -var _package_json__WEBPACK_IMPORTED_MODULE_13___namespace = /*#__PURE__*/__webpack_require__.t(18, 1); -/** -* Global variable Gp. -* -* @module Gp -* @alias Gp -* @description -* -* This is the global variable that is exposed in the browser environment. -* Content is composed of constructor, functions and properties... -* -* > {@link Gp.Error Error()} -* - .TYPE_SRVERR : "SERVICE_ERROR" -* - .TYPE_UNKERR : "UNKNOWN_ERROR" -* - .TYPE_USEERR : "USAGE_ERROR" -* -* > {@link module:Helper Helper} -* - .indent() -* - .normalyzeParameters() -* - .normalyzeUrl() -* -* > {@link module:XHR Protocols.XHR} -* - .call() -* -* > {@link module:Services Services (objects)} -* - .Alti -* - {@link Gp.Services.Alti.Elevation .Elevation()} -* - {@link Gp.Services.AltiResponse .AltiResponse()} -* - .AutoComplete -* - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()} -* - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()} -* - {@link Gp.Services.Config .Config()} -* - {@link Gp.Services.DefaultUrl .DefaultUrl()} -* - {@link Gp.Services.GeocodeResponse .GeocodeResponse()} -* - {@link Gp.Services.GetConfigResponse .GetConfigResponse()} -* - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()} -* - .Route -* - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()} -* - {@link Gp.Services.RouteResponse .RouteResponse()} -* -* > Services (factory) -* - {@link module:Services~autoComplete .autoComplete()} -* - {@link module:Services~geocode .geocode()} -* - {@link module:Services~getAltitude .getAltitude()} -* - {@link module:Services~getConfig .getConfig()} -* - {@link module:Services~isoCurve .isoCurve()} -* - {@link module:Services~reverseGeocode .reverseGeocode()} -* - {@link module:Services~route .route()} -* -* > servicesDate : "YYYY-MM-DD" -* -* > servicesVersion : "X.X.X" -* -*/ - - - - - - - - - - - - - - - - -/** Version */ -var servicesVersion = _package_json__WEBPACK_IMPORTED_MODULE_13__.version; -/** Publication date */ -var servicesDate = _package_json__WEBPACK_IMPORTED_MODULE_13__.date; - -// on declare les ns dans root global -var Gp = {}; -Gp.servicesVersion = servicesVersion; -Gp.servicesDate = servicesDate; - -// Export Protocols -Gp.Protocols = {}; -Gp.Protocols.XHR = _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__["default"]; -// Export services -Gp.Services = _Services_Services__WEBPACK_IMPORTED_MODULE_0__["default"]; -// Export DefaultUrls -Gp.Services.DefaultUrl = _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"]; -// Export Alti -Gp.Services.AltiResponse = _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__["default"]; -Gp.Services.Alti = {}; -Gp.Services.Alti.Elevation = _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__["default"]; -// Export Autocomplete -Gp.Services.AutoCompleteResponse = _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__["default"]; -Gp.Services.AutoComplete = {}; -Gp.Services.AutoComplete.SuggestedLocation = _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__["default"]; -// Export Config -Gp.Services.Config = _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__["default"]; -// Export IsoCurve -Gp.Services.IsoCurveResponse = _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__["default"]; -// Export Route -Gp.Services.RouteResponse = _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__["default"]; -Gp.Services.Route = {}; -Gp.Services.Route.RouteInstruction = _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__["default"]; -// Export Erreurs et Outils -Gp.Error = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__["default"]; -Gp.Helper = _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__["default"]; -/* harmony default export */ __webpack_exports__["default"] = (Gp); - -/***/ }), -/* 2 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Config_Config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); -/* harmony import */ var _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21); -/* harmony import */ var _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(35); -/* harmony import */ var _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43); -/* harmony import */ var _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(44); -/* harmony import */ var _Route_Route__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(48); -/* harmony import */ var _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(55); -/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "point|circle|bbox" }] */ - -/** -* Geoportal web services invocation namespace. -* -* @module Services -* @alias Gp.Services -*/ - - - - - - - -var Services = { - /** - * Access to Geoportal resources metadata availables with one ore several keys - * - * @method getConfig - * @param {Object} options - Options for function call. - * @param {String} [options.apiKey] - Access key(s) ("," as separator, no spaces) to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web} - * @param {String} [options.customConfigFile] - path to a local config file. Overload the apiKey parameter - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if "rawResponse" parameter is set to true : a String will be returned. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - */ - getConfig: function getConfig(options) { - var configService = new _Config_Config__WEBPACK_IMPORTED_MODULE_0__["default"](options); - configService.call(); - }, - /** - * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.
- * Two use cases are availables :
- * 1. getting elevations of the given points : don't use the options.sampling parameter ;
- * 2. getting a regular set of elevations along the given points : use the options.sampling parameter. - * - * @method getAltitude - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {Array.} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter. - * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.
- * If not used, only elevations of these positions will be returned. - * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST'. Only use if you know what you are doing. - * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing. - */ - getAltitude: function getAltitude(options) { - var altiService = new _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__["default"](options); - altiService.call(); - }, - /** - * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}. - * - * @example - * Gp.Services.geocode ({ - * apiKey : "carte", - * location : "73 avenue de Paris, Saint-Mandé", - * // traitement des resultats - * onSuccess : function (result) { - * console.log("found (x:"+result.position.x+", y:"+result.position.y+")") ; - * } - * }) ; - * - * - * @method geocode - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". - * @param {String} options.query - Geographic identifier to locate. - * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. - * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". - *

- * Properties availables for address search :
- * "postalCode", "inseeCode" and "city". - *

- * Properties availables for place names search :
- * "postalCode", "inseeCode" and "type". - *

- * Properties availables for cadastral parcels search :
- * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. - * @param {Boolean} [options.returnTrueGeometry=false] - Set this parameter to true if you wish to have the true geometrie returned. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - geocode: function geocode(options) { - var geocodeService = new _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__["default"](options); - geocodeService.call(); - }, - /** - * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}. - * - * @method reverseGeocode - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". - * @param {Object} options.position - Reference position where to search geographical identifiers. - * @param {Float} options.position.lon - Longitude - * @param {Float} options.position.lat - Latitude - * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. - * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". - *

- * Properties availables for address search :
- * "postalCode", "inseeCode" and "city". - *

- * Properties availables for place names search :
- * "postalCode", "inseeCode" and "type". - *

- * Properties availables for cadastral parcels search :
- * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * @param {Object} [options.searchGeometry] - Location where to perform the search. - * @param {String} options.searchGeometry.type - Geometry type (Point|Circle|Linestring|Polygon) - * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordinates - * @param {Float} [options.searchGeometry.radius] - Radius (only for type 'Circle') - * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - reverseGeocode: function reverseGeocode(options) { - var reverseGeocodeService = new _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__["default"](options); - reverseGeocodeService.call(); - }, - /** - * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html} - * - * @method autoComplete - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} options.text - Text input to complete. - * @param {Array.} [options.filterOptions.type = "StreetAddress"] - Suggestion types to provide : address ("StreetAddress") and/or place name ("PositionOfInterest"). - * @param {Array.} [options.filterOptions.territory] - Places where to limit the search of suggestions : "METROPOLE" (Corsica and metropolitan France), "DOMTOM" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31'] - * @param {Number} [options.maximumResponses = 10] - Maximum number of responses. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - autoComplete: function autoComplete(options) { - var autoCompleteService = new _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__["default"](options); - autoCompleteService.call(); - }, - /** - * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}. - * - * @method route - * @param {Object} options - Options for function call. - * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} [options.routePreference = "fastest"] - Indicates the way to compute the route : "fastest" (time optimisation) or "shortest" (distance optimisation). Available values are in the GetCapabilities. - * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. - * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. - * @param {Array.} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude). Available bbox are in the GetCapabilities. - * @param {String} [options.graph = "Voiture"] - User profile to use to compute the route : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads the route may use and the average speed. Available bbox are in the GetCapabilities. - * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). - * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions. - * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response. - * @param {String} [options.distanceUnit = "m"] - The unit used to provide distances in the response ("meter" or "kilometer"). - * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). - * @param {Array.} [options.waysAttributes] - Way Attributes to add in the response. Available values are in the GetCapabilities. - * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.outputFormat='json'] - Output format ("json" or "xml") to use for underlying webService. Only use if you know what you are doing. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - route: function route(options) { - var routeService = new _Route_Route__WEBPACK_IMPORTED_MODULE_5__["default"](options); - routeService.call(); - }, - /** - * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}. - * - * @method isoCurve - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. - * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude). - * @param {String} [options.graph = "Voiture"] - User profile to use to compute the isoCurve : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads to use and the average speed. Available values are in the GetCapabilities. - * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). - * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. - * @param {String} [options.method = "time"] - Computing method to use : "time" (using a duration as a constraint) or "distance" (using a distance as a constraint). Available values are in the GetCapabilities. - * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to "time". - * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to "distance". - * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing. - * @param {String} [options.distanceUnit = "km"] - The unit used to provide distances in the response ("m" or "km"). - * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). - * @param {Boolean} [options.smoothing = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry to be smoothed. - * @param {Boolean} [options.holes = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.outputFormat='json'] - Output format ("json") to use for underlying webService. Only use if you know what you are doing. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - isoCurve: function isoCurve(options) { - var processIsoCurveService = new _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__["default"](options); - processIsoCurveService.call(); - } -}; - -/** - * Point object. - * - * @namespace - * @alias Gp.Point - * - * @property {Float} x - Point abscissa - * @property {Float} y - Point ordinate - */ -var point = {}; - -/** - * Circle object. - * - * @namespace - * @alias Gp.Circle - * - * @property {Float} x - Circle center abscissa. - * @property {Float} y - Circle center ordinate. - * @property {Float} radius - Circle radius. - */ -var circle = {}; - -/** - * Bounding box object, expressed with four coordinates. - * - * @namespace - * @alias Gp.BBox - * - * @property {Float} left - minimum abscissa - * @property {Float} right - maximum abscissa - * @property {Float} bottom - minimum ordinate - * @property {Float} top - maximum ordinate - */ -var bbox = {}; -/* harmony default export */ __webpack_exports__["default"] = (Services); - -/***/ }), -/* 3 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19); -/* harmony import */ var _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } - - - - - - -/** - * @classdesc - * - * Recupération de la configuration de clés Géoportail sous forme de JSON - * - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.Config - * @param {Object} options - options spécifiques au service (+ les options heritées) - * @param {Sting} options.apiKey - clé(s) dont on veut obtenir la configuration. Si plusieurs clés, séparer chacune par une virgule - * @param {Boolean} [options.sync=false] - force le mode synchrone - * @param {String} options.customConfigFile - chemin vers un fichier de configuration personnalisé. Surcharge le paramètre apiKey. - * - * @example - * var options = { - * apiKey : "cartes,ortho", - * sync : false, - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * }; - * - */ -function Config(options) { - if (!(this instanceof Config)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Config")); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "Config"; - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Config"); - this.logger.trace("[Constructeur Config (options)]"); - - // ##################### - // analyse des options - // ##################### - - // gestion du callback onSuccess - var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); - if (!bOnSuccess) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "onSuccess()")); - } - if (!options.apiKey && !options.customConfigFile) { - // si pas de thème spécifié, on récupère toutes les ressources possibles dans l'objet Config - options.apiKey = "full"; - } - this.options = {}; - this.options.onSuccess = options.onSuccess; - this.options.onFailure = options.onFailure; - - // mode sync - this.options.sync = options.sync || false; - - // gestion d'un tableau d'url des fichiers de configuration - this.options.listConfigUrls = options.customConfigFile ? [options.customConfigFile] : !Array.isArray(options.apiKey) ? _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__["default"].Config.url(options.apiKey.split(",")) : _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__["default"].Config.url(options.apiKey); -} - -/** - * @lends module:Config# - */ -Config.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_2__["default"].prototype, { - // todo - // getter/setter -}); - -/** - * Constructeur (alias) - */ -Config.prototype.constructor = Config; - -/** - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - * @overload - */ -Config.prototype.buildRequest = function (error, success) { - // liste des urls des fichiers de configuration en JSON - this.listConfigUrls = this.options.listConfigUrls; - if (!this.listConfigUrls) { - error.call(this, new Error("url by default not found !")); - return; - } - - // INFO : - // il n'y a pas de construction de requête, - // on passe directement à l'appel des requêtes - success.call(this, this.listConfigUrls); -}; - -/** - * Récupération des configuration - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - * @overload - */ -Config.prototype.callService = function (error, success) { - if (this.options.sync) { - __callServiceSync.call(this, error, success); - } else { - __callService.call(this, error, success); - } -}; - -/** - * Requêtes en mode asynchrone - * - * @param {*} error - * @param {*} success - * @private - */ -var __callService = function __callService(error, success) { - var _this = this; - // liste des resultats au format JSON - this.listConfigResults = []; - - // test on env. nodejs or browser - var Fetch = null; - if (typeof window === "undefined") { - var nodefetch = __webpack_require__(14); - Fetch = nodefetch; - } else { - Fetch = window.fetch; - } - - // the factory of fetch ! - var fetchFactory = function fetchFactory(url) { - return Fetch(url, { - credentials: "same-origin" - }).then(function (response) { - if (response.ok) { - return response.json().then(function (json) { - // TODO : - // tester le contenu ! - return json; - })["catch"](function (error) { - throw new Error("Exception Json : " + error); - }); - } else { - throw new Error("Exception HTTP : " + response.status + " (status code) !"); - } - })["catch"](function (error) { - return new Promise(function (resolve, reject) { - // eslint-disable-line no-unused-vars - reject(error); - }); - }); - }; - - // construction des promises fetch - var promises = []; - for (var index = 0; index < this.listConfigUrls.length; index++) { - var url = this.listConfigUrls[index]; - promises.push(fetchFactory(url)); - } - Promise.all(promises).then(function (results) { - if (!results) { - throw new Error("results config empty !?"); - } - results.forEach(function (result) { - // TODO : - // verification des resultats - _this.listConfigResults.push(result); - }); - }).then(function () { - success.call(_this, _this.listConfigResults); - })["catch"](function (e) { - // TODO : - // construction d'un message - error.call(_this, e); - }); -}; - -/** - * Requêtes en mode synchrone - * - * @param {*} error - * @param {*} success - * @private - */ -var __callServiceSync = function __callServiceSync(error, success) { - // liste des resultats au format JSON - this.listConfigResults = []; - - // FIXME : - // boucle synchrone ! - for (var i = 0; i < this.listConfigUrls.length; i++) { - var url = this.listConfigUrls[i]; - // TODO : - // prévoir le CORS, headers, ... - var request = new XMLHttpRequest(); - request.open("GET", url, false); - request.send(null); - if (request.status === 200) { - // TODO : - // tester la reponse ! - var response = JSON.parse(request.responseText); - this.listConfigResults.push(response); - } - } - // callback - if (this.listConfigResults.length !== 0) { - success.call(this, this.listConfigResults); - } else { - error.call(this, new Error("...")); - } -}; - -/** - * Analyse et mise en forme de la réponse en fusionnant les configurations - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - * @overload - */ -Config.prototype.analyzeResponse = function (error, success) { - // fonction de merge des objects JSON - var mergeConfig = function mergeConfig(objects) { - // objet fusion des couches - var allLayersConfig = {}; - // objet fusion des clés - var allKeysConfig = {}; - // objet fusion des TMS - var allTMSConfig = {}; - - // on fusionne les résultat - for (var i = 0; i < objects.length; i++) { - if (!objects[i].generalOptions || !objects[i].layers) { - return; - } - allKeysConfig = _objectSpread(_objectSpread({}, allKeysConfig), objects[i].generalOptions.apiKeys); - allLayersConfig = _objectSpread(_objectSpread({}, allLayersConfig), objects[i].layers); - allTMSConfig = _objectSpread(_objectSpread({}, allTMSConfig), objects[i].tileMatrixSets); - } - var mergedConfig = { - generalOptions: { - apiKeys: allKeysConfig - }, - layers: allLayersConfig, - tileMatrixSets: allTMSConfig - }; - return mergedConfig; - }; - - // fusion des configurations JSON - var ConfigJSON = mergeConfig(this.listConfigResults); - if (!ConfigJSON) { - error.call(this, new Error("configuration structure not conforme !")); - return; - } - - // creation des interfaces - var IConfig = new _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__["default"](); - // ajout des interfaces avec la configuration JSON - Object.assign(IConfig, ConfigJSON); - - // définition de la variable globale Gp.Config - var scope = typeof window !== "undefined" ? window : {}; - if (!scope.Gp) { - scope.Gp = {}; - } - - // enregistrement - if (scope.Gp.Config) { - Object.assign(scope.Gp.Config, IConfig); - // dans le doute..., ceinture et bretelles ! - for (var property in IConfig) { - scope.Gp.Config[property] = IConfig[property]; - } - } else { - scope.Gp.Config = IConfig; - } - - // INFO : - // il n'y a pas d'analyse des résultats, - // on passe directement à l'appel de la callback utilisateur - success.call(this, scope.Gp.Config); -}; -/* harmony default export */ __webpack_exports__["default"] = (Config); - -/***/ }), -/* 4 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); -/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__); - -var LoggerByDefault = { - /** - * logger statique - * - * @static - * @param {String} name - nom du logger - * @returns {Object} retourne un logger - */ - getLogger: function getLogger(name) { - // Substitute global constants configured at compile time - // cf. webpack.config.js - // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ? - "false".match(/true/) ? loglevel__WEBPACK_IMPORTED_MODULE_0__["disableAll"]() : loglevel__WEBPACK_IMPORTED_MODULE_0__["enableAll"](); - var logname = name || "default"; - return loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](logname); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (LoggerByDefault); - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* -* loglevel - https://github.com/pimterry/loglevel -* -* Copyright (c) 2013 Tim Perry -* Licensed under the MIT license. -*/ -(function (root, definition) { - "use strict"; - if (true) { - !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : - __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else {} -}(this, function () { - "use strict"; - - // Slightly dubious tricks to cut down minimized file size - var noop = function() {}; - var undefinedType = "undefined"; - var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && ( - /Trident\/|MSIE /.test(window.navigator.userAgent) - ); - - var logMethods = [ - "trace", - "debug", - "info", - "warn", - "error" - ]; - - // Cross-browser bind equivalent that works at least back to IE6 - function bindMethod(obj, methodName) { - var method = obj[methodName]; - if (typeof method.bind === 'function') { - return method.bind(obj); - } else { - try { - return Function.prototype.bind.call(method, obj); - } catch (e) { - // Missing bind shim or IE8 + Modernizr, fallback to wrapping - return function() { - return Function.prototype.apply.apply(method, [obj, arguments]); - }; - } - } - } - - // Trace() doesn't print the message in IE, so for that case we need to wrap it - function traceForIE() { - if (console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - // In old IE, native console methods themselves don't have apply(). - Function.prototype.apply.apply(console.log, [console, arguments]); - } - } - if (console.trace) console.trace(); - } - - // Build the best logging method possible for this env - // Wherever possible we want to bind, not wrap, to preserve stack traces - function realMethod(methodName) { - if (methodName === 'debug') { - methodName = 'log'; - } - - if (typeof console === undefinedType) { - return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives - } else if (methodName === 'trace' && isIE) { - return traceForIE; - } else if (console[methodName] !== undefined) { - return bindMethod(console, methodName); - } else if (console.log !== undefined) { - return bindMethod(console, 'log'); - } else { - return noop; - } - } - - // These private functions always need `this` to be set properly - - function replaceLoggingMethods(level, loggerName) { - /*jshint validthis:true */ - for (var i = 0; i < logMethods.length; i++) { - var methodName = logMethods[i]; - this[methodName] = (i < level) ? - noop : - this.methodFactory(methodName, level, loggerName); - } - - // Define log.log as an alias for log.debug - this.log = this.debug; - } - - // In old IE versions, the console isn't present until you first open it. - // We build realMethod() replacements here that regenerate logging methods - function enableLoggingWhenConsoleArrives(methodName, level, loggerName) { - return function () { - if (typeof console !== undefinedType) { - replaceLoggingMethods.call(this, level, loggerName); - this[methodName].apply(this, arguments); - } - }; - } - - // By default, we use closely bound real methods wherever possible, and - // otherwise we wait for a console to appear, and then try again. - function defaultMethodFactory(methodName, level, loggerName) { - /*jshint validthis:true */ - return realMethod(methodName) || - enableLoggingWhenConsoleArrives.apply(this, arguments); - } - - function Logger(name, defaultLevel, factory) { - var self = this; - var currentLevel; - defaultLevel = defaultLevel == null ? "WARN" : defaultLevel; - - var storageKey = "loglevel"; - if (typeof name === "string") { - storageKey += ":" + name; - } else if (typeof name === "symbol") { - storageKey = undefined; - } - - function persistLevelIfPossible(levelNum) { - var levelName = (logMethods[levelNum] || 'silent').toUpperCase(); - - if (typeof window === undefinedType || !storageKey) return; - - // Use localStorage if available - try { - window.localStorage[storageKey] = levelName; - return; - } catch (ignore) {} - - // Use session cookie as fallback - try { - window.document.cookie = - encodeURIComponent(storageKey) + "=" + levelName + ";"; - } catch (ignore) {} - } - - function getPersistedLevel() { - var storedLevel; - - if (typeof window === undefinedType || !storageKey) return; - - try { - storedLevel = window.localStorage[storageKey]; - } catch (ignore) {} - - // Fallback to cookies if local storage gives us nothing - if (typeof storedLevel === undefinedType) { - try { - var cookie = window.document.cookie; - var location = cookie.indexOf( - encodeURIComponent(storageKey) + "="); - if (location !== -1) { - storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1]; - } - } catch (ignore) {} - } - - // If the stored level is not valid, treat it as if nothing was stored. - if (self.levels[storedLevel] === undefined) { - storedLevel = undefined; - } - - return storedLevel; - } - - function clearPersistedLevel() { - if (typeof window === undefinedType || !storageKey) return; - - // Use localStorage if available - try { - window.localStorage.removeItem(storageKey); - return; - } catch (ignore) {} - - // Use session cookie as fallback - try { - window.document.cookie = - encodeURIComponent(storageKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; - } catch (ignore) {} - } - - /* - * - * Public logger API - see https://github.com/pimterry/loglevel for details - * - */ - - self.name = name; - - self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, - "ERROR": 4, "SILENT": 5}; - - self.methodFactory = factory || defaultMethodFactory; - - self.getLevel = function () { - return currentLevel; - }; - - self.setLevel = function (level, persist) { - if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { - level = self.levels[level.toUpperCase()]; - } - if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { - currentLevel = level; - if (persist !== false) { // defaults to true - persistLevelIfPossible(level); - } - replaceLoggingMethods.call(self, level, name); - if (typeof console === undefinedType && level < self.levels.SILENT) { - return "No console available for logging"; - } - } else { - throw "log.setLevel() called with invalid level: " + level; - } - }; - - self.setDefaultLevel = function (level) { - defaultLevel = level; - if (!getPersistedLevel()) { - self.setLevel(level, false); - } - }; - - self.resetLevel = function () { - self.setLevel(defaultLevel, false); - clearPersistedLevel(); - }; - - self.enableAll = function(persist) { - self.setLevel(self.levels.TRACE, persist); - }; - - self.disableAll = function(persist) { - self.setLevel(self.levels.SILENT, persist); - }; - - // Initialize with the right level - var initialLevel = getPersistedLevel(); - if (initialLevel == null) { - initialLevel = defaultLevel; - } - self.setLevel(initialLevel, false); - } - - /* - * - * Top-level API - * - */ - - var defaultLogger = new Logger(); - - var _loggersByName = {}; - defaultLogger.getLogger = function getLogger(name) { - if ((typeof name !== "symbol" && typeof name !== "string") || name === "") { - throw new TypeError("You must supply a name when creating a logger."); - } - - var logger = _loggersByName[name]; - if (!logger) { - logger = _loggersByName[name] = new Logger( - name, defaultLogger.getLevel(), defaultLogger.methodFactory); - } - return logger; - }; - - // Grab the current global log variable in case of overwrite - var _log = (typeof window !== undefinedType) ? window.log : undefined; - defaultLogger.noConflict = function() { - if (typeof window !== undefinedType && - window.log === defaultLogger) { - window.log = _log; - } - - return defaultLogger; - }; - - defaultLogger.getLoggers = function getLoggers() { - return _loggersByName; - }; - - // ES6 default export, for compatibility - defaultLogger['default'] = defaultLogger; - - return defaultLogger; -})); - - -/***/ }), -/* 6 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée. - * - * @example - * MessagesResources.getMessage("ERROR_PARAM_MISSING", "x", "y", "z"))); - * // --> output : Parameter(s) 'x - y - z' missing - * - * @module MessagesResources - * @alias Gp.Utils.MessagesResources - * @private - */ -var MessagesResources = { - // Paramètres - PARAM_MISSING: "Parameter(s) '%var%' missing", - PARAM_EMPTY: "Parameter(s) '%var%' empty", - PARAM_TYPE: "Wrong type(s) for parameter(s) '%var%'", - PARAM_FORMAT: "Parameter(s) '%var%' not correctly formatted", - PARAM_NOT_SUPPORT: "Value(s) for parameter(s) '%var%' not supported", - PARAM_NOT_SUPPORT_NODEJS: "Value(s) for parameter(s) '%var%' not supported to NodeJS", - PARAM_UNKNOWN: "Value(s) for parameter(s) '%var%' unknown", - // Services - // Requête - SERVICE_REQUEST_BUILD: "An error occurred during the request building of the service", - SERVICE_REQUEST_EMPTY: "The request sent to the service is empty", - // Réponse - SERVICE_RESPONSE_EXCEPTION: "The service returned an exception : '%var%'", - SERVICE_RESPONSE_EXCEPTION_2: "The service returned an exception", - SERVICE_RESPONSE_ANALYSE: "An error occurred while parsing the response '%var%' of the service", - SERVICE_RESPONSE_ANALYSE_2: "An unknown error occurred while parsing the response", - SERVICE_RESPONSE_EMPTY: "The response of the service is empty", - SERVICE_RESPONSE_EMPTY_2: "The response from the service could not be analyzed or is empty", - SERVICE_RESPONSE_FORMAT: "The format of the service response is not supported (handled format(s) : '%var%')", - SERVICE_RESPONSE_FORMAT_2: "The format of the service response is not supported", - SERVICE_RESPONSE_FORMAT_3: "No suggestion matching the search", - // Classes - CLASS_CONSTRUCTOR: "'%var%' constructor cannot be called as a function.", - /** - * Fonction qui va retourner le message d'erreur associé à la clé donnée - * - * @method getMessage - * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM) - * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée - * @return {String} message - String contenant le message de l'exception - */ - getMessage: function getMessage(clef, parametres) { - // param de la fonction uniquement pour la documentation... - - if (Object.keys(arguments).length === 0) { - return "Message indefined !"; - } - var params = Array.prototype.slice.call(arguments); - var key = params.shift(); - var args = params; - var message = this[key]; - try { - if (Array.isArray(args) && args.length > 0) { - message = message.replace("%var%", args.join(" - ")); - } else { - message = message.replace("%var%", "%var% (not specified)"); - } - } catch (e) { - // error de string.replace() - } - return message; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (MessagesResources); - -/***/ }), -/* 7 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6); -/* harmony import */ var _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(18); -var _package_json__WEBPACK_IMPORTED_MODULE_5___namespace = /*#__PURE__*/__webpack_require__.t(18, 1); - - - - - -// import DefaultUrlService from "./DefaultUrlService"; -// package.json (extract version) - - -/** - * @classdesc - * Composant Service - * - * @constructor - * @alias Gp.Services.CommonService - * @param {Object} options - options communes à tous les services - * - * @param {String} [options.serverUrl] - URL d'accès au service. Par défaut "https://wxs.ign.fr/calcul/geoportail/SERVICE/". - * Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès. - * Si ce paramètre est renseigné alors, le paramètre par défaut est ignoré. - * - * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service : - * peut valoir 'JSONP' ou 'XHR'. - * Par défaut, c'est le protocole XHR qui sera utilisé. - * Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR). - * - * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https. - * Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS). - * Sur un navigateur, le protocole est automatiquement extrait de l'url du site... - * Par défaut, on utilise le protocole http (ssl=false). - * - * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR. - * Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP. - * - * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP. - * Par défaut, la fonction de callback portera un nom du type "callback"+ID, où ID est soit un identifiant unique généré à chaque requête, - * soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix="_2", la fonction sera "callback_2 ()". - * Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu - * Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'. - * - * @param {String} [options.httpMethod] - La méthode HTTP - * à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'. - * Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET. - * Par défaut, c'est la méthode GET qui est utilisée. - * - * @param {String} [options.contentType] - Content-Type de la requete - * à utiliser dans le cas d'une requête XHR en mode POST. - * Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET. - * Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type. - * - * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête). - * Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0). - * - * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée. - * (Cf. paramètre « onSuccess » pour plus de détails). - * - * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête - * (code HTTP 200, sans message d'erreur). - * Cette fonction prend en paramètre la réponse du service, - * soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ; - * soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ». - * - * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement - * (code HTTP de retour différent de 200 ou pas de réponse). - * - * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse - * Permet de modifier la réponse avant parsing et la fonction doit retourner une String. - * Cette fonction prend en paramètre la réponse telle que renvoyée par le service - * (cad au format json ou xml). - * Pour le JSONP, si le paramètre "rawResponse" a été précisé avec la valeur "true", - * la fonction prend en paramètre un Object JavaScript contenant la réponse XML. - * - * @example - * var options = { - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * ssl : false, - * proxyURL : null, - * callbackName : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * onBeforeParse : function (rawResponse) {} - * }; - */ -function CommonService(options) { - if (!(this instanceof CommonService)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("CLASS_CONSTRUCTOR")); - } - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("CommonService"); - this.logger.trace("[Constructeur CommonService (options)]"); - - // ##################### - // récupération des options par défaut pour les paramètres optionnels - // ##################### - - /** - * Options du service - * @type {Object} - */ - this.options = { - // protocol : "JSONP", - protocol: "XHR", - ssl: true, - proxyURL: "", - // callbackName : "", - callbackSuffix: null, - httpMethod: "GET", - timeOut: 0, - rawResponse: false, - scope: this, - /** - * callback par defaut pour la reponse - * @param {Object} response - response - * @private - */ - onSuccess: function onSuccess(response) { - console.log("onSuccess - la reponse est la suivante : ", response); - }, - /** - * callback par defaut pour les erreurs - * @param {Object} error - error - * @private - */ - onFailure: function onFailure(error) { - if (error.status === 200 || !error.status) { - console.log("onFailure : ", error.message); - } else { - console.log("onFailure - Erreur (", error.status, ") : ", error.message); - } - } - }; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } - - // ##################### - // analyse des options - // ##################### - - // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée - if (this.options.rawResponse && !this.options.onSuccess) { - /** - * callback par defaut pour la reponse - * @param {Object} response - response - * @private - */ - this.options.onSuccess = function (response) { - console.log("onSuccess - la réponse brute du service est la suivante : ", response); - }; - } - - // gestion du callback onSuccess - var bOnSuccess = !!(this.options.onSuccess !== null && typeof this.options.onSuccess === "function"); - if (!bOnSuccess) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_MISSING", "onSuccess()")); - } - - // FIXME traitement au niveau de chaque composant pour tester service WXS / GPF - // gestion de l'url du service par defaut - /* - if (!this.options.serverUrl) { - // INFO - // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut - // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant - // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut - DefaultUrlService.ssl = this.options.ssl; - var urlByDefault = DefaultUrlService[this.CLASSNAME].url("calcul"); - if (typeof urlByDefault === "string") { - this.options.serverUrl = urlByDefault; - } else { - this.logger.trace("URL par defaut à determiner au niveau du composant..."); - } - } - */ - - // FIXME nettoyage des KVP dans l'url du service - // if (this.options.serverUrl) { - // // INFO - // // si l'url est renseignée, il faut la nettoyer de tous ses KVP - // // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait - // // des opérations d'encapsulations des reponses légèrement farfelues ... - // var urlsource = this.options.serverUrl; - // var urlparts = urlsource.split("?"); - // this.options.serverUrl = urlparts[0]; - // } - - // gestion de la methode HTTP - this.options.httpMethod = typeof options.httpMethod === "string" ? options.httpMethod.toUpperCase() : "GET"; - switch (this.options.httpMethod) { - case "POST": - case "GET": - break; - case "PUT": - case "DELETE": - case "HEAD": - case "OPTIONS": - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_NOT_SUPPORT", "httpMethod")); - default: - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_UNKNOWN", "httpMethod")); - } - - // gestion du protocole - // this.options.protocol = (typeof options.protocol === "string" ) ? options.protocol.toUpperCase() : "JSONP"; - this.options.protocol = typeof options.protocol === "string" ? options.protocol.toUpperCase() : "XHR"; - switch (this.options.protocol) { - case "JSONP": - case "XHR": - break; - default: - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_UNKNOWN", "protocol")); - } - - // on determine l'environnement d'execution : browser ou non ? - // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS... - if (typeof window === "undefined" && this.options.protocol === "JSONP") { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_NOT_SUPPORT_NODEJS", "protocol=JSONP (instead use XHR)")); - } - - // le protocole JSONP ne fonctionne qu'en GET. - if (this.options.protocol === "JSONP") { - this.options.httpMethod = "GET"; - } - - // gestion du cache - this.options.nocache = options.nocache || false; - - // ##################### - // attributs d'instances - // ##################### - - /** - * Format de réponse du service - */ - this.options.outputFormat = null; - /** - * Requête envoyée au service - */ - this.request = null; - /** - * Reponse du service - */ - this.response = null; -} - -/** - * @lends module:CommonService - */ -CommonService.prototype = { - /* - * Constructeur (alias) - */ - constructor: CommonService, - /** - * Appel du service Géoportail - */ - call: function call() { - /* jshint validthis : true */ - this.logger.trace("CommonService::call ()"); - var context = this; - /** fonction d'execution */ - function run() { - this.logger.trace("CommonService::run ()"); - this.buildRequest.call(context, onError, onBuildRequest); - } - run.call(context); - - // callback de fin de construction de la requête - function onBuildRequest(result) { - this.logger.trace("CommonService::onBuildRequest : ", result); - this.callService.call(context, onError, onCallService); - } - - // callback de fin d'appel au service - function onCallService(result) { - this.logger.trace("CommonService::onCallService : ", result); - this.analyzeResponse.call(context, onError, onAnalyzeResponse); - } - - // callback de fin de lecture de la reponse - function onAnalyzeResponse(result) { - this.logger.trace("CommonService::onAnalyzeResponse : ", result); - if (result) { - this.options.onSuccess.call(this, result); - } else { - return onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("Analyse de la reponse en échec !?")); - } - } - - // callback de gestion des erreurs : renvoit un objet de type ErrorService - function onError(error) { - this.logger.trace("CommonService::onError()"); - // error : l'objet est du type ErrorService ou Error - var e = error; - if (!(e instanceof _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"])) { - e = new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"](error.message); - } - this.options.onFailure.call(this, e); - } - }, - /** - * Création de la requête - * @param {Function} error - callback - * @param {Function} success - callback - */ - buildRequest: function buildRequest(error, success) { - // INFO - this.logger.error("overwritten method !"); - // retourne l'objet 'this.request' - if (error) { - error.call(this, "This method must be overwritten !"); - } - success.call(this, "This method must be overwritten !"); - }, - /** - * Appel du service - * @param {Function} error - callback - * @param {Function} success - callback - */ - callService: function callService(error, success) { - // INFO - // retourne l'objet 'this.response' - - // NOTES - // Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document). - // Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes : - // - natif - // - XML encapsulé : - // {http : {status:200, error:null},xml :'réponse du service'} - // {http : {status:400, error:'reponse du service'},xml :null} - // En XHR, la reponse est directement sauvegardée dans 'this.response'. - // Par contre, en JSONP, on doit analyser la reponse (status ou non vide), - // et ne renvoyer que le contenu (xml ou l'objet) - - // gestion de la proxification du service - var strUrlProxified = null; - var strData = this.request; - - // a t on mis en place un proxy ? - // la proxyfication est valable uniquement en mode XHR ! - var bUrlProxified = !!(this.options.proxyURL && this.options.protocol === "XHR"); - - // rajout de l'option gpbibaccess - // INFO : acces au numero de version de package.conf aprés compilation ! - if (this.CLASSNAME !== "Geocode" && this.CLASSNAME !== "ReverseGeocode" && this.CLASSNAME !== "AutoComplete") { - this.options.serverUrl = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, { - "gp-access-lib": _package_json__WEBPACK_IMPORTED_MODULE_5__.version, - apiKey: this.options.apiKey || "calcul" - }, false); - } - - // si le proxy est renseigné, on proxifie l'url du service - if (bUrlProxified) { - if (this.options.httpMethod === "GET") { - strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, this.request, true); - strData = null; - } - if (this.options.httpMethod === "POST") { - strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, null, true); - strData = this.request; - } - } - - // contexte du composant spécifique ! - var self = this; - var options = { - url: strUrlProxified || this.options.serverUrl, - method: this.options.httpMethod, - protocol: this.options.protocol, - timeOut: this.options.timeOut || 0, - format: this.options.outputFormat, - // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) ! - nocache: this.options.nocache || false, - // ceci permet d'ajouter un timestamp dans la requête - wrap: this.options.protocol !== "XHR", - // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR ! - callbackSuffix: this.options.callbackSuffix, - // callbackName : this.options.callbackName || null, - data: strData, - headers: null, - // TODO... - content: this.options.contentType || "application/xml", - scope: this.options.scope || this, - // callback de reponse - onResponse: function onResponse(response) { - self.logger.trace("callService::onResponse()"); - - // le contenu de la reponse à renvoyer ! - var content = null; - - // XHR : on renvoie toujours la reponse brute du service (json ou xml) - // au parser du composant... - if (self.options.protocol === "XHR") { - self.logger.trace("Response XHR", response); - content = response; // par defaut, la reponse du service ! - } - - // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas) - // avant de l'envoyer au parser du composant... - if (self.options.protocol === "JSONP") { - self.logger.trace("Response JSON", response); - if (response) { - if (response.http) { - // reponse encapsulée : - // ex. reponse du service en xml - // > {http : {status:200, error:null},xml :'réponse du service'} - if (response.http.status !== 200) { - error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]({ - status: response.http.status, - message: response.http.error, - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"].TYPE_SRVERR - })); - return; - } else { - content = response.xml; // par defaut ! - if (self.options.rawResponse) { - content = response; - } - } - } else { - // reponse non encapsulée : - // ex. reponse du service en json ou xml - content = response; - } - } else { - error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("Le contenu de la reponse est vide !?")); - return; - } - } - - // si on souhaite parser la reponse du service - if (typeof self.options.onBeforeParse === "function") { - var newResponse = self.options.onBeforeParse(content); - if (typeof newResponse === "string") { - // la reponse parsée par l'utilisateur est retournée sous - // forme de string ! - content = newResponse; - } - } - // sauvegarde de la reponse dans l'objet parent (CommonService) - self.response = content; - // on renvoie la reponse... - success.call(self, content); - }, - // callback des erreurs - onFailure: function onFailure(e) { - self.logger.trace("callService::onFailure()"); - // on est forcement sur une erreur levée par un service ! - e.type = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"].TYPE_SRVERR; - error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"](e)); - }, - // callback de timeOut - onTimeOut: function onTimeOut() { - self.logger.trace("callService::onTimeOut()"); - error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("TimeOut!")); - } - }; - _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__["default"].send(options); - }, - /** - * Analyse de la réponse - * @param {Function} error - callback - * @param {Function} success - callback - */ - analyzeResponse: function analyzeResponse(error, success) { - // INFO - this.logger.error("overwritten method !"); - // retourne l'objet spécifique au type de composant (json) - if (error) { - error.call(this, "This method must be overwritten !"); - } - success.call(this, "This method must be overwritten !"); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (CommonService); - -/***/ }), -/* 8 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Classe utilitaire - * - * @module Helper - * @alias Gp.Helper - */ -var Helper = { - /** - * concatenation des parametres key/value dans les urls - * - * @method normalyzeParameters - * @static - * @param {Object} params - tableau de clef/valeur - * - * @example - * Gp.Utils.Helper.normalyzeParameters ({ - * key1:value1, - * key2:value2, - * key3:value3 - * }); - * // out : "key1=value1&key2=value2&key3=value3" - * - * @returns {String} retourne les paramètres concaténés - */ - normalyzeParameters: function normalyzeParameters(params) { - var myParams = null; - if (params) { - var tabParams = []; - for (var key in params) { - if (params.hasOwnProperty(key)) { - var value = params[key]; - if (!value) { - value = ""; - } - tabParams.push(key + "=" + value); - } - } - myParams = tabParams.join("&"); - } - return myParams; - }, - /** - * Concaténation et encodage des urls. - * - * @method normalyzeUrl - * @static - * @param {String} url - url - * @param {Object|String} params - tableau de clef/valeur ou string - * @param {Boolean} encode - true|false, false par defaut - * - * @example - * Gp.Utils.Helper.normalyzeUrl (url, { - * key1:value1, - * key2=:value2, - * key3:value3 - * }); - * // out : "url?key1=value1&key2=value2&key3=value3" - * - * @returns {String} retourne une url normalisée - */ - normalyzeUrl: function normalyzeUrl(url, params, encode) { - var myUrl = url; - if (url) { - var k = url.indexOf("?"); - if (k === -1) { - // pas de ? et KVP - myUrl += "?"; - } - if (k !== -1 && k !== url.length - 1) { - // KVP - myUrl += "&"; - } - } - if (params) { - if (typeof params === "string") { - myUrl += params; - } else { - myUrl += this.normalyzeParameters(params); - } - } - if (encode) { - // FIXME bonne idée ? - myUrl = encodeURIComponent(myUrl); - } - return myUrl; - }, - /** - * Indentation d'une chaine - * - * @method indent - * @static - * @param {Number} n - nombre de tabulation - * @param {String} msg - chaine - * - * @example - * Gp.Utils.Helper.indent (2, "message à indenter") - * // out - * // ........message à indenter - * - * @returns {String} retourne une chaine indentée - */ - indent: function indent(n, msg) { - var num = n || 0; - return new Array(num + 1).join("\t") + msg; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (Helper); - -/***/ }), -/* 9 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); -/* harmony import */ var _XHR__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10); -/* harmony import */ var _JSONP__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); -/** - * Interface de dialogue avec les webservices - * - * @module Protocols - * @private - * @alias Gp.Protocols - */ - - - -var Protocol = { - /** - * Interface unique d"envoi d"une requête. - * - * @method send - * @static - * @param {Object} options - options generales - * @param {String} options.url - url du service - * @param {String} options.method - GET, POST, PUT, DELETE - * @param {String} options.protocol - XHR | JSONP - * @param {String} options.format - format de la reponse du service : json, xml ou null (brute)... - * @param {String} options.wrap - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP) - * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix="", la fonction s'appellera "callback") - * @param {String} options.timeOut - 0 ms - * @param {Boolean} options.nocache - true|false - * @param {Object|String} options.data - content (post) ou param (get) - * @param {Object|String} options.headers - (post) ex. referer - * @param {Object|String} options.content - (post) ex. "application/json" - * @param {String} options.scope - this (TODO) - * @param {Function} options.onResponse - callback - * @param {Function} options.onFailure - callback - * @param {Function} options.onTimeOut - callback - * @param {String} options.proxyUrl - (TODO) - */ - send: function send(options) { - // INFO - // "output" - param est interne à la classe "Protocol" (parametrable via "wrap"), et à ajouter à l"url - // ce param est independant du service car il est géré par le filtre LUA : - // ex. json|xml (json par defaut). - // Ce param. permet d"encapsuler du XML dans du JSON : - // {http : {status:200, error:null},xml :"réponse du service"} - // Utile pour les services qui ne repondent que du XML (ex. Geocodage) - // - // |-------------------------------------------------| - // | \service | | | | - // | output\ format| json | xml | remarques | - // |--------\------|------|-----|--------------------| - // | json | json | json| json/xml encapsulé | - // | xml | json | xml | param inactif | - // |-------------------------------------------------| - // ex. le service demande une reponse native au "format" json et avec un "output" json. - // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas ! - // dans ce cas on ne renseigne pas output=json - - // INFO - // "wrap" - choix d"encapsuler ou non les reponses dans du JSON. - // Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) ! - - // INFO - // "callback" - param est interne à la classe "Protocol" (non parametrable), et à ajouter à l"url - // ce param est independant du service car il est géré aussi par le filtre LUA : - // ex. callback|null - // Ce param. permet de renvoyer une reponse javascript : - // callback ({http : {status:200, error:null},xml :"réponse du service"}) - // Ce param. est non renseigné par defaut car pour du JSONP, on utilise le - // le protocol JSONP, et ce dernier implemente déjà le callback ! - - // settings par defaut - var settings = options || { - method: "GET", - // protocol : "JSONP", - protocol: "XHR", - timeOut: 0, - format: null, - wrap: true, - nocache: true, - output: "json", - callback: null, - callbackSuffix: null - }; - - // on determine l'environnement d'execution : browser ou non ? - // et on stoppe pour nodeJS... sur un protocole JSONP ! - if (typeof window === "undefined" && options.protocol === "JSONP") { - console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS"); - return; - } - if (options.protocol === "XHR" || options.format === "json") { - settings.wrap = false; - } else if (options.protocol === "JSONP" && options.format === "xml") { - settings.wrap = true; - } - settings.callback = null; // FIXME non géré !? - settings.output = settings.wrap ? "json" : null; - - // on encapsule les reponses dans un objet JSON - if (settings.wrap) { - var params = {}; - params.output = settings.output; - params.callback = settings.callback; - delete params.callback; // FIXME non géré !? - settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(options.url, params); - } - - // choix de l"implementation : - // XHR ou JSONP - switch (settings.protocol) { - case "XHR": - // on normalise l'url (gestion du cache) - if (options.method === "GET" && options.nocache) { - settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(settings.url, { - t: new Date().getTime() - }); - } - // appel du service en XHR - _XHR__WEBPACK_IMPORTED_MODULE_1__["default"].call(settings); - break; - case "JSONP": - // on normalise l'url si les params. sont renseignés dans la string|object "data" - if (settings.data) { - settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(settings.url, settings.data); - } - - // appel du service en JSONP - _JSONP__WEBPACK_IMPORTED_MODULE_2__["default"].call(settings); - break; - default: - throw new Error("protocol not supported (XHR|JSONP) !"); - } - } -}; -/* harmony default export */ __webpack_exports__["default"] = (Protocol); - -/***/ }), -/* 10 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8); -/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); -/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_2__); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -/* global Promise, require, XDomainRequest */ - - - - -// import __request from "request"; -// import __xmldom from "xmldom"; - -/** - * Ajax Request (use of Promises) - * - * @module XHR - * @alias Gp.Protocols.XHR - * @see dependance 'es6-promise' - */ - -// cf. https://xhr.spec.whatwg.org/ -// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest - -var XHR = { - /** - * Interface unique d'envoi d'une requête. - * - * @method call - * @static - * @param {Object} settings - options generales - * @param {String} settings.url - url du service - * @param {String} settings.method - GET, POST, PUT, DELETE - * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute) - * @param {String} settings.data - content (post) ou param (get) - * @param {String} settings.proxy - proxy url - * @param {Object|String} settings.headers - (post) ex. referer - * @param {Object|String} settings.content - (post) ex. 'application/json' - * @param {String} settings.timeOut - timeout = 0 par defaut - * @param {String} settings.scope - this - * @param {Function} settings.onResponse - callback - * @param {Function} settings.onFailure - callback - */ - call: function call(settings) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("XHR"); - logger.trace("[XHR::call()]"); - - // FIXME - // To polyfill the global environment - es6_promise__WEBPACK_IMPORTED_MODULE_2___default.a.polyfill(); - - // test sur les settings obligatoires - if (!settings.url) { - throw new Error("missing parameter : url is not defined !"); - } - if (!settings.method) { - throw new Error("missing parameter : method is not defined !"); - } - if (!settings.format) { - settings.format = "text"; // reponse brute ! - } - - var options = {}; - options.url = settings.url; - options.data = settings.data ? settings.data : null; - options.method = settings.method; - options.timeOut = settings.timeOut || 0; - options.scope = settings.scope || this; - options.proxy = settings.proxy || null; - options.content = settings.content || null; - options.headers = settings.headers || { - referer: "http://localhost" - }; - - // test sur les valeurs de 'settings.method' - switch (settings.method) { - case "DELETE": - case "GET": - break; - case "PUT": - case "POST": - // on force sur ces params spécifiques au mode POST - options.content = settings.content ? settings.content : "application/x-www-form-urlencoded"; // FIXME en attente des services : bascule en "application/xml" ou "application/json" - options.headers = settings.headers ? settings.headers : { - referer: "http://localhost" - }; // FIXME parametrable... - break; - case "HEAD": - case "OPTIONS": - throw new Error("HTTP method not yet supported !"); - default: - throw new Error("HTTP method unknown !"); - } - - // test sur les valeurs de 'settings.format' - switch (settings.format) { - case "text": - this.__call(options).then(function (response) { - logger.trace(response); - settings.onResponse.call(this, response); - })["catch"](function (error) { - settings.onFailure.call(this, error); - }); - break; - case "json": - this.__callJSON(options).then(function (response) { - logger.trace(response); - settings.onResponse.call(this, response); - })["catch"](function (error) { - settings.onFailure.call(this, error); - }); - break; - case "xml": - this.__callXML(options).then(function (response) { - logger.trace(response); - settings.onResponse.call(this, response); - })["catch"](function (error) { - settings.onFailure.call(this, error); - }); - break; - default: - throw new Error("This output Format is not yet supported !"); - } - }, - /** - * Requete - * - * @method __call - * @private - * @param {Object} options - options - * @return {Object} promise - */ - __call: function __call(options) { - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("XHR"); - logger.trace("[XHR::__call()]"); - var promise = new Promise(function (resolve, reject) { - // traitement du corps de la requête - var corps = options.method === "POST" || options.method === "PUT" ? 1 : 0; - - // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères) - if (options.data && (_typeof(options.data) === "object" && Object.keys(options.data).length || typeof options.data === "string" && options.data.length) && !corps) { - if (options.scope.CLASSNAME === "Geocode" || options.scope.CLASSNAME === "ReverseGeocode") { - options.url = options.url + options.data; - } else { - options.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(options.url, options.data); - } - } - logger.trace("URL = ", options.url); - var hXHR = null; - - // test on env. nodejs or browser - if (typeof window === "undefined") { - var nodefetch = __webpack_require__(14); - var opts = { - headers: { - Referer: "https://localhost" - } - }; - if (options.data && typeof options.data === "string" && corps) { - opts = { - method: options.method, - body: options.data, - headers: { - "Content-Type": options.content, - Referer: "https://localhost" - } - }; - } - return nodefetch(options.url, opts).then(function (response) { - if (response.ok) { - // res.status >= 200 && res.status < 300 - resolve(response.text()); - } else { - var message = "Errors Occured on Http Request (status : '" + response.statusText + "' | url : '" + response.url + "')"; - var status = response.status; - reject({ - message: message, - status: status - }); - } - })["catch"](function (e) { - reject({ - message: e, - status: -1 - }); - }); - } else { - if (window.XMLHttpRequest) { - logger.trace("XMLHttpRequest"); - hXHR = new XMLHttpRequest(); - hXHR.open(options.method, options.url, true); // async - hXHR.overrideMimeType = options.content; - - // gestion du timeout - var onTimeOutTrigger = null; - if (options.timeOut > 0) { - // FIXME le timeout interne ne me permet pas de declencher le bon message... - // hXHR.timeout = options.timeOut; - logger.trace("XHR - TimeOut actif !"); - /** - * Description - * - * @method onTimeOutTrigger - * @private - */ - onTimeOutTrigger = window.setTimeout(function () { - var message = "TimeOut Occured on Http Request with XMLHttpRequest !"; - reject({ - message: message, - status: -1 - }); - }, options.timeOut); - } - if (corps) { - // headers, data, content of data - // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader - logger.trace("data = ", options.data); - hXHR.setRequestHeader("Content-type", options.content); - // FIXME refused to set unsafe header content-length javascript - // hXHR.setRequestHeader ("Content-length", options.data.length); - // hXHR.setRequestHeader ("Referer", options.headers.referer); - } - - /** - * On Error - * FIXME ne se declenche pas !? - * - * @param {Object} e - Event - * @method onerror - * @private - */ - hXHR.onerror = function (e) { - console.log(e); - reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * On Timeout - * FIXME ne se declenche pas !? - * - * @param {Object} e - Event - * @method ontimeout - * @private - */ - hXHR.ontimeout = function (e) { - console.log(e); - reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * Description - * - * @method onreadystatechange - * @private - */ - hXHR.onreadystatechange = function (e) { - if (hXHR.readyState === 4) { - // DONE - if (hXHR.status === 200) { - window.clearTimeout(onTimeOutTrigger); - resolve(hXHR.response); - } else { - var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "' | response : '" + e.target.response + "')"; - var status = e.target.status; - reject({ - message: message, - status: status - }); - } - } - }; - - // gestion du content data - var data4xhr = options.data && corps ? options.data : null; - hXHR.send(data4xhr); - } else if (window.XDomainRequest) { - // worked in Internet Explorer 8–10 only ! - logger.trace("XDomainRequest"); - hXHR = new XDomainRequest(); - hXHR.open(options.method, options.url); - hXHR.overrideMimeType = options.content; - if (options.timeOut > 0) { - hXHR.timeout = options.timeout; - logger.trace("XHR - TimeOut actif !"); - } - if (corps) { - // headers, data, content of data - // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader - hXHR.setRequestHeader("Content-type", options.content); - // FIXME refused to set unsafe header content-length javascript - // hXHR.setRequestHeader ("Content-length", options.data.length); - // hXHR.setRequestHeader ("Referer", options.headers.referer); - } - - /** - * Description - * - * @method onerror - * @private - */ - hXHR.onerror = function () { - reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * Description - * - * @method ontimeout - * @private - */ - hXHR.ontimeout = function () { - reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * On Load - * - * @method onload - * @private - */ - hXHR.onload = function (e) { - if (hXHR.status === 200) { - resolve(hXHR.responseText); - } else { - var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "')"; - var status = e.target.status; - reject({ - message: message, - status: status - }); - } - }; - var data4xdr = options.data && corps ? options.data : null; - hXHR.send(data4xdr); - } else { - throw new Error("CORS not supported"); - } - } - }); - return promise; - }, - /** - * Requete avec parser JSON - * - * @method __callJSON - * @private - * @param {Object} options - options - * @return {Object} promise - */ - __callJSON: function __callJSON(options) { - return this.__call(options).then(JSON.parse)["catch"](function (error) { - console.log("_callJSON failed on : ", options.url, error); - // FIXME pas d'exception, laissons le fil se derouler... - // throw error; - }); - }, - - /** - * Requete avec parser XML - * - * @method __callXML - * @private - * @param {Object} options - options - * @return {Object} promise - */ - __callXML: function __callXML(options) { - return this.__call(options).then(function (response) { - var xmlDoc; - - // test on env. nodejs or browser - if (typeof window === "undefined") { - var DOMParser = __webpack_require__(15).DOMParser; // __xmldom.DOMParser - xmlDoc = new DOMParser().parseFromString(response, "text/xml"); - } else { - if (window.DOMParser) { - var parser = new window.DOMParser(); - xmlDoc = parser.parseFromString(response, "text/xml"); - } else { - // IE - xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.async = false; - xmlDoc.loadXML(response); - } - } - return xmlDoc; - })["catch"](function (error) { - console.log("__callXML failed on : ", options.url, error); - // FIXME pas d'exception, laissons le fil se derouler... - // throw error; - }); - } -}; - -/* harmony default export */ __webpack_exports__["default"] = (XHR); - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(process, global) {/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE - * @version v4.2.8+1e68dce6 - */ - -(function (global, factory) { - true ? module.exports = factory() : - undefined; -}(this, (function () { 'use strict'; - -function objectOrFunction(x) { - var type = typeof x; - return x !== null && (type === 'object' || type === 'function'); -} - -function isFunction(x) { - return typeof x === 'function'; -} - - - -var _isArray = void 0; -if (Array.isArray) { - _isArray = Array.isArray; -} else { - _isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; -} - -var isArray = _isArray; - -var len = 0; -var vertxNext = void 0; -var customSchedulerFn = void 0; - -var asap = function asap(callback, arg) { - queue[len] = callback; - queue[len + 1] = arg; - len += 2; - if (len === 2) { - // If len is 2, that means that we need to schedule an async flush. - // If additional callbacks are queued before the queue is flushed, they - // will be processed by this flush that we are scheduling. - if (customSchedulerFn) { - customSchedulerFn(flush); - } else { - scheduleFlush(); - } - } -}; - -function setScheduler(scheduleFn) { - customSchedulerFn = scheduleFn; -} - -function setAsap(asapFn) { - asap = asapFn; -} - -var browserWindow = typeof window !== 'undefined' ? window : undefined; -var browserGlobal = browserWindow || {}; -var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; -var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; - -// test for web worker but not in IE10 -var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; - -// node -function useNextTick() { - // node version 0.10.x displays a deprecation warning when nextTick is used recursively - // see https://github.com/cujojs/when/issues/410 for details - return function () { - return process.nextTick(flush); - }; -} - -// vertx -function useVertxTimer() { - if (typeof vertxNext !== 'undefined') { - return function () { - vertxNext(flush); - }; - } - - return useSetTimeout(); -} - -function useMutationObserver() { - var iterations = 0; - var observer = new BrowserMutationObserver(flush); - var node = document.createTextNode(''); - observer.observe(node, { characterData: true }); - - return function () { - node.data = iterations = ++iterations % 2; - }; -} - -// web worker -function useMessageChannel() { - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - return function () { - return channel.port2.postMessage(0); - }; -} - -function useSetTimeout() { - // Store setTimeout reference so es6-promise will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var globalSetTimeout = setTimeout; - return function () { - return globalSetTimeout(flush, 1); - }; -} - -var queue = new Array(1000); -function flush() { - for (var i = 0; i < len; i += 2) { - var callback = queue[i]; - var arg = queue[i + 1]; - - callback(arg); - - queue[i] = undefined; - queue[i + 1] = undefined; - } - - len = 0; -} - -function attemptVertx() { - try { - var vertx = Function('return this')().require('vertx'); - vertxNext = vertx.runOnLoop || vertx.runOnContext; - return useVertxTimer(); - } catch (e) { - return useSetTimeout(); - } -} - -var scheduleFlush = void 0; -// Decide what async method to use to triggering processing of queued callbacks: -if (isNode) { - scheduleFlush = useNextTick(); -} else if (BrowserMutationObserver) { - scheduleFlush = useMutationObserver(); -} else if (isWorker) { - scheduleFlush = useMessageChannel(); -} else if (browserWindow === undefined && "function" === 'function') { - scheduleFlush = attemptVertx(); -} else { - scheduleFlush = useSetTimeout(); -} - -function then(onFulfillment, onRejection) { - var parent = this; - - var child = new this.constructor(noop); - - if (child[PROMISE_ID] === undefined) { - makePromise(child); - } - - var _state = parent._state; - - - if (_state) { - var callback = arguments[_state - 1]; - asap(function () { - return invokeCallback(_state, child, callback, parent._result); - }); - } else { - subscribe(parent, child, onFulfillment, onRejection); - } - - return child; -} - -/** - `Promise.resolve` returns a promise that will become resolved with the - passed `value`. It is shorthand for the following: - - ```javascript - let promise = new Promise(function(resolve, reject){ - resolve(1); - }); - - promise.then(function(value){ - // value === 1 - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = Promise.resolve(1); - - promise.then(function(value){ - // value === 1 - }); - ``` - - @method resolve - @static - @param {Any} value value that the returned promise will be resolved with - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve$1(object) { - /*jshint validthis:true */ - var Constructor = this; - - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - - var promise = new Constructor(noop); - resolve(promise, object); - return promise; -} - -var PROMISE_ID = Math.random().toString(36).substring(2); - -function noop() {} - -var PENDING = void 0; -var FULFILLED = 1; -var REJECTED = 2; - -function selfFulfillment() { - return new TypeError("You cannot resolve a promise with itself"); -} - -function cannotReturnOwn() { - return new TypeError('A promises callback cannot return that same promise.'); -} - -function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { - try { - then$$1.call(value, fulfillmentHandler, rejectionHandler); - } catch (e) { - return e; - } -} - -function handleForeignThenable(promise, thenable, then$$1) { - asap(function (promise) { - var sealed = false; - var error = tryThen(then$$1, thenable, function (value) { - if (sealed) { - return; - } - sealed = true; - if (thenable !== value) { - resolve(promise, value); - } else { - fulfill(promise, value); - } - }, function (reason) { - if (sealed) { - return; - } - sealed = true; - - reject(promise, reason); - }, 'Settle: ' + (promise._label || ' unknown promise')); - - if (!sealed && error) { - sealed = true; - reject(promise, error); - } - }, promise); -} - -function handleOwnThenable(promise, thenable) { - if (thenable._state === FULFILLED) { - fulfill(promise, thenable._result); - } else if (thenable._state === REJECTED) { - reject(promise, thenable._result); - } else { - subscribe(thenable, undefined, function (value) { - return resolve(promise, value); - }, function (reason) { - return reject(promise, reason); - }); - } -} - -function handleMaybeThenable(promise, maybeThenable, then$$1) { - if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { - handleOwnThenable(promise, maybeThenable); - } else { - if (then$$1 === undefined) { - fulfill(promise, maybeThenable); - } else if (isFunction(then$$1)) { - handleForeignThenable(promise, maybeThenable, then$$1); - } else { - fulfill(promise, maybeThenable); - } - } -} - -function resolve(promise, value) { - if (promise === value) { - reject(promise, selfFulfillment()); - } else if (objectOrFunction(value)) { - var then$$1 = void 0; - try { - then$$1 = value.then; - } catch (error) { - reject(promise, error); - return; - } - handleMaybeThenable(promise, value, then$$1); - } else { - fulfill(promise, value); - } -} - -function publishRejection(promise) { - if (promise._onerror) { - promise._onerror(promise._result); - } - - publish(promise); -} - -function fulfill(promise, value) { - if (promise._state !== PENDING) { - return; - } - - promise._result = value; - promise._state = FULFILLED; - - if (promise._subscribers.length !== 0) { - asap(publish, promise); - } -} - -function reject(promise, reason) { - if (promise._state !== PENDING) { - return; - } - promise._state = REJECTED; - promise._result = reason; - - asap(publishRejection, promise); -} - -function subscribe(parent, child, onFulfillment, onRejection) { - var _subscribers = parent._subscribers; - var length = _subscribers.length; - - - parent._onerror = null; - - _subscribers[length] = child; - _subscribers[length + FULFILLED] = onFulfillment; - _subscribers[length + REJECTED] = onRejection; - - if (length === 0 && parent._state) { - asap(publish, parent); - } -} - -function publish(promise) { - var subscribers = promise._subscribers; - var settled = promise._state; - - if (subscribers.length === 0) { - return; - } - - var child = void 0, - callback = void 0, - detail = promise._result; - - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; - - if (child) { - invokeCallback(settled, child, callback, detail); - } else { - callback(detail); - } - } - - promise._subscribers.length = 0; -} - -function invokeCallback(settled, promise, callback, detail) { - var hasCallback = isFunction(callback), - value = void 0, - error = void 0, - succeeded = true; - - if (hasCallback) { - try { - value = callback(detail); - } catch (e) { - succeeded = false; - error = e; - } - - if (promise === value) { - reject(promise, cannotReturnOwn()); - return; - } - } else { - value = detail; - } - - if (promise._state !== PENDING) { - // noop - } else if (hasCallback && succeeded) { - resolve(promise, value); - } else if (succeeded === false) { - reject(promise, error); - } else if (settled === FULFILLED) { - fulfill(promise, value); - } else if (settled === REJECTED) { - reject(promise, value); - } -} - -function initializePromise(promise, resolver) { - try { - resolver(function resolvePromise(value) { - resolve(promise, value); - }, function rejectPromise(reason) { - reject(promise, reason); - }); - } catch (e) { - reject(promise, e); - } -} - -var id = 0; -function nextId() { - return id++; -} - -function makePromise(promise) { - promise[PROMISE_ID] = id++; - promise._state = undefined; - promise._result = undefined; - promise._subscribers = []; -} - -function validationError() { - return new Error('Array Methods must be provided an Array'); -} - -var Enumerator = function () { - function Enumerator(Constructor, input) { - this._instanceConstructor = Constructor; - this.promise = new Constructor(noop); - - if (!this.promise[PROMISE_ID]) { - makePromise(this.promise); - } - - if (isArray(input)) { - this.length = input.length; - this._remaining = input.length; - - this._result = new Array(this.length); - - if (this.length === 0) { - fulfill(this.promise, this._result); - } else { - this.length = this.length || 0; - this._enumerate(input); - if (this._remaining === 0) { - fulfill(this.promise, this._result); - } - } - } else { - reject(this.promise, validationError()); - } - } - - Enumerator.prototype._enumerate = function _enumerate(input) { - for (var i = 0; this._state === PENDING && i < input.length; i++) { - this._eachEntry(input[i], i); - } - }; - - Enumerator.prototype._eachEntry = function _eachEntry(entry, i) { - var c = this._instanceConstructor; - var resolve$$1 = c.resolve; - - - if (resolve$$1 === resolve$1) { - var _then = void 0; - var error = void 0; - var didError = false; - try { - _then = entry.then; - } catch (e) { - didError = true; - error = e; - } - - if (_then === then && entry._state !== PENDING) { - this._settledAt(entry._state, i, entry._result); - } else if (typeof _then !== 'function') { - this._remaining--; - this._result[i] = entry; - } else if (c === Promise$1) { - var promise = new c(noop); - if (didError) { - reject(promise, error); - } else { - handleMaybeThenable(promise, entry, _then); - } - this._willSettleAt(promise, i); - } else { - this._willSettleAt(new c(function (resolve$$1) { - return resolve$$1(entry); - }), i); - } - } else { - this._willSettleAt(resolve$$1(entry), i); - } - }; - - Enumerator.prototype._settledAt = function _settledAt(state, i, value) { - var promise = this.promise; - - - if (promise._state === PENDING) { - this._remaining--; - - if (state === REJECTED) { - reject(promise, value); - } else { - this._result[i] = value; - } - } - - if (this._remaining === 0) { - fulfill(promise, this._result); - } - }; - - Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) { - var enumerator = this; - - subscribe(promise, undefined, function (value) { - return enumerator._settledAt(FULFILLED, i, value); - }, function (reason) { - return enumerator._settledAt(REJECTED, i, reason); - }); - }; - - return Enumerator; -}(); - -/** - `Promise.all` accepts an array of promises, and returns a new promise which - is fulfilled with an array of fulfillment values for the passed promises, or - rejected with the reason of the first passed promise to be rejected. It casts all - elements of the passed iterable to promises as it runs this algorithm. - - Example: - - ```javascript - let promise1 = resolve(1); - let promise2 = resolve(2); - let promise3 = resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - Promise.all(promises).then(function(array){ - // The array here would be [ 1, 2, 3 ]; - }); - ``` - - If any of the `promises` given to `all` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - Example: - - ```javascript - let promise1 = resolve(1); - let promise2 = reject(new Error("2")); - let promise3 = reject(new Error("3")); - let promises = [ promise1, promise2, promise3 ]; - - Promise.all(promises).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(error) { - // error.message === "2" - }); - ``` - - @method all - @static - @param {Array} entries array of promises - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all `promises` have been - fulfilled, or rejected if any of them become rejected. - @static -*/ -function all(entries) { - return new Enumerator(this, entries).promise; -} - -/** - `Promise.race` returns a new promise which is settled in the same way as the - first passed promise to settle. - - Example: - - ```javascript - let promise1 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 2'); - }, 100); - }); - - Promise.race([promise1, promise2]).then(function(result){ - // result === 'promise 2' because it was resolved before promise1 - // was resolved. - }); - ``` - - `Promise.race` is deterministic in that only the state of the first - settled promise matters. For example, even if other promises given to the - `promises` array argument are resolved, but the first settled promise has - become rejected before the other promises became fulfilled, the returned - promise will become rejected: - - ```javascript - let promise1 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new Promise(function(resolve, reject){ - setTimeout(function(){ - reject(new Error('promise 2')); - }, 100); - }); - - Promise.race([promise1, promise2]).then(function(result){ - // Code here never runs - }, function(reason){ - // reason.message === 'promise 2' because promise 2 became rejected before - // promise 1 became fulfilled - }); - ``` - - An example real-world use case is implementing timeouts: - - ```javascript - Promise.race([ajax('foo.json'), timeout(5000)]) - ``` - - @method race - @static - @param {Array} promises array of promises to observe - Useful for tooling. - @return {Promise} a promise which settles in the same way as the first passed - promise to settle. -*/ -function race(entries) { - /*jshint validthis:true */ - var Constructor = this; - - if (!isArray(entries)) { - return new Constructor(function (_, reject) { - return reject(new TypeError('You must pass an array to race.')); - }); - } else { - return new Constructor(function (resolve, reject) { - var length = entries.length; - for (var i = 0; i < length; i++) { - Constructor.resolve(entries[i]).then(resolve, reject); - } - }); - } -} - -/** - `Promise.reject` returns a promise rejected with the passed `reason`. - It is shorthand for the following: - - ```javascript - let promise = new Promise(function(resolve, reject){ - reject(new Error('WHOOPS')); - }); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = Promise.reject(new Error('WHOOPS')); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - @method reject - @static - @param {Any} reason value that the returned promise will be rejected with. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject$1(reason) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(noop); - reject(promise, reason); - return promise; -} - -function needsResolver() { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); -} - -function needsNew() { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); -} - -/** - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise's eventual value or the reason - why the promise cannot be fulfilled. - - Terminology - ----------- - - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. - - A promise can be in one of three states: pending, fulfilled, or rejected. - - Promises that are fulfilled have a fulfillment value and are in the fulfilled - state. Promises that are rejected have a rejection reason and are in the - rejected state. A fulfillment value is never a thenable. - - Promises can also be said to *resolve* a value. If this value is also a - promise, then the original promise's settled state will match the value's - settled state. So a promise that *resolves* a promise that rejects will - itself reject, and a promise that *resolves* a promise that fulfills will - itself fulfill. - - - Basic Usage: - ------------ - - ```js - let promise = new Promise(function(resolve, reject) { - // on success - resolve(value); - - // on failure - reject(reason); - }); - - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Advanced Usage: - --------------- - - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. - - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - let xhr = new XMLHttpRequest(); - - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); - } - } - }; - }); - } - - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Unlike callbacks, promises are great composable primitives. - - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON - - return values; - }); - ``` - - @class Promise - @param {Function} resolver - Useful for tooling. - @constructor -*/ - -var Promise$1 = function () { - function Promise(resolver) { - this[PROMISE_ID] = nextId(); - this._result = this._state = undefined; - this._subscribers = []; - - if (noop !== resolver) { - typeof resolver !== 'function' && needsResolver(); - this instanceof Promise ? initializePromise(this, resolver) : needsNew(); - } - } - - /** - The primary way of interacting with a promise is through its `then` method, - which registers callbacks to receive either a promise's eventual value or the - reason why the promise cannot be fulfilled. - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` - Chaining - -------- - The return value of `then` is itself a promise. This second, 'downstream' - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return 'default name'; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `'default name'` - }); - findUser().then(function (user) { - throw new Error('Found user, but still unhappy'); - }, function (reason) { - throw new Error('`findUser` rejected and we're unhappy'); - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. - // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. - ```js - findUser().then(function (user) { - throw new PedagogicalException('Upstream error'); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` - Assimilation - ------------ - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` - If the assimliated promise rejects, then the downstream promise will also reject. - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` - Simple Example - -------------- - Synchronous Example - ```javascript - let result; - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` - Errback Example - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success - } - }); - ``` - Promise Example; - ```javascript - findResult().then(function(result){ - // success - }, function(reason){ - // failure - }); - ``` - Advanced Example - -------------- - Synchronous Example - ```javascript - let author, books; - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` - Errback Example - ```js - function foundBooks(books) { - } - function failure(reason) { - } - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` - Promise Example; - ```javascript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong - }); - ``` - @method then - @param {Function} onFulfilled - @param {Function} onRejected - Useful for tooling. - @return {Promise} - */ - - /** - `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same - as the catch block of a try/catch statement. - ```js - function findAuthor(){ - throw new Error('couldn't find that author'); - } - // synchronous - try { - findAuthor(); - } catch(reason) { - // something went wrong - } - // async with promises - findAuthor().catch(function(reason){ - // something went wrong - }); - ``` - @method catch - @param {Function} onRejection - Useful for tooling. - @return {Promise} - */ - - - Promise.prototype.catch = function _catch(onRejection) { - return this.then(null, onRejection); - }; - - /** - `finally` will be invoked regardless of the promise's fate just as native - try/catch/finally behaves - - Synchronous example: - - ```js - findAuthor() { - if (Math.random() > 0.5) { - throw new Error(); - } - return new Author(); - } - - try { - return findAuthor(); // succeed or fail - } catch(error) { - return findOtherAuther(); - } finally { - // always runs - // doesn't affect the return value - } - ``` - - Asynchronous example: - - ```js - findAuthor().catch(function(reason){ - return findOtherAuther(); - }).finally(function(){ - // author was either found, or not - }); - ``` - - @method finally - @param {Function} callback - @return {Promise} - */ - - - Promise.prototype.finally = function _finally(callback) { - var promise = this; - var constructor = promise.constructor; - - if (isFunction(callback)) { - return promise.then(function (value) { - return constructor.resolve(callback()).then(function () { - return value; - }); - }, function (reason) { - return constructor.resolve(callback()).then(function () { - throw reason; - }); - }); - } - - return promise.then(callback, callback); - }; - - return Promise; -}(); - -Promise$1.prototype.then = then; -Promise$1.all = all; -Promise$1.race = race; -Promise$1.resolve = resolve$1; -Promise$1.reject = reject$1; -Promise$1._setScheduler = setScheduler; -Promise$1._setAsap = setAsap; -Promise$1._asap = asap; - -/*global self*/ -function polyfill() { - var local = void 0; - - if (typeof global !== 'undefined') { - local = global; - } else if (typeof self !== 'undefined') { - local = self; - } else { - try { - local = Function('return this')(); - } catch (e) { - throw new Error('polyfill failed because global object is unavailable in this environment'); - } - } - - var P = local.Promise; - - if (P) { - var promiseToString = null; - try { - promiseToString = Object.prototype.toString.call(P.resolve()); - } catch (e) { - // silently ignored - } - - if (promiseToString === '[object Promise]' && !P.cast) { - return; - } - } - - local.Promise = Promise$1; -} - -// Strange compat.. -Promise$1.polyfill = polyfill; -Promise$1.Promise = Promise$1; - -return Promise$1; - -}))); - - - -//# sourceMappingURL=es6-promise.map - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(12), __webpack_require__(13))) - -/***/ }), -/* 12 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 13 */ -/***/ (function(module, exports) { - -var g; - -// This works in non-strict mode -g = (function() { - return this; -})(); - -try { - // This works if eval is allowed (see CSP) - g = g || new Function("return this")(); -} catch (e) { - // This works if the window reference is available - if (typeof window === "object") g = window; -} - -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} - -module.exports = g; - - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE__14__; - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE__15__; - -/***/ }), -/* 16 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/** - * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail - * - * @module JSONP - * @private - * @alias Gp.Protocols.JSONP - */ - - -// cf. https://github.com/sobstel/jsonp.js -var JSONP = { - /** - * Construction d'un identifiant statique basé sur le timestamp, - * et qui s'incremente de +1 à chaque appel - */ - uuid: function () { - var id = Math.floor(Date.now()); - return function () { - return id++; - }; - }(), - /** - * Cette fonction réalise l'appel du service fourni via le paramètre "options.url" - * en mettant en œuvre le protocole JSONP. - * - * @method call - * @static - * @param {Object} options - parametres d'invocation du service en JSONP - * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP). - * Cette URL contient déjà les paramètres du service. - * Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ; - * sa valeur est déterminée en fonction du paramètre callbackName. - * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu. - * Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut. - * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL. - * Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: "callback1458574396582 ()" - * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL. - * Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte. - * La fonction de callback est créée dynamiquement par la fonction JSONP ; - * elle a deux fonctions : - * elle annule la condition de timeOut - * puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse. - * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service. - * Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback. - * La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre. - * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service. - * Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut. - * @example - * var options = { - * url : 'http://localhost/some/test.json&callback=myResults', - * timeOut : 100, - * callbackName : 'myResults', - * callbackSuffix : "", - * onResponse : function (response) { - * console.log('results : ', response); - * }, - * - * }; - * JSONP.call(options); - */ - call: function call(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("JSONP"); - logger.trace("[JSONP::call ()]"); - - // analyse parametres - - if (!options) { - logger.error("missing parameter : options !"); - throw new Error("missing parameter : options !"); - } - if (!options.url) { - logger.error("missing parameter : options.url !"); - throw new Error("missing parameter : options.url !"); - } - if (!options.timeOut) { - logger.info("setting 'options.timeOut' default value"); - options.timeOut = 0; - } - - // FIXME si un callback coté client a été mis en place, - // cette condition sur cette methode n'a pas de sens !? - if (!options.onResponse) { - logger.error("missing parameter : options.onResponse !"); - throw new Error("missing parameter : options.onResponse !"); - // FIXME doit on definir un callback interne par defaut !? - // options.onResponse = function (data) { - // console.log("response callback (inner) : ", data); - // }; - } - - // ID du callback à utiliser : null ou string. - // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = "") - // sinon, on utilise un timestamp : this.uuid () - var callbackId = typeof options.callbackSuffix === "string" ? options.callbackSuffix : this.uuid(); - - // on recherche le parametre callback et son nom de fonction dans l'url - var urlHasCallbackKey = false; - var urlHasCallbackName = false; - var idx = options.url.indexOf("callback="); - if (idx !== -1) { - urlHasCallbackKey = true; - // extraction callbackName de l'url : entre "callback=" et "&" ou fin de ligne - var j = options.url.indexOf("&", idx); - if (j === -1) { - j = options.url.length; - } - - // on ecrase le parametre options.callbackName s'il avait été défini - var callbackName = options.url.substring(idx + 9, j); - if (callbackName) { - urlHasCallbackName = true; - options.callbackName = callbackName; - logger.info("setting 'options.callbackName' value (" + options.callbackName + ") from 'options.url' parameter"); - } - } - - // on ajoute le parametre callback dans l'URL s'il n'existe pas - if (!urlHasCallbackKey) { - // gestion des autres param. et "?" - var k = options.url.indexOf("?"); - if (k === -1) { - // aucun param., ni de '?' - options.url = options.url + "?" + "callback="; - } else if (k === options.url.length) { - // uniquement le '?' - options.url = options.url + "callback="; - } else { - // le '?' et les param. existent - options.url = options.url + "&" + "callback="; - } - logger.info("setting callback default key in 'options.url' : " + options.url); - } - - // utilisation de la fonction callback coté client ? - var HasCallbackName = options.callbackName ? true : urlHasCallbackName; - - // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas - if (!urlHasCallbackName) { - // fonction callback par defaut - if (!options.callbackName) { - logger.info("setting 'options.callbackName' default value"); - options.callbackName = "callback"; // ou "gp.protocol.jsonp" ? - // info : si on ne veut pas gerer d'ID dans le callback, - // options.callbackSuffix = "" - if (callbackId || callbackId === "") { - options.callbackName += callbackId; - } - } - options.url = options.url.replace("callback=", "callback=" + options.callbackName); - logger.info("setting callback function name in 'options.url' : " + options.url); - } - - // timeOut par defaut - if (!options.onTimeOut) { - logger.info("setting 'options.onTimeOut' default value"); - /** callback timeout par defaut */ - options.onTimeOut = function /* error */ - () { - console.log("TimeOut while invoking url : " + options.url); - }; - } - if (!HasCallbackName) { - var self = this; - - // event du timeout - var onTimeOutTrigger = null; - - // declenche le timeout si > à 0 ! - if (options.timeOut > 0) { - onTimeOutTrigger = window.setTimeout(function () { - /** fonction de reponse du service */ - window[options.callbackName] = function () {}; - options.onTimeOut(); - self._deleteScript(callbackId); - }, options.timeOut); - } - - // FIXME le nom de la fonction n'accepte pas de namespace ! - // ex. Gp.Function.callback - /** - * fonction de reponse du service - * @param {Object} data - data - * @private - */ - window[options.callbackName] = function (data) { - window.clearTimeout(onTimeOutTrigger); - options.onResponse(data); - self._deleteScript(callbackId); - }; - } - this._createScript(callbackId, options.url); - }, - /** - * create Script - * @param {String} callbackId - callback Id - * @param {String} url - url - * @private - */ - _createScript: function _createScript(callbackId, url) { - var scriptu; - var scripto = document.getElementById("results" + callbackId); - scriptu = document.createElement("script"); - scriptu.setAttribute("type", "text/javascript"); - scriptu.setAttribute("src", url); - scriptu.setAttribute("charset", "UTF-8"); - scriptu.setAttribute("id", "results" + callbackId); - scriptu.setAttribute("async", "true"); // FIXME async ? - // head ou body ou autres ? - var node = document.documentElement || document.getElementsByTagName("head")[0]; - if (scripto === null) { - node.appendChild(scriptu); - } else { - // s'il existe déjà, on le remplace ! - node.replaceChild(scriptu, scripto); - } - }, - /** - * delete Script - * @param {String} callbackId - callback Id - * @private - */ - _deleteScript: function _deleteScript(callbackId) { - var script = document.getElementById("results" + callbackId); - if (script) { - var node = script.parentNode || document.documentElement; - if (!node) { - return; - } - node.removeChild(script); - } - } -}; -/* harmony default export */ __webpack_exports__["default"] = (JSONP); - -/***/ }), -/* 17 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Errors raised by API for one among three reasons : wrong API usage, underlying service error or unknown reason. - * - * @property {String} message - Error message - * @property {Number} status - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} ; -1 otherwise. - * @property {String} type - Error type ({@link Gp.Error.TYPE_SRVERR}, {@link Gp.Error.TYPE_USEERR} or {@link Gp.Error.TYPE_UNKERR}). - * - * @namespace - * @alias Gp.Error - * @param {Object|String} error - Options for creating error object. Can be a String (message) or an Object. - * @param {String} error.message - Error message to return to user. - * @param {enum} [error.type=TYPE_UNKERR] - Error type - * @param {status} [error.status=-1] - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}. - * - */ -function ErrorService(error) { - if (!(this instanceof ErrorService)) { - throw new TypeError("ErrorService constructor cannot be called as a function."); - } - var e = error; - if (typeof error === "string" || error instanceof String) { - this.message = error; - this.status = -1; - this.type = ErrorService.TYPE_UNKERR; - } else { - this.message = e.message || "undefined!?"; - this.type = e.type; - this.status = e.status || -1; - } - this.name = "ErrorService"; - this.stack = new Error().stack; -} - -/** - * Error raised when underlying geoportal service answers on error. - * - * @type {String} - * @constant - * @static - */ -ErrorService.TYPE_SRVERR = "SERVICE_ERROR"; -/** - * Error raised when funcion use is inappropriate - * - * @type {String} - * @constant - * @static - */ -ErrorService.TYPE_USEERR = "USAGE_ERROR"; -/** - * Error raised when API can't perform the job for a reason other than the two other ones. - * - * @type {String} - * @constant - * @static - */ -ErrorService.TYPE_UNKERR = "UNKNOWN_ERROR"; - -/** - * @lends module:ErrorService - */ -ErrorService.prototype = Object.create(Error.prototype, { - constructor: { - value: ErrorService, - writable: true, - configurable: true - } -}); -/* harmony default export */ __webpack_exports__["default"] = (ErrorService); - -/***/ }), -/* 18 */ -/***/ (function(module) { - -module.exports = JSON.parse("{\"name\":\"geoportal-access-lib\",\"version\":\"3.4.0-beta2\",\"date\":\"27/10/2023\",\"description\":\"French Geoportal resources access library\",\"module\":\"src/Gp.js\",\"main\":\"dist/GpServices-src.js\",\"homepage\":\"https://github.com/IGNF/geoportal-access-lib#readme\",\"scripts\":{\"clean\":\"echo \\\"Warning: no yet implemented!\\\" && exit 0\",\"setup\":\"npm install\",\"cover\":\"nyc --reporter=lcov --reporter=text npm run test\",\"eslint\":\"eslint src/\",\"build\":\"webpack --mode=none\",\"build:prod\":\"webpack --mode=production\",\"build:dev\":\"webpack --mode=development\",\"test\":\"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\\"test_*.js\\\" test/spec/\",\"test:serve\":\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js\",\"test:serve:docker\":\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js\",\"test:end-to-end:serve\":\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js\",\"test:end-to-end:serve:docker\":\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js\",\"sample\":\"npm run sample:serve\",\"sample:serve\":\"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path '/dist/' --port 9001 --open\",\"sample:serve:prod\":\"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path '/dist/' --port 9001 --open\",\"sample:serve:dev\":\"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path '/dist/' --port 9001 --open\",\"doc\":\"npm run doc:serve\",\"doc:serve\":\"webpack-dev-server --content-base jsdoc --port 9001 --open\"},\"nyc\":{\"include\":[\"src/**/*.js\"],\"instrument\":false,\"sourceMap\":false},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/IGNF/geoportal-access-lib.git\"},\"keywords\":[\"geoportail\",\"webservice\",\"javascript\",\"es6\"],\"author\":\"IGNF\",\"license\":\"CECILL-B\",\"dependencies\":{\"es6-promise\":\"^4.2.4\",\"node-fetch\":\"^2.6.1\",\"xmldom\":\"^0.1.27\"},\"devDependencies\":{\"@babel/core\":\"^7.12.10\",\"@babel/plugin-transform-template-literals\":\"^7.12.1\",\"@babel/preset-env\":\"^7.12.11\",\"babel-loader\":\"^8.2.2\",\"chai\":\"^4.1.2\",\"clean-webpack-plugin\":\"^3.0.0\",\"copy-webpack-plugin\":\"^5.1.2\",\"eslint\":\"^7.18.0\",\"eslint-config-standard\":\"^16.0.2\",\"eslint-loader\":\"^4.0.2\",\"eslint-plugin-import\":\"^2.22.1\",\"eslint-plugin-node\":\"^11.1.0\",\"eslint-plugin-promise\":\"^4.2.1\",\"eslint-plugin-standard\":\"^5.0.0\",\"glob\":\"^7.1.2\",\"handlebars-layouts\":\"^3.1.4\",\"handlebars-webpack-plugin\":\"^1.4.1\",\"html-webpack-plugin\":\"^4.5.1\",\"istanbul-instrumenter-loader\":\"^3.0.1\",\"jsdoc-webpack-plugin\":\"^0.3.0\",\"loglevel\":\"^1.6.1\",\"mocha\":\"^7.2.0\",\"mocha-loader\":\"^5.1.5\",\"mocha-webpack\":\"^2.0.0-beta.0\",\"mochawesome\":\"^6.2.1\",\"nyc\":\"^15.1.0\",\"path\":\"^0.12.7\",\"replace-bundle-webpack-plugin\":\"^1.0.0\",\"sinon\":\"^9.2.4\",\"sinon-es6\":\"0.0.3\",\"speed-measure-webpack-plugin\":\"^1.4.2\",\"string-template\":\"^1.0.0\",\"terser-webpack-plugin\":\"^2.3.8\",\"webpack\":\"^4.46.0\",\"webpack-cli\":\"^3.3.12\",\"webpack-dev-server\":\"^3.11.2\",\"webpack-node-externals\":\"^2.5.2\",\"webpack-shell-plugin\":\"^0.5.0\"},\"bundledDependencies\":[],\"peerDependencies\":{},\"optionalDependencies\":{}}"); - -/***/ }), -/* 19 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// cette classe contient les URLs par defaut des services. -// DefaultUrlService.Alti.url(key)[elevation-json] -// DefaultUrlService.Alti.url(key)[elevation-xml] -// DefaultUrlService.Alti.url(key)[profil-json] -// DefaultUrlService.Alti.url(key)[profil-xml] -// DefaultUrlService.ProcessIsoCurve.url(key) -// DefaultUrlService.AutoComplete.url(key) -// DefaultUrlService.ReverseGeocode.url(key) -// DefaultUrlService.Geocode.url(key) -// DefaultUrlService.Route.url(key) - -// Example : -// -// DefaultUrlService.Alti.url('alti')[elevation-json] -// output {String} -> http://wxs.ign.fr/calcul/alti/rest/elevation.json -// -// DefaultUrlService.Alti.url('calcul') -// output {Object|String} -// -> http://wxs.ign.fr/calcul/alti/rest/elevation.json -// -> http://wxs.ign.fr/calcul/alti/rest/elevation.xml -// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.json -// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.xml -// -// ssl by default. -// -// Force to not do ssl : -// DefaultUrlService.ssl = false; -// -// DefaultUrlService.AutoComplete.url('calcul') -// output {Object|String} -// -> https://wxs.ign.fr/calcul/ols/apis/completion - -// constantes internes -var HOSTNAME = "wxs.ign.fr"; - -/** - * Default Geoportal web services URLs access. - * - * @namespace - * @alias Gp.Services.DefaultUrl - */ -var DefaultUrlService = { - /** if set true, require the use of https protocol */ - ssl: true, - /** - * base url of services (ssl protocol management) - * @param {String} path - path - * @returns {String} url - */ - url: function url(path) { - // comportement par défaut => https - // sinon, il est fixé par l'option 'ssl' (false => http) - var _protocol; - if (DefaultUrlService.ssl === false) { - _protocol = "http://"; - } else { - _protocol = "https://"; - } - return _protocol + HOSTNAME + path; - }, - /** - * base new-url of services (ssl protocol management) - * @param {String} path - path - * @returns {String} url - */ - newUrl: function newUrl(path, hostname) { - // comportement par défaut => https - // sinon, il est fixé par l'option 'ssl' (false => http) - var _protocol; - if (DefaultUrlService.ssl === false) { - _protocol = "http://"; - } else { - _protocol = "https://"; - } - return _protocol + hostname + path; - }, - /** - * Elevation web service access - * - * @member {Object} - * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("elevation-json", "elevation-xml", "profil-json" or "profil-xml"). - */ - Alti: { - new_key: { - // rest - "elevation-json": "/altimetrie/1.0/calcul/alti/rest/elevation.json", - "elevation-xml": "/altimetrie/1.0/calcul/alti/rest/elevation.xml", - "profil-json": "/altimetrie/1.0/calcul/alti/rest/elevationLine.json", - "profil-xml": "/altimetrie/1.0/calcul/alti/rest/elevationLine.xml" - }, - _key: { - // rest - "elevation-json": "/calcul/alti/rest/elevation.json", - "elevation-xml": "/calcul/alti/rest/elevation.xml", - "profil-json": "/calcul/alti/rest/elevationLine.json", - "profil-xml": "/calcul/alti/rest/elevationLine.xml", - // other - wps: "/alti/wps" - }, - /** - * newurl from geoplateforme service - * @param {String} key - key - * @returns {String} url - */ - newUrl: function newUrl() {}, - /** - * url from wxs service - * @returns {String} url - */ - url: function url() { - return { - // rest - "elevation-json": DefaultUrlService.url(this._key["elevation-json"]), - "elevation-xml": DefaultUrlService.url(this._key["elevation-xml"]), - "profil-json": DefaultUrlService.url(this._key["profil-json"]), - "profil-xml": DefaultUrlService.url(this._key["profil-xml"]) - }; - } - }, - /** - * IsoCurve web service access - * - * @member {Object} - * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("iso-json" or "iso-xml"). - */ - ProcessIsoCurve: { - new_key: "/itineraire/isochrone", - _key: "/calcul/geoportail/isochrone/rest/1.0.0/isochrone", - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl: function newUrl() {}, - /** - * url from wxs service - * @returns {String} url - */ - url: function url() { - return DefaultUrlService.url(this._key); - } - }, - /** - * Config web service access - * - * @member {Object} - * @property {Function} url (key) - Returns config service default urls with or without geoportal access key given as a parameter. - */ - Config: { - _key: "https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/", - /** - * url - * @param {String} key - key - * @returns {String} url - */ - url: function url(key) { - // key must be an array of one or several keys - if (!Array.isArray(key)) { - key = key.split(","); - } - // not homogeneous with others geoportal services URLs - var url = []; - for (var i = 0; i < key.length; i++) { - url[i] = this._key + key[i] + "Config.json"; - } - return url; - } - }, - /** - * Autocompletion web service access - * - * @member {Object} - * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String. - */ - AutoComplete: { - new_key: "/geocodage/completion", - _key: "/calcul/geoportail/geocodage/rest/0.1/completion", - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl: function newUrl() { - var NEW_AUTOCOMPLETE_HOSTNAME = "data.geopf.fr"; - return DefaultUrlService.newUrl(this.new_key, NEW_AUTOCOMPLETE_HOSTNAME); - }, - /** - * url - * @returns {String} url - */ - url: function url(key) { - return DefaultUrlService.url(this._key); - } - }, - /** - * Reverse geocoding web service access - * - * @member {Object} - * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. - */ - ReverseGeocode: { - new_key: "/geocodage/reverse", - _key: "/calcul/geoportail/geocodage/rest/0.1/reverse", - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl: function newUrl() { - var NEW_REVERSE_GEOCODE_HOSTNAME = "data.geopf.fr"; - return DefaultUrlService.newUrl(this.new_key, NEW_REVERSE_GEOCODE_HOSTNAME); - }, - /** - * url - * @returns {String} url - */ - url: function url() { - return DefaultUrlService.url(this._key); - } - }, - /** - * Geocoding web service access - * - * @member {Object} - * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. - */ - Geocode: { - new_key: "/geocodage/search", - _key: "/calcul/geoportail/geocodage/rest/0.1/search", - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl: function newUrl() { - var NEW_GEOCODE_HOSTNAME = "data.geopf.fr"; - return DefaultUrlService.newUrl(this.new_key, NEW_GEOCODE_HOSTNAME); - }, - /** - * url - * @returns {String} url - */ - url: function url() { - return DefaultUrlService.url(this._key); - } - }, - /** - * Routing web service access - * - * @member {Object} - * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols. - */ - Route: { - new_key: "/itineraire/route", - _key: "/calcul/geoportail/itineraire/rest/1.0.0/route", - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl: function newUrl() {}, - /** - * url from wxs service - * @returns {String} url - */ - url: function url() { - return DefaultUrlService.url(this._key); - } - } -}; -/* harmony default export */ __webpack_exports__["default"] = (DefaultUrlService); - -/***/ }), -/* 20 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Object} generalOptions - General properties for default map configuration resources. - * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key. - * @property {String} generalOptions.title - Underlying web service Title. - * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array. - * @property {String} generalOptions.theme - default theme (FIXME : for what ?) - * @property {Array.} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel. - * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}). - * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}). - * - * @namespace - * @alias Gp.Services.GetConfigInterface - */ -function ConfigInterface() { - if (!(this instanceof ConfigInterface)) { - throw new TypeError("ConfigInterface constructor cannot be called as a function."); - } - this.generalOptions = { - apiKeys: {}, - title: null, - defaultGMLGFIStyle: null, - theme: null, - wgs84Resolutions: [] - }; - this.layers = {}; - this.tileMatrixSets = {}; -} -ConfigInterface.prototype = { - /* - * Constructor (alias) - */ - constructor: ConfigInterface, - /** - * Check if config is loaded for a given key - * - * @param {String} apiKey - Access key to Geoportal platform - * @returns {Boolean} isKeyConfLoaded - true if config of the key is already loaded, false otherwise - */ - isKeyConfLoaded: function isKeyConfLoaded(apiKey) { - if (!apiKey) { - return; - } - if (this.generalOptions.apiKeys[apiKey]) { - return true; - } - return false; - }, - /** - * Returns an array of Geoportal layers identifiers, corresponding to an API contract key. - * - * @param {String} apiKey - Access key to Geoportal platform - * @returns {Array} apiKeys - Array of geoportal layers identifiers - */ - getLayersId: function getLayersId(apiKey) { - return this.generalOptions.apiKeys[apiKey]; - }, - /** - * Returns the id of a Geoportal layer with its name and its service. - * - * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") - * @param {String} service - name of the service (ex. "WMS" ou "WMTS") - * @returns {String} Id of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS") - */ - getLayerId: function getLayerId(layerName, service) { - if (!layerName || !service) { - return; - } - var layerId = null; - - // layer - // key : [layerName]$[contexte]:OGC:[service] - // ex : "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS" - - // service - // key : [layerName]$[contexte];[service] - // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode - - if (this.layers) { - var layers = this.layers; - for (var key in layers) { - if (layers.hasOwnProperty(key)) { - var parts = key.split("$"); - if (layerName === parts[0]) { - if (parts[1]) { - var servicePartsLayer = parts[1].split(":"); - var servicePartsService = parts[1].split(";"); - if (servicePartsService[1] === service.toUpperCase()) { - layerId = key; - break; - } - if (servicePartsLayer[2] === service.toUpperCase()) { - layerId = key; - break; - } - } - } - } - } - } - if (!layerId) { - return; - } - return layerId; - }, - /** - * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key. - * If no key is specified, all layers from configuration are returned. - * - * @param {String} apiKey - Access key to Geoportal platform - * @returns {Object} layers - Object which properties are layers identifiers. - */ - getLayersConf: function getLayersConf(apiKey) { - var layers = {}; - var layersIdArray = this.getLayersId(apiKey); - if (layersIdArray) { - for (var i = 0; i < layersIdArray.length; i++) { - var lyrId = layersIdArray[i]; - layers[lyrId] = this.layers[lyrId]; - } - } - return layers; - }, - /** - * Returns a geoportal layer configuration, given its identifier - * - * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") - * @return {Object} layer - Layer configuration - */ - getLayerConf: function getLayerConf(layerId) { - if (!this.layers) { - return; - } - return this.layers[layerId]; - }, - /** - * Get all parameters needed to display a WMS or WMTS layer given its name, its service and its key - * - * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") - * @param {String} service - name of the service (ex. "WMS" ou "WMTS") - * @param {String} [apiKey] - Contract API key - * @returns {Object} params - params of the service (WMS or WMTS) for the given layer - * @returns {String} params.url - Url of the service to reach to display the layer - * @returns {String} params.version - Version of the service - * @returns {String} params.styles - Default style of the layer - * @returns {String} params.format - Default format of the layer - * @returns {String} params.projection - Default projection of the layer - * @returns {Number} params.minScale - Min scale denominator of the layer - * @returns {Number} params.maxScale - Max scale denominator of the layer - * @returns {Gp.BBox} params.extent - Extent of the layer, in the projection of the layer - * @returns {Array} params.legends - Array of legends associated to the layer - * @returns {Array} params.title - Name of the layer, readable by a human - * @returns {Array} params.description - Description of the layer - * @returns {String} params.[TMSLink] - Id of the Tile Matrix Set (TMS), in the case of WMTS layer - * @returns {Gp.Point} params.[matrixOrigin] - Originof the tile matrix (top left corner), in the case of WMTS layer - * @returns {Array} params.[nativeResolutions] - Array with the resolution of each level of the tile matrix set, in the case of WMTS layer - * @returns {Array} params.[matrixIds] - Array with the ID of each level of the tile matrix set, in the case of WMTS layer - */ - getLayerParams: function getLayerParams(layerName, service) { - var params = {}; - if ((service === "WMS" || Object.keys(this.tileMatrixSets).length !== 0) && Object.keys(this.layers).length !== 0) { - // get the layerId of the layer - var layerId = this.getLayerId(layerName, service); - if (layerId) { - // get the layer Conf Object - var layerConf = this.getLayerConf(layerId); - var keys = this.getLayerKey(layerId); - if (keys.length === 0) { - return; - } - - // get services params - for (var i = 0; i < keys.length; i++) { - // only one serverUrl is saved in Gp.Config : with multiKeys, we have to retrieve the key used in the serverUrl property - if (layerConf.serviceParams.serverUrl[keys[i]]) { - params.url = layerConf.serviceParams.serverUrl[keys[i]]; - } - } - var wmsTypeRegex = /\/v\//; - // WMS vector style always empty (not in getCap) - if (wmsTypeRegex.test(params.url)) { - params.styles = " "; - } else { - // WMS raster style is defined in getCap - params.styles = layerConf.styles[0].name; - } - params.version = layerConf.serviceParams.version; - params.format = layerConf.formats[0].name; - params.projection = layerConf.defaultProjection; - - // get layer info and constraints - params.minScale = layerConf.globalConstraint.minScaleDenominator; - params.maxScale = layerConf.globalConstraint.maxScaleDenominator; - params.extent = layerConf.globalConstraint.bbox; - params.legends = layerConf.legends; - params.title = layerConf.title; - params.description = layerConf.description; - if (service === "WMS") { - params.metadata = layerConf.metadata; - } - - // Informations non disponibles avec les getCap - // params.metadata = layerConf.getMetadata(); - // params.originators = layerConf.getOriginators(); - // params.quicklookUrl = layerConf.getQuicklookUrl(); - - // WMTS : get the tileMatrixSetLimits - if (layerConf.wmtsOptions) { - params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits; - var TMSLink = layerConf.wmtsOptions.tileMatrixSetLink; - if (TMSLink) { - params.TMSLink = TMSLink; - var tmsConf = this.getTMSConf(TMSLink); - // Get matrix origin : Gp.Point = Object{x:Float, y:Float} - // params.matrixOrigin = tmsConf.getTopLeftCorner(); - params.matrixIds = Object.keys(tmsConf.tileMatrices); - params.tileMatrices = tmsConf.tileMatrices; - // by default, pseudo mercator resolutions - params.nativeResolutions = tmsConf.nativeResolutions || this.getTMSConf("PM").nativeResolutions; - } - } - } - } - return params; - }, - /** - * Get the contract key(s) associated to a given layer. - * - * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") - * @return {Array} layerKey - array of key(s) associated to the given layer - */ - getLayerKey: function getLayerKey(layerId) { - var layerKey = []; - if (this.generalOptions && this.generalOptions.apiKeys && Object.keys(this.generalOptions.apiKeys).length !== 0) { - var resourcesByKey = this.generalOptions.apiKeys; - for (var key in resourcesByKey) { - var resourcesArray = resourcesByKey[key]; - resourcesArray.forEach(function (arrayLayerId) { - if (arrayLayerId === layerId) { - layerKey.push(key); - } - }); - } - } - return layerKey; - }, - /** - * Returns an associative array of Tile Matrix Sets configurations. - * - * @return {Object} tileMatrixSets - Object which properties are TMS identifiers - * - */ - getTileMatrixSets: function getTileMatrixSets() { - return this.tileMatrixSets; - }, - /** - * Returns a Tile Matrix Sets configuration, given its identifier. - * - * @param {String} tmsID - Tile Matrix Set identifier (e.g. : "PM") - * @return {Object} tileMatrixSet - Tile Matrix Set configuration - */ - getTMSConf: function getTMSConf(tmsID) { - if (!this.tileMatrixSets) { - return; - } - return this.tileMatrixSets[tmsID]; - }, - /** - * Get global constraints for a given Layer : extent, minScale, maxScale, projection - * - * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") - * @returns {Object} params - layer constraints - * @returns {String} params.projection - default layer projection - * @returns {Number} params.minScale - layer min scale denominator - * @returns {Number} params.maxScale - layer max scale denominator - * @returns {Gp.BBox} params.extent - layer extent expressed in the layer projection - */ - getGlobalConstraints: function getGlobalConstraints(layerId) { - var params = {}; - if (layerId) { - // get layer configuration object - var layerConf = this.getLayerConf(layerId); - params.projection = layerConf.defaultProjection; - params.minScale = layerConf.globalConstraint.minScaleDenominator; - params.maxScale = layerConf.globalConstraint.maxScaleDenominator; - params.extent = layerConf.globalConstraint.bbox; - } - return params; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (ConfigInterface); - -/***/ }), -/* 21 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); -/* harmony import */ var _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(22); -/* harmony import */ var _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29); - - - - - - - - -/** - * @classdesc - * - * Appel du service d'altimétrie du Géoportail - * - * @todo gestion du parma. output et callback - * @todo outputFormat (REST) et format (WPS) - * @todo La reponse JSON peut encapsuler un XML ! - * - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.Alti - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {Array.} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84) - * dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil). - * Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants. - * Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine). - * Maximum 50 éléments. - * - * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'. - * Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST, - * ou la valeur du paramètre 'format' dans le cas de la norme WPS. - * Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST, - * pour connaître le format dans lequel sera fournie la réponse (pour son traitement). - * Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'. - * - * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000. - * A spécifier lorsqu'on souhaite accéder à cette fonctionnalité. - * Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique - * le long duquel le profil doit être calculé. - * Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis, - * c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis). - * Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points). - * - * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS). - * Par défaut, on utilise l'API REST. - * - * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'. - * Vaut 'false' par défaut. - * - * @param {String} [options.resource] - Resource utilisée pour réaliser le calcul. - * - * @example - * var options = { - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * positions : [{lon:, lat:}, {lon:, lat:}], - * outputFormat : 'json' // json|xml - * sampling : 3, - * api : 'REST', // REST|WPS - * zonly : false // false|true, - * resource : "resource-par-defaut" - * }; - * - */ -function Alti(options) { - if (!(this instanceof Alti)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Alti")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "Alti"; - - // appel du constructeur par heritage - _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments); - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Alti"); - this.logger.trace("[Constructeur Alti (options)]"); - - // ##################### - // analyse des options - // ##################### - - if (!options.positions) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "positions")); - } - if (options.positions.length === 0) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "positions")); - } - - // ajout des options spécifiques au service - this.options.positions = options.positions; - - // format de réponse du service : "json" ou "xml" (valeur par défaut), en minuscule ! - this.options.outputFormat = typeof options.outputFormat === "string" ? options.outputFormat.toLowerCase() : "xml"; - - // ressource utilisée pour le calcul altimétrique - this.options.resource = options.resource || "rge_alti_corse2a_float32_zip_lamb93"; - - // sampling - this.options.sampling = options.sampling || null; - - // type d'api utilisé pour requeter le service, en majuscule ! - this.options.api = typeof options.api === "string" ? options.api.toUpperCase() : "REST"; - - // l'api ne peut être interrogée qu'en GET. - if (this.options.api === "REST") { - this.options.httpMethod = "GET"; - } - - // param. zonly - this.options.zonly = options.zonly || false; - - // param. measures - this.options.measures = options.measures || false; - - // gestion de l'url du service par defaut - // si l'url n'est pas renseignée, il faut utiliser les urls par defaut - // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat) - // ainsi que sur le type de service (profil ou elevation) - if (!this.options.serverUrl) { - // Code commenté pour Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti - /* var lstUrlByDefault = DefaultUrlService.Alti.newUrl(); - if (this.options.oldAltiService) { - lstUrlByDefault = DefaultUrlService.Alti.url(); - } */ - // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti - var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Alti.url(); - var urlFound = null; - switch (this.options.api) { - case "WPS": - urlFound = lstUrlByDefault.wps; - break; - case "REST": - var key = (options.sampling ? "profil" : "elevation") + "-" + this.options.outputFormat; - urlFound = lstUrlByDefault[key]; - break; - default: - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_UNKNOWN", "api")); - } - if (!urlFound) { - throw new Error("Url by default not found !"); - } - this.options.serverUrl = urlFound; - this.logger.trace("Server URL by default : " + this.options.serverUrl); - } - - // gestion du type de service - // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat) - var idx = this.options.serverUrl.lastIndexOf("."); - if (idx !== -1) { - var extension = this.options.serverUrl.substring(idx + 1); - if (extension && extension.length < 5) { - // FIXME extension de moins de 4 car. ... - this.logger.trace("Server Extension URL : " + extension); - switch (extension.toLowerCase()) { - case "json": - case "xml": - this.options.outputFormat = extension.toLowerCase(); - break; - default: - throw new Error("type of service : unknown or unsupported (json or xml) !"); - } - } - } -} - -/** - * @lends module:Alti# - */ -Alti.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { - // todo - // getter/setter -}); - -/** - * Constructeur (alias) - */ -Alti.prototype.constructor = Alti; - -/** - * Création de la requête (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Alti.prototype.buildRequest = function (error, success) { - // utilisation en mode callback - var options = { - httpMethod: this.options.httpMethod, - // callback - onSuccess: function onSuccess(result) { - // sauvegarde de la requete ! - this.request = result; - success.call(this, this.request); - }, - onError: error, - scope: this, - // spécifique au service : - resource: this.options.resource, - positions: this.options.positions, - outputFormat: this.options.outputFormat, - sampling: this.options.sampling, - api: this.options.api, - zonly: this.options.zonly, - measures: this.options.measures - }; - _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); -}; - -/** - * Analyse de la reponse (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Alti.prototype.analyzeResponse = function (error, success) { - // INFO - // Factory pour masquer la complexité du retour du service qui renvoie soit - // - une 'string' qui contient du XML ou JSON natif en mode XHR - // - un objet JSON qui est natif ou encapsulé - - if (this.response) { - var options = { - response: this.response, - outputFormat: this.options.outputFormat, - // utile pour parser la string en mode XHR : JSON ou XML ! - rawResponse: this.options.rawResponse, - onError: error, - onSuccess: success, - scope: this - }; - _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); - } else { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (Alti); - -/***/ }), -/* 22 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); -/* harmony import */ var _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23); -/* harmony import */ var _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(27); -/** - * Creation d'une requête en REST ou WPS - * (Factory) - * - * @module AltiRequestFactory - * @alias Gp.Services.Alti.Request.AltiRequestFactory - * @private - */ - - - - -var AltiRequestFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Alti - * - * @example - * var options = { - * httpMethod : 'GET', // GET|POST - * onSuccess : function (response) {}, - * onError : function (error) {}, - * scope : this, - * positions : [{lon:, lat:}, {lon:, lat:}], - * outputFormat : 'json' // json|xml - * sampling : 3, - * api : 'REST', // REST|WPS - * zonly : false // false|true - * }; - * - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestFactory"); - logger.trace(["AltiRequestFactory::build()"]); - var request = null; - - // on factorise les options par groupe; - // - global, - // - param, les params pour les data inputs - // - wps, les param du service - // - callback - - var settings = { - // ajout des valeurs par defaut spécifiques au service - type: options.sampling ? "Profil" : "Elevation", - method: options.httpMethod, - param: { - positions: null, - delimiter: null, - // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !? - indent: null, - // par defaut - crs: null, - // par defaut - format: null, - // (only to POST) - sampling: null, - // (only use by Profil) - zonly: null, - // (only use by Elevation) - measures: null // (only use by Elevation) - } - }; - - // surcharge des valeurs obligatoires - settings.param.positions = options.positions; - settings.param.format = options.outputFormat; - settings.param.sampling = options.sampling; - settings.param.zonly = options.zonly; - settings.param.measures = options.measures; - settings.param.resource = options.resource; - - // gestion des callback - var bOnError = !!(options.onError !== null && typeof options.onError === "function"); // cast variable to boolean - var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); - var message = null; - switch (options.api) { - case "REST": - // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! - var myReq = new _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__["default"](settings); - if (!myReq.processRequestString()) { - message = "Error in process request (rest) !"; - if (bOnError) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); - return; - } - throw new Error(message); - } - request = myReq.requestString; - break; - case "WPS": - // ajout des valeurs par defaut spécifiques au service WPS - settings.wps = { - service: null, - // par defaut - version: null, - // par defaut - identifier: null, - // par defaut - rawdataoutput: null, - // par defaut - request: null // par defaut - }; - - request = _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__["default"].build(settings); - if (!request) { - message = "Error in process request (wps) !"; - if (bOnError) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); - return; - } - throw new Error(message); - } - break; - default: - message = "Type of API is not supported by service (REST or WPS) !"; - if (bOnError) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); - return; - } - throw new Error(message); - } - if (bOnSuccess) { - options.onSuccess.call(options.scope, request); - } - return request; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiRequestFactory); - -/***/ }), -/* 23 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(24); -/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(26); -/* jshint multistr : true */ - - - - - - -/** - * @classdesc - * Classe de gestion des requêtes de type REST sur le service altimetrique. - * - * @todo Le service Alti n'implemente pas le POST !? - * @constructor - * @alias Gp.Services.Alti.Request.AltiRequestREST - * @param {Object} options - options - * @param {Object} options.param.positions - tableau de coordonnées lon/lat - * @param {String} options.param.delimiter - '|' - * @param {Boolean} options.param.indent - false|true - * @param {String} options.param.crs - 'CRS:84' - * @param {String} options.param.sampling - 3 - * @param {String} options.param.resource - 'rge_alti_corse2a_float32_zip_lamb93' - * @param {Boolean} options.param.zonly - false|true - * @param {Boolean} options.param.measures - false|true - * @param {String} options.param.format - "JSON|XML" - * @param {String} options.type - "Profil|Elevation" - * @param {String} options.method - GET|POST - * - * @example - * var options = { - * type : 'Profil', // Elevation - * method : 'GET', // par defaut - * param : { - * positions : [ - * {lon:'1.11', lat:'1.11'}, - * {lon:'1.10', lat:'1.10'}, - * {lon:'1.12', lat:'1.12'} - * ], - * delimiter : ";", // par defaut - * indent : true, // par defaut - * crs : 'EPSG:4326', // par defaut - * format : 'json', // par defaut (only to POST) - * sampling : 3 , // par defaut (only use by Profil) - * zonly : false // par defaut (only use by Elevation) - * measures : false // par defaut (only use by Elevation) - * } - * }; - * - * var result; - * try { - * var obj = new AltiRequestREST (options); - * if (! obj.processRequestString ()) { - * throw new Error("Request empty !?") - * } - * result = obj.requestString; - * } catch (e) { - * // exceptions... - * } - * @private - */ -function AltiRequestREST(options) { - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestREST"); - this.logger.trace("[Constructeur AltiRequestREST ()]"); - if (!(this instanceof AltiRequestREST)) { - throw new TypeError("AltiRequestREST constructor cannot be called as a function."); - } - this.options = options || {}; - - // existance des options - if (!this.options) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); - } - - // type de requete : Altitude ou Profil - // (param. à determiner en fonction des parametres d'entrée) - if (!this.options.type) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); - } - - // construction du modele de requête - // (test du type d'objet candidat) - this.DataObject = null; - switch (this.options.type) { - case "Elevation": - this.DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__["default"](this.options.param); - break; - case "Profil": - this.DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__["default"](this.options.param); - break; - default: - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "type (Elevation or Profil)")); - } - - /** - * methode. - * Par defaut, "GET". - */ - this.method = this.options.method || "GET"; -} -AltiRequestREST.prototype = { - /** - * request - * @type {String} - */ - requestString: null, - /** - * Constructeur (alias) - */ - constructor: AltiRequestREST, - /** - * Template de la requête. - */ - template: { - get: { - // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__' - value: "lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'&resource=__RESOURCE__&measures=__MEASURES__", - input: { - point: "&zonly=__ZONLY__", - profil: "&sampling=__SAMPLING__" - } - }, - post: { - // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\n\ - value: "lon=__LON__\n" + "lat=__LAT__\n" + "indent=__INDENT__\n" + "crs='__CRS__'\n" + "resource='__RESOURCE__'\n" + "measures='__MEASURES__'\n", - input: { - point: "zonly=__ZONLY__\n", - profil: "sampling=__SAMPLING__" - } - } - }, - /** - * Construction de la requête. - * - * @example - * // GET out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84' - * // POST out : Not yet supported method POST ! - * @returns {String} - */ - processRequestString: function processRequestString() { - this.logger.trace("AltiRequestREST::processRequestString ()"); - var template = ""; - if (this.method === "POST") { - template = this.template.post.value; - } else if (this.method === "GET") { - template = this.template.get.value; - } - template = template.replace(/__LON__/g, this.DataObject.getLon()); - template = template.replace(/__LAT__/g, this.DataObject.getLat()); - // FIXME on retire le param 'delimiter' - // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter); - template = template.replace(/__INDENT__/g, this.DataObject.indent); - template = template.replace(/__CRS__/g, this.DataObject.crs); - template = template.replace(/__RESOURCE__/g, this.DataObject.resource); - template = template.replace(/__MEASURES__/g, this.DataObject.measures); - - // ajout + - template = template + this.__addDataInputs(); - this.logger.trace("traduction tmpl", template); - - // sauvegarde - this.requestString = template; - return this.requestString; - }, - /** - * Ajout de parametres spécifiques (ex. zonly) - * - * @returns {String} - */ - __addDataInputs: function __addDataInputs() { - this.logger.trace("AltiRequestREST::addDataInput ()"); - var myTemplate; - if (this.method === "POST") { - myTemplate = this.template.post; - } else if (this.method === "GET") { - myTemplate = this.template.get; - } else { - throw new Error("No other HTTP method supported by the service !"); - } - var tmpl = null; - if (this.DataObject.CLASSNAME === "AltiElevationRequest") { - tmpl = myTemplate.input.point; - return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly.toString()); - } else if (this.DataObject.CLASSNAME === "AltiProfilRequest") { - tmpl = myTemplate.input.profil; - return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling); - } else { - throw new Error("No other object supported than elevation or profil !?"); - } - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiRequestREST); - -/***/ }), -/* 24 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); - - - -/** - * @classdesc - * - * Classe de gestion des param. des requêtes de type POINT du service altimetrique. - * - * @constructor - * @alias Gp.Services.Alti.Request.AltiElevationRequest - * @param {Object} options - options - * @param {Boolean} options.zonly - false|true - * - * @private - */ -function AltiElevationRequest(options) { - if (!(this instanceof AltiElevationRequest)) { - throw new TypeError("AltiElevationRequest constructor cannot be called as a function."); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "AltiElevationRequest"; - - // appel du constructeur par heritage - _AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments); - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur AltiElevationRequest ()]"); - - /** - * Z uniquement. - * true|false - */ - this.zonly = this.options.zonly || false; // test des options héritées ! -} - -/** - * @lends module:AltiElevationRequest# - */ - -AltiElevationRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, { - /** - * Setter/getter pour "zonly" - */ - zonly: { - /** getter */ - get: function get() { - return this._zonly; - }, - /** setter */ - set: function set(z) { - this._zonly = z; - } - } -}); - -/** - * Constructeur (alias) - */ -AltiElevationRequest.prototype.constructor = AltiElevationRequest; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Array} - */ -AltiElevationRequest.prototype.getData = function () { - // par glop..., appel de AltiRequest::getData () ! - var map = []; - map.push({ - k: "lon", - v: this.getLon() - }); - map.push({ - k: "lat", - v: this.getLat() - }); - // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" - map.push({ - k: "indent", - v: this.indent - }); - map.push({ - k: "crs", - v: this.crs - }); - map.push({ - k: "zonly", - v: this.zonly - }); - map.push({ - k: "format", - v: this.format - }); - map.push({ - k: "resource", - v: this.resource - }); - return map; -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiElevationRequest); - -/***/ }), -/* 25 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); - - -/** - * @classdesc - * Classe de gestion des param. des requêtes du service altimetrique. - * - * @constructor - * @alias Gp.Services.Alti.Request.AltiRequest - * @param {Object} options - options - * @param {Object} options.positions - tableau de coordonnées lon/lat - * @param {String} options.delimiter - "|" - * @param {Boolean} options.indent - false|true - * @param {String} options.crs - "CRS:84" - * @param {String} options.format - "JSON|XML" - * - * @private - */ -function AltiRequest(options) { - if (!(this instanceof AltiRequest)) { - throw new TypeError("AltiRequest constructor cannot be called as a function."); - } - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur AltiRequest ()]"); - - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - /** - * Liste des coordonnées. - * @example - * var c = [{lon : "", lat : ""}, {lon : "", lat : ""}]; - */ - this.positions = this.options.positions || []; - - /** - * Caractère de séparation. - * Par defaut, "|". - */ - this.delimiter = this.options.delimiter || "|"; - - /** - * Indentation. - * true|false - */ - this.indent = this.options.indent || false; - - /** - * Projection. - * Par defaut, CRS:84. - */ - this.crs = this.options.crs || "CRS:84"; - - /** - * format de sortie. - * Par defaut, "json". - */ - this.format = this.options.format || "json"; - - /* - * Ressource utilisée - */ - this.resource = this.options.resource; - - /** - * Réponse détaillée (source & accuracy) - * true|false - */ - this.measures = this.options.measures || false; -} - -/** - * CLASSNAME - */ -AltiRequest.CLASSNAME = "AltiRequest"; -AltiRequest.prototype = { - /** - * @lends module:AltiRequest# - */ - - /** - * Constructeur (alias) - */ - constructor: AltiRequest, - /** - * Ajout d"une liste de coordonnées. - * - * @param {Object[]} lstPosition - liste de positions - * @example - * obj.setPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); - */ - setPositions: function setPositions(lstPosition) { - var positions = []; - for (var i = 0; i < lstPosition.length; i++) { - var o = lstPosition[i]; - if (o.lon && o.lat) { - positions.push(o); - } - } - this.positions = positions; - }, - /** - * Liste des coordonnées. - * - * @param {Int} pos - position - * @returns {positions} - * @example - * obj.getPositions (); // [{lon : "", lat : ""}, {lon : "", lat : ""}] - * obj.getPositions (0); // [{lon : "", lat : ""}] - */ - getPositions: function getPositions(pos) { - // FIXME test if not a number !? - if (!pos) { - return this.positions; - } - var index = this.positions.length - 1; - if (pos > index || pos < index) { - this.logger.warn("index out of range !"); - return this.positions; - } - return this.positions[pos]; - }, - /** - * Ajout d"une liste de coordonnées. - * - * @param {Object[]} lstPosition - liste de positions - * @example - * obj.addPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); - */ - addPositions: function addPositions(lstPosition) { - for (var i = 0; i < lstPosition.length; i++) { - var o = lstPosition[i]; - if (o.lon && o.lat) { - this.positions.push(lstPosition[i]); - } - } - }, - /** - * Retourne la liste des longitudes avec un caractère de séparation. - * - * @returns {String} - une liste de longitudes - * @example - * // out : 0.2367|2.1570|43.789|... - */ - getLon: function getLon() { - var lstLon = []; - for (var i = 0; i < this.positions.length; i++) { - lstLon.push(this.positions[i].lon); - } - this.logger.trace(lstLon); - return lstLon.join(this.delimiter); - }, - /** - * Retourne la liste des lattitudes avec un caractère de séparation. - * - * @returns {String} - une liste de lattitudes - * @example - * // out : 0.2367|2.1570|43.789|... - */ - getLat: function getLat() { - var lstLat = []; - for (var i = 0; i < this.positions.length; i++) { - lstLat.push(this.positions[i].lat); - } - this.logger.trace(lstLat); - return lstLat.join(this.delimiter); - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Object[]} - */ -AltiRequest.prototype.getData = function () { - var map = []; - map.push({ - k: "lon", - v: this.getLon() - }); - map.push({ - k: "lat", - v: this.getLat() - }); - map.push({ - k: "delimiter", - v: this.delimiter - }); - map.push({ - k: "indent", - v: this.indent - }); - map.push({ - k: "crs", - v: this.crs - }); - map.push({ - k: "format", - v: this.format - }); - return map; -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiRequest); - -/***/ }), -/* 26 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); - - - -/** - * @classdesc - * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique. - * - * @constructor - * @alias Gp.Services.Alti.Request.AltiProfilRequest - * @param {Object} options - options - * @param {String} options.sampling - 3 - * - * @private - */ -function AltiProfilRequest(options) { - if (!(this instanceof AltiProfilRequest)) { - throw new TypeError("AltiProfilRequest constructor cannot be called as a function."); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "AltiProfilRequest"; - - // appel du constructeur par heritage - _AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments); - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur AltiProfilRequest ()]"); - - /** - * Sampling - * Par defaut, 3 - */ - this.sampling = this.options.sampling || 3; // test des options héritées ! -} - -/** - * @lends module:AltiProfilRequest# - */ - -AltiProfilRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, { - /** - * Setter/getter pour "sampling" - */ - sampling: { - /** getter */ - get: function get() { - return this._sampling; - }, - /** setter */ - set: function set(value) { - this._sampling = value; - } - } -}); - -/** - * Constructeur (alias) - */ -AltiProfilRequest.prototype.constructor = AltiProfilRequest; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Object[]} - */ -AltiProfilRequest.prototype.getData = function () { - // par glop..., appel de AltiRequest::getData () ! - var map = []; - map.push({ - k: "lon", - v: this.getLon() - }); - map.push({ - k: "lat", - v: this.getLat() - }); - // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" - map.push({ - k: "indent", - v: this.indent - }); - map.push({ - k: "crs", - v: this.crs - }); - map.push({ - k: "sampling", - v: this.sampling - }); - map.push({ - k: "format", - v: this.format - }); - map.push({ - k: "resource", - v: this.resource - }); - return map; -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiProfilRequest); - -/***/ }), -/* 27 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28); -/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24); -/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26); -/** - * Classe d'interface des requêtes de type WPS sur le service altimetrique. - * (Factory) - * - * @module Gp.Services.Alti.Request.AltiRequestWPS - * @alias Gp.Services.Alti.Request.AltiRequestWPS - * @private - */ - - - - - -var AltiRequestWPS = { - /** - * Interface unique de construction de la requête. - * - * @method build - * @param {Object} options - options - * @param {Object} options.param.positions - tableau de coordonnées lon/lat - * @param {String} options.param.delimiter - '|' - * @param {Boolean} options.param.indent - false|true - * @param {String} options.param.crs - 'CRS:84' - * @param {String} options.param.sampling - 3 - * @param {Boolean} options.param.zonly - false|true - * @param {String} options.param.format - "JSON|XML" (only to POST) - * @param {String} options.wps.service - "WPS" - * @param {String} options.wps.version - "1.0.0" - * @param {String} options.wps.identifier - "gs:WPSElevation|gs:WPSLineElevation" - * @param {String} options.wps.rawdataoutput - "result" - * @param {String} options.wps.request - "Execute" - * @param {String} options.type - "Profil|Elevation" - * @param {String} options.method - GET|POST - * @example - * var options = { - * type : 'Profil', // Elevation - * method : 'GET', // par defaut - * param : { - * positions : [ - * {lon:'1.11', lat:'1.11'}, - * {lon:'1.10', lat:'1.10'}, - * {lon:'1.12', lat:'1.12'} - * ], - * delimiter : ";", // par defaut - * indent : true, // par defaut - * crs : 'EPSG:4326', // par defaut - * format : 'json', // par defaut (only to POST) - * sampling : 3 , // par defaut (only use by Profil) - * zonly : false, // par defaut (only use by Elevation) - * }, - * wps : { - * service : 'WPS', // par defaut - * version : '1.0.0', // par defaut - * identifier : 'gs:WPS', // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation - * rawdataoutput : 'result',// par defaut - * request : 'Execute' // par defaut - * } - * }; - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestWPS"); - logger.trace(["AltiRequestWPS::build()"]); - - // existance des options - if (!options) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); - } - - // type de requete : Altitude ou Profil - // (param. à determiner en fonction des parametres d'entrée) - if (!options.type) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); - } - - // construction du modele de requête - // (test du type d'objet candidat) - var DataObject = null; - switch (options.type) { - case "Elevation": - // surcharge - options.wps.identifier = "gs:WPSElevation"; - DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__["default"](options.param); - break; - case "Profil": - // surcharge - options.wps.identifier = "gs:WPSLineElevation"; - DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__["default"](options.param); - break; - default: - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "type (Elevation or Profil)")); - } - - // construction de la requête WPS - var settings = { - data: DataObject, - method: options.method, - param: options.wps - }; - var rqstWPS = new _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__["default"](settings); - if (!rqstWPS.processRequestString()) { - throw new Error("Enable to process request !"); - } - return rqstWPS.requestString; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiRequestWPS); - -/***/ }), -/* 28 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); - - -/** - * @classdesc - * Standard WPS - * - * @constructor - * @alias Gp.Formats.WPS - * @param {Object} options - options - * @param {Object} options.data - objet - * @param {String} options.method - POST|GET - * @param {String} options.param.service - "WPS" - * @param {String} options.param.version - "1.0.0" - * @param {String} options.param.identifier - "gs:WPSElevation|gs:WPSLineElevation" - * @param {String} options.param.rawdataoutput - "result" - * @param {String} options.param.request - "Execute" - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * @private - */ -function WPS(options) { - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur WPS()]"); - if (!(this instanceof WPS)) { - throw new TypeError("WPS constructor cannot be called as a function."); - } - this.options = options || {}; - - /** - * Objet DATA - */ - this.DataObject = this.options.data; - if (!this.DataObject) { - throw new TypeError("This data object is not defined !"); - } - - /** - * param service. - * Par defaut, "WPS". - */ - this.paramservice = this.options.param.service || "WPS"; - - /** - * param version. - * Par defaut, "1.0.0". - */ - this.paramversion = this.options.param.version || "1.0.0"; - - /** - * param identifier - * Par defaut, "gs:WPS" - */ - this.paramidentifier = this.options.param.identifier || "gs:WPS"; - - /** - * param rawdataoutput - * Par defaut, "result". - */ - this.paramrawdataoutput = this.options.param.rawdataoutput || "result"; - - /** - * param request - * Par defaut, "Execute". - */ - this.paramrequest = this.options.param.request || "Execute"; - - /** - * methode. - * Par defaut, "GET". - */ - this.method = this.options.method || "GET"; -} -WPS.prototype = { - /** - * @lends module:WPS# - */ - - /** - * request - * @type {String} - */ - requestString: null, - /** - * Constructeur (alias) - */ - constructor: WPS, - /** - * Template de la requête. - */ - template: { - get: { - value: "service=__SERVICE__" + "&version=__VERSION__" + "&rawdataoutput=__RAWDATAOUTPUT__" + "&identifier=__IDENTIFIER__" + "&request=__REQUEST__" + "&datainputs=", - input: "__KEY__=__DATA__" - }, - post: { - value: "" + "" + "__IDENTIFIER__" + "" + "" + "" + "" + "" + "__RAWDATAOUTPUT__" + "" + "" + "", - input: "" + "__KEY__" + "" + "__DATA__" + "" + "" - } - }, - /** - * Namespace par defaut de la requete POST. - * - * @returns {String} namespace - */ - namespaceByDefault: function namespaceByDefault() { - var ns = ["xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", "xmlns=\"http://www.opengis.net/wps/1.0.0\"", "xmlns:wfs=\"http://www.opengis.net/wfs\"", "xmlns:wps=\"http://www.opengis.net/wps/1.0.0\"", "xmlns:ows=\"http://www.opengis.net/ows/1.1\"", "xmlns:gml=\"http://www.opengis.net/gml\"", "xmlns:ogc=\"http://www.opengis.net/ogc\"", "xmlns:wcs=\"http://www.opengis.net/wcs/1.1.1\"", "xmlns:xlink=\"http://www.w3.org/1999/xlink\""]; - return ns.join(" "); - }, - /** - * Schemalocation par defaut. - * - * @returns {String} schemaLocation - */ - schemaLocationByDefault: function schemaLocationByDefault() { - return "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\""; - }, - /** - * Construction de la requête. - * - * @example - * // GET out : - * // service=__SERVICE__ - * // &version=__VERSION__ - * // &rawdataoutput=__RAWDATAOUTPUT__ - * // &identifier=__IDENTIFIER__ - * // &request=__REQUEST__ - * // &datainputs="__DATAINPUTS__" - * // avec __DATAINPUTS__ = __KEY__=__DATA__;... - * - * // POST out : - * // - * // - * // __IDENTIFIER__ - * // - * // - * // - * // - * // - * // __RAWDATAOUTPUT__ - * // - * // - * // ", - * // avec __DATAINPUTS__ - * // - * // __KEY__ - * // - * // __DATA__ - * // - * // - * - * @returns {Boolean} validation de la construction de la requete - */ - processRequestString: function processRequestString() { - this.logger.trace("WPS::processRequestString ()"); - var template = ""; - if (this.method === "POST") { - template = this.template.post.value; - } else if (this.method === "GET") { - template = this.template.get.value; - } else { - this.logger.error("No other method supported by the service !"); - return false; - } - template = template.replace(/__SERVICE__/g, this.paramservice); - template = template.replace(/__VERSION__/g, this.paramversion); - template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput); - template = template.replace(/__IDENTIFIER__/g, this.paramidentifier); - template = template.replace(/__REQUEST__/g, this.paramrequest); - - // ajout + - if (this.method === "POST") { - template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); - template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); - } - - // ajout des datainputs - template = template.replace(//g, this.__addDataInputs()); - if (!template) { - this.logger.warn("traduction tmpl : empty request !?"); - return false; - } - this.requestString = template; - this.logger.trace("traduction tmpl", template); - return true; - }, - /** - * Ajout des données - * - * @returns {String} Données concaténées dans une chaine - */ - __addDataInputs: function __addDataInputs() { - this.logger.trace("WPS::__addDataInputs ()"); - - // c'est un peu grossier... - var tmpl = this.method === "GET" ? this.template.get.input : this.template.post.input; - var sep = this.method === "GET" ? ";" : ""; - var result = ""; - var that = this; - var map = this.DataObject.getData(); - for (var i = 0; i < map.length; i++) { - // FIXME closure ? - (function (j) { - if (sep) { - sep = j === map.length - 1 ? "" : ";"; - } - result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep); - })(i); - } - return result; - }, - /** - * Ajout d'une donnée. - * - * @param {String} tmpl - template - * @param {String} key - clef - * @param {String} data - valeur - * @returns {String} chaine avec les substitutions clef/valeur - */ - __addDataInput: function __addDataInput(tmpl, key, data) { - var tmp = tmpl; - tmp = tmp.replace(/__KEY__/g, key); - tmp = tmp.replace(/__DATA__/g, data); - return tmp; - }, - /** - * Definir le mode de requête - * - * @param {String} method - GET|POST - */ - setMethod: function setMethod(method) { - if (method === "GET" || method === "POST") { - this.method = method; - } else { - this.logger.warn("support only GET and POST method !"); - } - }, - /** - * Retourne le mode de requete (GET|POST). - * - * @returns {AltiRequest.options.mode|String} methode (GET|POST) - */ - getMethod: function getMethod() { - return this.method; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (WPS); - -/***/ }), -/* 29 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(30); -/* harmony import */ var _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(31); -/* harmony import */ var _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(32); -/* harmony import */ var _model_Elevation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(33); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -/** - * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON - * (Factory) - * - * @module AltiResponseFactory - * @private - * @alias Gp.Services.Alti.Response.AltiResponseFactory - */ - - - - - - - -var AltiResponseFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Alti - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiResponseFactory"); - logger.trace(["AltiResponseFactory::build()"]); - var data = null; - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - switch (options.outputFormat) { - case "xml": - logger.trace("analyze response : xml"); - try { - var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__["default"]({ - reader: _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__["default"] - }); - if (typeof options.response === "string") { - p.setXMLString(options.response); - } else { - p.setXMLDoc(options.response); - } - data = p.parse(); - if (!data) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2")); - } - } catch (e) { - var message = e.message; - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", message), - status: 200, - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR - })); - return; - } - break; - case "json": - logger.trace("analyze response : json"); - logger.trace("analyze response : ", _typeof(options.response)); - var JSONResponse = null; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // le service renvoie t il une erreur ? - if (JSONResponse && JSONResponse.error) { - // ex. {"error": {"code": "BAD_PARAMETER","description": "The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180)."}} - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), - status: 200, - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR - })); - return; - } - - // analyse de la reponse - if (JSONResponse) { - var elevations = JSONResponse.elevations; - var altiResponse = new _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__["default"](); - var elevation; - if (Array.isArray(elevations) && elevations.length) { - for (var i = 0; i < elevations.length; i++) { - elevation = new _model_Elevation__WEBPACK_IMPORTED_MODULE_6__["default"](); - if (_typeof(elevations[i]) === "object") { - // elevations[i] est un objet elevation - if (elevations[i].lon) { - elevation.lon = elevations[i].lon; - } - if (elevations[i].lat) { - elevation.lat = elevations[i].lat; - } - if (elevations[i].z) { - elevation.z = elevations[i].z; - } - if (elevations[i].acc) { - elevation.acc = elevations[i].acc; - } - if (elevations[i].measures) { - elevation.measures = elevations[i].measures; - } - } else if (typeof elevations[i] === "number") { - // elevations[i] est un nombre, dans le cas de zonly=true notamment - elevation.z = elevations[i]; - } - if (Array.isArray(altiResponse.elevations)) { - altiResponse.elevations.push(elevation); - } - } - } - data = altiResponse; - } - if (!data) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE_2"), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR, - status: -1 - })); - return; - } - break; - default: - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_2"), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR, - status: -1 - })); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, - status: 200 - })); - return; - } else if (data.error) { - var errorMess = data.error.description; - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", errorMess), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, - status: 200 - })); - return; - } - } - } else { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - options.onSuccess.call(options.scope, data); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiResponseFactory); - -/***/ }), -/* 30 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* global require */ - - -// import __xmldom from "xmldom"; - -/** - * @classdesc - * - * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM, - * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques. - * - * @constructor - * @alias Gp.Formats.XML - * - * @param {Object} [options] - options du format XML - * - * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) - * utile pour interpréter le XML lorsque sa structure est connue. - * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. - * - * @param {Object} [options.writers] - writers - * - * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter. - * - * @private - */ -function XML(options) { - if (!(this instanceof XML)) { - throw new TypeError("XML constructor cannot be called as a function."); - } - - // FIXME : notion de singleton - - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur XML ()]"); - - /** - * Chaîne de caractères contenant le texte XML - * @type {String} - */ - this.xmlString = null; - - /** - * DOM Element correspondant à la structure du XML. - * @type {DOMElement} - */ - this.xmlDoc = null; - - /** - * Objet contenant des fonctions de lecture des différentes balises XML. - * @type {Object} - */ - this.reader = null; - - // traitement des paramètres d'options s'il y en a - if (options) { - if (options.xmlString && typeof options.xmlString === "string") { - this.xmlString = options.xmlString; - // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document - this.xmlDoc = __getXMLDOC(options.xmlString); - } - if (options.reader) { - this.setReader(options.reader); - } - } -} -XML.prototype = { - /** - * @lends module:XML - */ - - /* - * Constructeur (alias) - */ - constructor: XML, - /** - * Méthode permettant de récupérer la chaîne de caractères associée au format XML - * - * @returns {String} xmlString - la chaîne de caractères correspondant au format XML - */ - getXMLString: function getXMLString() { - return this.xmlString; - }, - /** - * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString). - * La méthode va aussi transformer cette chaîne de caractères en document XML, - * afin de remplir l'attribut xmlDoc. - * - * @param {String} xmlString - la chaîne de caractères correspondant au format XML - */ - setXMLString: function setXMLString(xmlString) { - if (xmlString && typeof xmlString === "string") { - this.xmlString = xmlString; - this.xmlDoc = __getXMLDOC(xmlString); - } - }, - /** - * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis - * - * @return {Object} readers - les readers associés au format XML, s'ils existent, - * sous forme d'une collection de fonctions - */ - getReader: function getReader() { - return this.reader; - }, - /** - * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data), - * lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)). - * - * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) - * utile pour interpréter le XML lorsque sa structure est connue. - * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. - */ - setReader: function setReader(reader) { - if (reader && reader.read && typeof reader.read === "function") { - this.reader = reader; - } - }, - /** - * Méthode permettant de récupérer le document XML associé au format, s'il existe. - * - * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe - */ - getXMLDoc: function getXMLDoc() { - return this.xmlDoc; - }, - /** - * Setter - */ - setXMLDoc: function setXMLDoc(doc) { - this.xmlDoc = doc; - }, - /** - * Méthode initialisant la lecture du XML, à partir d'un XML Document : - * création d'un objet JavaScript contenant les informations du XML, - * sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide). - * - * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML : - * - soit toutes les informations si aucun reader n'a été spécifié à la création du format - * - soit les informations spécifiées dans le reader. - */ - parse: function parse() { - // build xml document from xmlString - if (!this.xmlDoc && this.xmlString) { - this.xmlDoc = __getXMLDOC(this.xmlString); - } - if (this.xmlDoc) { - var root = __getRootNode(this.xmlDoc); - if (root) { - var parserOutput; - // call reader if exists - if (this.reader && this.reader.read) { - parserOutput = this.reader.read(root); - } else { - parserOutput = {}; - parserOutput[root.nodeName] = __readDefault(root); - } - return parserOutput; - } else { - return {}; - } - } - } -}; - -/** - * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML, - * en utilisant DOMParser () lorsque c'est possible. - * For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface - * - * @private - * @memberof XML - * @method __getXMLDOC - * @param {String} xmlString - xml string to be converted into DOM element - * @return {DOMElement} - the corresponding XML Document - */ -function __getXMLDOC(xmlString) { - if (typeof window === "undefined") { - // env. nodejs - var DOMParser = __webpack_require__(15).DOMParser; // __xmldom.DOMParser; - return new DOMParser().parseFromString(xmlString, "text/xml"); - } else { - // env. browser - - var parser; - var xmlDoc; - var errorMsg = "Erreur lors du parsing de la réponse du service : XML non conforme"; - if (window.ActiveXObject) { - // Internet Explorer < 9 - xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.async = false; - xmlDoc.loadXML(xmlString); - var parseError = xmlDoc.parseError; - if (parseError.errorCode) { - if (parseError.line && parseError.linepos) { - errorMsg += "( ligne " + parseError.line + ", colonne " + parseError.linepos; - } - if (parseError.reason) { - errorMsg += ": " + parseError.reason + ")"; - } - throw new Error(errorMsg); - } - return xmlDoc; - } else if (window.DOMParser) { - // les autres (Chrome, Mozilla, IE >= 9) - parser = new window.DOMParser(); - try { - xmlDoc = parser.parseFromString(xmlString, "text/xml"); - } catch (e) { - // Internet Explorer browser raises exception if xmlString is not valid XML - if (e.message === "SyntaxError") { - throw new Error(errorMsg); - } else { - throw new Error("Erreur lors du parsing de la réponse du service : " + e.message); - } - } - // look for parsing error in case no exception was raised - if (xmlDoc.getElementsByTagName("parsererror").length > 0) { - var parsererror = xmlDoc.getElementsByTagName("parsererror"); - for (var i = 0; i < parsererror.length; i++) { - var content = parsererror[i].innerHTML; - // except in case parsererror is just because of huge xml, but parsing is done. - if (content.indexOf("Huge input lookup") === -1) { - errorMsg += "(" + content + ")"; - throw new Error(errorMsg); - } - } - } else if (!xmlDoc.documentElement) { - // may happen in chrome browser - throw new Error(errorMsg); - } - return xmlDoc; - } else { - // FIXME - throw new Error("Incompatible DOM Parser pour ce navigateur !"); - } - } -} - -/** - * Méthode de la classe (privée) permettant de récupérer le noeud racine du document, - * à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode) - * - * @private - * @memberof XML - * @method __getRootNode - * @param {DOMElement} [xmlDoc] - a Document Node - * @return {DOMElement} root - the document root node - */ -function __getRootNode(xmlDoc) { - var root; - if (xmlDoc.nodeType === 9) { - // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree) - root = xmlDoc.documentElement; - } else if (xmlDoc.nodeType === 1) { - root = xmlDoc; - } - return root; -} - -/** - * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML, - * lorsqu'aucun reader spécifique n'a été spécifié (parser brut) - * - * @private - * @memberof XML - * @method readDefault - * @param {DOMElement} node - a DOM element node - * @example final data object looks like : - * data = { - * attributeName: attributeValue, - * childName: { - * attributeName: attributeValue, - * attributeName: attributeValue, - * childName: { - * "textContent": textContent - * }, - * childName: { - * childName: { - * attributeName:attributeValue - * } - * } - * } - * } - */ -function __readDefault(node) { - var data = {}; - - // if element node has attributes, set their values to data - if (node.attributes.length > 0) { - var dataAttributes = __getAttributes(node); - data["attributes"] = dataAttributes; - } - - // if element node has childNodes, read them and set them to data - if (node.hasChildNodes()) { - var childData = {}; - var child; - var children = node.childNodes; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (child.nodeType === 3) { - // TEXT_NODE - data["textContent"] = child.nodeValue; - } else if (child.nodeType === 1) { - childData = __readDefault(child); - if (!data[child.nodeName]) { - // store childData in an object - data[child.nodeName] = childData; - } else { - // in case several childNodes has the same name : store them in an array. - // if data[nodeName] already exists but is not an array - if (!Array.isArray(data[child.nodeName])) { - var old = data[child.nodeName]; - data[child.nodeName] = []; - data[child.nodeName].push(old); - } - data[child.nodeName].push(childData); - } - } - // TODO : manage other node types (4=CDATA, etc) - } - } - - return data; -} - -/** - * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément - * - * @private - * @memberof XML - * @method __getAttributes - * @param {DOMElement} node - noeud contenant l'attribut recherché - * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs - */ -function __getAttributes(node) { - if (node.attributes.length > 0) { - var nodeAttributes = {}; - var attributes = node.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - nodeAttributes[attribute.nodeName] = attribute.nodeValue; - } - return nodeAttributes; - } -} -/* harmony default export */ __webpack_exports__["default"] = (XML); - -/***/ }), -/* 31 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(32); -/* harmony import */ var _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(33); -/* harmony import */ var _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34); -/** - * Fonction retournant un objet contenant des clés de lecture (readers) - * qui permettent de parser des réponses XML du service Altimétrique du Géoportail - * (calcul altimétrique simple ou profil altimétrique d'une courbe), - * lorsque le paramètre output = xml, - * afin de récupérer les élévations retournées. - * - * @module AltiResponseReader - * @alias Gp.Services.Alti.Formats.AltiResponseReader - * @private - */ - -// import Logger from "../../../Utils/LoggerByDefault"; - - - - -/** - * - * Objet AltiResponseReader - * - * @member {Object} AltiResponseReader - * - * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers" - * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire - * et la valeur associée est une fonction (node, data) - * où node est un noeud du document DOM - * et data est un objet où l'on stocke les informations lues dans le XML. - * - * @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud "elevations" de la réponse XML - * du service alti, correspondant logiquement à la racine du document - * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) - * - * @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud "elevation" de la réponse xml du service alti. - * (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc) - * - * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud "lat" de la réponse xml du service alti. - * (contient une valeur de latitude, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud "lon" de la réponse xml du service alti. - * (contient une valeur de longitude, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud "z" de la réponse xml du service alti. - * (contient une valeur d'altitude, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud "acc" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud "measures" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud "source_name" de la réponse xml du service alti. - * (pour remplir l'éventuel objet measure) - * - * @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud "source_mesure" de la réponse xml du service alti. - * (pour remplir l'éventuel objet measure) - * - * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. - * - * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud "Exception" de la réponse xml du service alti. - * - * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, - * à l'aide des readers de la classe. - * - */ -var AltiResponseReader = {}; -AltiResponseReader.READERS = { - /** - * Lecture d'un noeud "elevations" de la réponse XML du service alti, correspondant logiquement à la racine du document - * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) - * - * @param {DOMElement} root - racine de la réponse XML - * @static - * @memberof AltiResponseReader - * @returns {Object} Retourne un objet de type AltiResponse - */ - elevations: function elevations(root) { - // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir. - var altiResponse = new _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__["default"](); - if (root.hasChildNodes()) { - var children = root.childNodes; - var child; - var elevation; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (AltiResponseReader.READERS[child.nodeName]) { - elevation = AltiResponseReader.READERS[child.nodeName](child); - altiResponse.elevations.push(elevation); - } - } - } - return altiResponse; - }, - /** - * Lecture d'un noeud "elevation" de la réponse xml du service alti. - * (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures) - * - * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures]) - * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse - * @static - * @memberof AltiResponseReader - */ - elevation: function elevation(node) { - var elevation = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__["default"](); - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (AltiResponseReader.READERS[child.nodeName]) { - // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. - AltiResponseReader.READERS[child.nodeName](child, elevation); - } - } - } - return elevation; - }, - /** - * Lecture d'un noeud "lat" de la réponse xml du service alti. - * (contient une valeur de latitude, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la latitude - * @param {Object} elevation - objet dans lequel stocker la latitude retournée - * @static - * @memberof AltiResponseReader - */ - lat: function lat(node, elevation) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - elevation.lat = parseFloat(textNode.nodeValue); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente"); - } - }, - /** - * Lecture d'un noeud "lon" de la réponse xml du service alti. - * (contient une valeur de longitude, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la longitude - * @param {Object} elevation - objet dans lequel stocker la longitude retournée - * @static - * @memberof AltiResponseReader - */ - lon: function lon(node, elevation) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - elevation.lon = parseFloat(textNode.nodeValue); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente"); - } - }, - /** - * Lecture d'un noeud "z" de la réponse xml du service alti. - * (contient une valeur d'altitude, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer l'altitude - * @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure - * @static - * @memberof AltiResponseReader - */ - z: function z(node, elevationObject) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - if (elevationObject) { - elevationObject.z = parseFloat(textNode.nodeValue); - } else { - elevationObject = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__["default"](); - elevationObject.z = parseFloat(textNode.nodeValue); - return elevationObject; - } - } else { - throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente"); - } - }, - /** - * Lecture d'un noeud "acc" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure - * @static - * @memberof AltiResponseReader - */ - acc: function acc(node, elevationObject) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - elevationObject.acc = parseFloat(textNode.nodeValue); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente"); - } - }, - /** - * Lecture d'un noeud "source_name" de la réponse xml du service alti. - * (contient le nom de la source, qui est un string) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} measure - objet dans lequel stocker le nom de la source retourné - * @static - * @memberof AltiResponseReader - */ - source_name: function source_name(node, measure) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - measure.source_name = textNode.nodeValue; - } else { - throw new Error("Erreur dans la lecture de la réponse du service : source_name attendue mais absente"); - } - }, - /** - * Lecture d'un noeud "source_measure" de la réponse xml du service alti. - * (contient le nom de la mesure, qui est un string) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} measure - objet dans lequel stocker le nom de la source retourné - * @static - * @memberof AltiResponseReader - */ - source_measure: function source_measure(node, measure) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - measure.source_measure = textNode.nodeValue; - } else { - throw new Error("Erreur dans la lecture de la réponse du service : source_measure attendue mais absente"); - } - }, - /** - * Lecture d'un noeud "measures" et de ses enfants "measure" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} elevation - objet dans lequel stocker la précision retournée - * @static - * @memberof AltiResponseReader - */ - measures: function measures(node, elevation) { - elevation.measures = []; - var measure; - if (node.hasChildNodes()) { - var children = node.childNodes; - var measureNode; - var measureChildren; - for (var i = 0; i < children.length; i++) { - measure = new _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__["default"](); - measureNode = children[i]; - measureChildren = measureNode.childNodes; - for (var j = 0; j < measureChildren.length; j++) { - if (AltiResponseReader.READERS[measureChildren[j].nodeName]) { - // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. - AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : measures attendues mais absentes"); - } - } - elevation.measures.push(measure); - } - } - }, - /** - * Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. - * - * @param {DOMElement} node - noeud à lire pour récupérer l'exception - * @return {Object} exceptionReport - objet contenant l'exception - * @static - * @memberof AltiResponseReader - */ - exceptionreport: function exceptionreport(node) { - var response = {}; - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (child.nodeName === "Exception") { - response.exceptionReport = AltiResponseReader.READERS.exception(child); - } - } - } - return response; - }, - /** - * Lecture d'un noeud "Exception" de la réponse xml du service alti. - * - * @param {DOMElement} node - noeud à lire pour récupérer l'exception - * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs : - * {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception - * {String} exceptionReport.exception - qui contient le message de l'exception - * @static - * @memberof AltiResponseReader - */ - exception: function exception(node) { - var exceptionReport = {}; - - // get exception code - var exceptionCode = node.getAttribute("exceptionCode"); - if (exceptionCode) { - exceptionReport.exceptionCode = exceptionCode; - } - - // get exception message - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - exceptionReport.exception = textNode.nodeValue; - } - return exceptionReport; - }, - /** - * Lecture d'un noeud "Error" de la réponse xml du service alti. - * - * @param {DOMElement} node - noeud à lire pour récupérer l'exception - * @return {Object} error - objet contenant l'exception - * @static - */ - error: function error(node) { - var response = { - error: {} - }; - // get error code and description - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - var textNode; - // get error code - if (child.nodeType === 1 && child.nodeName === "code") { - // 1 === node.ELEMENT_NODE - textNode = child.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - response.error.code = textNode.nodeValue; - } - } - // get error description - if (child.nodeType === 1 && child.nodeName === "description") { - // 1 === node.ELEMENT_NODE - textNode = child.firstChild; - if (textNode && textNode.nodeType === 3) { - // 3 === node.TEXT_NODE - response.error.description = textNode.nodeValue; - } - } - } - } - return response; - } -}; - -/** - * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, - * à l'aide des readers de la classe. - * - * @method AltiResponseReader.read - * @param {DOMElement} root - racine de la réponse XML à lire - * @static - * @memberof AltiResponseReader - */ -AltiResponseReader.read = function (root) { - if (root.nodeName === "elevations") { - var altiResponse = AltiResponseReader.READERS.elevations(root); - return altiResponse; - } else if (root.nodeName === "ExceptionReport") { - var exceptionReport = AltiResponseReader.READERS.exceptionreport(root); - return exceptionReport; - } else if (root.nodeName === "error") { - var error = AltiResponseReader.READERS.error(root); - return error; - } else { - throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu."); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiResponseReader); - -/***/ }), -/* 32 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Array.} elevations - Elevations array. - * - * @namespace - * @alias Gp.Services.AltiResponse - */ -function AltiResponse() { - if (!(this instanceof AltiResponse)) { - throw new TypeError("AltiResponse constructor cannot be called as a function."); - } - this.elevations = []; -} -AltiResponse.prototype = { - constructor: AltiResponse -}; -/* harmony default export */ __webpack_exports__["default"] = (AltiResponse); - -/***/ }), -/* 33 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if "zonly" parameter wasn't set to true. - * - * @property {Float} lat - Point latitude. (only if zonly=false) - * @property {Float} lon - Point longitude. (only if zonly=false) - * @property {Float} z - Point elevation. - * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) - * - * @namespace - * @alias Gp.Services.Alti.Elevation - */ -function Elevation() { - if (!(this instanceof Elevation)) { - throw new TypeError("Elevation constructor cannot be called as a function."); - } - this.z = null; -} -Elevation.prototype = { - constructor: Elevation -}; -/* harmony default export */ __webpack_exports__["default"] = (Elevation); - -/***/ }), -/* 34 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Single measure object returned by underlying web service if measures = true and zonly = false - * - * @property {String} source_name - Name of the source - * @property {String} source_measure - Name of the measure - * @property {Float} z - Point elevation. - * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) - * - * @namespace - * @alias Gp.Services.Alti.Measure - */ -function Measure() { - if (!(this instanceof Measure)) { - throw new TypeError("Measure constructor cannot be called as a function."); - } - this.source_name = null; - this.source_measure = null; - this.z = null; - this.acc = null; -} -Measure.prototype = { - constructor: Measure -}; -/* harmony default export */ __webpack_exports__["default"] = (Measure); - -/***/ }), -/* 35 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); -/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36); -/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(39); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } - - - - - - - - -/** - * @classdesc - * Appel du service de géocodage direct du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * - * - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.Geocode - * - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String|Object} options.query - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée. - * - * @param {Object} [options.filters] - Les propriétés possibles de cet objet sont décrites ci-après. - * @param {String} [options.filters.[prop]] - Critère supplémentaire pour filtrer la recherche sous la forme - * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. - * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : - * "postalCode", "inseeCode", "city". - * Il permet également de filtrer les toponymes avec les propriétés : - * "postalCode", "inseeCode", "type". - * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : - * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * - * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. - * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' - * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. - * L'index 'location' regroupe les indexes 'StreetAddress' et 'PositionOfInterest'. - * D'autres types pourront être rajoutés selon l'évolution du service. - * Par défaut, index = 'StreetAddress'. - * - * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. - * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. - * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. - * - * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. - * Pas de valeur par défaut. - * Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20. - * - * @param {Boolean} [options.returnTrueGeometry = false] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. - * false par défaut. - * - * - * @example - * var options = { - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * proxyURL : null, - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * position : {lon:, lat:}, - * index : 'StreetAddress', - * query : '10 rue du pont Machin-ville' - * (...) - * }; - */ -function Geocode(options_) { - if (!(this instanceof Geocode)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Geocode")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "Geocode"; - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Geocode"); - this.logger.trace("[Constructeur Geocode (options)]"); - var options = this.patchOptionConvertor(options_); - if (!options.serverUrl) { - options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Geocode.newUrl(); - if (options.oldGeocodeService) { - options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Geocode.url(); - } - } - - // appel du constructeur par heritage - _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, [options]); - if (!options.hasOwnProperty("query")) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "query")); - } - - // ajout des options spécifiques au service - this.options.query = options.query; - - // on definit l'index par defaut - if (!options.index) { - this.options.index = options.index = "StreetAddress"; - } - if (options.filters) { - var filter = Object.keys(options.filters); - for (var i = 0; i < filter.length; i++) { - var key = filter[i]; - // on supprime les filtres vides - if (typeof options.filters[key] === "undefined" || _typeof(options.filters[key]) === "object" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === "string" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) { - delete this.options.filters[key]; - } - } - } - this.options.index = options.index || "StreetAddress"; - this.options.maximumResponses = options.maximumResponses || 20; -} - -/** - * @lends module:Geocode# - */ -Geocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -Geocode.prototype.constructor = Geocode; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} options_ - options du service - * @return {Object} - options - */ -Geocode.prototype.patchOptionConvertor = function (options_) { - var options = options_; - if (options.hasOwnProperty("location")) { - this.logger.warn("The parameter 'location' is deprecated"); - if (!options.query) { - options.query = options.location; - } - delete options.location; - } - if (options.filterOptions) { - this.logger.warn("The parameter 'filterOptions' is deprecated"); - if (!options.filters) { - options.filters = options.filterOptions; - if (options.filters.type) { - this.logger.warn("The parameter 'filterOptions.type' is deprecated"); - if (!options.index) { - if (Array.isArray(options.filters.type) && options.filters.type.length > 0) { - options.index = options.filters.type[0]; - } else { - options.index = options.filters.type; - } - } - delete options.filters.type; - } - if (options.filters.bbox) { - this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); - delete options.filters.bbox; - } - } - delete options.filterOptions; - } - if (options.position) { - if (options.position.x) { - this.logger.warn("The parameter 'position.x' is deprecated"); - if (!options.position.lon) { - options.position.lon = options.position.x; - } - delete options.position.x; - } - if (options.position.y) { - this.logger.warn("The parameter 'position.y' is deprecated"); - if (!options.position.lat) { - options.position.lat = options.position.y; - } - delete options.position.y; - } - } - if (options.returnFreeForm) { - this.logger.warn("The parameter 'returnFreeForm' is deprecated"); - delete options.returnFreeForm; - } - if (options.srs) { - this.logger.warn("The parameter 'srs' is deprecated"); - delete options.srs; - } - return options; -}; - -/** - * Création de la requête (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Geocode.prototype.buildRequest = function (error, success) { - var options = { - httpMethod: this.options.httpMethod, - // options specifiques du service - geocodeMethod: "search", - query: this.options.query, - index: this.options.index, - returnTrueGeometry: this.options.returnTrueGeometry, - position: this.options.position, - maxResp: this.options.maximumResponses, - filters: this.options.filters - }; - this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); - - // on teste si la requete a bien été construite ! - !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); -}; - -/** - * Analyse de la reponse (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Geocode.prototype.analyzeResponse = function (error, success) { - /* INFO : - Etape 1 : Création de la requête (URL) - -> stockage de la requête dans this.request - Etape 2 : Envoi de la requête - -> appel du protocol XHR, et envoi (par ex send ()) - -> récupération de la réponse JSON dans la fonction onSuccess () (this.response) - -> si code HTTP 200 et pas de message d'erreur : etape 3 - -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur - Etape 3 : Analyse de la réponse JSON (si rawResponse === false ) - -> appel du parser pour récupérer le document - Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse : - -> JSON (si rawResponse === true) - -> ou geocodedLocations - */ - - if (this.response) { - var options = { - response: this.response, - rawResponse: this.options.rawResponse, - onError: error, - onSuccess: success, - scope: this - }; - _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); - } else { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (Geocode); - -/***/ }), -/* 36 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(37); - - - -/** - * Creation d'une requête - * (Factory) - * - * @module GeocodeRequestFactory - * @alias Gp.Services.Geocode.Request.GeocodeRequestFactory - * @private - */ -var GeocodeRequestFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Geocode - * - * @example - * var options = { - * // options specifiques du service - * geocodeMethod: - * query: - * filters: - * maximumResponses: - * }; - * var result = GeocodeRequestFactory.build(options); - * if (!result) { - * // error... - * } - * @returns {String} request - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("GeocodeRequestFactory"); - logger.trace(["GeocodeRequestFactory::build()"]); - var settings = options || {}; - var myReq = new _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__["default"](settings); - if (!myReq.processRequestString()) { - throw new Error("Error process request (rest) !"); - } - var request = myReq.requestString; - logger.trace(request); - return request; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (GeocodeRequestFactory); - -/***/ }), -/* 37 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(38); - - - - -/** - * @classdesc - * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire - * (uniquement en GET) - * - * @constructor - * @alias Gp.Services.Geocode.Request.GeocodeRequestREST - * @param {Object} options - options definies dans le composant Route - * - * @example - * var options = { - * (...) - * }; - * - * @private - */ -function GeocodeRequestREST(options) { - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("GeocodeRequestREST"); - this.logger.trace("[Constructeur GeocodeRequestREST ()]"); - if (!(this instanceof GeocodeRequestREST)) { - throw new TypeError("GeocodeRequestREST constructor cannot be called as a function."); - } - - // existance des options - if (!options) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); - } - - /** liste des options */ - this.settings = options; -} -GeocodeRequestREST.prototype = { - /** - * @lends module:GeocodeRequestREST# - */ - - /** - * request - * @type {String} - */ - requestString: null, - /** - * Constructeur (alias) - */ - constructor: GeocodeRequestREST, - /** - * Construction de la requête. - * - * @returns {String} request - */ - processRequestString: function processRequestString() { - var request = ""; - - // Mapping des options avec le service de l'API REST - var oParams = new _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__["default"](this.settings); - var params = oParams.getParams(); - for (var i = 0; i < params.length; i++) { - var o = params[i]; - if (request) { - request += "&"; - } - request += o.k + "=" + o.v; - } - if (!this.settings.geocodeMethod || this.settings.geocodeMethod !== "search" && this.settings.geocodeMethod !== "reverse") { - throw new Error("Error geocodeMethod not valid"); - } - this.requestString = "?" + request; - this.logger.trace(this.requestString); - return this.requestString; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (GeocodeRequestREST); - -/***/ }), -/* 38 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); - - -/** - * @classdesc - * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). - * Permet le mapping avec les options du service. - * @constructor - * @alias Gp.Services.Route.Request.RouteParamREST - * @param {Object} options - options - * - * @private - */ -function GeocodeParamREST(options) { - if (!(this instanceof GeocodeParamREST)) { - throw new TypeError("GeocodeParamREST constructor cannot be called as a function."); - } - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur GeocodeParamREST ()]"); - - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - // methode de geocodage - if (!this.options.geocodeMethod || this.options.geocodeMethod !== "search" && this.options.geocodeMethod !== "reverse") { - throw new Error("Error geocodeMethod not valid"); - } - this.geocodeMethod = this.options.geocodeMethod; - - // mapping des options avec l'API REST - this.query = typeof this.options !== "undefined" ? this.options.query : null; - this.searchGeometry = this.options.searchGeometry || null; - this.index = this.options.index || null; - this.lon = this.options.position && this.options.position.lon ? this.options.position.lon : null; - this.lat = this.options.position && this.options.position.lat ? this.options.position.lat : null; - this.maxResp = this.options.maxResp || null; - this.returnTrueGeometry = this.options.returnTrueGeometry || null; - this.filters = this.options.filters || {}; -} - -/** - * CLASSNAME - */ -GeocodeParamREST.CLASSNAME = "GeocodeParamREST"; -GeocodeParamREST.prototype = { - /** - * @lends module:GeocodeParamREST# - */ - - /** - * Constructeur (alias) - */ - constructor: GeocodeParamREST, - /** - * Retourne les filtres - * @returns {String} les filtres - */ - getFilters: function getFilters() { - var filters = {}; - for (var prop in this.filters) { - if (this.filters.hasOwnProperty(prop)) { - filters[prop] = this.filters[prop]; - } - } - return filters; - }, - /** - * Retourne l'index - * @returns {String} l'index - */ - getIndex: function getIndex() { - if (this.index === undefined) { - return null; - } - if (this.index === "StreetAddress") { - return "address"; - } else if (this.index === "CadastralParcel") { - return "parcel"; - } else if (this.index === "PositionOfInterest") { - return "poi"; - } else if (this.index === "location") { - return "location"; - } - return this.index; - }, - /** - * Retourne la géométrie de recherche - * @returns {String} la géométrie de recherche au format json - */ - getSearchGeometry: function getSearchGeometry() { - return JSON.stringify(this.searchGeometry); - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Array} liste de paramêtres - */ -GeocodeParamREST.prototype.getParams = function () { - var map = []; - if (this.geocodeMethod === "search") { - map.push({ - k: "q", - v: this.query - }); - } - if (this.index) { - map.push({ - k: "index", - v: this.getIndex() - }); - } - if (this.geocodeMethod === "reverse" && this.searchGeometry) { - map.push({ - k: "searchgeom", - v: this.getSearchGeometry() - }); - } - if (this.lon && this.lat) { - map.push({ - k: "lon", - v: this.lon - }); - map.push({ - k: "lat", - v: this.lat - }); - } - if (this.maxResp) { - map.push({ - k: "limit", - v: this.maxResp - }); - } - if (this.returnTrueGeometry) { - map.push({ - k: "returntruegeometry", - v: this.returnTrueGeometry - }); - } - var filters = this.getFilters(); - for (var key in filters) { - map.push({ - k: key, - v: filters[key] - }); - } - return map; -}; -/* harmony default export */ __webpack_exports__["default"] = (GeocodeParamREST); - -/***/ }), -/* 39 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(17); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(40); -/** - * Factory pour générer une reponse JSON à partir d'un XML - * (Factory) - * - * @module GeocodeResponseFactory - * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory - * @private - */ -// import Logger from "../../../Utils/LoggerByDefault"; - - - -var GeocodeReponseFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Geocode - * - * @example - * var options = { - * response : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build: function build(options) { - // data de type GeocodeResponse - var data = null; - if (options.response) { - if (options.rawResponse) { - data = options.response; - } else { - try { - var parser = new _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__["default"](); - data = parser.parse(options.response); - if (!data) { - throw new Error("L'analyse de la réponse du service !?"); - } - } catch (e) { - var message = e.message; - if (typeof options.response === "string") { - message += "('" + options.response + "')"; - } else { - message += "('" + options.response.documentElement.innerHTML + "')"; - } - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", message), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_UNKERR, - status: -1 - })); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_SRVERR, - status: 200 // FIXME : 200 ? - })); - - return; - } - } - } else { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_SRVERR, - status: -1 // FIXME : status response - })); - - return; - } - options.onSuccess.call(options.scope, data); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (GeocodeReponseFactory); - -/***/ }), -/* 40 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); -/* harmony import */ var _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41); -/* harmony import */ var _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(42); -// import Logger from "../../../Utils/LoggerByDefault"; - - - - - -/** - * Fonction retournant un objet contenant des clés de lecture (readers) - * qui permettent de parser des réponses XML du service de géocodage direct du Géoportail - * afin de récupérer les résultats retournés. - * @module GeocodeResponseParser - * @alias Gp.Services.Geocode.Formats.GeocodeResponseParser - * @private - */ - -/** - * @classdesc - * - * Classe permettant de parser une réponse GeoJSON - * - * @constructor - * @alias Gp.Formats.GeocodeResponseParser - * - * @private - */ -function GeocodeResponseParser() { - if (!(this instanceof GeocodeResponseParser)) { - throw new TypeError("GeocodeResponseParser constructor cannot be called as a function."); - } -} -GeocodeResponseParser.prototype = { - /** - * @lends module:GeocodeResponseParser - */ - - /* - * Constructeur (alias) - */ - constructor: GeocodeResponseParser, - /** - * Méthode permettant de lancer la lecture d'une réponse GeoJSON, - * - * @param {String} json - réponse au format GeoJSON - * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse GeoJSON, - * sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception. - */ - parse: function parse(json) { - var geocodeResponse = new _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__["default"](); - var obj = JSON.parse(json); - if (obj.type === "FeatureCollection") { - for (var i = 0; i < obj.features.length; ++i) { - _parseFeature(obj.features[i], geocodeResponse); - } - } else if (obj.type === "Feature") { - _parseFeature(obj, geocodeResponse); - } else if (obj.type === "SERVICE_ERROR") { - return _parseError(obj); - } else { - var mess = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", obj.type); - throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({ - message: mess, - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_UNKERR, - status: 200 - }); - } - return geocodeResponse; - } -}; - -/** - * Méthode permettant de parser un feature - * - * @private - * - * @param {Object} feature - * @param {Object} geocodeResponse - * - * @memberof GeocodeResponseParser - * @return {Object} objet GeocodedLocation - */ -function _parseFeature(feature, geocodeResponse) { - var location = new _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__["default"](); - if (feature.geometry && feature.geometry.type === "Point") { - location.position = { - lon: feature.geometry.coordinates[0], - lat: feature.geometry.coordinates[1] - }; - } - if (feature.properties) { - for (var prop in feature.properties) { - if (prop === "_score") { - location.accuracy = feature.properties[prop]; - } else if (prop === "_type") { - if (feature.properties[prop] === "address") { - location.type = "StreetAddress"; - } else if (feature.properties[prop] === "poi") { - location.type = "PositionOfInterest"; - } else if (feature.properties[prop] === "parcel") { - location.type = "CadastralParcel"; - } - } else { - location.placeAttributes[prop] = feature.properties[prop]; - } - } - if (feature.properties._type === "address") { - location.matchType = feature.properties.number !== undefined && feature.properties.number !== null ? "street number" : "street"; - } - } - geocodeResponse.locations.push(location); -} - -/** - * Méthode permettant de parser une erreur - * - * @private - * - * @param {Object} error - * - * @memberof GeocodeResponseParser - * @return {Object} - */ -function _parseError(error) { - return { - exceptionReport: error - }; -} -/* harmony default export */ __webpack_exports__["default"] = (GeocodeResponseParser); - -/***/ }), -/* 41 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Array.} locations - locations array. - * - * @namespace - * @alias Gp.Services.GeocodeResponse - */ -function GeocodeResponse() { - if (!(this instanceof GeocodeResponse)) { - throw new TypeError("GeocodeResponse constructor cannot be called as a function."); - } - this.locations = []; -} -GeocodeResponse.prototype = { - constructor: GeocodeResponse -}; -/* harmony default export */ __webpack_exports__["default"] = (GeocodeResponse); - -/***/ }), -/* 42 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Single location object returned by the underlying geocoding web service. - * - * @property {Gp.Point} position - Position of the location given in the requested coordinates system. - * @property {String} type - location type "StreetAddress" (for an address), "PositionOfInterest" (for a place name) or "CadastralParcel" (for cadastral parcel). - * @property {String} matchType - how geocoding is performed : "street number" (exact address), "street enhanced" (street number calculated by interpolation), "street" (only the street), "city" (only the city). - * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match). - * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service : - * - * *Common attributes : * - * - * - **trueGeometry** - the 'real life' geometry if different from 'Point' type. - * - * *if type === "StreetAddress" :* - * - * - **number** - Street number. - * - **postalCode** - PostCode - * - **street** - Street name - * - **city** - City - * - **houseNumberInfos** - additional street number information - * - **inseeCode** - INSEE Code - * - * - * *if type === "PositionOfInterest" :* - * - * - **type** - Place name type - * - **postalCode** - PostCode - * - **toponyme** - Toponyme - * - **extraFields** - additional place name properties - * - **inseeCode** - INSEE Code - * - * - * *si type = "CadastralParcel" :* - * - * - **codeCommuneAbs** - when a parcel comes from a city that was absorbed by another, code of that old city. "000" otherwise. - * - **codeArrondissement** - arrondissement - * - **identifiant** - cadastral parcel code - * - **feuille** - Parcel Sheet (eg. "1"). - * - **numero** - Parcel Number (eg. "0041") - * - **section** - Parcel Section (eg. "0D"). - * - **nomCommune** - Parcel municipality name. - * - **codeCommune** - Parcel municipality. - * - **codeDepartement** - Parcel Department. - * - * @namespace - * @alias Gp.Services.Geocode.GeocodedLocation - */ -function GeocodedLocation() { - if (!(this instanceof GeocodedLocation)) { - throw new TypeError("GeocodedLocation constructor cannot be called as a function."); - } - this.position = null; - this.matchType = null; - this.placeAttributes = {}; - this.type = null; - this.accuracy = null; - - /** - * Nom de la classe : "GeocodedLocation" - * @type {String} - */ - this.CLASSNAME = "GeocodedLocation"; -} -GeocodedLocation.prototype = { - constructor: GeocodedLocation -}; -/* harmony default export */ __webpack_exports__["default"] = (GeocodedLocation); - -/***/ }), -/* 43 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); -/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36); -/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(39); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } - - - - - - - - -/** - * @classdesc - * Appel du service de géocodage inverse du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.ReverseGeocode - * - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. - * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. - * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. - * - * @param {Object} [options.filters] - Les propriétés possibles de cet objet. - * @param {String} [options.filters.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme - * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. - * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : - * "postalCode", "inseeCode", "city". - * Il permet également de filtrer les toponymes avec les propriétés : - * "postalCode", "inseeCode", "type". - * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : - * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * - * @param {Object} [options.searchGeometry] - Emprise dans laquelle on souhaite effectuer la recherche. - * Les propriétés possibles de cet objet sont décrites ci-après. - * @param {String} options.searchGeometry.type - Type de géometrie (Point|Circle|Linestring|Polygon) - * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordonnées des points constituant la géométrie. - * @param {Float} options.searchGeometry.radius - Rayon. Paramètre applicable uniquement pour le type 'Circle'. - * - * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. - * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' - * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. L'index 'location' permet une recherche - * multi-indexes en regroupant les indexes 'PositionOfInterest' et 'StreetAddress'. - * D'autres types pourront être rajoutés selon l'évolution du service. - * Par défaut, index = 'StreetAddress'. - * - * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. - * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20s. - * - * @param {Boolean} [options.returnTrueGeometry] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. - * false par défaut. - * - * @example - * var options = { - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * proxyURL : null, - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * index : 'StreetAddress', - * searchGeometry : { - * type : Circle, - * coordinates : [48, 2], - * radius : 100 - * }, - * position : {lon:2 , lat:48.5}, - * maximumResponses : 25, - * }; - * - */ -function ReverseGeocode(options_) { - if (!(this instanceof ReverseGeocode)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "ReverseGeocode")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "ReverseGeocode"; - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.ReverseGeocode"); - this.logger.trace("[Constructeur ReverseGeocode (options)]"); - var options = this.patchOptionConvertor(options_); - if (!options.serverUrl) { - options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ReverseGeocode.newUrl(); - if (options.oldReverseService) { - options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ReverseGeocode.url(); - } - } - - // appel du constructeur par heritage - _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, [options]); - if (!options.searchGeometry) { - if (!options.position) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "searchGeometry")); - } - } else { - this.options.searchGeometry = options.searchGeometry; - } - - // on definit l'index par defaut - if (!options.index) { - this.options.index = options.index = "StreetAddress"; - } - if (options.filters) { - var filter = Object.keys(options.filters); - for (var i = 0; i < filter.length; i++) { - var key = filter[i]; - // on supprime les filtres vides - if (typeof options.filters[key] === "undefined" || _typeof(options.filters[key]) === "object" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === "string" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) { - delete this.options.filters[key]; - } - } - } - this.options.position = options.position; - this.options.index = options.index || "StreetAddress"; - this.options.maximumResponses = options.maximumResponses || 20; -} - -/** - * @lends module:ReverseGeocode# - */ -ReverseGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -ReverseGeocode.prototype.constructor = ReverseGeocode; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} options_ - options du service - * @return {Object} - options - */ -ReverseGeocode.prototype.patchOptionConvertor = function (options_) { - var options = options_; - if (options.filterOptions) { - this.logger.warn("The parameter 'filterOptions' is deprecated"); - if (options.filterOptions.type) { - this.logger.warn("The parameter 'filterOptions.type' is deprecated"); - if (!options.index) { - if (Array.isArray(options.filterOptions.type) && options.filterOptions.type.length > 0) { - options.index = options.filterOptions.type[0]; - } else { - options.index = options.filterOptions.type; - } - } - delete options.filterOptions.type; - } - if (options.filterOptions.bbox) { - this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); - if (!options.searchGeometry) { - // convertir la geometrie - options.searchGeometry = this.bbox2Json(options.filterOptions.bbox); - } - delete options.filterOptions.bbox; - } - if (options.filterOptions.circle) { - this.logger.warn("The parameter 'filterOptions.circle' is deprecated"); - if (!options.searchGeometry) { - // convertir la geometrie - options.searchGeometry = this.circle2Json(options.filterOptions.circle); - } - delete options.filterOptions.circle; - } - if (options.filterOptions.polygon) { - this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"); - if (!options.searchGeometry) { - // convertir la geometrie - options.searchGeometry = this.polygon2Json(options.filterOptions.polygon); - } - delete options.filterOptions.polygon; - } - if (!options.filters && Object.keys(options.filterOptions).length > 0) { - options.filters = options.filterOptions; - } - delete options.filterOptions; - } - if (options.position) { - if (options.position.x) { - this.logger.warn("The parameter 'position.x' is deprecated"); - if (!options.position.lon) { - options.position.lon = options.position.x; - } - delete options.position.x; - } - if (options.position.y) { - this.logger.warn("The parameter 'position.y' is deprecated"); - if (!options.position.lat) { - options.position.lat = options.position.y; - } - delete options.position.y; - } - } - if (options.srs) { - this.logger.warn("The parameter 'srs' is deprecated"); - delete options.srs; - } - return options; -}; - -/** - * (overwrite) - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -ReverseGeocode.prototype.buildRequest = function (error, success) { - var options = { - httpMethod: this.options.httpMethod, - // options specifiques du service - geocodeMethod: "reverse", - searchGeometry: this.options.searchGeometry, - index: this.options.index, - position: this.options.position, - returnTrueGeometry: this.options.returnTrueGeometry, - maxResp: this.options.maximumResponses, - filters: this.options.filters - }; - this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); - - // on teste si la requete a bien été construite ! - !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -ReverseGeocode.prototype.analyzeResponse = function (error, success) { - if (this.response) { - var options = { - response: this.response, - rawResponse: this.options.rawResponse, - onError: error, - onSuccess: success, - scope: this - }; - _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); - } else { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Array} bbox - bbox - * @return {Object} - geometrie au format json - */ -ReverseGeocode.prototype.bbox2Json = function (bbox) { - return { - type: "Polygon", - coordinates: [[[bbox.left, bbox.top], [bbox.right, bbox.top], [bbox.right, bbox.bottom], [bbox.left, bbox.bottom], [bbox.left, bbox.top]]] - }; -}; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} circle - circle - * @return {Object} - geometrie au format json - */ -ReverseGeocode.prototype.circle2Json = function (circle) { - return { - type: "Circle", - radius: circle.radius, - coordinates: [circle.x, circle.y] - }; -}; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Array} polygon - polygon - * @return {Object} - geometrie au format json - */ -ReverseGeocode.prototype.polygon2Json = function (polygon) { - var jsonGeom = { - type: "Polygon", - coordinates: [[]] - }; - for (var i = 0; i < polygon.length; ++i) { - jsonGeom.coordinates[0].push([polygon[i].x, polygon[i].y]); - } - return jsonGeom; -}; - -/** - * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées. - */ -ReverseGeocode.geoEPSG = ["EPSG:4326"]; -/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocode); - -/***/ }), -/* 44 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); -/* harmony import */ var _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6); -/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(17); - - - - - - - - -/** - * @classdesc - * Appel du service d'autocomplétion du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.AutoComplete - * - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String} options.text - La chaîne de caractère à compléter. - * Cette chaîne n'est pas "URL encodée". - * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête. - * - * @param {Array.} [options.type = ["StreetAddress"]] - Type de l'objet recherché. - * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'. - * D'autres types pourront être rajoutés selon l'évolution du service. - * Par défaut, type = ['StreetAddress']. - * - * @param {String} [options.territory] - Limitation de la zone de recherche de localisants. - * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE', - * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31' - * Pas de valeur par défaut. - * La valeur par défaut est donc celle du service. - * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié. - * - * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir. - * Pas de valeur par défaut. - * La valeur par défaut sera donc celle du service : 10. - * - * @example - * var options = { - * // options communes aux services - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * text : "", - * type : "StreetAddress", - * territory : 'METROPOLE', - * maximumResponses : 10 - * }; - */ -function AutoComplete(options_) { - if (!(this instanceof AutoComplete)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("CLASS_CONSTRUCTOR", "AutoComplete")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "AutoComplete"; - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__["default"].getLogger("Gp.Services.AutoComplete"); - this.logger.trace("[Constructeur AutoComplete (options)]"); - var options = this.patchOptionConvertor(options_); - if (!options.serverUrl) { - options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"].AutoComplete.newUrl(); - if (options.oldAutocompleteService) { - options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"].AutoComplete.url(); - } - } - - // appel du constructeur par heritage - _CommonService__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments); - if (!options.text) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("PARAM_MISSING", "text")); - } - - // ajout des options spécifiques au service - this.options.text = options.text; - - // on definit des parametres par defaut - if (!options.type) { - options.type = ["StreetAddress,PositionOfInterest"]; - } - this.options.type = options.type; - this.options.territory = options.territory || ""; - this.options.maximumResponses = options.maximumResponses || 10; - - // INFO - // le service ne repond pas en mode POST (405 Method Not Allowed) - if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") { - this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"); - this.options.httpMethod = "GET"; // on surcharge ! - } - - // attributs d'instances - - /** - * Format forcé de la réponse du service : "json" - * sauf si l'on souhaite une reponse brute (options.rawResponse) - */ - this.options.outputFormat = this.options.rawResponse ? "" : "json"; -} - -/** - * @lends module:AutoComplete# - */ - -AutoComplete.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_0__["default"].prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -AutoComplete.prototype.constructor = AutoComplete; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} options_ - options du service - * @return {Object} - options - */ -AutoComplete.prototype.patchOptionConvertor = function (options_) { - var options = options_; - if (options.filterOptions) { - this.logger.warn("The parameter 'filterOptions' is deprecated"); - if (options.filterOptions.type) { - this.logger.warn("The parameter 'filterOptions.type' is deprecated"); - if (!options.type) { - options.type = options.filterOptions.type; - } - } - if (options.filterOptions.territory) { - this.logger.warn("The parameter 'filterOptions.territory' is deprecated"); - if (!options.terr) { - options.terr = options.filterOptions.territory; - } - } - delete options.filterOptions; - } - return options; -}; - -/** - * (overwrite) - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -AutoComplete.prototype.buildRequest = function (error, success) { - // ex. - // http://wxs.ign.fr/CLEF/ols/apis/completion? - // text=Brie-Comt& - // type=StreetAddress,PositionOfInterest& - // territory=METROPOLE& - // maximumResponses=10 - - // traitement des param KPV sous forme de tableau - var territory = ""; - if (this.options.territory) { - territory = this.options.territory; - } - var type = ""; - if (this.options.type) { - type = this.options.type.join(","); - } - - // normalisation de la requete avec param KPV - this.request = _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__["default"].normalyzeParameters({ - text: encodeURIComponent(this.options.text), - type: type, - terr: territory, - maximumResponses: this.options.maximumResponses - }); - !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback de succès de l'analyse de la réponse - */ -AutoComplete.prototype.analyzeResponse = function (error, success) { - if (this.response) { - var options = { - response: this.response, - rawResponse: this.options.rawResponse, - onSuccess: success, - onError: error, - scope: this - }; - _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__["default"].build(options); - } else { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AutoComplete); - -/***/ }), -/* 45 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46); -/* harmony import */ var _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(47); -/** - * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON - * (Factory) - * - * @module AutoCompleteResponseFactory - * @private - * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory - */ - - - - - -var AutoCompleteResponseFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Alti - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AutoCompleteResponseFactory"); - logger.trace(["AutoCompleteResponseFactory::build()"]); - var data = null; - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - var JSONResponse = null; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // analyse de la réponse - if (JSONResponse) { - // le service renvoie t il une erreur ? - if (JSONResponse.error) { - // ex. ? - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), - status: JSONResponse.error.code, - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR - })); - return; - } - - // création de l'objet réponse - data = new _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__["default"](); - - // boucle sur les résultats de l'autocomplétion - if (JSONResponse.results && Array.isArray(JSONResponse.results)) { - var suggestedLocation = null; - for (var i = 0; i < JSONResponse.results.length; i++) { - var result = JSONResponse.results[i]; - suggestedLocation = new _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__["default"](); - if (result) { - if (result.country === "StreetAddress") { - suggestedLocation.street = result.street; - suggestedLocation.type = "StreetAddress"; - } else if (result.country === "PositionOfInterest") { - suggestedLocation.poi = result.street; - suggestedLocation.kind = result.kind; - suggestedLocation.type = "PositionOfInterest"; - } - if (suggestedLocation.position) { - suggestedLocation.position.x = result.x; - suggestedLocation.position.y = result.y; - } - suggestedLocation.commune = result.city; - suggestedLocation.fullText = result.fulltext; - suggestedLocation.postalCode = result.zipcode; - suggestedLocation.classification = result.classification; - } - // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation - data.suggestedLocations.push(suggestedLocation); - } - } else { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_3"))); - return; - } - if (!data.suggestedLocations.length) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_3"))); - return; - } - } - if (!data) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE_2"), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR, - status: -1 - })); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, - status: 200 - })); - return; - } - } - } else { - // si la réponse (xmlString) est vide, on appelle le callback d'erreur - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - - // si tout s'est bien passé, on appelle le callback de succès - options.onSuccess.call(options.scope, data); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (AutoCompleteResponseFactory); - -/***/ }), -/* 46 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Array.} suggestedLocations - SuggestedLocations array. - * - * @namespace - * @alias Gp.Services.AutoCompleteResponse - */ -function AutoCompleteResponse() { - if (!(this instanceof AutoCompleteResponse)) { - throw new TypeError("AutoCompleteResponse constructor cannot be called as a function."); - } - this.suggestedLocations = []; -} -AutoCompleteResponse.prototype = { - constructor: AutoCompleteResponse -}; -/* harmony default export */ __webpack_exports__["default"] = (AutoCompleteResponse); - -/***/ }), -/* 47 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Single SuggestedLocation Object returned by underlying web service. - * Each suggested location represents a street address ("StreetAddress") or a place name ("PositionOfInterest"). - * - * @property {String} type - Suggested location type : "StreetAddress" ou "PositionOfInterest" - * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system. - * @property {String} commune - Suggested municipality - * @property {String} fullText - Full text representation of the suggested location. - * @property {String} postalCode - Suggested location postcode - * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). - * @property {String} street - Street name of the suggested location ("StreetAddress" only). - * @property {String} kind - Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). - * - * @namespace - * @alias Gp.Services.AutoComplete.SuggestedLocation - */ -function SuggestedLocation() { - if (!(this instanceof SuggestedLocation)) { - throw new TypeError("SuggestedLocation constructor cannot be called as a function."); - } - - /* REPONSE : - { - "status" : "OK", - "results" : [ - { - "country":"PositionOfInterest", - "x":-1.559185, - "y":47.952603, - "city":"Brie", - "zipcode":"35150", - "street":"corbe", - "kind":"Lieu-dit habité", - "fulltext":"corbe, 35150 Brie", - "classification":6 - }, - { - "country":"StreetAddress", - "x":1.538295, - "y":43.19646, - "city":"Brie", - "zipcode":"09700", - "street":"courreste", - "kind":"", - "fulltext":"courreste, 09700 Brie", - "classification":7 - } - ] - } - */ - - /* REPONSE EN ERREUR - { - status : "ERROR", - results : [ ] - } - */ - - /** - * Suggested location type : "StreetAddress" ou "PositionOfInterest" - * @type {String} - */ - this.type = null; - - /** - * Position of the suggested location given in requested coordinates system. - * @type {Gp.Point} - */ - this.position = { - x: null, - y: null - }; - - /** - * Suggested municipality - * @type {String} - */ - this.commune = null; - - /** - * Full text representation of the suggested location. - * @type {String} - */ - this.fullText = null; - - /** - * Suggested location postcode - * @type {Number} - */ - this.postalCode = null; - - /** - * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). - * @type {Integer} - */ - this.classification = null; - - /** - * Street name of the suggested location ("StreetAddress" only). - * @type {String} - */ - this.street = null; - - /** - * Place name of the suggested location ("PositionOfInterest" only). - * @type {String} - */ - this.poi = null; - - /** - * Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). - * @type {String} - */ - this.kind = null; -} -SuggestedLocation.prototype = { - constructor: SuggestedLocation -}; -/* harmony default export */ __webpack_exports__["default"] = (SuggestedLocation); - -/***/ }), -/* 48 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); -/* harmony import */ var _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(49); -/* harmony import */ var _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(52); - - - - - - - - -/** - * @classdesc - * Appel du service d'itinéraire du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * - * @alias Gp.Services.Route - * @constructor - * @extends {Gp.Services.CommonService} - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. - * - * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'json' uniquement et par défaut. - * - * @param {String} [options.routePreference = "fastest"] - Mode de calcul à utiliser : - * - le plus rapide « fastest » - * - le plus court « shortest » - * Par défaut : « fastest ». - * - * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) - * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire. - * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire. - * - * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) - * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire. - * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire. - * - * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau. - * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float} - * - * @param {String} [options.graph = "voiture"] - Type de graphe utilisé : "Voiture" ou "Pieton". - * Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non. - * Par défaut, c'est la valeur "Voiture" qui sera utilisée. - * - * @param {String[]} [options.exclusions] - DEPRECATED: Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre "avoidFeature" d'OpenLS) - * On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte - * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). - * Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints - * - * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. - * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". - * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". - * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". - * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". - * - * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions. - * (correspond au paramètre "provideGeometry" d'OpenLS) Par défaut : false. - * - * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse. - * Par défaut : true. - * - * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse. - * Par défaut : m. - * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse. Il peut-être formatté hh:mm::ss avec la valeur standard. - * Les valeurs possibles sont "standard", "second", "minute" ou "hour". - * Par défaut : "standard". - * - * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés. - * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'. - * - * @param {String[]} [options.waysAttributes] - Nom des attributs des voies. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. - * - * @example - * var options = { - * // options communes aux services - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'XHR', - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * resource : 'bdtopo' - * outputFormat : 'json', - * startPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * endPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * provideBbox : true, - * exclusions : ["Bridge", "Tunnel", "Toll"], - * distanceUnit : "km", - * graph : "Voiture", - * geometryInInstructions : true, - * routePreference : "fastest" - * }; - * - */ -function Route(options) { - if (!(this instanceof Route)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Route")); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "Route"; - - // appel du constructeur par heritage - _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments); - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Route"); - this.logger.trace("[Constructeur Route (options)]"); - if (!options.startPoint) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint")); - } - - // on lance une exception afin d'eviter au service de le faire... - if (options.startPoint.x === null) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint.x")); - } - if (options.startPoint.y === null) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint.y")); - } - if (!options.endPoint) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint")); - } - - // on lance une exception afin d'eviter au service de le faire... - if (options.endPoint.x === null) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint.x")); - } - if (options.endPoint.y === null) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint.y")); - } - - // options par defaut - - // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. - if (options.outputFormat && options.outputFormat !== "json") { - this.logger.warn("options.outputFormat could only be json"); - } - this.options.outputFormat = "json"; - this.options.resource = options.resource || "bdtopo-osrm"; - this.options.startPoint = options.startPoint; - this.options.endPoint = options.endPoint; - this.options.viaPoints = options.viaPoints || []; - this.options.routePreference = options.routePreference || "fastest"; - /** Gestion des anciennes valeurs de graph */ - if (options.graph) { - if (options.graph === "Voiture") { - this.options.graph = "car"; - } - if (options.graph === "Pieton") { - this.options.graph = "pedestrian"; - } - } else { - this.options.graph = "car"; - } - this.options.constraints = []; - if (options.constraints) { - if (Array.isArray(options.constraints)) { - for (var k = 0; k < options.constraints.length; k++) { - this.options.constraints.push(options.constraints[k]); - } - } else { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "constraints")); - } - } - - /** Gestion de l'ancien paramètre exclusion */ - var constraintTunnel = {}; - var constraintPont = {}; - var constraintAutoroute = {}; - if (options.exclusions) { - if (options.exclusions.length !== 0) { - this.logger.warn("options.exclusions is DEPRECATED !!"); - for (var c = 0; c < options.exclusions.length; c++) { - if (typeof options.exclusions[c] === "string") { - options.exclusions[c] = options.exclusions[c].toLowerCase(); - } else { - // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions - continue; - } - if (options.exclusions[c] === "toll") { - constraintAutoroute.constraintType = "banned"; - constraintAutoroute.key = "wayType"; - constraintAutoroute.operator = "="; - constraintAutoroute.value = "autoroute"; - this.options.constraints.push(constraintAutoroute); - } - if (options.exclusions[c] === "tunnel") { - constraintTunnel.constraintType = "banned"; - constraintTunnel.key = "wayType"; - constraintTunnel.operator = "="; - constraintTunnel.value = "tunnel"; - this.options.constraints.push(constraintTunnel); - } - if (options.exclusions[c] === "bridge") { - constraintPont.constraintType = "banned"; - constraintPont.key = "wayType"; - constraintPont.operator = "="; - constraintPont.value = "pont"; - this.options.constraints.push(constraintPont); - } - } - } - } - this.options.geometryInInstructions = options.geometryInInstructions || false; - this.options.provideBbox = options.provideBbox || true; - this.options.distanceUnit = options.distanceUnit || "m"; - this.options.timeUnit = options.timeUnit || "second"; - this.options.expectedStartTime = null; // FIXME not yet implemented ! - this.options.srs = options.srs || "EPSG:4326"; - this.options.waysAttributes = options.waysAttributes || []; - - // gestion de l'url du service par defaut - // si l'url n'est pas renseignée, il faut utiliser les urls par defaut - if (!this.options.serverUrl) { - // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire - /* var UrlByDefault = DefaultUrlService.Route.newUrl(); - if (this.options.oldRouteService) { - UrlByDefault = DefaultUrlService.Route.url(); - } */ - // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire - var UrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Route.url(); - if (!UrlByDefault) { - throw new Error("Url by default not found !"); - } - this.options.serverUrl = UrlByDefault; - this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); - } -} - -/** - * @lends module:Route# - */ -Route.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -Route.prototype.constructor = Route; - -/** - * (overwrite) - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Route.prototype.buildRequest = function (error, success) { - var options = { - // spécifique au service - resource: this.options.resource, - startPoint: this.options.startPoint, - endPoint: this.options.endPoint, - viaPoints: this.options.viaPoints, - provideBbox: this.options.provideBbox, - constraints: this.options.constraints, - distanceUnit: this.options.distanceUnit, - timeUnit: this.options.timeUnit, - graph: this.options.graph, - geometryInInstructions: this.options.geometryInInstructions, - routePreference: this.options.routePreference, - srs: this.options.srs, - waysAttributes: this.options.waysAttributes - }; - this.request = _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); - - // on teste si la requete a bien été construite ! - if (!this.request) { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"))); - } else { - success.call(this, this.request); - } -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Route.prototype.analyzeResponse = function (error, success) { - // INFO - // Factory pour masquer la complexité du retour du service - - if (this.response) { - var options = { - distanceUnit: this.options.distanceUnit, - timeUnit: this.options.timeUnit, - response: this.response, - outputFormat: this.options.outputFormat, - // utile pour parser la string en mode XHR : JSON ou XML ! - rawResponse: this.options.rawResponse, - onError: error, - onSuccess: success, - scope: this, - geometryInInstructions: this.options.geometryInInstructions - }; - _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); - } else { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (Route); - -/***/ }), -/* 49 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); -/* harmony import */ var _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(50); - - - - -/** - * Creation d'une requête REST en mode POST ou GET - * (Factory) - * - * @module RouteRequestFactory - * @alias Gp.Services.Route.Request.RouteRequestFactory - * @private - */ -var RouteRequestFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Route - * - * @example - * // utilisation avec les callback - * var options = { - * (...) - * onSuccess : function (response) {}, - * onError : function (error) {}, - * // spécifique au service - * startPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * endPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * provideBbox : false, - * exclusions : ["bridge", "tunnel", "toll"], - * distanceUnit : "km", - * graph : "Voiture", - * geometryInInstructions : false, - * routePreference : "fastest" - * }; - * RouteRequestFactory.build(options); - * - * // utilisation sans callback - * var options = {...}; - * try { - * var result = RouteRequestFactory.build(options); - * if (! result) { throw new Error("..."):} - * } catch (e) { - * // todo - * } - * @returns {String} request - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestFactory"); - logger.trace(["RouteRequestFactory::build()"]); - var request = null; - var settings = options || {}; - - // gestion des callback - var bOnError = !!(options.onError !== null && typeof options.onError === "function"); - var message = null; - - // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! - var myReq = new _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__["default"](settings); - if (!myReq.processRequestString()) { - message = "Error process request (rest) !"; - if (bOnError) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); - return; - } - throw new Error(message); - } - request = myReq.requestString; - return request; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (RouteRequestFactory); - -/***/ }), -/* 50 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51); - - - - -/** - * @classdesc - * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire - * (uniquement en GET) - * - * @constructor - * @alias Gp.Services.Route.Request.RouteRequestREST - * @param {Object} options - options definies dans le composant Route - * - * @example - * var options = { - * (...) - * }; - * - * @private - */ -function RouteRequestREST(options) { - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestREST"); - this.logger.trace("[Constructeur RouteRequestREST ()]"); - if (!(this instanceof RouteRequestREST)) { - throw new TypeError("RouteRequestREST constructor cannot be called as a function."); - } - - // existance des options - if (!options) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); - } - - /** liste des options */ - this.settings = options; -} -RouteRequestREST.prototype = { - /** - * @lends module:RouteRequestREST# - */ - - /** - * request - * @type {String} - */ - requestString: null, - /** - * Constructeur (alias) - */ - constructor: RouteRequestREST, - /** - * Construction de la requête. - * - * @example - * // GET out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838 - * // POST out : Not yet supported method POST ! - * @returns {String} request - */ - processRequestString: function processRequestString() { - // INFO - // construction simple sans template..., - // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE ! - this.logger.warn(" PROTOTYPE !"); - - // Mapping des options avec le service de l'API REST - var oParams = new _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__["default"](this.settings); - var params = oParams.getParams(); - var request = ""; - for (var i = 0; i < params.length; i++) { - var o = params[i]; - if (request) { - request += "&"; - } - request += o.k + "=" + o.v; - } - - // Exemple : - // http://wxs.ign.fr/KEY/itineraire/rest/route.json? - // origin=& - // destination=& - // waypoints=& - // method=DISTANCE& - // graph=Pieton& - // graphName=Pieton& - // exclusions=& - // tolerance=10& - // srs= - - this.logger.trace(request); - this.requestString = request; - return this.requestString; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (RouteRequestREST); - -/***/ }), -/* 51 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); - - -/** - * @classdesc - * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). - * Permet le mapping avec les options du service. - * @constructor - * @alias Gp.Services.Route.Request.RouteParamREST - * @param {Object} options - options - * - * @private - */ -function RouteParamREST(options) { - if (!(this instanceof RouteParamREST)) { - throw new TypeError("RouteParamREST constructor cannot be called as a function."); - } - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur RouteParamREST ()]"); - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - // mapping des options avec l'API REST - - /** Ressource utilisée */ - this.resource = this.options.resource; - - /** Coordonnées du point de départ. */ - this.start = this.options.startPoint.x + "," + this.options.startPoint.y; - - /** Coordonnées du point d’arrivée. */ - this.end = this.options.endPoint.x + "," + this.options.endPoint.y; - - /** Coordonnées des étapes point de départ. */ - this.intermediates = this.options.viaPoints; - - /** Nom du profile à utiliser */ - this.profile = this.options.graph; - - /** projection (code EPSG comme epsg:4326 ou wgs84) */ - this.crs = this.options.srs; - - /** Liste des contraintes */ - this.constraints = this.options.constraints; - - /** Nom de l'optimisation à utiliser */ - this.optimization = this.options.routePreference; - - /** Format de sortie (résumé de l’itinéraire) */ - this.getSteps = this.options.geometryInInstructions ? "true" : "false"; - - /** Unité des distances */ - this.distanceUnit = this.options.distanceUnit; - - /** Unité des durées */ - this.timeUnit = this.options.timeUnit; - - /** Attributs des voies */ - this.waysAttributes = this.options.waysAttributes; -} - -/** - * CLASSNAME - */ -RouteParamREST.CLASSNAME = "RouteParamREST"; -RouteParamREST.prototype = { - /** - * @lends module:RouteParamREST# - */ - - /** - * Constructeur (alias) - */ - constructor: RouteParamREST, - /** - * Retourne une liste de points - * @returns {String} une liste de points (sep '|') - */ - getIntermediates: function getIntermediates() { - var array = []; - if (this.intermediates.length !== 0) { - for (var i = 0; i < this.intermediates.length; i++) { - var obj = this.intermediates[i]; - array.push(obj.x + "," + obj.y); - } - } - return array.join("|"); - }, - /** - * Retourne une liste d'attributs - * @returns {String} une liste d'attributs (sep '|') - */ - getWaysAttributes: function getWaysAttributes() { - return this.waysAttributes.join("|"); - }, - /** - * Retourne un profile - * @returns {String} profile - */ - getProfile: function getProfile() { - return this.profile; - }, - /** - * Retourne un distanceUnit - * @returns {String} distanceUnit - */ - getDistanceUnit: function getDistanceUnit() { - if (this.distanceUnit === "m") { - return "meter"; - } - if (this.distanceUnit === "km") { - return "kilometer"; - } - return ""; - }, - /** - * Retourne une optimisation - * @returns {String} optimization - */ - getOptimization: function getOptimization() { - if (this.optimization) { - return this.optimization; - } else { - return ""; - } - }, - /** - * Retourne la liste des constraints - * @returns {String} une liste des constraints (sep '|') - */ - getConstraints: function getConstraints() { - var constraintArray = []; - if (this.constraints.length !== 0) { - for (var k = 0; k < this.constraints.length; k++) { - constraintArray.push(JSON.stringify(this.constraints[k])); - } - } - return constraintArray.join("|"); - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Array} liste de paramêtres - */ -RouteParamREST.prototype.getParams = function () { - var map = []; - map.push({ - k: "resource", - v: this.resource - }); - map.push({ - k: "start", - v: this.start - }); - map.push({ - k: "end", - v: this.end - }); - map.push({ - k: "geometryFormat", - v: "geojson" - }); - if (this.optimization) { - map.push({ - k: "optimization", - v: this.getOptimization() - }); - } - if (this.intermediates) { - map.push({ - k: "intermediates", - v: this.getIntermediates() - }); - } - if (this.profile) { - map.push({ - k: "profile", - v: this.getProfile() - }); - } - if (this.constraints) { - map.push({ - k: "constraints", - v: this.getConstraints() - }); - } - if (this.crs) { - map.push({ - k: "crs", - v: this.crs - }); - } - if (this.distanceUnit) { - map.push({ - k: "distanceUnit", - v: this.getDistanceUnit() - }); - } - if (this.timeUnit) { - map.push({ - k: "timeUnit", - v: this.timeUnit - }); - } - if (this.waysAttributes) { - map.push({ - k: "waysAttributes", - v: this.getWaysAttributes() - }); - } - return map; -}; -/* harmony default export */ __webpack_exports__["default"] = (RouteParamREST); - -/***/ }), -/* 52 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(53); -/* harmony import */ var _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(54); - - - - - - -/** - * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON - * (Factory) - * - * @module RouteResponseFactory - * @alias Gp.Services.Route.Response.RouteResponseFactory - * @private - */ -var RouteResponseFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Route - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteResponseFactory"); - logger.trace("RouteResponseFactory::build()"); - var data = null; - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - logger.trace("analyze response : json"); - var JSONResponse; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // construction de l'objet réponse JSON - if (JSONResponse) { - // le service renvoie t il une erreur ? - if (JSONResponse.message) { - // ex. {"message":"message not null", "status":"ERROR"} - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.message))); - return; - } - var legs = []; - var legSteps = []; - var steps = []; - data = new _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__["default"](); - if (data.hasOwnProperty("totalTime")) { - data.totalTime = parseFloat(JSONResponse.duration); - } - if (data.hasOwnProperty("totalDistance")) { - data.totalDistance = parseFloat(JSONResponse.distance); - } - if (data.hasOwnProperty("bbox")) { - data.bbox.left = parseFloat(JSONResponse.bbox[0]); - data.bbox.bottom = parseFloat(JSONResponse.bbox[1]); - data.bbox.right = parseFloat(JSONResponse.bbox[2]); - data.bbox.top = parseFloat(JSONResponse.bbox[3]); - } - if (data.hasOwnProperty("routeGeometry") && !options.geometryInInstructions) { - data.routeGeometry = JSONResponse.geometry; - } - if (data.hasOwnProperty("routeInstructions") && options.geometryInInstructions) { - var legList = JSONResponse.portions; - var i; - if (Array.isArray(legList) && legList.length) { - for (i = 0; i < legList.length; i++) { - legs.push(legList[i]); - } - } - if (legs.length) { - for (i = 0; i < legs.length; i++) { - legSteps.push(legs[i].steps); - } - } - if (legSteps.length) { - for (i = 0; i < legSteps.length; i++) { - steps = steps.concat(legSteps[i]); - } - } - steps.forEach(function (step) { - data.routeInstructions.push(new _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__["default"]()); - data.routeInstructions[data.routeInstructions.length - 1].duration = step.duration; - data.routeInstructions[data.routeInstructions.length - 1].distance = step.distance; - data.routeInstructions[data.routeInstructions.length - 1].code = ""; - data.routeInstructions[data.routeInstructions.length - 1].instruction = ""; - data.routeInstructions[data.routeInstructions.length - 1].geometry = step.geometry; - - // on ne souhaite pas de ce type de valeur... - if (step.name === "Valeur non renseignée") { - step.name = ""; - } - switch (step.instruction.type) { - case "turn": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Tourner"; - break; - case "new name": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer tout droit"; - break; - case "depart": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Départ"; - break; - case "arrive": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Arrivée"; - break; - case "merge": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Rejoindre"; - break; - case "ramp": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; - break; - case "on ramp": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; - break; - case "off ramp": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la sortie"; - break; - case "fork": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Sur la bifurcation, prendre"; - break; - case "end of road": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "À la fin de la route, prendre"; - break; - case "use lane": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Utiliser la file"; - break; - case "continue": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer"; - break; - case "roundabout": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; - break; - case "rotary": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; - break; - case "roundabout turn": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond point, tourner"; - break; - case "notification": - data.routeInstructions[data.routeInstructions.length - 1].instruction += ""; - break; - default: - data.routeInstructions[data.routeInstructions.length - 1].instruction += "?" + step.instruction.type + "?"; - break; - } - if (step.instruction.modifier) { - switch (step.instruction.modifier) { - case "uturn": - data.routeInstructions[data.routeInstructions.length - 1].instruction = "Faire demi-tour"; - break; - case "sharp right": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à droite"; - break; - case "right": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " à droite"; - break; - case "slight right": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " légèrement à droite"; - break; - case "straight": - data.routeInstructions[data.routeInstructions.length - 1].instruction = "Continuer tout droit"; - break; - case "slight left": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " lègèrement à gauche"; - break; - case "left": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " à gauche"; - break; - case "sharp left": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à gauche"; - break; - default: - data.routeInstructions[data.routeInstructions.length - 1].instruction += " ?" + step.instruction.modifier + "?"; - break; - } - } - if (step.instruction.exit) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += "".concat(step.instruction.exit, "e sortie"); - } - if (step.attributes.name) { - if (step.attributes.name.nom_1_droite || step.attributes.name.toponyme) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += " sur"; - } - if (step.attributes.name.nom_1_droite) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += " ".concat(step.attributes.name.nom_1_droite); - } - if (step.attributes.name.toponyme) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += " ".concat(step.attributes.name.toponyme); - } - } - }); - } - } - if (!data) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", "json"))); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2"))); - return; - } - } - } else { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - options.onSuccess.call(options.scope, data); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (RouteResponseFactory); - -/***/ }), -/* 53 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call. - * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route. - * @property {Array.} routeInstructions - Instructions of the route. - * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to "km" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by " Km" (e.g. : "19.6 Km"). If distanceUnit parameter was set to "m", totalDistance is a string containing the total distance expressed in meters (e.g. : "19599.14"). - * @property {Float} totalTime - Route duration in seconds. - * - * @namespace - * @alias Gp.Services.RouteResponse - */ -function RouteResponse() { - if (!(this instanceof RouteResponse)) { - throw new TypeError("RouteResponse constructor cannot be called as a function."); - } - this.totalTime = null; - this.totalDistance = null; - this.bbox = { - left: null, - right: null, - top: null, - bottom: null - }; - this.routeGeometry = null; // FIXME can be null if option 'geometryInInstructions' is true ! - - this.routeInstructions = []; -} -RouteResponse.prototype = { - constructor: RouteResponse -}; -/* harmony default export */ __webpack_exports__["default"] = (RouteResponse); - -/***/ }), -/* 54 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Single Route Instruction object. - * - * @property {String} code - Instruction code : - * - * - "F" : Straight forward - * - "B" : U-turn - * - "L" : turn left - * - "R" : turn right - * - "BL" : turn left strongly - * - "BR" : turn right strongly - * - "FL" : turn lightly to the left - * - "FR" : turn lightly to the right - * - "round_about_entry" : round about entry - * - "round_about_exit" : round about exit - * - * @property {String} instruction - Instruction text : translated code + street name - * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street. - * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter. - * @property {Float} duration - Instruction duration in seconds. - * - * @namespace - * @alias Gp.Services.Route.RouteInstruction - */ -function RouteInstruction() { - if (!(this instanceof RouteInstruction)) { - throw new TypeError("RouteInstruction constructor cannot be called as a function."); - } - this.duration = null; - this.distance = null; - this.code = null; - this.instruction = null; - this.geometry = null; // FIXME can be null if option 'geometryInInstructions' is false ! -} - -RouteInstruction.prototype = { - constructor: RouteInstruction -}; -/* harmony default export */ __webpack_exports__["default"] = (RouteInstruction); - -/***/ }), -/* 55 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); -/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); -/* harmony import */ var _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(56); -/* harmony import */ var _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(58); - - - - - - - - -/** - * @classdesc - * Appel du service d'isochrone/distance du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.ProcessIsoCurve - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. - * - * @param {String} options.outputFormat - Le format de la réponse du service iso : 'json' uniquement et par défaut. - * - * @param {Object} options.position - Point de départ du calcul. - * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) - * @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance. - * @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance. - * - * @param {String} options.srs - Projection. - * Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et - * dans lequel la géométrie de la courbe résultante sera exprimée. - * Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ». - * - * @param {String} [options.graph = "voiture"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »). - * La valeur par défaut est : «voiture» - * - * @param {Array.} [options.exclusions] - DEPRECATED: Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints. - * Critères d'exclusions à appliquer pour le calcul. - * On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte - * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). - * - * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. - * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". - * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". - * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". - * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". - * - * @param {String} [options.method = "time"] - Méthode utilisée pour le calcul de la courbe iso. - * Les valeurs possible sont "time" pour un calcul d'isochrone, "distance" pour un calcul d'isodistance. - * Pas de valeur spécifié équivaut à un calcul d'isochrone. - * - * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse ("m" or "km"). - * - * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse ("standard", "second", "minute", "hour"). Il peut-être formatté hh:mm::ss avec la valeur standard. - * - * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ». - * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "time". - * Si l'option method n'est pas renseignée, ce paramètre doit être renseigné. - * - * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ». - * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "DISTANCE". - * Si l'option "method" n'est pas renseignée, ce paramètre sera ignoré. - * - * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. - * Par défaut, la valeur « false » est appliquée. - * - * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. - * Par défaut, la valeur « false » est appliquée. - * - * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »). - * Par défaut, la valeur « false » est appliquée. - * - * @example - * var options = { - * // options communes aux services - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * position : { - * x : 2.3242664298058053, - * y : 48.86118017324745 - * }, - * distance : 200, - * [time : ] - * method : "distance", - * graph : "voiture", - * reverse : false - * }; - */ - -function ProcessIsoCurve(options) { - if (!(this instanceof ProcessIsoCurve)) { - throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "ProcessIsoCurve")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "ProcessIsoCurve"; - - // appel du constructeur par heritage - _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments); - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.ProcessIsoCurve"); - this.logger.trace("[Constructeur ProcessIsoCurve (options)]"); - if (!options.position) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position")); - } - - // on lance une exception afin d'eviter au service de le faire... - if (options.position.x === null) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.x")); - } - if (options.position.y === null) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.y")); - } - if (!options.time && !options.distance) { - throw new Error("Parameter (s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance"); - } - - // si on a que le paramètre "distance" en entrée, on calcule une isodistance. - // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "distance" - if (!options.time && options.distance) { - this.options.method = "distance"; - // on supprime l'éventuel attribut time, résidu d'un appel antérieur - if (this.options.time) { - delete this.options.time; - } - } - - // si on a que le paramètre "time" en entrée, on calcule une isochrone. - // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "time" - if (options.time && !options.distance) { - this.options.method = "time"; - // on supprime l'éventuel attribut time, résidu d'un appel antérieur - if (this.options.distance) { - delete this.options.distance; - } - } - - // au cas où on a ni l'un, ni l'autre... - this.options.method = this.options.method || "time"; - - // options par defaut du service - // TODO: modifier la ressource lors de la mise en production du service - this.options.resource = options.resource || "bdtopo-iso"; - this.options.exclusions = options.exclusions || []; - this.options.reverse = options.reverse || false; - this.options.srs = options.srs || "EPSG:4326"; - this.options.distanceUnit = options.distanceUnit || "m"; - this.options.timeUnit = options.timeUnit || "second"; - - // options depreciees - if (options.smoothing) { - this.logger.warn("options.smoothing is DEPRECATED"); - } - this.options.smoothing = false; - if (options.holes) { - this.logger.warn("options.holes is DEPRECATED"); - } - this.options.holes = false; - - // Gestion du graphe - if (options.graph) { - if (options.graph === "Voiture") { - this.options.graph = "car"; - } - if (options.graph === "Pieton") { - this.options.graph = "pedestrian"; - } - } else { - this.options.graph = "car"; - } - - // Gestions des contraintes - this.options.constraints = []; - if (options.constraints) { - if (Array.isArray(options.constraints)) { - for (var k = 0; k < options.constraints.length; k++) { - this.options.constraints.push(options.constraints[k]); - } - } else { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "constraints")); - } - } - - // Gestion de l'ancien paramètre exclusions - var constraintTunnel = {}; - var constraintPont = {}; - var constraintAutoroute = {}; - if (options.exclusions) { - if (options.exclusions.length !== 0) { - this.logger.warn("options.exclusions is DEPRECATED !!"); - for (var c = 0; c < options.exclusions.length; c++) { - if (typeof options.exclusions[c] === "string") { - options.exclusions[c] = options.exclusions[c].toLowerCase(); - } else { - // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions - continue; - } - if (options.exclusions[c] === "toll") { - constraintAutoroute.constraintType = "banned"; - constraintAutoroute.key = "wayType"; - constraintAutoroute.operator = "="; - constraintAutoroute.value = "autoroute"; - this.options.constraints.push(constraintAutoroute); - } - if (options.exclusions[c] === "tunnel") { - constraintTunnel.constraintType = "banned"; - constraintTunnel.key = "wayType"; - constraintTunnel.operator = "="; - constraintTunnel.value = "tunnel"; - this.options.constraints.push(constraintTunnel); - } - if (options.exclusions[c] === "bridge") { - constraintPont.constraintType = "banned"; - constraintPont.key = "wayType"; - constraintPont.operator = "="; - constraintPont.value = "pont"; - this.options.constraints.push(constraintPont); - } - } - } - } - - // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. - this.options.outputFormat = typeof options.outputFormat === "string" ? options.outputFormat.toLowerCase() : "json"; - if (options.outputFormat && options.outputFormat !== "json") { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_NOT_SUPPORT", "outputFormat")); - } - this.options.outputFormat = "json"; - - // gestion de l'url du service par defaut - // si l'url n'est pas renseignée, il faut utiliser les urls par defaut - if (!this.options.serverUrl) { - // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone - /* var urlFound = DefaultUrlService.ProcessIsoCurve.newUrl(); - if (this.options.oldIsoService) { - urlFound = DefaultUrlService.ProcessIsoCurve.url(); - } */ - // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone - var urlFound = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ProcessIsoCurve.url(); - if (!urlFound) { - throw new Error("Url by default not found !"); - } - this.options.serverUrl = urlFound; - this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); - } -} - -/** - * @lends module:ProcessIsoCurve# - */ -ProcessIsoCurve.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -ProcessIsoCurve.prototype.constructor = ProcessIsoCurve; - -/** - * Création de la requête (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -ProcessIsoCurve.prototype.buildRequest = function (error, success) { - try { - var oIsoCurve = new _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__["default"](this.options); - if (!oIsoCurve.processRequestString()) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD")); - } - this.request = oIsoCurve.requestString; - } catch (e) { - error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](e.message)); - return; - } - success.call(this, this.request); -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} onError - callback des erreurs - * @param {Function} onSuccess - callback de succès de l'analyse de la réponse - */ -ProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) { - if (this.response) { - var options = { - response: this.response, - outputFormat: this.options.outputFormat, - rawResponse: this.options.rawResponse, - onSuccess: onSuccess, - onError: onError, - scope: this - }; - _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); - } else { - onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurve); - -/***/ }), -/* 56 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(57); - - - - -/** - * @classdesc - * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance. - * Les requêtes peuvent être en mode GET ou POST, - * et le format de sorti est en JSON. - * - * @constructor - * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest - * @param {Object} options - options - * - * @example - * var options = { - * httpMethod : 'GET', // GET|POST - * // spécifique au service - * position : { - * x : 2.3242664298058053, - * y : 48.86118017324745 - * }, - * graph : "car", - * method : 'time', - * time : 1000, //distance : 200 - * reverse : false, - * srs : 'EPSG:4326' - * }; - * - * try { - * - * var oIsoCurve = new ProcessIsoCurveRequest (options); - * if (!oIsoCurve.processRequestString ()) { - * // error - * } - * - * var request = oIsoCurve.requestString; - * - * } catch (e) { - * // error - * } - * @private - */ -function ProcessIsoCurveRequest(options) { - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ProcessIsoCurveRequest"); - this.logger.trace("[Constructeur ProcessIsoCurveRequest ()]"); - if (!(this instanceof ProcessIsoCurveRequest)) { - throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function."); - } - - // existance des options - if (!options) { - throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); - } - - /** - * Liste des options - */ - this.settings = options; - - /** - * Mode HTPP. - * Par defaut, "GET". - * @type {String} - */ - this.mode = this.settings.httpMethod || "GET"; -} -ProcessIsoCurveRequest.prototype = { - /** - * @lends module:ProcessIsoCurveRequest# - */ - - /** - * Requête - * @type {String} - */ - requestString: null, - /** - * Constructeur (alias) - */ - constructor: ProcessIsoCurveRequest, - /** - * Construction de la requête. - * - * @example - * // GET out : - * // (http://wxs.ign.fr/KEY/isochrone?) - * // resource=& - * // point=& - * // costValue=& - * // costType=& - * // profile=& - * // constraints=& - * // direction=& - * // crs= - * - * // POST out : - * { - * resource: "bduni-idf-pgr", - * point: "2.337306,48.849319", - * costValue: 100, - * costType: "time", - * profile: "car", - * constraints: [{ - * constraintType: "banned", - * key: "ways_type", - * operator: "=", - * value: "autoroute" - * }] - * } - * - * @returns {String} request - */ - processRequestString: function processRequestString() { - var request = ""; - var i = 0; - switch (this.mode) { - case "GET": - this.logger.trace("Process GET Request"); - - // Mapping des options avec le service de l'API REST - var oParams = new _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__["default"](this.settings); - var params = oParams.getParams(); - for (i = 0; i < params.length; i++) { - var o = params[i]; - if (request) { - request += "&"; - } - request += o.k + "=" + o.v; - } - break; - case "POST": - this.logger.trace("Process POST Request"); - // creation du JSON - var postRequest = {}; - postRequest.resource = this.settings.resource; - postRequest.point = this.settings.position.x + "," + this.settings.position.y; - if (this.settings.method === "distance") { - postRequest.costType = "distance"; - postRequest.costValue = this.settings.distance; - } else { - postRequest.costType = "time"; - postRequest.costValue = this.settings.time; - } - postRequest.profile = this.settings.graph; - if (this.settings.reverse) { - postRequest.direction = "arrival"; - } else { - postRequest.direction = "departure"; - } - postRequest.constraints = this.settings.constraints; - postRequest.distanceUnit = this.settings.distanceUnit; - postRequest.timeUnit = this.settings.timeUnit; - postRequest.crs = this.settings.srs; - - // conversion en chaîne de caractères - request = JSON.stringify(postRequest); - break; - default: - this.logger.error("No other HTTP method supported by the service !"); - } - this.logger.trace(request); - this.requestString = request; - return this.requestString; - } -}; -/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveRequest); - -/***/ }), -/* 57 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); - - -/** - * @classdesc - * - * Classe de gestion des param. des requêtes du service de calcul des iso. - * Permet le mapping avec les options du service. - * - * @constructor - * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam - * @param {Object} options - options - * @private - * - */ -function ProcessIsoCurveParam(options) { - if (!(this instanceof ProcessIsoCurveParam)) { - throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function."); - } - this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); - this.logger.trace("[Constructeur ProcessIsoCurveParam ()]"); - - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - // mapping des options avec l'API REST - - /** Identifiant de l’isochrone */ - this.id = this.options.id; - - /** Resource */ - this.resource = this.options.resource; - - /** Coordonnées de départ (ou arrivée si le reverse est à true). */ - this.point = this.options.position; - - /** projection (code EPSG comme epsg:4326 ou wgs84) */ - this.crs = this.options.srs; - - /** - * Profil de véhicule à utiliser pour le calcul. - * Voiture ou Pieton - */ - this.profile = this.options.graph; - - /** Liste des règles de restrictions à utiliser */ - this.constraints = this.options.constraints; - this.reverse = this.options.reverse; - this.timeUnit = this.options.timeUnit; - this.distanceUnit = this.options.distanceUnit; - - /** - * "time" pour isochrone ou "distance" for isodistance. - * Par defaut, time... - */ - if (this.options.method === "distance") { - this.costType = "distance"; - this.costValue = this.options.distance; - } else { - this.costType = "time"; - this.costValue = this.options.time; - } -} - -/** - * CLASSNAME - */ -ProcessIsoCurveParam.CLASSNAME = "ProcessIsoCurveParam"; -ProcessIsoCurveParam.prototype = { - /** - * @lends module:ProcessIsoCurveParam# - */ - - /** - * Constructeur (alias) - */ - constructor: ProcessIsoCurveParam, - /** - * Retourne le point - * @returns {String} x,y - */ - getLocation: function getLocation() { - return this.point.x + "," + this.point.y; - }, - /** - * Retourne l'unité de la distance - * @returns {String} - */ - getDistanceUnit: function getDistanceUnit() { - if (this.distanceUnit === "m") { - return "meter"; - } - if (this.distanceUnit === "km") { - return "kilometer"; - } - return ""; - }, - /** - * Retourne la liste des contraintes - * @returns {String} - */ - getConstraints: function getConstraints() { - var constraintArray = []; - if (this.constraints.length !== 0) { - for (var k = 0; k < this.constraints.length; k++) { - constraintArray.push(JSON.stringify(this.constraints[k])); - } - } - return constraintArray.join("|"); - }, - /** - * Retourne la direction - * @returns {String} - */ - getDirection: function getDirection() { - if (this.reverse) { - return "arrival"; - } else { - return "departure"; - } - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Object[]} KVP - */ -ProcessIsoCurveParam.prototype.getParams = function () { - var map = []; - map.push({ - k: "resource", - v: this.resource - }); - map.push({ - k: "point", - v: this.getLocation() - }); - map.push({ - k: "direction", - v: this.getDirection() - }); - map.push({ - k: "costType", - v: this.costType - }); - map.push({ - k: "costValue", - v: this.costValue - }); - map.push({ - k: "profile", - v: this.profile - }); - map.push({ - k: "timeUnit", - v: this.timeUnit - }); - map.push({ - k: "distanceUnit", - v: this.getDistanceUnit() - }); - if (this.crs) { - map.push({ - k: "crs", - v: this.crs - }); - } - if (this.constraints) { - map.push({ - k: "constraints", - v: this.getConstraints() - }); - } - return map; -}; -/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveParam); - -/***/ }), -/* 58 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); -/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(59); - - - - - -/** - * Factory pour générer une reponse JSON à partir d'un JSON - * (Factory) - * - * @module ProcessIsoCurveResponseFactory - * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory - * @private - */ -var ProcessIsoCurveResponseFactory = { - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant ProcessIsoCurve - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build: function build(options) { - // logger - var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ProcessIsoCurveResponseFactory"); - logger.trace(["ProcessIsoCurveResponseFactory::build()"]); - var data = null; - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - logger.trace("analyze response : json"); - var JSONResponse; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // analyse de la reponse - // création de l'objet de réponse - data = new _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__["default"](); - - // remplissage de l'objet créé avec les attribtuts de la réponse du service - if (JSONResponse) { - if (JSONResponse.costType === "distance") { - data.time = ""; - data.distance = JSONResponse.costValue; - } else { - data.time = JSONResponse.costValue; - data.distance = ""; - } - data.message = ""; - data.id = ""; - data.srs = JSONResponse.crs; - data.geometry = JSONResponse.geometry; - var coords = JSONResponse.point.split(","); - if (data.location) { - data.location.x = coords[0]; - data.location.y = coords[1]; - } - } else { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", options.response))); - return; - } - - // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !! - // ex. Key does not exist or has expired - // mais le statut est 403, l'erreur est donc remontée plus tôt. - if (data.exceptionReport) { - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ - message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, - status: 200 - })); - return; - } - } - } else { - // si la réponse est vide, on appelle le callback d'erreur - options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - - // si tout s'est bien passé, on appelle le callback de succès - options.onSuccess.call(options.scope, data); - } -}; -/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponseFactory); - -/***/ }), -/* 59 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Float} distance - distance (expressed in meters) used for the request. - * @property {Float} time - time (expressed in seconds) used for the request. - * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve. - * @property {String} id - request id (used by underlying webservice). - * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in "srs" coordinates system). - * @property {String} message - message - * @property {String} srs - Identifier of the coordinates system used for the isocurve. - * - * @namespace - * @alias Gp.Services.IsoCurveResponse - * - */ -function ProcessIsoCurveResponse() { - if (!(this instanceof ProcessIsoCurveResponse)) { - throw new TypeError("ProcessIsoCurveResponse constructor cannot be called as a function."); - } - this.message = null; - this.id = null; - this.location = {}; - this.location.x = null; - this.location.y = null; - this.srs = null; - this.geometry = null; - this.time = null; - this.distance = null; -} -ProcessIsoCurveResponse.prototype = { - constructor: ProcessIsoCurveResponse -}; -/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponse); - -/***/ }) -/******/ ])["default"]; -}); \ No newline at end of file diff --git a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js deleted file mode 100644 index d8489a33..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js +++ /dev/null @@ -1,30 +0,0 @@ -/*! - * @brief Geoportal resources access library - * - * This software is released under the licence CeCILL-B (Free BSD compatible) - * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt - * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt - * @see http://www.cecill.info/ - * - * copyright CeCILL-B - * copyright IGN - * @author IGN - * @version 3.4.0-beta2 - * @date 27/10/2023 - * - */ -/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE - * @version v4.2.4 - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("node-fetch"),require("xmldom")):"function"==typeof define&&define.amd?define("Gp",["require","require"],e):"object"==typeof exports?exports.Gp=e(require("node-fetch"),require("xmldom")):t.Gp=e(t[void 0],t[void 0])}(this,(function(t,e){return function(t){var e={};function o(r){if(e[r])return e[r].exports;var s=e[r]={i:r,l:!1,exports:{}};return t[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}return o.m=t,o.c=e,o.d=function(t,e,r){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)o.d(r,s,function(e){return t[e]}.bind(null,s));return r},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=5)}([function(t){t.exports=JSON.parse('{"name":"geoportal-access-lib","version":"3.4.0-beta2","date":"27/10/2023","description":"French Geoportal resources access library","module":"src/Gp.js","main":"dist/GpServices-src.js","homepage":"https://github.com/IGNF/geoportal-access-lib#readme","scripts":{"clean":"echo \\"Warning: no yet implemented!\\" && exit 0","setup":"npm install","cover":"nyc --reporter=lcov --reporter=text npm run test","eslint":"eslint src/","build":"webpack --mode=none","build:prod":"webpack --mode=production","build:dev":"webpack --mode=development","test":"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\"test_*.js\\" test/spec/","test:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js","test:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js","test:end-to-end:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js","test:end-to-end:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js","sample":"npm run sample:serve","sample:serve":"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:prod":"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:dev":"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","doc":"npm run doc:serve","doc:serve":"webpack-dev-server --content-base jsdoc --port 9001 --open"},"nyc":{"include":["src/**/*.js"],"instrument":false,"sourceMap":false},"repository":{"type":"git","url":"https://github.com/IGNF/geoportal-access-lib.git"},"keywords":["geoportail","webservice","javascript","es6"],"author":"IGNF","license":"CECILL-B","dependencies":{"es6-promise":"^4.2.4","node-fetch":"^2.6.1","xmldom":"^0.1.27"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-transform-template-literals":"^7.12.1","@babel/preset-env":"^7.12.11","babel-loader":"^8.2.2","chai":"^4.1.2","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.1.2","eslint":"^7.18.0","eslint-config-standard":"^16.0.2","eslint-loader":"^4.0.2","eslint-plugin-import":"^2.22.1","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.2.1","eslint-plugin-standard":"^5.0.0","glob":"^7.1.2","handlebars-layouts":"^3.1.4","handlebars-webpack-plugin":"^1.4.1","html-webpack-plugin":"^4.5.1","istanbul-instrumenter-loader":"^3.0.1","jsdoc-webpack-plugin":"^0.3.0","loglevel":"^1.6.1","mocha":"^7.2.0","mocha-loader":"^5.1.5","mocha-webpack":"^2.0.0-beta.0","mochawesome":"^6.2.1","nyc":"^15.1.0","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","sinon":"^9.2.4","sinon-es6":"0.0.3","speed-measure-webpack-plugin":"^1.4.2","string-template":"^1.0.0","terser-webpack-plugin":"^2.3.8","webpack":"^4.46.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.2","webpack-node-externals":"^2.5.2","webpack-shell-plugin":"^0.5.0"},"bundledDependencies":[],"peerDependencies":{},"optionalDependencies":{}}')},function(t,e,o){var r,s;!function(n,i){"use strict";void 0===(s="function"==typeof(r=function(){var t=function(){},e="undefined"!=typeof window&&void 0!==window.navigator&&/Trident\/|MSIE /.test(window.navigator.userAgent),o=["trace","debug","info","warn","error"];function r(t,e){var o=t[e];if("function"==typeof o.bind)return o.bind(t);try{return Function.prototype.bind.call(o,t)}catch(e){return function(){return Function.prototype.apply.apply(o,[t,arguments])}}}function s(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function n(o){return"debug"===o&&(o="log"),"undefined"!=typeof console&&("trace"===o&&e?s:void 0!==console[o]?r(console,o):void 0!==console.log?r(console,"log"):t)}function i(e,r){for(var s=0;s=0&&e<=n.levels.SILENT))throw"log.setLevel() called with invalid level: "+e;if(s=e,!1!==r&&function(t){var e=(o[t]||"silent").toUpperCase();if("undefined"!=typeof window&&a){try{return void(window.localStorage[a]=e)}catch(t){}try{window.document.cookie=encodeURIComponent(a)+"="+e+";"}catch(t){}}}(e),i.call(n,e,t),"undefined"==typeof console&&e1)for(var o=1;o0?n.replace("%var%",s.join(" - ")):n.replace("%var%","%var% (not specified)")}catch(t){}return n}},i={normalyzeParameters:function(t){var e=null;if(t){var o=[];for(var r in t)if(t.hasOwnProperty(r)){var s=t[r];s||(s=""),o.push(r+"="+s)}e=o.join("&")}return e},normalyzeUrl:function(t,e,o){var r=t;if(t){var s=t.indexOf("?");-1===s&&(r+="?"),-1!==s&&s!==t.length-1&&(r+="&")}return e&&(r+="string"==typeof e?e:this.normalyzeParameters(e)),o&&(r=encodeURIComponent(r)),r},indent:function(t,e){return new Array((t||0)+1).join("\t")+e}},a=o(4),c=o.n(a);function l(t){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u,p={call:function(t){var e=s.getLogger("XHR");if(e.trace("[XHR::call()]"),c.a.polyfill(),!t.url)throw new Error("missing parameter : url is not defined !");if(!t.method)throw new Error("missing parameter : method is not defined !");t.format||(t.format="text");var o={};switch(o.url=t.url,o.data=t.data?t.data:null,o.method=t.method,o.timeOut=t.timeOut||0,o.scope=t.scope||this,o.proxy=t.proxy||null,o.content=t.content||null,o.headers=t.headers||{referer:"http://localhost"},t.method){case"DELETE":case"GET":break;case"PUT":case"POST":o.content=t.content?t.content:"application/x-www-form-urlencoded",o.headers=t.headers?t.headers:{referer:"http://localhost"};break;case"HEAD":case"OPTIONS":throw new Error("HTTP method not yet supported !");default:throw new Error("HTTP method unknown !")}switch(t.format){case"text":this.__call(o).then((function(o){e.trace(o),t.onResponse.call(this,o)})).catch((function(e){t.onFailure.call(this,e)}));break;case"json":this.__callJSON(o).then((function(o){e.trace(o),t.onResponse.call(this,o)})).catch((function(e){t.onFailure.call(this,e)}));break;case"xml":this.__callXML(o).then((function(o){e.trace(o),t.onResponse.call(this,o)})).catch((function(e){t.onFailure.call(this,e)}));break;default:throw new Error("This output Format is not yet supported !")}},__call:function(t){var e=s.getLogger("XHR");return e.trace("[XHR::__call()]"),new Promise((function(r,s){var n="POST"===t.method||"PUT"===t.method?1:0;t.data&&("object"===l(t.data)&&Object.keys(t.data).length||"string"==typeof t.data&&t.data.length)&&!n&&("Geocode"===t.scope.CLASSNAME||"ReverseGeocode"===t.scope.CLASSNAME?t.url=t.url+t.data:t.url=i.normalyzeUrl(t.url,t.data)),e.trace("URL = ",t.url);var a=null;if("undefined"==typeof window){var c=o(2),u={headers:{Referer:"https://localhost"}};return t.data&&"string"==typeof t.data&&n&&(u={method:t.method,body:t.data,headers:{"Content-Type":t.content,Referer:"https://localhost"}}),c(t.url,u).then((function(t){if(t.ok)r(t.text());else{var e="Errors Occured on Http Request (status : '"+t.statusText+"' | url : '"+t.url+"')",o=t.status;s({message:e,status:o})}})).catch((function(t){s({message:t,status:-1})}))}if(window.XMLHttpRequest){e.trace("XMLHttpRequest"),(a=new XMLHttpRequest).open(t.method,t.url,!0),a.overrideMimeType=t.content;var p=null;t.timeOut>0&&(e.trace("XHR - TimeOut actif !"),p=window.setTimeout((function(){s({message:"TimeOut Occured on Http Request with XMLHttpRequest !",status:-1})}),t.timeOut)),n&&(e.trace("data = ",t.data),a.setRequestHeader("Content-type",t.content)),a.onerror=function(t){console.log(t),s(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(t){console.log(t),s(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onreadystatechange=function(t){if(4===a.readyState)if(200===a.status)window.clearTimeout(p),r(a.response);else{var e="Errors Occured on Http Request (status : '"+t.target.statusText+"' | url : '"+t.target.responseURL+"' | response : '"+t.target.response+"')",o=t.target.status;s({message:e,status:o})}};var h=t.data&&n?t.data:null;a.send(h)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");e.trace("XDomainRequest"),(a=new XDomainRequest).open(t.method,t.url),a.overrideMimeType=t.content,t.timeOut>0&&(a.timeout=t.timeout,e.trace("XHR - TimeOut actif !")),n&&a.setRequestHeader("Content-type",t.content),a.onerror=function(){s(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(){s(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onload=function(t){if(200===a.status)r(a.responseText);else{var e="Errors Occured on Http Request (status : '"+t.target.statusText+"' | url : '"+t.target.responseURL+"')",o=t.target.status;s({message:e,status:o})}};var f=t.data&&n?t.data:null;a.send(f)}}))},__callJSON:function(t){return this.__call(t).then(JSON.parse).catch((function(e){console.log("_callJSON failed on : ",t.url,e)}))},__callXML:function(t){return this.__call(t).then((function(t){var e;"undefined"==typeof window?e=(new(0,o(3).DOMParser)).parseFromString(t,"text/xml"):window.DOMParser?e=(new window.DOMParser).parseFromString(t,"text/xml"):((e=new window.ActiveXObject("Microsoft.XMLDOM")).async=!1,e.loadXML(t));return e})).catch((function(e){console.log("__callXML failed on : ",t.url,e)}))}},h={uuid:(u=Math.floor(Date.now()),function(){return u++}),call:function(t){var e=s.getLogger("JSONP");if(e.trace("[JSONP::call ()]"),!t)throw e.error("missing parameter : options !"),new Error("missing parameter : options !");if(!t.url)throw e.error("missing parameter : options.url !"),new Error("missing parameter : options.url !");if(t.timeOut||(e.info("setting 'options.timeOut' default value"),t.timeOut=0),!t.onResponse)throw e.error("missing parameter : options.onResponse !"),new Error("missing parameter : options.onResponse !");var o="string"==typeof t.callbackSuffix?t.callbackSuffix:this.uuid(),r=!1,n=!1,i=t.url.indexOf("callback=");if(-1!==i){r=!0;var a=t.url.indexOf("&",i);-1===a&&(a=t.url.length);var c=t.url.substring(i+9,a);c&&(n=!0,t.callbackName=c,e.info("setting 'options.callbackName' value ("+t.callbackName+") from 'options.url' parameter"))}if(!r){var l=t.url.indexOf("?");-1===l?t.url=t.url+"?callback=":l===t.url.length?t.url=t.url+"callback=":t.url=t.url+"&callback=",e.info("setting callback default key in 'options.url' : "+t.url)}var u=!!t.callbackName||n;if(n||(t.callbackName||(e.info("setting 'options.callbackName' default value"),t.callbackName="callback",(o||""===o)&&(t.callbackName+=o)),t.url=t.url.replace("callback=","callback="+t.callbackName),e.info("setting callback function name in 'options.url' : "+t.url)),t.onTimeOut||(e.info("setting 'options.onTimeOut' default value"),t.onTimeOut=function(){console.log("TimeOut while invoking url : "+t.url)}),!u){var p=this,h=null;t.timeOut>0&&(h=window.setTimeout((function(){window[t.callbackName]=function(){},t.onTimeOut(),p._deleteScript(o)}),t.timeOut)),window[t.callbackName]=function(e){window.clearTimeout(h),t.onResponse(e),p._deleteScript(o)}}this._createScript(o,t.url)},_createScript:function(t,e){var o,r=document.getElementById("results"+t);(o=document.createElement("script")).setAttribute("type","text/javascript"),o.setAttribute("src",e),o.setAttribute("charset","UTF-8"),o.setAttribute("id","results"+t),o.setAttribute("async","true");var s=document.documentElement||document.getElementsByTagName("head")[0];null===r?s.appendChild(o):s.replaceChild(o,r)},_deleteScript:function(t){var e=document.getElementById("results"+t);if(e){var o=e.parentNode||document.documentElement;if(!o)return;o.removeChild(e)}}},f={send:function(t){var e=t||{method:"GET",protocol:"XHR",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("undefined"!=typeof window||"JSONP"!==t.protocol){if("XHR"===t.protocol||"json"===t.format?e.wrap=!1:"JSONP"===t.protocol&&"xml"===t.format&&(e.wrap=!0),e.callback=null,e.output=e.wrap?"json":null,e.wrap){var o={};o.output=e.output,o.callback=e.callback,delete o.callback,e.url=i.normalyzeUrl(t.url,o)}switch(e.protocol){case"XHR":"GET"===t.method&&t.nocache&&(e.url=i.normalyzeUrl(e.url,{t:(new Date).getTime()})),p.call(e);break;case"JSONP":e.data&&(e.url=i.normalyzeUrl(e.url,e.data)),h.call(e);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}else console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS")}};function d(t){if(!(this instanceof d))throw new TypeError("ErrorService constructor cannot be called as a function.");var e=t;"string"==typeof t||t instanceof String?(this.message=t,this.status=-1,this.type=d.TYPE_UNKERR):(this.message=e.message||"undefined!?",this.type=e.type,this.status=e.status||-1),this.name="ErrorService",this.stack=(new Error).stack}d.TYPE_SRVERR="SERVICE_ERROR",d.TYPE_USEERR="USAGE_ERROR",d.TYPE_UNKERR="UNKNOWN_ERROR",d.prototype=Object.create(Error.prototype,{constructor:{value:d,writable:!0,configurable:!0}});var g=d,m=o(0);function y(t){if(!(this instanceof y))throw new TypeError(n.getMessage("CLASS_CONSTRUCTOR"));for(var e in this.logger=s.getLogger("CommonService"),this.logger.trace("[Constructeur CommonService (options)]"),this.options={protocol:"XHR",ssl:!0,proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(t){console.log("onSuccess - la reponse est la suivante : ",t)},onFailure:function(t){200!==t.status&&t.status?console.log("onFailure - Erreur (",t.status,") : ",t.message):console.log("onFailure : ",t.message)}},t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);if(this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(t){console.log("onSuccess - la réponse brute du service est la suivante : ",t)}),!!(null===this.options.onSuccess||"function"!=typeof this.options.onSuccess))throw new Error(n.getMessage("PARAM_MISSING","onSuccess()"));switch(this.options.httpMethod="string"==typeof t.httpMethod?t.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(n.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(n.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof t.protocol?t.protocol.toUpperCase():"XHR",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(n.getMessage("PARAM_UNKNOWN","protocol"))}if("undefined"==typeof window&&"JSONP"===this.options.protocol)throw new Error(n.getMessage("PARAM_NOT_SUPPORT_NODEJS","protocol=JSONP (instead use XHR)"));"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=t.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}y.prototype={constructor:y,call:function(){this.logger.trace("CommonService::call ()");var t=this;function e(e){this.logger.trace("CommonService::onBuildRequest : ",e),this.callService.call(t,s,o)}function o(e){this.logger.trace("CommonService::onCallService : ",e),this.analyzeResponse.call(t,s,r)}function r(t){if(this.logger.trace("CommonService::onAnalyzeResponse : ",t),!t)return s.call(this,new g("Analyse de la reponse en échec !?"));this.options.onSuccess.call(this,t)}function s(t){this.logger.trace("CommonService::onError()");var e=t;e instanceof g||(e=new g(t.message)),this.options.onFailure.call(this,e)}(function(){this.logger.trace("CommonService::run ()"),this.buildRequest.call(t,s,e)}).call(t)},buildRequest:function(t,e){this.logger.error("overwritten method !"),t&&t.call(this,"This method must be overwritten !"),e.call(this,"This method must be overwritten !")},callService:function(t,e){var o=null,r=this.request,s=!(!this.options.proxyURL||"XHR"!==this.options.protocol);"Geocode"!==this.CLASSNAME&&"ReverseGeocode"!==this.CLASSNAME&&"AutoComplete"!==this.CLASSNAME&&(this.options.serverUrl=i.normalyzeUrl(this.options.serverUrl,{"gp-access-lib":m.version,apiKey:this.options.apiKey||"calcul"},!1)),s&&("GET"===this.options.httpMethod&&(o=this.options.proxyURL+i.normalyzeUrl(this.options.serverUrl,this.request,!0),r=null),"POST"===this.options.httpMethod&&(o=this.options.proxyURL+i.normalyzeUrl(this.options.serverUrl,null,!0),r=this.request));var n=this,a={url:o||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:r,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(o){n.logger.trace("callService::onResponse()");var r=null;if("XHR"===n.options.protocol&&(n.logger.trace("Response XHR",o),r=o),"JSONP"===n.options.protocol){if(n.logger.trace("Response JSON",o),!o)return void t.call(n,new g("Le contenu de la reponse est vide !?"));if(o.http){if(200!==o.http.status)return void t.call(n,new g({status:o.http.status,message:o.http.error,type:g.TYPE_SRVERR}));r=o.xml,n.options.rawResponse&&(r=o)}else r=o}if("function"==typeof n.options.onBeforeParse){var s=n.options.onBeforeParse(r);"string"==typeof s&&(r=s)}n.response=r,e.call(n,r)},onFailure:function(e){n.logger.trace("callService::onFailure()"),e.type=g.TYPE_SRVERR,t.call(n,new g(e))},onTimeOut:function(){n.logger.trace("callService::onTimeOut()"),t.call(n,new g("TimeOut!"))}};f.send(a)},analyzeResponse:function(t,e){this.logger.error("overwritten method !"),t&&t.call(this,"This method must be overwritten !"),e.call(this,"This method must be overwritten !")}};var v=y,w={ssl:!0,url:function(t){return(!1===w.ssl?"http://":"https://")+"wxs.ign.fr"+t},newUrl:function(t,e){return(!1===w.ssl?"http://":"https://")+e+t},Alti:{new_key:{"elevation-json":"/altimetrie/1.0/calcul/alti/rest/elevation.json","elevation-xml":"/altimetrie/1.0/calcul/alti/rest/elevation.xml","profil-json":"/altimetrie/1.0/calcul/alti/rest/elevationLine.json","profil-xml":"/altimetrie/1.0/calcul/alti/rest/elevationLine.xml"},_key:{"elevation-json":"/calcul/alti/rest/elevation.json","elevation-xml":"/calcul/alti/rest/elevation.xml","profil-json":"/calcul/alti/rest/elevationLine.json","profil-xml":"/calcul/alti/rest/elevationLine.xml",wps:"/alti/wps"},newUrl:function(){},url:function(){return{"elevation-json":w.url(this._key["elevation-json"]),"elevation-xml":w.url(this._key["elevation-xml"]),"profil-json":w.url(this._key["profil-json"]),"profil-xml":w.url(this._key["profil-xml"])}}},ProcessIsoCurve:{new_key:"/itineraire/isochrone",_key:"/calcul/geoportail/isochrone/rest/1.0.0/isochrone",newUrl:function(){},url:function(){return w.url(this._key)}},Config:{_key:"https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/",url:function(t){Array.isArray(t)||(t=t.split(","));for(var e=[],o=0;oe||t__IDENTIFIER__\x3c!-- __DATAINPUTS__ --\x3e__RAWDATAOUTPUT__',input:"__KEY____DATA__"}},namespaceByDefault:function(){return['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'].join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){this.logger.trace("WPS::processRequestString ()");var t="";if("POST"===this.method)t=this.template.post.value;else{if("GET"!==this.method)return this.logger.error("No other method supported by the service !"),!1;t=this.template.get.value}return t=(t=(t=(t=(t=t.replace(/__SERVICE__/g,this.paramservice)).replace(/__VERSION__/g,this.paramversion)).replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput)).replace(/__IDENTIFIER__/g,this.paramidentifier)).replace(/__REQUEST__/g,this.paramrequest),"POST"===this.method&&(t=(t=t.replace(/__NAMESPACE__/g,this.namespaceByDefault)).replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),(t=t.replace(//g,this.__addDataInputs()))?(this.requestString=t,this.logger.trace("traduction tmpl",t),!0):(this.logger.warn("traduction tmpl : empty request !?"),!1)},__addDataInputs:function(){this.logger.trace("WPS::__addDataInputs ()");for(var t,e="GET"===this.method?this.template.get.input:this.template.post.input,o="GET"===this.method?";":"",r="",s=this,n=this.DataObject.getData(),i=0;i0)for(var i=r.getElementsByTagName("parsererror"),a=0;a0){var r=function(t){if(t.attributes.length>0){for(var e={},o=t.attributes,r=0;r0?e.index=e.filters.type[0]:e.index=e.filters.type),delete e.filters.type),e.filters.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),delete e.filters.bbox)),delete e.filterOptions),e.position&&(e.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),e.position.lon||(e.position.lon=e.position.x),delete e.position.x),e.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),e.position.lat||(e.position.lat=e.position.y),delete e.position.y)),e.returnFreeForm&&(this.logger.warn("The parameter 'returnFreeForm' is deprecated"),delete e.returnFreeForm),e.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete e.srs),e},vt.prototype.buildRequest=function(t,e){var o={httpMethod:this.options.httpMethod,geocodeMethod:"search",query:this.options.query,index:this.options.index,returnTrueGeometry:this.options.returnTrueGeometry,position:this.options.position,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=ct.build(o),this.request?e.call(this,this.request):t.call(this,new g(n.getMessage("SERVICE_REQUEST_BUILD")))},vt.prototype.analyzeResponse=function(t,e){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};mt.build(o)}else t.call(this,new g(n.getMessage("SERVICE_RESPONSE_EMPTY")))};var wt=vt;function Et(t){return(Et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function St(t){if(!(this instanceof St))throw new TypeError(n.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));this.CLASSNAME="ReverseGeocode",this.logger=s.getLogger("Gp.Services.ReverseGeocode"),this.logger.trace("[Constructeur ReverseGeocode (options)]");var e=this.patchOptionConvertor(t);if(e.serverUrl||(e.serverUrl=E.ReverseGeocode.newUrl(),e.oldReverseService&&(e.serverUrl=E.ReverseGeocode.url())),v.apply(this,[e]),e.searchGeometry)this.options.searchGeometry=e.searchGeometry;else if(!e.position)throw new Error(n.getMessage("PARAM_MISSING","searchGeometry"));if(e.index||(this.options.index=e.index="StreetAddress"),e.filters)for(var o=Object.keys(e.filters),r=0;r0?e.index=e.filterOptions.type[0]:e.index=e.filterOptions.type),delete e.filterOptions.type),e.filterOptions.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),e.searchGeometry||(e.searchGeometry=this.bbox2Json(e.filterOptions.bbox)),delete e.filterOptions.bbox),e.filterOptions.circle&&(this.logger.warn("The parameter 'filterOptions.circle' is deprecated"),e.searchGeometry||(e.searchGeometry=this.circle2Json(e.filterOptions.circle)),delete e.filterOptions.circle),e.filterOptions.polygon&&(this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"),e.searchGeometry||(e.searchGeometry=this.polygon2Json(e.filterOptions.polygon)),delete e.filterOptions.polygon),!e.filters&&Object.keys(e.filterOptions).length>0&&(e.filters=e.filterOptions),delete e.filterOptions),e.position&&(e.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),e.position.lon||(e.position.lon=e.position.x),delete e.position.x),e.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),e.position.lat||(e.position.lat=e.position.y),delete e.position.y)),e.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete e.srs),e},St.prototype.buildRequest=function(t,e){var o={httpMethod:this.options.httpMethod,geocodeMethod:"reverse",searchGeometry:this.options.searchGeometry,index:this.options.index,position:this.options.position,returnTrueGeometry:this.options.returnTrueGeometry,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=ct.build(o),this.request?e.call(this,this.request):t.call(this,new g(n.getMessage("SERVICE_REQUEST_BUILD")))},St.prototype.analyzeResponse=function(t,e){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};mt.build(o)}else t.call(this,new g(n.getMessage("SERVICE_RESPONSE_EMPTY")))},St.prototype.bbox2Json=function(t){return{type:"Polygon",coordinates:[[[t.left,t.top],[t.right,t.top],[t.right,t.bottom],[t.left,t.bottom],[t.left,t.top]]]}},St.prototype.circle2Json=function(t){return{type:"Circle",radius:t.radius,coordinates:[t.x,t.y]}},St.prototype.polygon2Json=function(t){for(var e={type:"Polygon",coordinates:[[]]},o=0;o - * // - * // 42 1.5 - * // - * - * @constructor - * @alias Gp.Formats.GML.Geometry - * @private - * @param {Object} options - options - */ -function Geometry (options) { - this.logger = Logger.getLogger("GML.Geometry"); - this.logger.trace("[Constructeur Geometry ()]"); - - if (!(this instanceof Geometry)) { - throw new TypeError("Geometry constructor cannot be called as a function."); - } - - this.options = options || {}; - - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - if (options[opt]) { - this.options[opt] = options[opt]; - } - } - } - - // gestion du type - if (!this.options.type) { - throw new Error("Type is not defined !"); - } - - // gestion des data - if (!this.options.data) { - throw new Error("Data is not defined !"); - } - - if (typeof this.options.data === "object" && Object.keys(this.options.data).length === 0) { - throw new Error("Data is empty !"); - } -} - -Geometry.prototype = { - - /** constructeur (alias) */ - constructor : Geometry, - - /** namespace GML par defaut */ - featureNS : "http://www.opengis.net/gml", - - /** namespace GML par defaut */ - featurePrefix : "gml", - - /** template */ - template : { - point : "" + - "__X__ __Y__" + - "", - envelop : "" + - "__LEFT__ __BOTTOM__" + - "__RIGHT__ __TOP__" + - "", - circle : "" + - "__X__ __Y__" + - "__RADIUS__" + - "", - polygon : "" + - "" + - "" + - "__XY__" + - "" + - "" + - "", - multipolygon : "" - }, - - /** - * choix du template GML - * @param {String} name - nom du template - * @returns {String} le template avec les substitutions clef/valeur - */ - getTemplate : function (name) { - var template = this.template[name]; - - if (!template) { - throw new Error("Type of template is unknow !"); - } - - if (!this.featurePrefix) { - return template; - } - - var regex; - var subst; - - // regex ns tag - regex = /<(\w+[^\s>])/; - subst = "<$1 xmlns:" + this.featurePrefix + "=\"" + this.featureNS + "\""; - template = template.replace(regex, subst); - - // regex prefixe balise ouvrante - regex = /<(\w+[\s>])/g; - subst = "<" + this.featurePrefix + ":$1"; - template = template.replace(regex, subst); - - // regex prefixe balise fermante - regex = /<\/(\w+[\s>])/g; - subst = "__X__ __Y__"; - var template = this.getTemplate("point"); - template = template.replace(/__X__/g, data.x); - template = template.replace(/__Y__/g, data.y); - return template; - }, - - /** - * creation d'une bbox - * @returns {String} le template avec les substitutions clef/valeur - */ - toEnvelop : function () { - var data = this.options.data; - if (!data.left || !data.bottom || !data.right || !data.top) { - throw new Error("One coordinate is undefined !"); - } - var template = this.getTemplate("envelop"); ; - template = template.replace(/__LEFT__/g, data.left); - template = template.replace(/__BOTTOM__/g, data.bottom); - template = template.replace(/__RIGHT__/g, data.right); - template = template.replace(/__TOP__/g, data.top); - return template; - }, - - /** - * creation d'un cercle - * @returns {String} le contenu du template - */ - toCircle : function () { - var data = this.options.data; - if (!data.x || !data.y || !data.radius) { - throw new Error("One parameter is undefined !"); - } - var template = this.getTemplate("circle"); - template = template.replace(/__X__/g, data.x); - template = template.replace(/__Y__/g, data.y); - template = template.replace(/__RADIUS__/g, data.radius); - return template; - }, - - /** - * creation d'un polygone - * @returns {String} le contenu du template - */ - toPolygon : function () { - var data = this.options.data; - if (data.length === 0) { - throw new Error("Array is empty !"); - } - - // fermeture du polygone - if (JSON.stringify(data[0]) !== JSON.stringify(data[data.length - 1])) { - data.push(data[0]); - } - var strCoordinates = ""; - for (var i = 0; i < data.length; i++) { - var coord = data[i]; - if (Array.isArray(coord)) { - throw new Error("Holes are not implemented !"); - } - if ((coord.x && coord.y) || (coord.x === 0 || coord.y === 0)) { - strCoordinates += coord.x + " " + coord.y; - if (data.length !== i + 1) { - strCoordinates += " "; - } - } - } - - if (!strCoordinates) { - throw new Error("Coordinates are empty !"); - } - - var template = this.getTemplate("polygon"); - template = template.replace(/__XY__/g, strCoordinates); - return template; - }, - - /** - * creation d'un polygone - */ - toMultiPolygon : function () { - throw new Error("Not yet implemented !"); - }, - - /** - * to string - * @returns {String} le contenu du template - */ - toString : function () { - var result = null; - - switch (this.options.type.toUpperCase()) { - case "POINT": - result = this.toPoint(); - break; - case "ENVELOP": - result = this.toEnvelop(); - break; - case "CIRCLE": - result = this.toCircle(); - break; - case "POLYGON": - result = this.toPolygon(); - break; - case "MULTIPOLYGON": - result = this.toMultiPolygon(); - break; - default: - this.logger.warn("Type is not supported !"); - } - - this.logger.trace("result :", result); - return result; - } -}; - -export default Geometry; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js deleted file mode 100644 index 469ac960..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js +++ /dev/null @@ -1,142 +0,0 @@ -import Logger from "../Utils/LoggerByDefault"; - -/** - * Lecture / Ecriture du format WKT - * - * Les besoins sont assez simples : - * 1. lecture des types suivants : - * - LINESTRING - * - POLYGON - * - (TODO) - * 2. convertir aux formats suivants : - * - json - * - (TODO) - * - * - * @example - * var strWKT = "LINESTRING (2.416907 48.846577, 2.416916 48.846613)"; - * WKT.toJson (strWKT, - * function onSuccess (json) { - * // { - * // type : 'LINESTRING', - * // coordinates : [ - * // [2.416907, 48.846577], - * // [2.416916, 48.846613] - * // ] - * // } - * }, - * function onError (error) { - * console.log(error); - * } - * ); - * - * @module WKT - * @alias Gp.Formats.WKT - * @private - */ - -var WKT = { - - /** - * Parsing d'une chaine WKT - * - * @method toJson - * @param {String} strWkt - chaine de type WKT - * @param {Function} success - fonction callback - * @param {Function} error - fonction callback - */ - toJson : function (strWkt, success, error) { - var logger = Logger.getLogger(); - - var json = null; - - try { - if (!strWkt) { - throw new Error("La chaine WKT n'est pas renseignée !"); - } - - if (!success) { - // callback success par defaut - success = function (json) { - console.log(json); - }; - } - - if (!error) { - // callback error par defaut - error = function (e) { - console.log(e); - }; - } - - var regex; - var subst; - - // regex coordinates - regex = /(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g; - subst = "[$1,$2]"; - strWkt = strWkt.replace(regex, subst); - - // regex type - regex = /^(\w+)/; - regex.exec(strWkt); - if (RegExp.$1 === "POLYGON") { - subst = "{\"type\" : \"Polygon\","; - strWkt = strWkt.replace(RegExp.$1, subst); - // clean - // (( --> coordinates : [[ - regex = /(\({2}?)/; - subst = "\"coordinates\" : [["; - strWkt = strWkt.replace(regex, subst); - // )) --> ]]} - regex = /(\){2}?)/; - subst = "]]}"; - strWkt = strWkt.replace(regex, subst); - // all ( --> [ - regex = /(\()/g; - subst = "["; - strWkt = strWkt.replace(regex, subst); - // all ) --> ] - regex = /(\))/g; - subst = "]"; - strWkt = strWkt.replace(regex, subst); - } else if (RegExp.$1 === "LINESTRING") { - subst = "{\"type\" : \"LineString\","; - strWkt = strWkt.replace(RegExp.$1, subst); - // clean - regex = /(\(\(?)/; - subst = "\"coordinates\" : ["; - strWkt = strWkt.replace(regex, subst); - regex = /(\)\)?)/; - subst = "]}"; - strWkt = strWkt.replace(regex, subst); - } - - logger.trace(strWkt); - - json = JSON.parse(strWkt); - - if (!json) { - throw new Error("Le JSON est vide !"); - } - - if (!json.type) { - throw new Error("Le type de geometrie n'est pas connu !"); - } - - if (!json.coordinates) { - throw new Error("La liste des points est vide !"); - } - - success.call(this, json); - } catch (e) { - if (e.name === "SyntaxError") { - error.call(this, "Erreur de parsing JSON !"); - return; - } - error.call(this, e); - } - } -}; - -export default WKT; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js deleted file mode 100644 index 31699e3b..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js +++ /dev/null @@ -1,306 +0,0 @@ -import Logger from "../Utils/LoggerByDefault"; - -/** - * @classdesc - * Standard WPS - * - * @constructor - * @alias Gp.Formats.WPS - * @param {Object} options - options - * @param {Object} options.data - objet - * @param {String} options.method - POST|GET - * @param {String} options.param.service - "WPS" - * @param {String} options.param.version - "1.0.0" - * @param {String} options.param.identifier - "gs:WPSElevation|gs:WPSLineElevation" - * @param {String} options.param.rawdataoutput - "result" - * @param {String} options.param.request - "Execute" - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * @private - */ -function WPS (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur WPS()]"); - - if (!(this instanceof WPS)) { - throw new TypeError("WPS constructor cannot be called as a function."); - } - - this.options = options || {}; - - /** - * Objet DATA - */ - this.DataObject = this.options.data; - - if (!this.DataObject) { - throw new TypeError("This data object is not defined !"); - } - - /** - * param service. - * Par defaut, "WPS". - */ - this.paramservice = this.options.param.service || "WPS"; - - /** - * param version. - * Par defaut, "1.0.0". - */ - this.paramversion = this.options.param.version || "1.0.0"; - - /** - * param identifier - * Par defaut, "gs:WPS" - */ - this.paramidentifier = this.options.param.identifier || "gs:WPS"; - - /** - * param rawdataoutput - * Par defaut, "result". - */ - this.paramrawdataoutput = this.options.param.rawdataoutput || "result"; - - /** - * param request - * Par defaut, "Execute". - */ - this.paramrequest = this.options.param.request || "Execute"; - - /** - * methode. - * Par defaut, "GET". - */ - this.method = this.options.method || "GET"; -} - -WPS.prototype = { - - /** - * @lends module:WPS# - */ - - /** - * request - * @type {String} - */ - requestString : null, - - /** - * Constructeur (alias) - */ - constructor : WPS, - - /** - * Template de la requête. - */ - template : { - get : { - value : "service=__SERVICE__" + - "&version=__VERSION__" + - "&rawdataoutput=__RAWDATAOUTPUT__" + - "&identifier=__IDENTIFIER__" + - "&request=__REQUEST__" + - "&datainputs=", - - input : "__KEY__=__DATA__" - - }, - post : { - - value : "" + - "" + - "__IDENTIFIER__" + - "" + - "" + - "" + - "" + - "" + - "__RAWDATAOUTPUT__" + - "" + - "" + - "", - - input : "" + - "__KEY__" + - "" + - "__DATA__" + - "" + - "" - } - }, - - /** - * Namespace par defaut de la requete POST. - * - * @returns {String} namespace - */ - namespaceByDefault : function () { - var ns = [ - "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", - "xmlns=\"http://www.opengis.net/wps/1.0.0\"", - "xmlns:wfs=\"http://www.opengis.net/wfs\"", - "xmlns:wps=\"http://www.opengis.net/wps/1.0.0\"", - "xmlns:ows=\"http://www.opengis.net/ows/1.1\"", - "xmlns:gml=\"http://www.opengis.net/gml\"", - "xmlns:ogc=\"http://www.opengis.net/ogc\"", - "xmlns:wcs=\"http://www.opengis.net/wcs/1.1.1\"", - "xmlns:xlink=\"http://www.w3.org/1999/xlink\"" - ]; - - return ns.join(" "); - }, - - /** - * Schemalocation par defaut. - * - * @returns {String} schemaLocation - */ - schemaLocationByDefault : function () { - return "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\""; - }, - - /** - * Construction de la requête. - * - * @example - * // GET out : - * // service=__SERVICE__ - * // &version=__VERSION__ - * // &rawdataoutput=__RAWDATAOUTPUT__ - * // &identifier=__IDENTIFIER__ - * // &request=__REQUEST__ - * // &datainputs="__DATAINPUTS__" - * // avec __DATAINPUTS__ = __KEY__=__DATA__;... - * - * // POST out : - * // - * // - * // __IDENTIFIER__ - * // - * // - * // - * // - * // - * // __RAWDATAOUTPUT__ - * // - * // - * // ", - * // avec __DATAINPUTS__ - * // - * // __KEY__ - * // - * // __DATA__ - * // - * // - * - * @returns {Boolean} validation de la construction de la requete - */ - processRequestString : function () { - this.logger.trace("WPS::processRequestString ()"); - - var template = ""; - if (this.method === "POST") { - template = this.template.post.value; - } else if (this.method === "GET") { - template = this.template.get.value; - } else { - this.logger.error("No other method supported by the service !"); - return false; - } - - template = template.replace(/__SERVICE__/g, this.paramservice); - template = template.replace(/__VERSION__/g, this.paramversion); - template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput); - template = template.replace(/__IDENTIFIER__/g, this.paramidentifier); - template = template.replace(/__REQUEST__/g, this.paramrequest); - - // ajout + - if (this.method === "POST") { - template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); - template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); - } - - // ajout des datainputs - template = template.replace(//g, this.__addDataInputs()); - - if (!template) { - this.logger.warn("traduction tmpl : empty request !?"); - return false; - } - - this.requestString = template; - this.logger.trace("traduction tmpl", template); - - return true; - }, - - /** - * Ajout des données - * - * @returns {String} Données concaténées dans une chaine - */ - __addDataInputs : function () { - this.logger.trace("WPS::__addDataInputs ()"); - - // c'est un peu grossier... - var tmpl = this.method === "GET" ? this.template.get.input : this.template.post.input; - var sep = this.method === "GET" ? ";" : ""; - - var result = ""; - var that = this; - var map = this.DataObject.getData(); - for (var i = 0; i < map.length; i++) { - // FIXME closure ? - (function (j) { - if (sep) { - sep = (j === map.length - 1) ? "" : ";"; - } - result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep); - })(i); - } - - return result; - }, - - /** - * Ajout d'une donnée. - * - * @param {String} tmpl - template - * @param {String} key - clef - * @param {String} data - valeur - * @returns {String} chaine avec les substitutions clef/valeur - */ - __addDataInput : function (tmpl, key, data) { - var tmp = tmpl; - tmp = tmp.replace(/__KEY__/g, key); - tmp = tmp.replace(/__DATA__/g, data); - return tmp; - }, - - /** - * Definir le mode de requête - * - * @param {String} method - GET|POST - */ - setMethod : function (method) { - if (method === "GET" || method === "POST") { - this.method = method; - } else { - this.logger.warn("support only GET and POST method !"); - } - }, - - /** - * Retourne le mode de requete (GET|POST). - * - * @returns {AltiRequest.options.mode|String} methode (GET|POST) - */ - getMethod : function () { - return this.method; - } -}; - -export default WPS; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js deleted file mode 100644 index 44ade42d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js +++ /dev/null @@ -1,482 +0,0 @@ -import Logger from "../Utils/LoggerByDefault"; -import RequestHeader from "./XLS/RequestHeader"; -import Request from "./XLS/Request"; -import AbstractService from "./XLS/AbstractService"; - -/** - * @classdesc - * - * standard OpenLS - * standard XLS - * (version 1.2) - * - * Réfs : - * - {@link http://schemas.opengis.net/ols/1.2/} - * - {@link http://www.opengeospatial.org/standards/ols} - * - {@link http://wxs.ign.fr/schemas/} - * - * - * Création du template XLS (avec gestion des namespaces) - * ------------------------ - * ``` - * balise xsd : element name="XLS" attribute name="version" [(attribute ref="lang")] - * ``` - * - * Exemple : - * ``` - * - * < (ref. OLS) /> - * - * ``` - * ``` - * - * - * - * ``` - * - * Création des templates OLS pour LocationUtilityService - * ------------------------------------------------------ - * - * Exemple : - * - * ``` - * - * - * - *
- * saint mandé - *
- *
- *
- * ``` - * ``` - * - * - * - * - * - * 50.347775 3.205098 - * - * - * StreetAddress - * - * - * ``` - * ``` - * Geocodage direct (balise xsd) : - * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] - * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] - * element name="GeocodeRequest" attribute name="returnFreeForm" - * element ref="xls:Address" - * ``` - * ``` - * Geocodage inverse (balise xsd) : - * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] - * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] - * element name="ReverseGeocodeRequest" - * element ref="xls:Position" - * element name="ReverseGeocodePreference" (enumeration) - * ``` - * - * Il existe 3 sous ensembles d'objets : - * - RequestHeader - * - Request - * - ReverseGeocodeRequest, GeocodeRequest - * - * GeocodeRequest est composé d'un objet {@link Gp.Services.Geocode.Response.GeocodeLocation}. - * ReverseGeocodeRequest est composé d'un objet {@link Gp.Services.ReverseGeocode.Response.ReverseGeocodeLocation}. - * - * Les locations font appels aux objets suivants qui possèdent des attributs spécifiques - * en fonction du type de table de geocodage interrogé : - * - StreetAddress - * - CadastralParcel - * - PositionOfInterest - * - Administratif - * - * - * et des élements sous jacents tels que : - * - ReverseGeocodePreference -> tables de geocodages : - * - StreetAddress - * - CadastralParcel - * - PositionOfInterest - * - Administratif (une balise par table) - * - Position -> standard GML 3.2.1 - * - Address -> cf. ci-dessous - * - * ``` - * Position (balise xsd) : - * ex. 50.347775 3.205098 - * ex. 48.85978570614691 2.29135727611288781000 - * (au choix) - * element ref="gml:Point" - * element ref="gml:CircleByCenterPoint" - * element ref="gml:Polygon" - * element ref="gml:MultiPolygon" - * les autres elemennts ne sont pas implémentés (QoP, Speed, Direction, Time, ...) - * - * Address (balise xsd) : - * ex.
1 r de paris saint denis
- * attribute name="countryCode" - * element name="freeFormAddress" - * element ref="xls:Place" - * element ref="gml:Envelope" - * ou - * ex.
1 rue MarconiMetz57000
- * attribute name="countryCode" - * element ref="xls:StreetAddress" - * element ref="xls:PostalCode" - * element ref="xls:Place" - * element ref="gml:Envelope" - * - * Place (balise xsd) : - * ex. Metz - * attribute name="type" - * enumeration value="CountrySubdivision" - * enumeration value="CountrySecondarySubdivision" - * enumeration value="Municipality" - * enumeration value="MunicipalitySubdivision" - * enumeration value="choume-banchi-go" - * enumeration value="Qualite" - * enumeration value="Departement" - * enumeration value="Bbox" - * enumeration value="Commune" - * enumeration value="Territoire" - * enumeration value="Importance" - * enumeration value="Nature" - * (la liste n'est pas exhaustives...) - * - * StreetAddress (balise xsd) : - * ex. 1 rue Marconi - * attribute name="locator" - * element name="xls:Building" - * element ref="xls:Street" - * - * Street (balise xsd) : - * ex. 1 rue Marconi - * attribute name="officialName" (...) - * - * Building (balise xsd) : - * ex. - * attribute name="number" attribute name="subdivision" attribute name="buildingName" - * - * PostalCode (balise xsd) : - * ex. 77182 - * - * ``` - * - * Requête - * ------- - * - * 2 modes de requête sur les services : GET ou POST. - * - * Le mode GET n'est que l'encodage du XML en param (qxml) de la requête (donc pas d'implementation particulière ?) - * - * Modèle de classes - * ----------------- - * - * ``` - * ________ XLS ____________ - * / | \ - * RequestHeader AbstractService Request - * ^ - * ______|________________________ - * (extends) / \ (extends) - * LocationUtilityService RouteService - * | | - * ___________|___________ (...) - * / \ - * GeocodeRequest ReverseGeocodeRequest - * | | - * | _____|______ - * | / \ - * Address Preference Position - * | - * / \ - * Place StreetAddress - * | - * / \ - * Street Building - * ``` - * - * @example - * // encapsule un objet 'LocationUtilityService' - * // dans une coquille XSL (avec/sans namespace) - * xsl = new XSL (); - * xsl.namespace = false; - * xsl.srsName = "epsg:4326"; - * xsl.maximumResponses = 26; - * // methodName fournit par l'objet 'lus' - * // requestID est calculé - * xsl.setService (lus); - * xsl.build (); - * // out -> - * // - * // - * // - * // < (ref. LocationUtilityService ou vide) /> - * // - * // - * - * - * @constructor - * @alias Gp.Formats.XLS - * @param {Object} options - options du constructeur - * @param {Object} options.srsName - identifiant du Systeme de Coordonnees - * @param {String} options.maximumResponses - nombre de reponses max d'une requete - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function XLS (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur XLS()]"); - - if (!(this instanceof XLS)) { - throw new TypeError("XLS constructor cannot be called as a function."); - } - - // options par defaut - this.options = { - srsName : "EPSG:4326", - maximumResponses : 25 - }; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - if (options[opt]) { - this.options[opt] = options[opt]; - } - } - } -} - -/** - * Version - */ -XLS.VERSION = "1.2"; - -XLS.prototype = { - - /** - * @lends module:XLS# - */ - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * namespace - * Surcharge les balises XLS d'un prefixe. - * Par defaut, false - * @type {Boolean} - */ - namespace : false, - - /** - * Objet Service - * LocationUtilityService ou RouteService - * @type {AbstractService} - */ - oService : null, - - /** - * Constructeur (alias) - */ - constructor : XLS, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * __VERSION__, __NAMESPACE__, __SCHEMALOCATION__ - * __REQUESTHEADER__, __REQUEST__ - */ - template : "\n" + - "\n" + - "__REQUESTHEADER__\n" + - "__REQUEST__\n" + - "\n", - - /** - * Namespace par defaut. - * - * @returns {String} namespace - */ - namespaceByDefault : function () { - var ns = [ - "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", - "xmlns:xls=\"http://www.opengis.net/xls\"", - "xmlns:gml=\"http://www.opengis.net/gml\"" - ]; - - return ns.join(" "); - }, - - /** - * Schemalocation par defaut - * - * @returns {String} schemaLocation - */ - schemaLocationByDefault : function () { - return "xsi:schemaLocation=\"http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd\""; - }, - - /** - * Setter Service - * Ajout d'un objet de type LocationUtilityService (LUS) ou RouteService - * - * @param {Object} oService - GeoceodeRequest / ReverseGeocodeRequest ou RouteRequest - */ - setService : function (oService) { - if (!oService) { - this.logger.trace("L'objet de type Service XSL n'est pas encore defini !?"); - return; - } - - if (oService instanceof AbstractService) { - this.oService = oService; - } else { - this.logger.error("L'objet n'est pas du type 'LocationUtilityService' ou 'RouteService' !?"); - } - }, - - /** - * Getter Service - * Retourne un objet de type LocationUtilityService (LUS) ou RouteService - * ex. GeoceodeRequest / ReverseGeocodeRequest ou RouteRequest - * - * @returns {Object} service (LocationUtilityService|RouteService) - */ - getService : function () { - return this.oService; - } -}; - -/** - * Ajout d'un prefixe de namespace - * - * @todo impl. l'ajout de namespace - * @param {Object} ns - ex. {key:xls, url:http://www.opengis.net/xls} - * @param {String} request - requête - * @returns {String} requête - */ -XLS.prototype.addNamespace = function (ns, request) { - // INFO - // on recherche la clef dans les namespaces par defaut. - // si la clef n'existe pas dans les namespaceByDefault (), on l'ajoute. - // on surcharge toutes les balises, ex. XLS -> xls:XLS - // sauf celles qui sont déjà prefixées ! - - var keyNS = ns.key; - // var urlNS = ns.url; // TODO not yet implemented ! - - // recherche la clef dans les namespaces par defaut - var bFound = false; - var allNS = this.namespaceByDefault().split(" "); - for (var index = 0; index < allNS.length; index++) { - var element = allNS[index]; - var map = element.split("="); - var key = map[0]; - // var url = map[1]; // TODO not yet implemented ! - - if (key === "xmlns:" + keyNS) { - bFound = true; - break; - } - } - - // TODO - // si on a une nouvelle clef, on l'ajoute... - if (!bFound) { - this.logger.warn("L'ajout d'un nouvel namespace n'est pas encore implémenté !"); - return request; - } - - // surcharge toutes les balises - var regex; - var subst; - - // regex balise ouvrante - regex = /<(\w+[\s>])/g; - subst = "<" + keyNS + ":$1"; - request = request.replace(regex, subst); - - // regex balise fermante - regex = /<\/(\w+[\s>])/g; - subst = " - // - // - // - // < (ref. LocationUtilityService ou vide) /> - // - // - - // as t on un objet de type Service XLS à disposition ? - var bService = !!this.getService(); - - var template = ""; - template = this.template; - template = template.replace(/__VERSION__/g, XLS.VERSION); - template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); - template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); - - // header - var oHeader = new RequestHeader({ - srsName : this.options.srsName - }); - template = template.replace(/__REQUESTHEADER__/g, oHeader.toString()); - - // request - var oRequest = new Request({ - maximumResponses : this.options.maximumResponses, - version : XLS.VERSION, // FIXME même version ? - methodName : bService ? this.getService().CLASSTYPE : null - }); - template = template.replace(/__REQUEST__/g, oRequest.toString()); - - // objet lus ou route - if (bService) { // INFO : clef __REQUESTSERVICE__ dispo dans l'objet 'Request' - template = template.replace(//g, this.getService().toString()); - } - - if (!template) { - this.logger.warn("traduction tmpl : empty request !?"); - return; - } - - // ajout d'un namespace - if (this.namespace) { - // ajout de xls par defaut - template = this.addNamespace({ - key : "xls", - url : "http://www.opengis.net/xls" - }, template); - } - - this.requestString = template; - this.logger.trace("traduction tmpl", template); - - // on retourne qqchose ! - return this.requestString; -}; - -export default XLS; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js deleted file mode 100644 index 317485a4..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js +++ /dev/null @@ -1,85 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; - -/** - * @classdesc - * @private - * - * @constructor - * @alias Gp.Formats.XLS.AbstractService - * - * @param {Object} [options] - options - */ -function AbstractService (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur AbstractService ()]"); - - if (!(this instanceof AbstractService)) { - throw new TypeError("AbstractService constructor cannot be called as a function."); - } - - // options par defaut - this.options = options || {}; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } -} - -/** - * @lends module:AbstractService# - */ -AbstractService.prototype = { - - /** - * request (out) - * @type {String} - */ - strRequest : null, - - /** - * objet Request - * @type {Request} - */ - oRequest : null, - - /** - * Filter - * @type {FilterExtension} - */ - oFilter : null, - - /** - * Constructeur (alias) - */ - constructor : AbstractService, - - /** - * Ajout d'un objet de type Request : GeocodeRequest / ReverseGeocodeRequest / RouteRequest - * - * @param {Object} oRequest - GeocodeRequest / ReverseGeocodeRequest / RouteRequest - */ - addRequest : function (oRequest) { - this.logger.error("overwritten method !"); - }, - - /** - * Ajout d'un objet de type FilterExtension : GeocodeFilterExtension ou RouteRequestExtension - * - * @param {Object} oFilter - GeocodeFilterExtension ou RouteRequestExtension - */ - addFilter : function (oFilter) { - this.logger.error("overwritten method !"); - }, - - /** - * toString - */ - toString : function () { - this.logger.error("overwritten method !"); - } -}; - -export default AbstractService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js deleted file mode 100644 index 8742942f..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js +++ /dev/null @@ -1,194 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; -import AbstractService from "./AbstractService"; -import GeocodeRequest from "./LocationUtilityService/GeocodeRequest"; -import ReverseGeocodeRequest from "./LocationUtilityService/ReverseGeocodeRequest"; -import GeocodeFilterExtension from "./LocationUtilityService/GeocodeFilterExtension"; - -/** - * @classdesc - * - * Requête de type LocationUtilityService (LUS) - * (Factory) - * - * @example - * // encapsule un objet dans une coquille XSL, Factory sur les objets Geocode/ReverseGeocode - * lus = new LocationUtilityService (); - * lus.addRequest (req); - * lus.toString(); - * ou - * lus = new LocationUtilityService ({ - * location : "saint mandé", - * returnFreeForm : true, - * filterOptions : { - * type : ['PositionOfInterest'] - * } - * }); - * lus.toString(); - * - * // out -> - * // - * //
- * // saint mandé - * //
- * //
- * - * // creation de l'objet Geocode - * req = new GeocodeRequest (); - * req.addAddress (new Address (/*todo/*)); - * req.toString(); - * // out -> - * // - * //
- * // saint mandé - * //
- * //
- * - * // creation de l'objet ReverseGeocode - * req = new ReverseGeocodeRequest (); - * req.addPosition (new Position (position:{x: , y: })); - * req.addPreference (['StreetAddress']); - * req.toString(); - * // out -> - * // - * // - * // - * // 50.347775 3.205098 - * // - * // - * // StreetAddress - * // - * - * @constructor - * @alias Gp.Formats.XLS.LocationUtilityService - * @param {Object} options - options - * @param {Object} options.location - location - * @param {String} options.position - position : {x : "", y : ""} - * @param {String} options.returnFreeForm - true|false - * @param {Object} options.filterOptions - filtres - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function LocationUtilityService (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur LocationUtilityService ()]"); - - if (!(this instanceof LocationUtilityService)) { - throw new TypeError("LocationUtilityService constructor cannot be called as a function."); - } - - /** - * Nom de la classe - */ - this.CLASSNAME = "LocationUtilityService"; - - /** - * Type de classe de geocodage - * ex. GeocodeRequest ou ReverseGeocodeRequest - */ - this.CLASSTYPE = null; - - // appel du constructeur par heritage - AbstractService.apply(this, arguments); - - // on determine le type de geocodage si les options sont renseignées - if (this.options) { - this.CLASSTYPE = (this.options.location) ? "GeocodeRequest" : (this.options.position) ? "ReverseGeocodeRequest" : null; - } -} - -/** - * @lends module:LocationUtilityService# - */ -LocationUtilityService.prototype = Object.create(AbstractService.prototype, { - // todo - // getter/setter -}); - -/** - * Constructeur (alias) - */ -LocationUtilityService.prototype.constructor = LocationUtilityService; - -/** - * (overwrite) Ajout d'un objet de type LUS : GeocodeRequest ou ReverseGeocodeRequest - * - * @param {Object} oLUSRequest - objet de type LUS - */ -LocationUtilityService.prototype.addRequest = function (oLUSRequest) { - // on determine le type de geocodage - this.CLASSTYPE = oLUSRequest.CLASSNAME; - - // on controle les types acceptés - switch (this.CLASSTYPE) { - case "GeocodeRequest": - case "ReverseGeocodeRequest": - this.oRequest = oLUSRequest; - break; - default: - throw new Error("Ce n'est pas un objet de type 'LUS Request' !?"); - } -}; - -/** - * (overwrite) Ajout d'un objet de type GeocodeFilterExtension - * - * @param {Object} oFilter - objet de type Filtre - */ -LocationUtilityService.prototype.addFilter = function (oFilter) { - // FIXME gestion des filtres à partir des tables de geocodages - if (oFilter instanceof GeocodeFilterExtension) { - this.oFilter = oFilter; - } -}; - -/** - * (overwrite) toString - * - * @returns {String} requête - */ -LocationUtilityService.prototype.toString = function () { - // soit, on a un objet LUS Request déjà instancié - // sinon, il faut le construire à partir des options à disposition - if (!this.oRequest) { - // il nous faut des options - if (!this.options) { - throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !"); - } - - // si les options 'location' et 'position' sont renseignées, - // on prendra par defaut le choix du geocodage direct - if (this.CLASSTYPE === "GeocodeRequest") { - var settingsDirect = { - location : this.options.location, - returnFreeForm : this.options.returnFreeForm, - filterOptions : this.options.filterOptions || {} - }; - this.oRequest = new GeocodeRequest(settingsDirect); - // ajout des filtres spécifiques au service du geocodage direct de l'IGN - if (this.oFilter) { - this.oRequest.addFilter(this.oFilter); - } - } else if (this.CLASSTYPE === "ReverseGeocodeRequest") { - var settingsInv = { - position : this.options.position, - returnFreeForm : this.options.returnFreeForm, - filterOptions : this.options.filterOptions || {} - }; - this.oRequest = new ReverseGeocodeRequest(settingsInv); - } else { - this.logger.error("impossible de determiner le type de geocodage : Direct ou Inverse !?"); - } - } - - // objet indefini !? - if (!this.oRequest) { - throw new Error("Type de Geocodage indefini !"); - } - - this.strRequest = this.oRequest.toString(); - return this.strRequest; -}; - -export default LocationUtilityService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js deleted file mode 100644 index f42cb50d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js +++ /dev/null @@ -1,188 +0,0 @@ - -import Logger from "../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * - * Ajouter des extensions de filtres spécifiques au service de geocodage de l'IGN. - * Ceci permet de contrôler les options spécifiques de la table de geocodage intérrogées. - * - * @example - * var ext = new GeocodeFiltersExtension (); - * ext.add (new Administratif ()); - * ext.add (new StreetAddress ()); - * ext.add (new PositionOfInterest ()); - * ext.add (new CadastralParcel ()); - * - * ext.getNames () - * // --> out - * // [Administratif, StreetAddress, PositionOfInterest, CadastralParcel] - * - * ext.getFilters () - * // --> out - * // [Object, Object, Object, Object] = tableau d'objet GeocodeLocation - * - * ext.getFilter ('StreetAddress') - * // --> out - * // {Object} = objet GeocodeLocation - * - * ext.getAttributs ('StreetAddress') - * // --> out - * // ["bbox", "number", "ID", "IDTR", "postalCode", "quality", "street", "territoire", "commune", "department", "insee", "municipality"] - * - * ext.setPlaceAttributs ('StreetAddress', {number:'', territoire:'', quality:'', fake:''}) - * // --> out - * // (fake est écarté car il n'appartient pas à la liste !) - * - * ext.getPlaceAttributs ('StreetAddress') - * // --> out - * // {number : '', territoire : '', quality : ''} - * - * // Comment ajouter des filtres spécifiques au service de geocodage ? - * var req = new GeocodeRequest ({ - * location : "saint mandé", - * returnFreeForm : true, - * filterOptions : { - * type : ['PositionOfInterest'], <-- ajouter une extension afin de gerer les attributs de cette table de geocodage ! - * (...) - * } - * }) - * req.addFilter (new PositionOfInterest ()); - * @constructor - * @alias Gp.Formats.XLS.LocationUtilityService.GeocodeFilterExtension - * - * @private - */ -function GeocodeFilterExtension () { - this.logger = Logger.getLogger("GeocodeFilterExtension"); - this.logger.trace("[Constructeur GeocodeFilterExtension ()]"); - - if (!(this instanceof GeocodeFilterExtension)) { - throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function."); - } - - /** - * Tableau de filtres (table de geocodage) - */ - this.filters = []; -} - -/** - * @lends module:GeocodeFilterExtension# - */ -GeocodeFilterExtension.prototype = { - - /** - * Constructeur (alias) - */ - constructor : GeocodeFilterExtension, - - /** - * Ajout d'un filtre - * - * @param {Object} oGeocodeLocation - objet de type 'GeocodeLocation' - */ - addFilterExtensions : function (oGeocodeLocation) { - // FIXME test sur le type d'objet ! - if (oGeocodeLocation) { - // FIXME ou test sur ses propriétés ! - this.filters.push(oGeocodeLocation); - } - }, - - // getter - - /** - * Tableau de noms (tables de geocodage) - * - * @returns {Array.} liste des noms de filtres - */ - getNames : function () { - var names = []; - for (var idx in this.filters) { - names.push(this.filters[idx].CLASSNAME); - } - this.logger.trace(names); - return names; - }, - - /** - * Retourne une table de geocodage - * - * @param {String} name - nom de la table de geocodage - * @returns {Object} filtre - */ - getFilter : function (name) { - var filter = null; - for (var idx in this.filters) { - if (this.filters[idx].CLASSNAME === name) { - filter = this.filters[idx]; - } - } - this.logger.trace(filter); - return filter; - }, - - /** - * Tableau d'objects (tables de geocodage) - * - * @returns {Array.} liste des filtres - */ - getFilters : function () { - this.logger.trace(this.filters); - return this.filters; - }, - - /** - * Récupère la liste des attributs (filtres) sur une table de geocodage - * - * @param {String} name - nom de la table de geocodage - * @returns {Array} liste des attributs d'un filtre - */ - getAttributs : function (name) { - var attributs = []; - for (var idx in this.filters) { - if (this.filters[idx].CLASSNAME === name) { - attributs = this.filters[idx].attributesList; - } - } - this.logger.trace(attributs); - return attributs; - }, - - /** - * Ajout des attributs (filtres) sur une table de geocodage - * - * @param {String} name - nom de la table de geocodage - * @param {Object} options - options de la table de geocodage - */ - setPlaceAttributs : function (name, options) { - var filter = this.getFilter(name); - var attributs = this.getAttributs(name); - for (var idx in attributs) { - var value = attributs[idx]; - if (options[value]) { - filter.placeAttributes[value] = options[value]; - } - } - }, - - /** - * Retourne les attributs (filtres) sur une table de geocodage - * - * @param {String} name - nom de la table de geocodage - * @returns {Array} liste des attributs d'un filtre - */ - getPlaceAttributs : function (name) { - var places = {}; - for (var idx in this.filters) { - if (this.filters[idx].CLASSNAME === name) { - places = this.filters[idx].placeAttributes; - } - } - this.logger.trace(places); - return places; - } -}; - -export default GeocodeFilterExtension; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js deleted file mode 100644 index 13cb41cd..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js +++ /dev/null @@ -1,226 +0,0 @@ -import Logger from "../../../Utils/LoggerByDefault"; -import Address from "./model/Address"; -import GeocodeFilterExtension from "./GeocodeFilterExtension"; - -/** - * @classdesc - * Requête de geocodage direct - * - * ``` - * XSD - * Geocodage direct (balise xsd) : - * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] - * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] - * element name="GeocodeRequest" attribute name="returnFreeForm" - * element ref="xls:Address" - * ``` - * - * @example - * // creation de l'objet Geocode an ajoutant un objet Address - * req = new GeocodeRequest (); - * req.returnFreeForm = true; // TODO ! - * req.addAddress (new Address ({ - * location : "saint mandé", - * type : ['PositionOfInterest'], - * filter : { - * (...) - * } - * })); - * req.toString(); - * // out -> - * // - * //
- * // saint mandé - * //
- * //
- * - * // creation de l'objet Geocode avec les options uniquement - * req = new GeocodeRequest ({ - * location : "saint mandé", - * returnFreeForm : true, - * filterOptions : { - * type : ['PositionOfInterest'], - * (...) - * } - * }); - * req.toString(); - * // out -> - * // - * //
- * // saint mandé - * //
- * //
- * @constructor - * - * @alias Gp.Formats.XLS.LocationUtilityService.GeocodeRequest - * @param {Object} options - options - * @param {Object} options.location - location - * @param {String} options.returnFreeForm - returnFreeForm - * @param {String} options.filterOptions - filtres - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function GeocodeRequest (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur GeocodeRequest ()]"); - - if (!(this instanceof GeocodeRequest)) { - throw new TypeError("GeocodeRequest constructor cannot be called as a function."); - } - - // options par defaut - this.options = options || {}; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } - - // TODO - // gestion de l'option 'returnFreeForm' si elle n'est pas renseignée dans les options ! - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "GeocodeRequest"; -} - -GeocodeRequest.prototype = { - - /** - * @lends module:GeocodeRequest# - */ - - /** - * request (out) - * @type {String} - */ - strRequest : null, - - /** - * Addresse - * @type {Address} - */ - oAddress : null, - - /** - * Filter - * @type {GeocodeFilterExtension} - */ - oFilter : null, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * __ADDRESS__, __RETURNFREEFORM__ - */ - template : "" + - "__ADDRESS__" + - "", - - /** - * Ajout d'un objet de type Adresse - * - * @param {Object} oAddress - Adresse - */ - addAddress : function (oAddress) { - if (oAddress instanceof Address) { - this.oAddress = oAddress; - } - }, - - /** - * Ajout d'un objet de type GeocodeFilterExtension - * - * @param {Object} oFilter - GeocodeFilterExtension - */ - addFilter : function (oFilter) { - // FIXME gestion des filtres à partir des tables de geocodages - if (oFilter instanceof GeocodeFilterExtension) { - this.oFilter = oFilter; - } - }, - - /** - * Constructeur (alias) - */ - constructor : GeocodeRequest, - - /** - * toString - * - * @returns {String} requête - */ - toString : function () { - var template = ""; - template = this.template; - - // soit on a déjà un objet Address instancié, - // sinon, on le fabrique via les options - if (!this.oAddress) { - var settings = {}; - settings.location = this.options.location; - settings.type = this.options.filterOptions.type || ["StreetAddress"]; - settings.filter = this.options.filterOptions; - delete settings.filter.type; // on ne met pas le 'type' dans les filtres... - - // gestion des filtres - if (this.oFilter) { - // on reconstruit les filtres - settings.filter = {}; - - // on determine la liste des filtres possibles - // pour chaque table de geocodage en param - for (var idx in settings.type) { - var filter = settings.type[idx]; - var oFilter = this.oFilter.getFilter(filter); - - if (!oFilter) { - this.logger.warn("Le filtre '" + filter + "' n'existe pas !?"); - continue; - } - - var mFilter = this.options.filterOptions; - - // correspondances des attributs de filtres possibles avec ceux qui sont en options - var attributs = oFilter.attributesList; - for (var idxe = 0; idxe < attributs.length; idxe++) { - var key = attributs[idxe]; - if (mFilter[key]) { - var matchingKey = oFilter.serviceAttributes[idxe]; - oFilter.placeAttributes[matchingKey] = mFilter[key]; - this.logger.trace("Selection du filtre '" + key + "' sur le type '" + filter + "'."); - } - } - - // ajout des valeurs des filtres - var places = oFilter.placeAttributes; - for (var kplace in places) { - if (places.hasOwnProperty(kplace)) { - settings.filter[kplace] = places[kplace]; - } - } - } - } - - this.oAddress = new Address(settings); - if (!this.oAddress) { - throw new Error("La construction de l'adresse n'est pas correctement definie !?"); - } - } - - // FIXME gestion des filtres pour un objet Address déjà instancié ? - - template = template.replace(/__ADDRESS__/g, this.oAddress.toString()); - template = template.replace(/__RETURNFREEFORM__/g, (this.options.returnFreeForm) ? "true" : "false"); - - this.strRequest = template; - return this.strRequest; - } -}; - -export default GeocodeRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js deleted file mode 100644 index 4ef2e177..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js +++ /dev/null @@ -1,177 +0,0 @@ - -import Logger from "../../../Utils/LoggerByDefault"; -import Position from "./model/Position"; -import Preference from "./model/Preference"; - -/** - * @classdesc - * - * Requête de geocodage inverse - * - * XSD - * ``` - * Geocodage inverse (balise xsd) : - * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] - * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] - * element name="ReverseGeocodeRequest" - * element ref="xls:Position" - * element name="ReverseGeocodePreference" (enumeration) - * ``` - * - * @example - * // creation de l"objet ReverseGeocode - * req = new ReverseGeocodeRequest (); - * req.addPosition (new Position (position:{x: , y: })); - * req.addPreference (["StreetAddress"]); - * req.toString(); - * // out -> - * // - * // - * // - * // 50.347775 3.205098 - * // - * // - * // StreetAddress - * // - * @constructor - * @alias Gp.Formats.XLS.ReverseGeocodeRequest - * @param {Object} options - options - * @param {Object} options.position - position - * @param {String} options.returnFreeForm - returnFreeForm - * @param {String} options.filterOptions - filtres - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function ReverseGeocodeRequest (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur ReverseGeocodeRequest ()]"); - - if (!(this instanceof ReverseGeocodeRequest)) { - throw new TypeError("ReverseGeocodeRequest constructor cannot be called as a function."); - } - - // options par defaut - this.options = options || {}; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "ReverseGeocodeRequest"; -} - -ReverseGeocodeRequest.prototype = { - - /** - * @lends module:ReverseGeocodeRequest# - */ - - /** - * request (out) - * @type {String} - */ - strRequest : null, - - /** - * Position - * @type {Position} - */ - oPosition : null, - - /** - * Preference - * @type {Preference} - */ - oPreference : null, - - /** - * Constructeur (alias) - */ - constructor : ReverseGeocodeRequest, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * __POSITION__, __PREFERENCE__, __RETURNFREEFORM__ - */ - template : "" + - "__POSITION__" + - "__PREFERENCE__" + - "", - - /** - * Ajout d"un objet de type Position - * - * @param {Object} oPosition - Position - */ - addPosition : function (oPosition) { - if (oPosition instanceof Position) { - this.oPosition = oPosition; - } - }, - - /** - * Ajout d"une liste de table de référence LUS : - * [StreetAddress, PointOfInterest, CadastralParcel, Administrativ] - * - * @param {Object} oPreference - Preference - */ - addPreferences : function (oPreference) { - if (oPreference instanceof Preference) { - this.oPreference = oPreference; - } - }, - - /** - * toString - * @returns {String} requête - */ - toString : function () { - var template = ""; - template = this.template; - - // si on a déjà un objet Preference instancié, - // sinon, on le fabrique via les options - if (!this.oPreference) { - this.oPreference = new Preference(this.options.filterOptions.type || ["StreetAddress"]); - if (!this.oPreference) { - throw new Error("Les preferences ne sont pas definies !?"); - } - } - template = template.replace(/__PREFERENCE__/g, this.oPreference.toString()); - - // si on a déjà un objet Position instancié, - // sinon, on le fabrique via les options - if (!this.oPosition) { - var settings = { - position : this.options.position, - filter : {} - }; - - // FIXME gestion des filtres ? - if (this.options.filterOptions) { - settings.filter = this.options.filterOptions; - delete settings.filter.type; // pas besoin ? - } - this.oPosition = new Position(settings); - if (!this.oPosition) { - throw new Error("La position et ses filtres ne sont pas definis !?"); - } - } - template = template.replace(/__POSITION__/g, this.oPosition.toString()); - template = template.replace(/__RETURNFREEFORM__/g, (this.options.returnFreeForm) ? "true" : "false"); - - this.strRequest = template; - return this.strRequest; - } -}; - -export default ReverseGeocodeRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js deleted file mode 100644 index 4f61d7d3..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js +++ /dev/null @@ -1,281 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * - * Location type "Address". - * - * Modèles de classes : - * ------------------ - * ``` - * - * Address - * (est composé de) - * ______ | _________ _________________ - * / | \ \ - * Place (StreetAddress ou FreeFormAddress) PostalCode - * (*) _|_ - * / \ - * Street Building - * ``` - * ``` - * XSD - * Address (balise xsd) : - * ex.
1 r de paris saint denis
- * attribute name="countryCode" - * element name="freeFormAddress" - * element ref="xls:Place" - * element ref="gml:Envelope" - * ou - * ex.
1 rue MarconiMetz57000
- * attribute name="countryCode" - * element ref="xls:StreetAddress" - * element ref="xls:PostalCode" - * element ref="xls:Place" - * element ref="gml:Envelope" - * ``` - * - * @example - * // simple - * adr = new Address ({ - * location : "2 av pasteur, Saint-Mandée", - * type : ["StreetAddress"], - * filter : {} - * }); - * adr.toString(); - * // -> out - * //
- * // 2 av pasteur, Saint-Mandée - * //
- * - * // avec filtre - * adr = new Address ({ - * location : { - * number : 2, - * street : "av pasteur", - * city : "Saint-Mandée", // FIXME filter Place "commune" ou "municipality" ? - * postalCode : "94166" // FIXME filter Place ou balise PostalCode ? - * }, - * type : ["StreetAddress"], - * filter : { - * territory : "FR", - * department : "94" - * } - * }); - * adr.toString(); - * // -> out - * //
- * // - * // - * // 2 av pasteur - * // - * // Saint-Mandée - * // 94 - * // FR - * // 94166 - * //
- * - * // avec bbox - * adr = new Address ({ - * location : "2 av pasteur, Saint-Mandée", - * type : ["StreetAddress"], - * filter : { - * bbox : {left:1, right:2, top:2, bottom:0} - * } - * }); - * adr.toString(); - * // -> out - * //
- * // 2 av pasteur, Saint-Mandée - * // - * // 1 0 - * // 2 2 - * // - * //
- * - * @constructor - * @alias Gp.Formats.XLS.LocationUtilityService.Address - * @param {Object} options - options - * @param {Object} options.location - location - * @param {String} options.type - type - * @param {String} options.filter - filtres - * @param {String} options.filter.* - Filtré en fonction des tables de geocodage interrogées - * - * @private - */ -function Address (options) { - this.logger = Logger.getLogger("Address"); - this.logger.trace("[Constructeur Address ()]"); - - if (!(this instanceof Address)) { - throw new TypeError("Address constructor cannot be called as a function."); - } - - // param par defaut - this.options = options || { - location : {}, - type : ["StreetAddress"], - filter : {} - }; - - // param obligatoire - if (!this.options.location || Object.keys(this.options.location).length === 0) { - throw new Error("l'option 'location' n'est pas renseignée !"); - } -} - -/** - * @lends module:Address# - */ -Address.prototype = { - - /** - * Constructeur (alias) - */ - constructor : Address, - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * Template de la requête. - * - * substitution des valeurs suivantes : - * - address : __COUNTRYCODE__, __LOCATION__, __PLACE__, __POSTALCODE__, __ENVELOPE__ - * - freeFormAddress : __FREEFORMADDRESSVALUE__ - * - streetAddress : __STREET__, __BUILDING__ - * - street : __STREETVALUE__ - * - building : __BUILDINGVALUE__ - * - place : __PLACEATYPE__, __PLACEVALUE__ - * - postalCode : __POSTALCODEVALUE__ - * - gml:envelope : __LEFT__ __BOTTOM__ __RIGHT__ __TOP__ - * - * @todo gestion de l"indentation - */ - template : { - address : "
" + - "__LOCATION__" + - "__PLACE__" + - "__POSTALCODE__" + - "__ENVELOPE__" + - "
", - location : { - freeFormAddress : "__FREEFORMADDRESSVALUE__", - streetAddress : { - container : "" + - "__STREET__" + - "__BUILDING__" + - "", - building : "", - street : "__STREETVALUE__" - } - }, - place : "__PLACEVALUE__", - postalCode : "__POSTALCODEVALUE__", - envelope : "" + - "__LEFT__ __BOTTOM__" + - "__RIGHT__ __TOP__" + - "" - } - -}; - -/** - * toString - * - * @returns {String} requête - */ -Address.prototype.toString = function () { - var template = null; - template = this.template.address; - template = template.replace(/__COUNTRYCODE__/g, this.options.type); - - // on a une adresse structurée ou libre ? - if (typeof this.options.location === "string") { - // balise freeFormeAddress - var tmplFreeFormAddress = this.template.location.freeFormAddress; - tmplFreeFormAddress = tmplFreeFormAddress.replace(/__FREEFORMADDRESSVALUE__/g, this.options.location); - template = template.replace(/__LOCATION__/g, tmplFreeFormAddress); - } else { - // balises Street et Building - var tmplBuilding = ""; - var tmplStreet = ""; - - if (this.options.location.number) { - tmplBuilding = this.template.location.streetAddress.building; - tmplBuilding = tmplBuilding.replace(/__BUILDINGVALUE__/g, this.options.location.number); - } - - if (this.options.location.street) { - tmplStreet = this.template.location.streetAddress.street; - tmplStreet = tmplStreet.replace(/__STREETVALUE__/g, this.options.location.street); - } - - // balise streetAddress - var tmplStreetAddress = this.template.location.streetAddress.container; - tmplStreetAddress = tmplStreetAddress.replace(/__STREET__/g, tmplStreet); - tmplStreetAddress = tmplStreetAddress.replace(/__BUILDING__/g, tmplBuilding); - template = template.replace(/__LOCATION__/g, tmplStreetAddress); - } - - // a t on un filtre de type PostalCode ? - var tmplPostalCode = ""; - if (this.options.location.postalCode) { - tmplPostalCode = this.template.postalCode; - tmplPostalCode = tmplPostalCode.replace(/__POSTALCODEVALUE__/g, this.options.location.postalCode); - } - - // a t on un filtre de type GML::Envelope ? - var tmplEnvelope = ""; - if (this.options.filter) { - var bbox = this.options.filter.bbox; - if (bbox) { - tmplEnvelope = this.template.envelope; - tmplEnvelope = tmplEnvelope.replace(/__LEFT__/g, bbox.left); - tmplEnvelope = tmplEnvelope.replace(/__BOTTOM__/g, bbox.bottom); - tmplEnvelope = tmplEnvelope.replace(/__RIGHT__/g, bbox.right); - tmplEnvelope = tmplEnvelope.replace(/__TOP__/g, bbox.top); - } - } - - // liste des filtres Place - var Places = []; - - // a t on des filtres de type Place ? - var tmplPlace = ""; - if (this.options.filter) { - var filters = this.options.filter; - for (var filter in filters) { - if (filter === "bbox") { - continue; - } - // FIXME gestion des filtres spécifiques IGN ? - tmplPlace = this.template.place; - tmplPlace = tmplPlace.replace(/__PLACETYPE__/g, filter); - tmplPlace = tmplPlace.replace(/__PLACEVALUE__/g, filters[filter]); - Places.push(tmplPlace); - } - } - - // a t on un filtre de type Place dans location ? - var tmplPlaceCity = ""; - if (this.options.location.city) { - tmplPlaceCity = this.template.place; - tmplPlaceCity = tmplPlaceCity.replace(/__PLACETYPE__/g, "Municipality"); - tmplPlaceCity = tmplPlaceCity.replace(/__PLACEVALUE__/g, this.options.location.city); - Places.push(tmplPlaceCity); - } - - template = template.replace(/__POSTALCODE__/g, tmplPostalCode); - template = template.replace(/__PLACE__/g, Places.join("\n")); - template = template.replace(/__ENVELOPE__/g, tmplEnvelope); - - this.requestString = template; - return this.requestString; -}; - -export default Address; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js deleted file mode 100644 index 78affdef..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * implemented into class 'Address' ! - * - * Location type Building - * - * - options - * - options.location.number - * - * FIXME on traite les autres attributs ? - * - * ``` - * XSD - * Building (balise xsd) : - * ex. - * attribute name="number" attribute name="subdivision" attribute name="buildingName" - * - * template : { - * 'attributs' : "" - * avec __attributs__ = - * number=value - * (...) - * } - * ``` - * @alias Gp.Formats.XLS.LocationUtilityService.Building - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js deleted file mode 100644 index b8696fc2..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * implemented into class 'Address' ! - * - * Filter - * - * - options - * - options.filterOptions.municipality - * - options.filterOptions.insee - * - options.filterOptions.department - * - (...) - * - * FIXME liste des attributs disponibles par table ? - * Les filtres de recherches sont disponibles dans les objets de type 'GeocodeLocation' : - * (liste des attributs sur la balise ) - * - Administratif - * - PointOfInterest - * - StreetAddress - * - CadastralParcel - * - * ``` - * template : "__VALUE__" - * ``` - * @alias Gp.Formats.XLS.LocationUtilityService.Place - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js deleted file mode 100644 index b4fe8647..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js +++ /dev/null @@ -1,180 +0,0 @@ -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * Location de type Position - * - * ``` - * XSD - * Position (balise xsd) : - * ex. 50.347775 3.205098 - * ex. 48.85978570614691 2.29135727611288781000 - * (au choix) - * element ref="gml:Point" - * element ref="gml:CircleByCenterPoint" - * element ref="gml:Polygon" - * element ref="gml:MultiPolygon" - * ``` - * - * FIXME les autres elements ne sont pas implémentés (QoP, Speed, Direction, Time, ...) ? - * - * ``` - * template : " - * __GMLPOINT__ - * __GMLFILTER__ - * " - * ``` - * ``` - * GML : { - * pos : "__X__ __Y__", - * point : "__POS__", - * circle : "__POS____RADIUS__", - * // not yet implemented ! - * polygon : "", - * multipolygon : "" - * } - * ``` - * - * @constructor - * @alias Gp.Formats.XLS.LocationUtilityService.Position - * @param {Object} options - options données en entrée - * @param {Object} options.position - x/y - * @param {Object} options.filter - filtre - * @param {Object} options.filter.circle - un cercle - * @param {Object} options.filter.polygon - un polygone - * - * @private - */ -function Position (options) { - this.logger = Logger.getLogger("Position"); - this.logger.trace("[Constructeur Position ()]"); - - if (!(this instanceof Position)) { - throw new TypeError("Position constructor cannot be called as a function."); - } - - // param par defaut - this.options = options || {}; - - // param obligatoire - if (!this.options.position) { - throw new Error("l'option 'position' n'est pas renseignée !"); - } -} - -/** - * @lends module:Position# - */ -Position.prototype = { - - /** - * Constructeur (alias) - */ - constructor : Position, - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * Template de la requête. - * - * substitution des valeurs suivantes : - * __GMLPOINT__ __GMLFILTER__ - * __X__ __Y__ __RADIUS__ - * __XY__ - * @todo indentation XML - * @todo implementation classe GML - */ - template : { - position : "" + - "__GMLPOINT__" + - "__GMLFILTER__" + - "", - gml : { - point : "__X__ __Y__", - pos : null, - filter : { - bbox : "" + - "__LEFT__ __BOTTOM__" + - "__RIGHT__ __TOP__" + - "", - circle : "__X__ __Y____RADIUS__", - polygon : "__XY__", - multipolygon : null - } - } - } -}; - -/** - * toString - * - * @returns {String} requête - */ -Position.prototype.toString = function () { - var template = this.template.position; - - var tmplGmlPoint = this.template.gml.point; - tmplGmlPoint = tmplGmlPoint.replace(/__X__/g, this.options.position.x); - tmplGmlPoint = tmplGmlPoint.replace(/__Y__/g, this.options.position.y); - - var tmplGmlFilter = ""; - if (this.options.filter) { - var filter = this.options.filter; - - for (var name in filter) { - switch (name) { - case "circle": - tmplGmlFilter = this.template.gml.filter[name]; - tmplGmlFilter = tmplGmlFilter.replace(/__X__/g, filter[name].x); - tmplGmlFilter = tmplGmlFilter.replace(/__Y__/g, filter[name].y); - tmplGmlFilter = tmplGmlFilter.replace(/__RADIUS__/g, filter[name].radius); - break; - case "bbox": - tmplGmlFilter = this.template.gml.filter[name]; - tmplGmlFilter = tmplGmlFilter.replace(/__LEFT__/g, filter[name].left); - tmplGmlFilter = tmplGmlFilter.replace(/__BOTTOM__/g, filter[name].bottom); - tmplGmlFilter = tmplGmlFilter.replace(/__RIGHT__/g, filter[name].right); - tmplGmlFilter = tmplGmlFilter.replace(/__TOP__/g, filter[name].top); - break; - case "polygon": - // FIXME implementation simple du polygone ! - // aucun test de fermeture du polygone, ni de gestion des trous ! - tmplGmlFilter = this.template.gml.filter[name]; - var strPoints = ""; - var lstPoints = filter[name]; - for (var i = 0; i < lstPoints.length; i++) { - var coord = lstPoints[i]; - if (Array.isArray(coord)) { - this.logger.error("Holes are not implemented !"); - break; - } - if ((coord.x && coord.y) || (coord.x === 0 || coord.y === 0)) { - strPoints += coord.x + " " + coord.y; - } - if (lstPoints.length !== i + 1) { - strPoints += " "; - } - } - tmplGmlFilter = tmplGmlFilter.replace(/__XY__/g, strPoints); - break; - case "multipolygon": - this.logger.warn("Filter '" + name + "' is not yet implemented !"); - break; - default: - this.logger.error("This filter '" + name + "' is not useful !"); - } - } - } - - template = template.replace(/__GMLPOINT__/g, tmplGmlPoint); - template = template.replace(/__GMLFILTER__/g, tmplGmlFilter); - - this.requestString = template; - return this.requestString; -}; - -export default Position; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js deleted file mode 100644 index 385813a7..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * implemented into class 'Address' ! - * - * Location type PostalCode - * - * options - * options.location.postalCode - * - * FIXME filtre (Place) ou location ? - * - * ``` - * XSD - * PostalCode (balise xsd) : - * ex. 77182 - * ``` - * ``` - * template : "__VALUE__" - * ``` - * @alias Gp.Formats.XLS.LocationUtilityService.PostalCode - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js deleted file mode 100644 index c63080b5..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js +++ /dev/null @@ -1,81 +0,0 @@ -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * - * Preference (Reverse) - * - * FIXME liste des types de tables de geocodage - * - * ``` - * template : "__TYPE__" - * ``` - * - * @constructor - * @alias Gp.Formats.XLS.LocationUtilityService.Preference - * @param {String} type - type de table de geocodage - * - * @private - * - */ - -function Preference (type) { - this.logger = Logger.getLogger("Preference"); - this.logger.trace("[Constructeur Preference ()]"); - - if (!(this instanceof Preference)) { - throw new TypeError("Preference constructor cannot be called as a function."); - } - - /** - * type de table de geocodage - * @type {Array.} - */ - this.type = type; -} - -/** - * @lends module:Preference# - */ -Preference.prototype = { - - /** - * Constructeur (alias) - */ - constructor : Preference, - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * Template de la requête. - * - * substitution des valeurs suivantes : - * __TYPE__ - * - */ - template : "__TYPE__" -}; - -/** - * toString - * - * @returns {String} requête - */ -Preference.prototype.toString = function () { - var Preferences = []; - var tmplPreference = ""; - for (var idx = 0; idx < this.type.length; idx++) { - tmplPreference = this.template; - tmplPreference = tmplPreference.replace(/__TYPE__/g, this.type[idx]); - Preferences.push(tmplPreference); - } - - this.strRequest = Preferences.join("\n"); - return this.strRequest; -}; - -export default Preference; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js deleted file mode 100644 index c08c6b6d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * implemented into class 'Address' ! - * - * Location type Street - * - * options - * options.location.street - * - * FIXME on traite les attributs ? - * - * ``` - * XSD - * Street (balise xsd) : - * ex. 1 rue Marconi - * attribute name="officialName" (...) - * ``` - * ``` - * template : "__VALUE__" - * ``` - * @alias Gp.Formats.XLS.LocationUtilityService.Street - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js deleted file mode 100644 index 9a63fc05..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * implemented into class 'Address' ! - * - * Location de type StreetAddress - * - * - options - * - options.location.street - * - options.location.number - * - options.city // FIXME quel est son type d'objet ? - * - * ``` - * XSD - * StreetAddress (balise xsd) : - * ex. 1 rue Marconi - * attribute name="locator" - * element name="xls:Building" - * element ref="xls:Street" - * ``` - * - * FIXME on traite les attributs ? - * - * ``` - * template : "\ - * \n\ - * STREET__ \n\ - * BUILDING__\n\ - * " - * ``` - * - * @alias Gp.Formats.XLS.LocationUtilityService.StreetAddress - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js deleted file mode 100644 index 16a4cc8c..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js +++ /dev/null @@ -1,113 +0,0 @@ -/* jshint bitwise: false */ -import Logger from "../../Utils/LoggerByDefault"; - -/** - * @classdesc - * - * Requête XLS - * - * @example - * // request XSL - * request = new Request (); - * request.maximumResponses = 26; - * request.methodName = "GeocodeRequest"; - * request.version = "1.2"; - * request.toString(); - * // out -> - * // - * // - * // - * - * @constructor - * @alias Gp.Formats.XLS.Request - * @param {Object} options - options - * @param {Object} options.maximumResponses - 25 - * @param {String} options.methodName - nom de l'objet LUS, "GeocodeRequest" | "ReverseGeocodeRequest" - * @param {String} options.version - '1.2' - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function Request (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur Request ()]"); - - if (!(this instanceof Request)) { - throw new TypeError("Request constructor cannot be called as a function."); - } - - // options par defaut - this.options = options || { - maximumResponses : 25, - methodName : null, - version : "1.2" - }; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } -} - -Request.prototype = { - - /** - * @lends module:Request# - */ - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * __MAXRESPONSES__, __METHODNAME__, __UUID__, __VERSION__ - * __REQUESTSERVICE__ - */ - template : "" + - "" + - "", - - /** - * Constructeur (alias) - */ - constructor : Request, - - /** - * an rfc4122 version 4 compliant guid - * @returns {String} guid - */ - guid : function () { - // INFO - // cf. http://byronsalau.com/blog/how-to-create-a-guid-uuid-in-javascript/ - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0; - var v = c === "x" ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - }, - - /** - * toString - * @returns {String} requête - */ - toString : function () { - var template = null; - template = this.template; - template = template.replace(/__MAXRESPONSES__/g, this.options.maximumResponses); - template = template.replace(/__METHODNAME__/g, this.options.methodName); - template = template.replace(/__UUID__/g, this.guid()); - template = template.replace(/__VERSION__/g, this.options.version); - - this.requestString = template; - return this.requestString; - } -}; - -export default Request; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js deleted file mode 100644 index c8b12830..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js +++ /dev/null @@ -1,83 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; - -/** - * @classdesc - * - * Entête de la requête XSL - * - * @example - * // header XSL - * header = new RequestHeader (); - * header.srsName = "epsg:4326"; - * header.toString(); - * // out -> - * // - * - * @constructor - * @alias Gp.Formats.XLS.RequestHeader - * @param {Object} options - options - * @param {Object} options.srsName - projection - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function RequestHeader (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur RequestHeader ()]"); - - if (!(this instanceof RequestHeader)) { - throw new TypeError("RequestHeader constructor cannot be called as a function."); - } - - // options par defaut - this.options = options || { - srsName : "EPSG:4326" - }; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } -} - -RequestHeader.prototype = { - - /** - * @lends module:RequestHeader# - */ - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * __SRSNAME__ - */ - template : "", - - /** - * Constructeur (alias) - */ - constructor : RequestHeader, - - /** - * toString - * @returns {String} requête - */ - toString : function () { - var template = null; - template = this.template; - template = template.replace(/__SRSNAME__/g, this.options.srsName); - this.requestString = template; - return this.requestString; - } -}; - -export default RequestHeader; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js deleted file mode 100644 index f31a9574..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js +++ /dev/null @@ -1,312 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; -import AbstractService from "./AbstractService"; -import DetermineRouteRequest from "./RouteService/DetermineRouteRequest"; -import RouteRequestExtension from "./RouteService/RouteRequestExtension"; - -/** - * @classdesc - * - * Requête de type RouteService - * (Factory) - * - * XSD : - * ---- - * [] => non implementé ! - * - * ``` - * element name="DetermineRouteRequest" - * [attribute name="provideRouteHandle" default="false"] - * attribute name="distanceUnit" default="M" - * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] - * element ref="xls:RoutePlan" - * element ref="xls:RouteInstructionsRequest" - * [element ref="xls:RouteGeometryRequest"] - * [element ref="xls:RouteMapRequest"] - * ``` - * ``` - * element name="RoutePlan" - * [attribute name="useRealTimeTraffic" default="false"] - * [attribute name="expectedStartTime" type="dateTime"] - * [attribute name="expectedEndTime" type="dateTime"] - * element ref="xls:RoutePreference" - * element ref="xls:WayPointList" - * element ref="xls:AvoidList" - * ``` - * ``` - * element name="RoutePreference" => value = Fastest | Shortest | Pedestrian - * ``` - * ``` - * element name="WayPointList" - * element ref="xls:StartPoint" - * element ref="xls:ViaPoint" minOccurs="0" - * element ref="xls:EndPoint" - * ``` - * ``` - * element name="StartPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="ViaPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="EndPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="AvoidList" - * [element ref="xls:AOI"] - * [element ref="xls:_Location"] (cf. element name="Position") - * element ref="xls:AvoidFeature" - * ``` - * ``` - * [element name="AOI"] - * [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"] - * ``` - * ``` - * element name="AvoidFeature" => value = highway | tollway | tunnel | bridge - * ``` - * ``` - * [element name="RouteMapRequest"] - * [element name="Output"] - * attribute name="width" - * attribute name="height" - * attribute name="format" - * attribute name="BGcolor" - * attribute name="transparent" - * attribute name="style" => value = Overview | Maneuver - * element name="BBoxContext" type="gml:EnvelopeType" - * ``` - * ``` - * element name="RouteInstructionsRequest" - * [attribute name="format"] default="text/plain" - * attribute name="provideGeometry" default="false" - * attribute name="provideBoundingBox" default="false" - * ``` - * ``` - * [element name="RouteGeometryRequest"] - * [attribute name="scale"] default="1" - * [attribute name="provideStartingPortion"] default="false" - * [attribute name="maxPoints"] default="100" - * [element name="BoundingBox" type="gml:EnvelopeType" ] - * ``` - * - * -------- - * Requête : - * -------- - * ``` - * - * - * - * - * - * - * Fastest - * - * - * - * 2.29993 48.87228 - * - * - * -1.53604 47.21548 - * - * - * - * - * - * - * - * non implementé ! - * - * ``` - * element name="DetermineRouteRequest" - * [attribute name="provideRouteHandle" default="false"] - * attribute name="distanceUnit" default="M" - * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] - * element ref="xls:RoutePlan" - * element ref="xls:RouteInstructionsRequest" - * [element ref="xls:RouteGeometryRequest"] - * [element ref="xls:RouteMapRequest"] - * ``` - * ``` - * element name="RouteInstructionsRequest" - * [attribute name="format"] default="text/plain" - * attribute name="provideGeometry" default="false" - * attribute name="provideBoundingBox" default="false" - * ``` - * ``` - * element name="RouteGeometryRequest" - * [attribute name="scale"] default="1" - * [attribute name="provideStartingPortion"] default="false" - * [attribute name="maxPoints"] default="100" - * [element name="BoundingBox" type="gml:EnvelopeType" ] - * ``` - * ``` - * [element name="RouteMapRequest"] - * [element name="Output"] - * [attribute name="width"] - * [attribute name="height"] - * [attribute name="format"] - * [attribute name="BGcolor"] - * [attribute name="transparent"] - * [attribute name="style"] => value = Overview | Maneuver - * [element name="BBoxContext" type="gml:EnvelopeType"] - * ``` - * - * -------- - * Requête : - * -------- - * ``` - * - * - * Fastest - * - * - * - * 2.29993 48.87228 - * - * - * -1.53604 47.21548 - * - * - * - * - * - * - * ``` - * - * @constructor - * @alias Gp.Formats.XLS.RouteService.DetermineRouteRequest - * @param {Object} options - options - * @param {Object} options.route.routePreference - « fastest », « shortest » ou « pedestrian » - * @param {String} options.route.startPoint - Point de départ (coordonnées exprimées en WGS84G) - * @param {String} options.route.viaPoint - Liste de points intermédiaires - * @param {String} options.route.endPoint - Point d'arrivée (coordonnées) - * @param {Object} options.route.avoidFeature - « highway », « tollway », « tunnel » ou « bridge » - * @param {Object} options.route.vehicle - « car » - * @param {Object} options.route.expectedStartTime - Date et heure de départ - * @param {Object} options.provideGeometry - true | false - * @param {Object} options.provideBoundingBox - true | false - * @param {Object} options.distanceUnit - Unité dans lesquelles la distance est exprimée (« m » ou « km ») - * @param {Function} options.onsuccess - function callback success (TODO) - * @param {Function} options.onerror - function callback error (TODO) - * - * @private - */ -function DetermineRouteRequest (options) { - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur DetermineRouteRequest ()]"); - - if (!(this instanceof DetermineRouteRequest)) { - throw new TypeError("DetermineRouteRequest constructor cannot be called as a function."); - } - - // options par defaut - this.options = options || {}; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "DetermineRouteRequest"; -} - -DetermineRouteRequest.prototype = { - - /** - * @lends module:DetermineRouteRequest# - */ - - /** - * request (out) - * @type {String} - */ - strRequest : null, - - /** - * RoutePlan - * @type {Address} - */ - oRoutePlan : null, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * __DISTANCEUNIT__, - * __ROUTEPLAN__, __ROUTEINSTRUCTIONREQUEST__, __ROUTEGEOMETRYREQUEST__, __ROUTEMAPREQUEST__ - * __PROVIDEGEOMETRY__, __PROVIDEBBOX__ - */ - template : { - determineRouteRequest : "" + - "__ROUTEPLAN__" + - "__ROUTEINSTRUCTIONREQUEST__" + - "__ROUTEGEOMETRYREQUEST__" + - "__ROUTEMAPREQUEST__" + - "", - routeInstructionRequest : "", - routeGeometryRequest : "", - routeMapRequest : "" // FIXME not yet implemented ! - }, - - /** - * Ajout d'un objet de type RoutePlan - * - * @param {Object} oRoutePlan - RoutePlan - */ - addRoute : function (oRoutePlan) { - if (oRoutePlan instanceof RoutePlan) { - this.oRoutePlan = oRoutePlan; - } - }, - - /** - * Constructeur (alias) - */ - constructor : DetermineRouteRequest, - - /** - * toString - * - * @returns {String} requête - */ - toString : function () { - var template = ""; - template = this.template.determineRouteRequest; - template = template.replace(/__DISTANCEUNIT__/g, this.options.distanceUnit || "KM"); - - // soit on a déjà un objet RoutePlan instancié, - // sinon, on le fabrique via les options - if (!this.oRoutePlan) { - var settings = this.options.route; - - this.oRoutePlan = new RoutePlan(settings); - if (!this.oRoutePlan) { - throw new Error("La construction du calcul d'initineraire n'est pas correctement definie !?"); - } - } - - // routeplan - template = template.replace(/__ROUTEPLAN__/g, this.oRoutePlan.toString()); - - // instruction - var tmplInstruction = this.template.routeInstructionRequest; - tmplInstruction = tmplInstruction.replace(/__PROVIDEGEOMETRY__/g, this.options.provideGeometry || false); - tmplInstruction = tmplInstruction.replace(/__PROVIDEBBOX__/g, this.options.provideBoundingBox || false); - template = template.replace(/__ROUTEINSTRUCTIONREQUEST__/g, tmplInstruction); - - // geometry - var tmplGeometry = this.template.routeGeometryRequest; - template = template.replace(/__ROUTEGEOMETRYREQUEST__/g, tmplGeometry); - - // map - var tmplMap = this.template.routeMapRequest; - template = template.replace(/__ROUTEMAPREQUEST__/g, tmplMap); - - this.strRequest = template; - return this.strRequest; - } -}; - -export default DetermineRouteRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js deleted file mode 100644 index 1989a5de..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * not implemented ! - * - * Extension de type 'graphName' de l'objet RoutePlan' - * - * FIXME L'extension 'graphName' est intégré comme étant du standard OLS. - * La balise viendrait surcharger le comportement de RoutePreference... - * - * ex. - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js deleted file mode 100644 index 56758d5e..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * implemented into class 'RoutePlan' ! - * - * Element permettant de spécifier des caractéristiques de tronçons à éviter. - * - * ---- - * XSD : - * ---- - * [] => non implementé ! - * ``` - * element name="RoutePlan" - * [attribute name="useRealTimeTraffic" default="false"] - * [attribute name="expectedStartTime" type="dateTime"] - * [attribute name="expectedEndTime" type="dateTime"] - * element ref="xls:RoutePreference" - * element ref="xls:WayPointList" - * element ref="xls:AvoidList" - * ``` - * ``` - * element name="AvoidList" - * [element ref="xls:AOI"] - * [element ref="xls:Location"] (cf. element name="Position") - * element ref="xls:AvoidFeature" - * ``` - * ``` - * [element name="AOI"] - * [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"] - * ``` - * ``` - * element name="AvoidFeature" - * => value = highway | tollway | tunnel | bridge - * ``` - * - * @module AvoidList - * @private - * @alias Gp.Formats.XLS.RouteService.AvoidList - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js deleted file mode 100644 index f79ae6dd..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * implemented into class 'DetermineRouteRequest' ! - * - * ---- - * XSD : - * ---- - * - * [] => non implementé ! - * ``` - * element name="DetermineRouteRequest" - * [attribute name="provideRouteHandle" default="false"] - * attribute name="distanceUnit" default="M" - * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] - * element ref="xls:RoutePlan" - * element ref="xls:RouteInstructionsRequest" - * [element ref="xls:RouteGeometryRequest"] - * [element ref="xls:RouteMapRequest"] - * ``` - * ``` - * element name="RouteGeometryRequest" - * [attribute name="scale"] default="1" - * [attribute name="provideStartingPortion"] default="false" - * [attribute name="maxPoints"] default="100" - * [element name="BoundingBox" type="gml:EnvelopeType" ] - * ``` - * - * @module RouteGeometryRequest - * @private - * @alias Gp.Formats.XLS.RouteService.RouteGeometryRequest - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js deleted file mode 100644 index ce540820..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * implemented into class 'DetermineRouteRequest' ! - * - * Pour pouvoir spécifier les éléments qui doivent apparaître dans la réponse au niveau des instructions : - * - géométrie de chaque instruction - * - zone d'encombrement de chaque instruction - * Par défaut, tous ces paramètres sont à false. - * - * ---- - * XSD : - * ---- - * - * [] => non implementé ! - * ``` - * element name="DetermineRouteRequest" - * [attribute name="provideRouteHandle" default="false"] - * attribute name="distanceUnit" default="M" - * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] - * element ref="xls:RoutePlan" - * element ref="xls:RouteInstructionsRequest" - * [element ref="xls:RouteGeometryRequest"] - * [element ref="xls:RouteMapRequest"] - * ``` - * ``` - * element name="RouteInstructionsRequest" - * [attribute name="format"] default="text/plain" - * attribute name="provideGeometry" default="false" - * attribute name="provideBoundingBox" default="false" - * ``` - * - * @module RouteInstructionsRequest - * @private - * @alias Gp.Formats.XLS.RouteService.RouteInstructionsRequest - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js deleted file mode 100644 index bf23fec4..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * not implemented ! - * - * ---- - * XSD : - * ---- - * [] => non implementé ! - * - * ``` - * element name="DetermineRouteRequest" - * [attribute name="provideRouteHandle" default="false"] - * attribute name="distanceUnit" default="M" - * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] - * element ref="xls:RoutePlan" - * element ref="xls:RouteInstructionsRequest" - * [element ref="xls:RouteGeometryRequest"] - * [element ref="xls:RouteMapRequest"] - * ``` - * ``` - * [element name="RouteMapRequest"] - * [element name="Output"] - * [attribute name="width"] - * [attribute name="height"] - * [attribute name="format"] - * [attribute name="BGcolor"] - * [attribute name="transparent"] - * [attribute name="style"] => value = Overview | Maneuver - * [element name="BBoxContext" type="gml:EnvelopeType"] - * ``` - * - * @module RouteMapRequest - * @private - * @alias Gp.Formats.XLS.RouteService.RouteMapRequest - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js deleted file mode 100644 index d3689744..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js +++ /dev/null @@ -1,255 +0,0 @@ -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * * Élément regroupant l'ensemble des données et paramètres pour le calcul d'itinéraire : points de navigation, configuration. - * - * ---- - * XSD : - * ---- - * [] => non implementé ! - * - * ``` - * element name="RoutePlan" - * [attribute name="useRealTimeTraffic" default="false"] - * [attribute name="expectedStartTime" type="dateTime"] - * [attribute name="expectedEndTime" type="dateTime"] - * element ref="xls:RoutePreference" - * element ref="xls:WayPointList" - * element ref="xls:AvoidList" - * ``` - * ``` - * element name="RoutePreference" - * => value = fastest | shortest | pedestrian - * ``` - * ``` - * element name="WayPointList" - * element ref="xls:StartPoint" - * element ref="xls:ViaPoint" minOccurs="0" - * element ref="xls:EndPoint" - * ``` - * ``` - * element name="StartPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="ViaPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="EndPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="AvoidList" - * [element ref="xls:AOI"] - * [element ref="xls:_Location"] (cf. element name="Position") - * element ref="xls:AvoidFeature" - * ``` - * ``` - * [element name="AOI"] - * [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"] - * ``` - * ``` - * element name="AvoidFeature" => value = highway | tollway | tunnel | bridge - * ``` - * - * -------- - * Requête : - * -------- - * ``` - * - * Fastest - * - * - * - * 2.29993 48.87228 - * - * - * -1.53604 47.21548 - * - * - * - * highway - * tollway - * tunnel - * - * - * ``` - * @constructor - * @alias Gp.Formats.XLS.RouteService.RoutePlan - * @param {Object} options - options - * - * @private - */ -function RoutePlan (options) { - this.logger = Logger.getLogger("RoutePlan"); - this.logger.trace("[Constructeur RoutePlan ()]"); - - if (!(this instanceof RoutePlan)) { - throw new TypeError("RoutePlan constructor cannot be called as a function."); - } - - // param par defaut - this.options = options || {}; - - // param obligatoire - if (!this.options.startPoint) { - throw new Error("l'option 'startPoint' n'est pas renseignée !"); - } - - if (!this.options.endPoint) { - throw new Error("l'option 'endPoint' n'est pas renseignée !"); - } -} - -RoutePlan.prototype = { - - /** - * Constructeur (alias) - */ - constructor : RoutePlan, - - /** - * request (out) - * @type {String} - */ - requestString : null, - - /** - * Template de la requête. - * substitution des valeurs suivantes : - * - __ROUTEPREFERENCE__, __VALUEROUTEPREFERENCE__ - * - __GRAPH__, __VALUEGRAPH__ - * - __WAYPOINTLIST__ (lst?), __STARTPOINT__, __VIAPOINT__, __ENDPOINT__, __POINT__, __X__, __Y__ - * - __AVOIDLIST__ (lst!), __AVOIDFEATURE__, __VALUEAVOIDFEATURE__ - */ - template : { - routePlan : "" + - "__ROUTEPREFERENCE__" + - "__GRAPH__" + - "__WAYPOINTLIST__" + - "__AVOIDLIST__" + - "", - routePreference : "__VALUEROUTEPREFERENCE__", - graph : "", - wayPointList : { - container : "" + - "__STARTPOINT__" + - "__VIAPOINT__" + - "__ENDPOINT__" + - "", - point : "__X__ __Y__", - startPoint : "" + - "__POINT__" + - "", - endPoint : "" + - "__POINT__" + - "", - viaPoint : "" + - "__POINT__" + - "" // implémentation de plusieurs étapes... - }, - avoidList : { - container : "" + - "__AVOIDFEATURE__" + - "", - avoidFeature : "__VALUEAVOIDFEATURE__" - } - }, - - /** - * toString - * - * @returns {String} requête - */ - toString : function () { - var template = ""; - template = this.template.routePlan; - - // preference - if (this.options.routePreference) { - var tmplPreference = this.template.routePreference; - tmplPreference = tmplPreference.replace(/__VALUEROUTEPREFERENCE__/, this.options.routePreference); - template = template.replace(/__ROUTEPREFERENCE__/g, tmplPreference); - } - // clean preference - template = template.replace(/__ROUTEPREFERENCE__/g, ""); - - // exclusions - if (this.options.avoidFeature) { - var tmplAvoidList = this.template.avoidList.container; - var avoidFeatures = []; - for (var i = 0; i < this.options.avoidFeature.length; i++) { - var tmplAvoidFeature = this.template.avoidList.avoidFeature; - tmplAvoidFeature = tmplAvoidFeature.replace(/__VALUEAVOIDFEATURE__/, this.options.avoidFeature[i]); - avoidFeatures.push(tmplAvoidFeature); - } - tmplAvoidList = tmplAvoidList.replace(/__AVOIDFEATURE__/, avoidFeatures.join("\n")); - template = template.replace(/__AVOIDLIST__/g, tmplAvoidList); - } - // clean exclusions - template = template.replace(/__AVOIDLIST__/g, ""); - - // graph - if (this.options.graph) { - var tmplVehicle = this.template.graph; - tmplVehicle = tmplVehicle.replace(/__VALUEGRAPH__/, this.options.graph); - template = template.replace(/__GRAPH__/g, tmplVehicle); - } - // clean vehicle - template = template.replace(/__GRAPH__/g, ""); - - // points - var tmplWayPointList = this.template.wayPointList.container; - var tmplPoint = ""; - // start - tmplPoint = this.template.wayPointList.point; - tmplPoint = tmplPoint.replace(/__X__/, this.options.startPoint.x); - tmplPoint = tmplPoint.replace(/__Y__/, this.options.startPoint.y); - tmplWayPointList = tmplWayPointList.replace(/__STARTPOINT__/, - this.template.wayPointList.startPoint.replace(/__POINT__/, tmplPoint)); - // end - tmplPoint = this.template.wayPointList.point; - tmplPoint = tmplPoint.replace(/__X__/, this.options.endPoint.x); - tmplPoint = tmplPoint.replace(/__Y__/, this.options.endPoint.y); - tmplWayPointList = tmplWayPointList.replace(/__ENDPOINT__/, - this.template.wayPointList.endPoint.replace(/__POINT__/, tmplPoint)); - // via - if (this.options.viaPoint) { - var points = []; - for (var j = 0; j < this.options.viaPoint.length; j++) { - var p = this.options.viaPoint[j]; - tmplPoint = this.template.wayPointList.point; - tmplPoint = tmplPoint.replace(/__X__/, p.x); - tmplPoint = tmplPoint.replace(/__Y__/, p.y); - points.push(tmplPoint); - } - - tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, - this.template.wayPointList.viaPoint.replace(/__POINT__/, points.join("\n"))); - } else { - // clean viaPoint - tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, ""); - } - - template = template.replace(/__WAYPOINTLIST__/g, tmplWayPointList); - - this.requestString = template; - return this.requestString; - } -}; - -export default RoutePlan; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js deleted file mode 100644 index 705fd003..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * implemented into class 'RoutePlan' ! - * - * Indique le type de calcul d'itinéraire souhaité : - * - « Fastest » : au plus rapide - * - « Shortest » : au plus court - * - * ---- - * XSD : - * ---- - * [] => non implementé ! - * - * ``` - * element name="RoutePlan" - * [attribute name="useRealTimeTraffic" default="false"] - * [attribute name="expectedStartTime" type="dateTime"] - * [attribute name="expectedEndTime" type="dateTime"] - * element ref="xls:RoutePreference" - * element ref="xls:WayPointList" - * element ref="xls:AvoidList" - * ``` - * ``` - * element name="RoutePreference" - * => value = fastest | shortest | pedestrian - * ``` - * - * @module RoutePreference - * @private - * @alias Gp.Formats.XLS.RouteService.RoutePreference - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js deleted file mode 100644 index 3d2a52af..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * implemented into class 'RoutePlan' ! - * - * Element permettant de spécifier les points de navigation. - * - Point de départ pour le calcul d'itinéraire. - * - Etape pour le calcul d'itinéraire. Plusieurs VaiPoint peuvent être spécifiés. - * - Point d'arrivée pour le calcul d'itinéraire. - * - * ---- - * XSD : - * ---- - * [] => non implementé ! - * - * ``` - * element name="RoutePlan" - * [attribute name="useRealTimeTraffic" default="false"] - * [attribute name="expectedStartTime" type="dateTime"] - * [attribute name="expectedEndTime" type="dateTime"] - * element ref="xls:RoutePreference" - * element ref="xls:WayPointList" - * element ref="xls:AvoidList" - * ``` - * ``` - * element name="WayPointList" - * element ref="xls:StartPoint" - * element ref="xls:ViaPoint" minOccurs="0" - * element ref="xls:EndPoint" - * ``` - * ``` - * element name="StartPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="ViaPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * ``` - * element name="EndPoint" - * [element name="GeocodeMatchCode"] - * [attribute name="accuracy"] - * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... - * element name="Position" - * element ref="gml:Point" - * ``` - * - * @module WayPointList - * @private - * @alias Gp.Formats.XLS.RouteService.WayPointList - * - */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js deleted file mode 100644 index 7db72f85..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js +++ /dev/null @@ -1,360 +0,0 @@ -/* global require */ - -import Logger from "../Utils/LoggerByDefault"; -// import __xmldom from "xmldom"; - -/** - * @classdesc - * - * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM, - * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques. - * - * @constructor - * @alias Gp.Formats.XML - * - * @param {Object} [options] - options du format XML - * - * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) - * utile pour interpréter le XML lorsque sa structure est connue. - * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. - * - * @param {Object} [options.writers] - writers - * - * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter. - * - * @private - */ -function XML (options) { - if (!(this instanceof XML)) { - throw new TypeError("XML constructor cannot be called as a function."); - } - - // FIXME : notion de singleton - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur XML ()]"); - - /** - * Chaîne de caractères contenant le texte XML - * @type {String} - */ - this.xmlString = null; - - /** - * DOM Element correspondant à la structure du XML. - * @type {DOMElement} - */ - this.xmlDoc = null; - - /** - * Objet contenant des fonctions de lecture des différentes balises XML. - * @type {Object} - */ - this.reader = null; - - // traitement des paramètres d'options s'il y en a - if (options) { - if (options.xmlString && typeof options.xmlString === "string") { - this.xmlString = options.xmlString; - // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document - this.xmlDoc = __getXMLDOC(options.xmlString); - } - if (options.reader) { - this.setReader(options.reader); - } - } -} - -XML.prototype = { - - /** - * @lends module:XML - */ - - /* - * Constructeur (alias) - */ - constructor : XML, - - /** - * Méthode permettant de récupérer la chaîne de caractères associée au format XML - * - * @returns {String} xmlString - la chaîne de caractères correspondant au format XML - */ - getXMLString : function () { - return this.xmlString; - }, - - /** - * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString). - * La méthode va aussi transformer cette chaîne de caractères en document XML, - * afin de remplir l'attribut xmlDoc. - * - * @param {String} xmlString - la chaîne de caractères correspondant au format XML - */ - setXMLString : function (xmlString) { - if (xmlString && typeof xmlString === "string") { - this.xmlString = xmlString; - this.xmlDoc = __getXMLDOC(xmlString); - } - }, - - /** - * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis - * - * @return {Object} readers - les readers associés au format XML, s'ils existent, - * sous forme d'une collection de fonctions - */ - getReader : function () { - return this.reader; - }, - - /** - * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data), - * lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)). - * - * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) - * utile pour interpréter le XML lorsque sa structure est connue. - * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. - */ - setReader : function (reader) { - if (reader && reader.read && typeof reader.read === "function") { - this.reader = reader; - } - }, - - /** - * Méthode permettant de récupérer le document XML associé au format, s'il existe. - * - * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe - */ - getXMLDoc : function () { - return this.xmlDoc; - }, - - /** - * Setter - */ - setXMLDoc : function (doc) { - this.xmlDoc = doc; - }, - /** - * Méthode initialisant la lecture du XML, à partir d'un XML Document : - * création d'un objet JavaScript contenant les informations du XML, - * sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide). - * - * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML : - * - soit toutes les informations si aucun reader n'a été spécifié à la création du format - * - soit les informations spécifiées dans le reader. - */ - parse : function () { - // build xml document from xmlString - if (!this.xmlDoc && this.xmlString) { - this.xmlDoc = __getXMLDOC(this.xmlString); - } - if (this.xmlDoc) { - var root = __getRootNode(this.xmlDoc); - if (root) { - var parserOutput; - // call reader if exists - if (this.reader && this.reader.read) { - parserOutput = this.reader.read(root); - } else { - parserOutput = {}; - parserOutput[root.nodeName] = __readDefault(root); - } - return parserOutput; - } else { - return {}; - } - } - } - -}; - -/** - * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML, - * en utilisant DOMParser () lorsque c'est possible. - * For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface - * - * @private - * @memberof XML - * @method __getXMLDOC - * @param {String} xmlString - xml string to be converted into DOM element - * @return {DOMElement} - the corresponding XML Document - */ -function __getXMLDOC (xmlString) { - if (typeof window === "undefined") { - // env. nodejs - var DOMParser = require("xmldom").DOMParser; // __xmldom.DOMParser; - return new DOMParser().parseFromString(xmlString, "text/xml"); - } else { - // env. browser - - var parser; - var xmlDoc; - var errorMsg = "Erreur lors du parsing de la réponse du service : XML non conforme"; - - if (window.ActiveXObject) { - // Internet Explorer < 9 - xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.async = false; - xmlDoc.loadXML(xmlString); - var parseError = xmlDoc.parseError; - if (parseError.errorCode) { - if (parseError.line && parseError.linepos) { - errorMsg += "( ligne " + parseError.line + ", colonne " + parseError.linepos; - } - if (parseError.reason) { - errorMsg += ": " + parseError.reason + ")"; - } - throw new Error(errorMsg); - } - return xmlDoc; - } else if (window.DOMParser) { - // les autres (Chrome, Mozilla, IE >= 9) - parser = new window.DOMParser(); - try { - xmlDoc = parser.parseFromString(xmlString, "text/xml"); - } catch (e) { - // Internet Explorer browser raises exception if xmlString is not valid XML - if (e.message === "SyntaxError") { - throw new Error(errorMsg); - } else { - throw new Error("Erreur lors du parsing de la réponse du service : " + e.message); - } - } - // look for parsing error in case no exception was raised - if (xmlDoc.getElementsByTagName("parsererror").length > 0) { - var parsererror = xmlDoc.getElementsByTagName("parsererror"); - for (var i = 0; i < parsererror.length; i++) { - var content = parsererror[i].innerHTML; - // except in case parsererror is just because of huge xml, but parsing is done. - if (content.indexOf("Huge input lookup") === -1) { - errorMsg += "(" + content + ")"; - throw new Error(errorMsg); - } - } - } else if (!xmlDoc.documentElement) { // may happen in chrome browser - throw new Error(errorMsg); - } - return xmlDoc; - } else { - // FIXME - throw new Error("Incompatible DOM Parser pour ce navigateur !"); - } - } -} - -/** - * Méthode de la classe (privée) permettant de récupérer le noeud racine du document, - * à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode) - * - * @private - * @memberof XML - * @method __getRootNode - * @param {DOMElement} [xmlDoc] - a Document Node - * @return {DOMElement} root - the document root node - */ -function __getRootNode (xmlDoc) { - var root; - if (xmlDoc.nodeType === 9) { - // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree) - root = xmlDoc.documentElement; - } else if (xmlDoc.nodeType === 1) { - root = xmlDoc; - } - return root; -} - -/** - * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML, - * lorsqu'aucun reader spécifique n'a été spécifié (parser brut) - * - * @private - * @memberof XML - * @method readDefault - * @param {DOMElement} node - a DOM element node - * @example final data object looks like : - * data = { - * attributeName: attributeValue, - * childName: { - * attributeName: attributeValue, - * attributeName: attributeValue, - * childName: { - * "textContent": textContent - * }, - * childName: { - * childName: { - * attributeName:attributeValue - * } - * } - * } - * } - */ -function __readDefault (node) { - var data = {}; - - // if element node has attributes, set their values to data - if (node.attributes.length > 0) { - var dataAttributes = __getAttributes(node); - data["attributes"] = dataAttributes; - } - - // if element node has childNodes, read them and set them to data - if (node.hasChildNodes()) { - var childData = {}; - var child; - var children = node.childNodes; - - for (var i = 0; i < children.length; i++) { - child = children[i]; - - if (child.nodeType === 3) { // TEXT_NODE - data["textContent"] = child.nodeValue; - } else if (child.nodeType === 1) { - childData = __readDefault(child); - - if (!data[child.nodeName]) { - // store childData in an object - data[child.nodeName] = childData; - } else { - // in case several childNodes has the same name : store them in an array. - // if data[nodeName] already exists but is not an array - if (!Array.isArray(data[child.nodeName])) { - var old = data[child.nodeName]; - data[child.nodeName] = []; - data[child.nodeName].push(old); - } - data[child.nodeName].push(childData); - } - } - // TODO : manage other node types (4=CDATA, etc) - } - } - - return data; -} - -/** - * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément - * - * @private - * @memberof XML - * @method __getAttributes - * @param {DOMElement} node - noeud contenant l'attribut recherché - * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs - */ -function __getAttributes (node) { - if (node.attributes.length > 0) { - var nodeAttributes = {}; - var attributes = node.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - nodeAttributes[attribute.nodeName] = attribute.nodeValue; - } - return nodeAttributes; - } -} - -export default XML; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Gp.js b/geoportal-access-lib-3.4.0-beta2/package/src/Gp.js deleted file mode 100644 index 9c670cf6..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Gp.js +++ /dev/null @@ -1,109 +0,0 @@ -/** -* Global variable Gp. -* -* @module Gp -* @alias Gp -* @description -* -* This is the global variable that is exposed in the browser environment. -* Content is composed of constructor, functions and properties... -* -* > {@link Gp.Error Error()} -* - .TYPE_SRVERR : "SERVICE_ERROR" -* - .TYPE_UNKERR : "UNKNOWN_ERROR" -* - .TYPE_USEERR : "USAGE_ERROR" -* -* > {@link module:Helper Helper} -* - .indent() -* - .normalyzeParameters() -* - .normalyzeUrl() -* -* > {@link module:XHR Protocols.XHR} -* - .call() -* -* > {@link module:Services Services (objects)} -* - .Alti -* - {@link Gp.Services.Alti.Elevation .Elevation()} -* - {@link Gp.Services.AltiResponse .AltiResponse()} -* - .AutoComplete -* - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()} -* - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()} -* - {@link Gp.Services.Config .Config()} -* - {@link Gp.Services.DefaultUrl .DefaultUrl()} -* - {@link Gp.Services.GeocodeResponse .GeocodeResponse()} -* - {@link Gp.Services.GetConfigResponse .GetConfigResponse()} -* - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()} -* - .Route -* - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()} -* - {@link Gp.Services.RouteResponse .RouteResponse()} -* -* > Services (factory) -* - {@link module:Services~autoComplete .autoComplete()} -* - {@link module:Services~geocode .geocode()} -* - {@link module:Services~getAltitude .getAltitude()} -* - {@link module:Services~getConfig .getConfig()} -* - {@link module:Services~isoCurve .isoCurve()} -* - {@link module:Services~reverseGeocode .reverseGeocode()} -* - {@link module:Services~route .route()} -* -* > servicesDate : "YYYY-MM-DD" -* -* > servicesVersion : "X.X.X" -* -*/ - -import Services from "./Services/Services"; -import DefaultUrl from "./Services/DefaultUrlService"; -import AltiResponse from "./Services/Alti/Response/model/AltiResponse"; -import Elevation from "./Services/Alti/Response/model/Elevation"; -import AutoCompleteResponse from "./Services/AutoComplete/Response/model/AutoCompleteResponse"; -import SuggestedLocation from "./Services/AutoComplete/Response/model/SuggestedLocation"; -import IsoCurveResponse from "./Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse"; -import RouteResponse from "./Services/Route/Response/model/RouteResponse"; -import RouteInstruction from "./Services/Route/Response/model/RouteInstruction"; -import Config from "./Services/Config/Config"; -import XHR from "./Protocols/XHR"; -import Error from "./Exceptions/ErrorService"; -import Helper from "./Utils/Helper"; - -import Pkg from "../package.json"; - -/** Version */ -export const servicesVersion = Pkg.version; -/** Publication date */ -export const servicesDate = Pkg.date; - -// on declare les ns dans root global -var Gp = {}; - -Gp.servicesVersion = servicesVersion; -Gp.servicesDate = servicesDate; - -// Export Protocols -Gp.Protocols = {}; -Gp.Protocols.XHR = XHR; -// Export services -Gp.Services = Services; -// Export DefaultUrls -Gp.Services.DefaultUrl = DefaultUrl; -// Export Alti -Gp.Services.AltiResponse = AltiResponse; -Gp.Services.Alti = {}; -Gp.Services.Alti.Elevation = Elevation; -// Export Autocomplete -Gp.Services.AutoCompleteResponse = AutoCompleteResponse; -Gp.Services.AutoComplete = {}; -Gp.Services.AutoComplete.SuggestedLocation = SuggestedLocation; -// Export Config -Gp.Services.Config = Config; -// Export IsoCurve -Gp.Services.IsoCurveResponse = IsoCurveResponse; -// Export Route -Gp.Services.RouteResponse = RouteResponse; -Gp.Services.Route = {}; -Gp.Services.Route.RouteInstruction = RouteInstruction; -// Export Erreurs et Outils -Gp.Error = Error; -Gp.Helper = Helper; - -export default Gp; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js deleted file mode 100644 index 5abac3ea..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js +++ /dev/null @@ -1,247 +0,0 @@ -/** - * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail - * - * @module JSONP - * @private - * @alias Gp.Protocols.JSONP - */ -import Logger from "../Utils/LoggerByDefault"; - -// cf. https://github.com/sobstel/jsonp.js -var JSONP = { - - /** - * Construction d'un identifiant statique basé sur le timestamp, - * et qui s'incremente de +1 à chaque appel - */ - uuid : (function () { - var id = Math.floor(Date.now()); - return function () { - return id++; - }; - })(), - - /** - * Cette fonction réalise l'appel du service fourni via le paramètre "options.url" - * en mettant en œuvre le protocole JSONP. - * - * @method call - * @static - * @param {Object} options - parametres d'invocation du service en JSONP - * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP). - * Cette URL contient déjà les paramètres du service. - * Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ; - * sa valeur est déterminée en fonction du paramètre callbackName. - * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu. - * Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut. - * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL. - * Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: "callback1458574396582 ()" - * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL. - * Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte. - * La fonction de callback est créée dynamiquement par la fonction JSONP ; - * elle a deux fonctions : - * elle annule la condition de timeOut - * puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse. - * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service. - * Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback. - * La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre. - * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service. - * Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut. - * @example - * var options = { - * url : 'http://localhost/some/test.json&callback=myResults', - * timeOut : 100, - * callbackName : 'myResults', - * callbackSuffix : "", - * onResponse : function (response) { - * console.log('results : ', response); - * }, - * - * }; - * JSONP.call(options); - */ - call : function (options) { - // logger - var logger = Logger.getLogger("JSONP"); - logger.trace("[JSONP::call ()]"); - - // analyse parametres - - if (!options) { - logger.error("missing parameter : options !"); - throw new Error("missing parameter : options !"); - } - - if (!options.url) { - logger.error("missing parameter : options.url !"); - throw new Error("missing parameter : options.url !"); - } - - if (!options.timeOut) { - logger.info("setting 'options.timeOut' default value"); - options.timeOut = 0; - } - - // FIXME si un callback coté client a été mis en place, - // cette condition sur cette methode n'a pas de sens !? - if (!options.onResponse) { - logger.error("missing parameter : options.onResponse !"); - throw new Error("missing parameter : options.onResponse !"); - // FIXME doit on definir un callback interne par defaut !? - // options.onResponse = function (data) { - // console.log("response callback (inner) : ", data); - // }; - } - - // ID du callback à utiliser : null ou string. - // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = "") - // sinon, on utilise un timestamp : this.uuid () - var callbackId = (typeof options.callbackSuffix === "string") ? options.callbackSuffix : this.uuid(); - - // on recherche le parametre callback et son nom de fonction dans l'url - var urlHasCallbackKey = false; - var urlHasCallbackName = false; - - var idx = options.url.indexOf("callback="); - - if (idx !== -1) { - urlHasCallbackKey = true; - // extraction callbackName de l'url : entre "callback=" et "&" ou fin de ligne - var j = options.url.indexOf("&", idx); - if (j === -1) { - j = options.url.length; - } - - // on ecrase le parametre options.callbackName s'il avait été défini - var callbackName = options.url.substring(idx + 9, j); - - if (callbackName) { - urlHasCallbackName = true; - options.callbackName = callbackName; - logger.info("setting 'options.callbackName' value (" + options.callbackName + ") from 'options.url' parameter"); - } - } - - // on ajoute le parametre callback dans l'URL s'il n'existe pas - if (!urlHasCallbackKey) { - // gestion des autres param. et "?" - var k = options.url.indexOf("?"); - if (k === -1) { - // aucun param., ni de '?' - options.url = options.url + "?" + "callback="; - } else if (k === options.url.length) { - // uniquement le '?' - options.url = options.url + "callback="; - } else { - // le '?' et les param. existent - options.url = options.url + "&" + "callback="; - } - logger.info("setting callback default key in 'options.url' : " + options.url); - } - - // utilisation de la fonction callback coté client ? - var HasCallbackName = options.callbackName ? true : urlHasCallbackName; - - // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas - if (!urlHasCallbackName) { - // fonction callback par defaut - if (!options.callbackName) { - logger.info("setting 'options.callbackName' default value"); - options.callbackName = "callback"; // ou "gp.protocol.jsonp" ? - // info : si on ne veut pas gerer d'ID dans le callback, - // options.callbackSuffix = "" - if (callbackId || callbackId === "") { - options.callbackName += callbackId; - } - } - options.url = options.url.replace("callback=", "callback=" + options.callbackName); - logger.info("setting callback function name in 'options.url' : " + options.url); - } - - // timeOut par defaut - if (!options.onTimeOut) { - logger.info("setting 'options.onTimeOut' default value"); - /** callback timeout par defaut */ - options.onTimeOut = function (/* error */) { - console.log("TimeOut while invoking url : " + options.url); - }; - } - - if (!HasCallbackName) { - var self = this; - - // event du timeout - var onTimeOutTrigger = null; - - // declenche le timeout si > à 0 ! - if (options.timeOut > 0) { - onTimeOutTrigger = window.setTimeout( - function () { - /** fonction de reponse du service */ - window[options.callbackName] = function () {}; - options.onTimeOut(); - self._deleteScript(callbackId); - }, options.timeOut); - } - - // FIXME le nom de la fonction n'accepte pas de namespace ! - // ex. Gp.Function.callback - /** - * fonction de reponse du service - * @param {Object} data - data - * @private - */ - window[options.callbackName] = function (data) { - window.clearTimeout(onTimeOutTrigger); - options.onResponse(data); - self._deleteScript(callbackId); - }; - } - - this._createScript(callbackId, options.url); - }, - - /** - * create Script - * @param {String} callbackId - callback Id - * @param {String} url - url - * @private - */ - _createScript : function (callbackId, url) { - var scriptu; - var scripto = document.getElementById("results" + callbackId); - - scriptu = document.createElement("script"); - scriptu.setAttribute("type", "text/javascript"); - scriptu.setAttribute("src", url); - scriptu.setAttribute("charset", "UTF-8"); - scriptu.setAttribute("id", "results" + callbackId); - scriptu.setAttribute("async", "true"); // FIXME async ? - // head ou body ou autres ? - var node = document.documentElement || document.getElementsByTagName("head")[0]; - if (scripto === null) { - node.appendChild(scriptu); - } else { - // s'il existe déjà, on le remplace ! - node.replaceChild(scriptu, scripto); - } - }, - - /** - * delete Script - * @param {String} callbackId - callback Id - * @private - */ - _deleteScript : function (callbackId) { - var script = document.getElementById("results" + callbackId); - if (script) { - var node = script.parentNode || document.documentElement; - if (!node) { - return; - } - node.removeChild(script); - } - } -}; - -export default JSONP; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js deleted file mode 100644 index f62ee826..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Interface de dialogue avec les webservices - * - * @module Protocols - * @private - * @alias Gp.Protocols - */ -import Helper from "../Utils/Helper"; -import XHR from "./XHR"; -import JSONP from "./JSONP"; - -var Protocol = { - - /** - * Interface unique d"envoi d"une requête. - * - * @method send - * @static - * @param {Object} options - options generales - * @param {String} options.url - url du service - * @param {String} options.method - GET, POST, PUT, DELETE - * @param {String} options.protocol - XHR | JSONP - * @param {String} options.format - format de la reponse du service : json, xml ou null (brute)... - * @param {String} options.wrap - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP) - * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix="", la fonction s'appellera "callback") - * @param {String} options.timeOut - 0 ms - * @param {Boolean} options.nocache - true|false - * @param {Object|String} options.data - content (post) ou param (get) - * @param {Object|String} options.headers - (post) ex. referer - * @param {Object|String} options.content - (post) ex. "application/json" - * @param {String} options.scope - this (TODO) - * @param {Function} options.onResponse - callback - * @param {Function} options.onFailure - callback - * @param {Function} options.onTimeOut - callback - * @param {String} options.proxyUrl - (TODO) - */ - send : function (options) { - // INFO - // "output" - param est interne à la classe "Protocol" (parametrable via "wrap"), et à ajouter à l"url - // ce param est independant du service car il est géré par le filtre LUA : - // ex. json|xml (json par defaut). - // Ce param. permet d"encapsuler du XML dans du JSON : - // {http : {status:200, error:null},xml :"réponse du service"} - // Utile pour les services qui ne repondent que du XML (ex. Geocodage) - // - // |-------------------------------------------------| - // | \service | | | | - // | output\ format| json | xml | remarques | - // |--------\------|------|-----|--------------------| - // | json | json | json| json/xml encapsulé | - // | xml | json | xml | param inactif | - // |-------------------------------------------------| - // ex. le service demande une reponse native au "format" json et avec un "output" json. - // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas ! - // dans ce cas on ne renseigne pas output=json - - // INFO - // "wrap" - choix d"encapsuler ou non les reponses dans du JSON. - // Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) ! - - // INFO - // "callback" - param est interne à la classe "Protocol" (non parametrable), et à ajouter à l"url - // ce param est independant du service car il est géré aussi par le filtre LUA : - // ex. callback|null - // Ce param. permet de renvoyer une reponse javascript : - // callback ({http : {status:200, error:null},xml :"réponse du service"}) - // Ce param. est non renseigné par defaut car pour du JSONP, on utilise le - // le protocol JSONP, et ce dernier implemente déjà le callback ! - - // settings par defaut - var settings = options || { - method : "GET", - // protocol : "JSONP", - protocol : "XHR", - timeOut : 0, - format : null, - wrap : true, - nocache : true, - output : "json", - callback : null, - callbackSuffix : null - }; - - // on determine l'environnement d'execution : browser ou non ? - // et on stoppe pour nodeJS... sur un protocole JSONP ! - if (typeof window === "undefined" && options.protocol === "JSONP") { - console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS"); - return; - } - - if (options.protocol === "XHR" || options.format === "json") { - settings.wrap = false; - } else if (options.protocol === "JSONP" && options.format === "xml") { - settings.wrap = true; - } - - settings.callback = null; // FIXME non géré !? - settings.output = settings.wrap ? "json" : null; - - // on encapsule les reponses dans un objet JSON - if (settings.wrap) { - var params = {}; - params.output = settings.output; - params.callback = settings.callback; - delete params.callback; // FIXME non géré !? - settings.url = Helper.normalyzeUrl(options.url, params); - } - - // choix de l"implementation : - // XHR ou JSONP - switch (settings.protocol) { - case "XHR": - // on normalise l'url (gestion du cache) - if (options.method === "GET" && options.nocache) { - settings.url = Helper.normalyzeUrl(settings.url, { - t : new Date().getTime() - }); - } - // appel du service en XHR - XHR.call(settings); - break; - case "JSONP": - - // on normalise l'url si les params. sont renseignés dans la string|object "data" - if (settings.data) { - settings.url = Helper.normalyzeUrl(settings.url, settings.data); - } - - // appel du service en JSONP - JSONP.call(settings); - break; - default: - throw new Error("protocol not supported (XHR|JSONP) !"); - } - } - -}; - -export default Protocol; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js deleted file mode 100644 index 1b1114c7..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js +++ /dev/null @@ -1,423 +0,0 @@ -/* global Promise, require, XDomainRequest */ - -import Logger from "../Utils/LoggerByDefault"; -import Helper from "../Utils/Helper"; -import ES6Promise from "es6-promise"; -// import __request from "request"; -// import __xmldom from "xmldom"; - -/** - * Ajax Request (use of Promises) - * - * @module XHR - * @alias Gp.Protocols.XHR - * @see dependance 'es6-promise' - */ - -// cf. https://xhr.spec.whatwg.org/ -// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest - -var XHR = { - - /** - * Interface unique d'envoi d'une requête. - * - * @method call - * @static - * @param {Object} settings - options generales - * @param {String} settings.url - url du service - * @param {String} settings.method - GET, POST, PUT, DELETE - * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute) - * @param {String} settings.data - content (post) ou param (get) - * @param {String} settings.proxy - proxy url - * @param {Object|String} settings.headers - (post) ex. referer - * @param {Object|String} settings.content - (post) ex. 'application/json' - * @param {String} settings.timeOut - timeout = 0 par defaut - * @param {String} settings.scope - this - * @param {Function} settings.onResponse - callback - * @param {Function} settings.onFailure - callback - */ - call : function (settings) { - // logger - var logger = Logger.getLogger("XHR"); - logger.trace("[XHR::call()]"); - - // FIXME - // To polyfill the global environment - ES6Promise.polyfill(); - - // test sur les settings obligatoires - if (!settings.url) { - throw new Error("missing parameter : url is not defined !"); - } - - if (!settings.method) { - throw new Error("missing parameter : method is not defined !"); - } - - if (!settings.format) { - settings.format = "text"; // reponse brute ! - } - - var options = {}; - options.url = settings.url; - options.data = settings.data ? settings.data : null; - options.method = settings.method; - options.timeOut = settings.timeOut || 0; - options.scope = settings.scope || this; - options.proxy = settings.proxy || null; - options.content = settings.content || null; - options.headers = settings.headers || { - referer : "http://localhost" - }; - - // test sur les valeurs de 'settings.method' - switch (settings.method) { - case "DELETE": - case "GET": - break; - case "PUT": - case "POST": - // on force sur ces params spécifiques au mode POST - options.content = settings.content ? settings.content : "application/x-www-form-urlencoded"; // FIXME en attente des services : bascule en "application/xml" ou "application/json" - options.headers = settings.headers ? settings.headers : { referer : "http://localhost" }; // FIXME parametrable... - break; - case "HEAD": - case "OPTIONS": - throw new Error("HTTP method not yet supported !"); - default: - throw new Error("HTTP method unknown !"); - } - - // test sur les valeurs de 'settings.format' - switch (settings.format) { - case "text": - this.__call(options) - .then(function (response) { - logger.trace(response); - settings.onResponse.call(this, response); - }) - .catch(function (error) { - settings.onFailure.call(this, error); - }); - break; - case "json": - this.__callJSON(options) - .then(function (response) { - logger.trace(response); - settings.onResponse.call(this, response); - }) - .catch(function (error) { - settings.onFailure.call(this, error); - }); - break; - case "xml": - this.__callXML(options) - .then(function (response) { - logger.trace(response); - settings.onResponse.call(this, response); - }) - .catch(function (error) { - settings.onFailure.call(this, error); - }); - break; - default: - throw new Error("This output Format is not yet supported !"); - } - }, - - /** - * Requete - * - * @method __call - * @private - * @param {Object} options - options - * @return {Object} promise - */ - __call : function (options) { - var logger = Logger.getLogger("XHR"); - logger.trace("[XHR::__call()]"); - - var promise = new Promise( - function (resolve, reject) { - // traitement du corps de la requête - var corps = (options.method === "POST" || options.method === "PUT") ? 1 : 0; - - // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères) - if (options.data && ((typeof options.data === "object" && Object.keys(options.data).length) || (typeof options.data === "string" && options.data.length)) && !corps) { - if (options.scope.CLASSNAME === "Geocode" || options.scope.CLASSNAME === "ReverseGeocode") { - options.url = options.url + options.data; - } else { - options.url = Helper.normalyzeUrl(options.url, options.data); - } - } - - logger.trace("URL = ", options.url); - - var hXHR = null; - - // test on env. nodejs or browser - if (typeof window === "undefined") { - var nodefetch = require("node-fetch"); - - var opts = { - headers : { - Referer : "https://localhost" - } - }; - - if (options.data && typeof options.data === "string" && corps) { - opts = { - method : options.method, - body : options.data, - headers : { - "Content-Type" : options.content, - Referer : "https://localhost" - } - }; - } - - return nodefetch(options.url, opts) - .then(function (response) { - if (response.ok) { // res.status >= 200 && res.status < 300 - resolve(response.text()); - } else { - var message = "Errors Occured on Http Request (status : '" + response.statusText + "' | url : '" + response.url + "')"; - var status = response.status; - reject({ - message : message, - status : status - }); - } - }) - .catch(function (e) { - reject({ - message : e, - status : -1 - }); - }); - } else { - if (window.XMLHttpRequest) { - logger.trace("XMLHttpRequest"); - - hXHR = new XMLHttpRequest(); - hXHR.open(options.method, options.url, true); // async - hXHR.overrideMimeType = options.content; - - // gestion du timeout - var onTimeOutTrigger = null; - if (options.timeOut > 0) { - // FIXME le timeout interne ne me permet pas de declencher le bon message... - // hXHR.timeout = options.timeOut; - logger.trace("XHR - TimeOut actif !"); - /** - * Description - * - * @method onTimeOutTrigger - * @private - */ - onTimeOutTrigger = window.setTimeout( - function () { - var message = "TimeOut Occured on Http Request with XMLHttpRequest !"; - reject({ - message : message, - status : -1 - }); - }, options.timeOut); - } - - if (corps) { - // headers, data, content of data - // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader - logger.trace("data = ", options.data); - hXHR.setRequestHeader("Content-type", options.content); - // FIXME refused to set unsafe header content-length javascript - // hXHR.setRequestHeader ("Content-length", options.data.length); - // hXHR.setRequestHeader ("Referer", options.headers.referer); - } - - /** - * On Error - * FIXME ne se declenche pas !? - * - * @param {Object} e - Event - * @method onerror - * @private - */ - hXHR.onerror = function (e) { - console.log(e); - reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * On Timeout - * FIXME ne se declenche pas !? - * - * @param {Object} e - Event - * @method ontimeout - * @private - */ - hXHR.ontimeout = function (e) { - console.log(e); - reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * Description - * - * @method onreadystatechange - * @private - */ - hXHR.onreadystatechange = function (e) { - if (hXHR.readyState === 4) { // DONE - if (hXHR.status === 200) { - window.clearTimeout(onTimeOutTrigger); - resolve(hXHR.response); - } else { - var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "' | response : '" + e.target.response + "')"; - var status = e.target.status; - reject({ - message : message, - status : status - }); - } - } - }; - - // gestion du content data - var data4xhr = (options.data && corps) ? options.data : null; - - hXHR.send(data4xhr); - } else if (window.XDomainRequest) { - // worked in Internet Explorer 8–10 only ! - logger.trace("XDomainRequest"); - - hXHR = new XDomainRequest(); - hXHR.open(options.method, options.url); - - hXHR.overrideMimeType = options.content; - - if (options.timeOut > 0) { - hXHR.timeout = options.timeout; - logger.trace("XHR - TimeOut actif !"); - } - - if (corps) { - // headers, data, content of data - // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader - hXHR.setRequestHeader("Content-type", options.content); - // FIXME refused to set unsafe header content-length javascript - // hXHR.setRequestHeader ("Content-length", options.data.length); - // hXHR.setRequestHeader ("Referer", options.headers.referer); - } - - /** - * Description - * - * @method onerror - * @private - */ - hXHR.onerror = function () { - reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * Description - * - * @method ontimeout - * @private - */ - hXHR.ontimeout = function () { - reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); - }; - - /** - * On Load - * - * @method onload - * @private - */ - hXHR.onload = function (e) { - if (hXHR.status === 200) { - resolve(hXHR.responseText); - } else { - var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "')"; - var status = e.target.status; - reject({ - message : message, - status : status - }); - } - }; - - var data4xdr = (options.data && corps) ? options.data : null; - - hXHR.send(data4xdr); - } else { - throw new Error("CORS not supported"); - } - } - } - ); - - return promise; - }, - - /** - * Requete avec parser JSON - * - * @method __callJSON - * @private - * @param {Object} options - options - * @return {Object} promise - */ - __callJSON : function (options) { - return this.__call(options) - .then(JSON.parse) - .catch(function (error) { - console.log("_callJSON failed on : ", options.url, error); - // FIXME pas d'exception, laissons le fil se derouler... - // throw error; - }); - }, - - /** - * Requete avec parser XML - * - * @method __callXML - * @private - * @param {Object} options - options - * @return {Object} promise - */ - __callXML : function (options) { - return this.__call(options) - .then(function (response) { - var xmlDoc; - - // test on env. nodejs or browser - if (typeof window === "undefined") { - var DOMParser = require("xmldom").DOMParser; // __xmldom.DOMParser - xmlDoc = new DOMParser().parseFromString(response, "text/xml"); - } else { - if (window.DOMParser) { - var parser = new window.DOMParser(); - xmlDoc = parser.parseFromString(response, "text/xml"); - } else { // IE - xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.async = false; - xmlDoc.loadXML(response); - } - } - - return xmlDoc; - }) - .catch(function (error) { - console.log("__callXML failed on : ", options.url, error); - // FIXME pas d'exception, laissons le fil se derouler... - // throw error; - }); - } - -}; - -export default XHR; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js deleted file mode 100644 index 9f420443..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js +++ /dev/null @@ -1,253 +0,0 @@ - -import Logger from "../../Utils/LoggerByDefault"; -import _ from "../../Utils/MessagesResources"; -import ErrorService from "../../Exceptions/ErrorService"; -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import AltiRequestFactory from "./Request/AltiRequestFactory"; -import AltiResponseFactory from "./Response/AltiResponseFactory"; - -/** - * @classdesc - * - * Appel du service d'altimétrie du Géoportail - * - * @todo gestion du parma. output et callback - * @todo outputFormat (REST) et format (WPS) - * @todo La reponse JSON peut encapsuler un XML ! - * - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.Alti - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {Array.} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84) - * dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil). - * Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants. - * Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine). - * Maximum 50 éléments. - * - * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'. - * Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST, - * ou la valeur du paramètre 'format' dans le cas de la norme WPS. - * Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST, - * pour connaître le format dans lequel sera fournie la réponse (pour son traitement). - * Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'. - * - * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000. - * A spécifier lorsqu'on souhaite accéder à cette fonctionnalité. - * Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique - * le long duquel le profil doit être calculé. - * Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis, - * c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis). - * Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points). - * - * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS). - * Par défaut, on utilise l'API REST. - * - * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'. - * Vaut 'false' par défaut. - * - * @param {String} [options.resource] - Resource utilisée pour réaliser le calcul. - * - * @example - * var options = { - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * positions : [{lon:, lat:}, {lon:, lat:}], - * outputFormat : 'json' // json|xml - * sampling : 3, - * api : 'REST', // REST|WPS - * zonly : false // false|true, - * resource : "resource-par-defaut" - * }; - * - */ -function Alti (options) { - if (!(this instanceof Alti)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Alti")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "Alti"; - - // appel du constructeur par heritage - CommonService.apply(this, arguments); - - this.logger = Logger.getLogger("Gp.Services.Alti"); - this.logger.trace("[Constructeur Alti (options)]"); - - // ##################### - // analyse des options - // ##################### - - if (!options.positions) { - throw new Error(_.getMessage("PARAM_MISSING", "positions")); - } - - if (options.positions.length === 0) { - throw new Error(_.getMessage("PARAM_EMPTY", "positions")); - } - - // ajout des options spécifiques au service - this.options.positions = options.positions; - - // format de réponse du service : "json" ou "xml" (valeur par défaut), en minuscule ! - this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "xml"; - - // ressource utilisée pour le calcul altimétrique - this.options.resource = options.resource || "rge_alti_corse2a_float32_zip_lamb93"; - - // sampling - this.options.sampling = options.sampling || null; - - // type d'api utilisé pour requeter le service, en majuscule ! - this.options.api = (typeof options.api === "string") ? options.api.toUpperCase() : "REST"; - - // l'api ne peut être interrogée qu'en GET. - if (this.options.api === "REST") { - this.options.httpMethod = "GET"; - } - - // param. zonly - this.options.zonly = options.zonly || false; - - // param. measures - this.options.measures = options.measures || false; - - // gestion de l'url du service par defaut - // si l'url n'est pas renseignée, il faut utiliser les urls par defaut - // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat) - // ainsi que sur le type de service (profil ou elevation) - if (!this.options.serverUrl) { - // Code commenté pour Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti - /* var lstUrlByDefault = DefaultUrlService.Alti.newUrl(); - if (this.options.oldAltiService) { - lstUrlByDefault = DefaultUrlService.Alti.url(); - } */ - // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti - var lstUrlByDefault = DefaultUrlService.Alti.url(); - var urlFound = null; - switch (this.options.api) { - case "WPS": - urlFound = lstUrlByDefault.wps; - break; - case "REST": - var key = (options.sampling ? "profil" : "elevation") + "-" + this.options.outputFormat; - urlFound = lstUrlByDefault[key]; - break; - default: - throw new Error(_.getMessage("PARAM_UNKNOWN", "api")); - } - - if (!urlFound) { - throw new Error("Url by default not found !"); - } - this.options.serverUrl = urlFound; - this.logger.trace("Server URL by default : " + this.options.serverUrl); - } - - // gestion du type de service - // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat) - var idx = this.options.serverUrl.lastIndexOf("."); - if (idx !== -1) { - var extension = this.options.serverUrl.substring(idx + 1); - if (extension && extension.length < 5) { // FIXME extension de moins de 4 car. ... - this.logger.trace("Server Extension URL : " + extension); - switch (extension.toLowerCase()) { - case "json": - case "xml": - this.options.outputFormat = extension.toLowerCase(); - break; - default: - throw new Error("type of service : unknown or unsupported (json or xml) !"); - } - } - } -} - -/** - * @lends module:Alti# - */ -Alti.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/** - * Constructeur (alias) - */ -Alti.prototype.constructor = Alti; - -/** - * Création de la requête (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Alti.prototype.buildRequest = function (error, success) { - // utilisation en mode callback - var options = { - httpMethod : this.options.httpMethod, - // callback - onSuccess : function (result) { - // sauvegarde de la requete ! - this.request = result; - success.call(this, this.request); - }, - onError : error, - scope : this, - // spécifique au service : - resource : this.options.resource, - positions : this.options.positions, - outputFormat : this.options.outputFormat, - sampling : this.options.sampling, - api : this.options.api, - zonly : this.options.zonly, - measures : this.options.measures - }; - - AltiRequestFactory.build(options); -}; - -/** - * Analyse de la reponse (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Alti.prototype.analyzeResponse = function (error, success) { - // INFO - // Factory pour masquer la complexité du retour du service qui renvoie soit - // - une 'string' qui contient du XML ou JSON natif en mode XHR - // - un objet JSON qui est natif ou encapsulé - - if (this.response) { - var options = { - response : this.response, - outputFormat : this.options.outputFormat, // utile pour parser la string en mode XHR : JSON ou XML ! - rawResponse : this.options.rawResponse, - onError : error, - onSuccess : success, - scope : this - }; - - AltiResponseFactory.build(options); - } else { - error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -export default Alti; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js deleted file mode 100644 index 6296e231..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js +++ /dev/null @@ -1,391 +0,0 @@ - -/** - * Fonction retournant un objet contenant des clés de lecture (readers) - * qui permettent de parser des réponses XML du service Altimétrique du Géoportail - * (calcul altimétrique simple ou profil altimétrique d'une courbe), - * lorsque le paramètre output = xml, - * afin de récupérer les élévations retournées. - * - * @module AltiResponseReader - * @alias Gp.Services.Alti.Formats.AltiResponseReader - * @private - */ - -// import Logger from "../../../Utils/LoggerByDefault"; -import AltiResponse from "../Response/model/AltiResponse"; -import Elevation from "../Response/model/Elevation"; -import Measure from "../Response/model/Measure"; - -/** - * - * Objet AltiResponseReader - * - * @member {Object} AltiResponseReader - * - * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers" - * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire - * et la valeur associée est une fonction (node, data) - * où node est un noeud du document DOM - * et data est un objet où l'on stocke les informations lues dans le XML. - * - * @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud "elevations" de la réponse XML - * du service alti, correspondant logiquement à la racine du document - * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) - * - * @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud "elevation" de la réponse xml du service alti. - * (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc) - * - * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud "lat" de la réponse xml du service alti. - * (contient une valeur de latitude, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud "lon" de la réponse xml du service alti. - * (contient une valeur de longitude, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud "z" de la réponse xml du service alti. - * (contient une valeur d'altitude, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud "acc" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud "measures" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud "source_name" de la réponse xml du service alti. - * (pour remplir l'éventuel objet measure) - * - * @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud "source_mesure" de la réponse xml du service alti. - * (pour remplir l'éventuel objet measure) - * - * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. - * - * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud "Exception" de la réponse xml du service alti. - * - * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, - * à l'aide des readers de la classe. - * - */ -var AltiResponseReader = {}; - -AltiResponseReader.READERS = { - - /** - * Lecture d'un noeud "elevations" de la réponse XML du service alti, correspondant logiquement à la racine du document - * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) - * - * @param {DOMElement} root - racine de la réponse XML - * @static - * @memberof AltiResponseReader - * @returns {Object} Retourne un objet de type AltiResponse - */ - elevations : function (root) { - // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir. - var altiResponse = new AltiResponse(); - - if (root.hasChildNodes()) { - var children = root.childNodes; - var child; - var elevation; - - for (var i = 0; i < children.length; i++) { - child = children[i]; - - if (AltiResponseReader.READERS[child.nodeName]) { - elevation = AltiResponseReader.READERS[child.nodeName](child); - altiResponse.elevations.push(elevation); - } - } - } - - return altiResponse; - }, - - /** - * Lecture d'un noeud "elevation" de la réponse xml du service alti. - * (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures) - * - * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures]) - * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse - * @static - * @memberof AltiResponseReader - */ - elevation : function (node) { - var elevation = new Elevation(); - - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (AltiResponseReader.READERS[child.nodeName]) { - // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. - AltiResponseReader.READERS[child.nodeName](child, elevation); - } - } - } - return elevation; - }, - - /** - * Lecture d'un noeud "lat" de la réponse xml du service alti. - * (contient une valeur de latitude, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la latitude - * @param {Object} elevation - objet dans lequel stocker la latitude retournée - * @static - * @memberof AltiResponseReader - */ - lat : function (node, elevation) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - elevation.lat = parseFloat(textNode.nodeValue); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente"); - } - }, - - /** - * Lecture d'un noeud "lon" de la réponse xml du service alti. - * (contient une valeur de longitude, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la longitude - * @param {Object} elevation - objet dans lequel stocker la longitude retournée - * @static - * @memberof AltiResponseReader - */ - lon : function (node, elevation) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - elevation.lon = parseFloat(textNode.nodeValue); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente"); - } - }, - - /** - * Lecture d'un noeud "z" de la réponse xml du service alti. - * (contient une valeur d'altitude, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer l'altitude - * @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure - * @static - * @memberof AltiResponseReader - */ - z : function (node, elevationObject) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - if (elevationObject) { - elevationObject.z = parseFloat(textNode.nodeValue); - } else { - elevationObject = new Elevation(); - elevationObject.z = parseFloat(textNode.nodeValue); - return elevationObject; - } - } else { - throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente"); - } - }, - - /** - * Lecture d'un noeud "acc" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure - * @static - * @memberof AltiResponseReader - */ - acc : function (node, elevationObject) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - elevationObject.acc = parseFloat(textNode.nodeValue); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente"); - } - }, - - /** - * Lecture d'un noeud "source_name" de la réponse xml du service alti. - * (contient le nom de la source, qui est un string) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} measure - objet dans lequel stocker le nom de la source retourné - * @static - * @memberof AltiResponseReader - */ - source_name : function (node, measure) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - measure.source_name = textNode.nodeValue; - } else { - throw new Error("Erreur dans la lecture de la réponse du service : source_name attendue mais absente"); - } - }, - - /** - * Lecture d'un noeud "source_measure" de la réponse xml du service alti. - * (contient le nom de la mesure, qui est un string) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} measure - objet dans lequel stocker le nom de la source retourné - * @static - * @memberof AltiResponseReader - */ - source_measure : function (node, measure) { - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - measure.source_measure = textNode.nodeValue; - } else { - throw new Error("Erreur dans la lecture de la réponse du service : source_measure attendue mais absente"); - } - }, - - /** - * Lecture d'un noeud "measures" et de ses enfants "measure" de la réponse xml du service alti. - * (contient une valeur de précision, qui est un flottant) - * - * @param {DOMElement} node - noeud à lire pour récupérer la précision - * @param {Object} elevation - objet dans lequel stocker la précision retournée - * @static - * @memberof AltiResponseReader - */ - measures : function (node, elevation) { - elevation.measures = []; - var measure; - if (node.hasChildNodes()) { - var children = node.childNodes; - var measureNode; - var measureChildren; - for (var i = 0; i < children.length; i++) { - measure = new Measure(); - measureNode = children[i]; - measureChildren = measureNode.childNodes; - for (var j = 0; j < measureChildren.length; j++) { - if (AltiResponseReader.READERS[measureChildren[j].nodeName]) { - // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. - AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure); - } else { - throw new Error("Erreur dans la lecture de la réponse du service : measures attendues mais absentes"); - } - } - elevation.measures.push(measure); - } - } - }, - - /** - * Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. - * - * @param {DOMElement} node - noeud à lire pour récupérer l'exception - * @return {Object} exceptionReport - objet contenant l'exception - * @static - * @memberof AltiResponseReader - */ - exceptionreport : function (node) { - var response = {}; - - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (child.nodeName === "Exception") { - response.exceptionReport = AltiResponseReader.READERS.exception(child); - } - } - } - - return response; - }, - - /** - * Lecture d'un noeud "Exception" de la réponse xml du service alti. - * - * @param {DOMElement} node - noeud à lire pour récupérer l'exception - * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs : - * {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception - * {String} exceptionReport.exception - qui contient le message de l'exception - * @static - * @memberof AltiResponseReader - */ - exception : function (node) { - var exceptionReport = {}; - - // get exception code - var exceptionCode = node.getAttribute("exceptionCode"); - if (exceptionCode) { - exceptionReport.exceptionCode = exceptionCode; - } - - // get exception message - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - exceptionReport.exception = textNode.nodeValue; - } - - return exceptionReport; - }, - - /** - * Lecture d'un noeud "Error" de la réponse xml du service alti. - * - * @param {DOMElement} node - noeud à lire pour récupérer l'exception - * @return {Object} error - objet contenant l'exception - * @static - */ - error : function (node) { - var response = { - error : {} - }; - // get error code and description - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - var textNode; - // get error code - if (child.nodeType === 1 && child.nodeName === "code") { // 1 === node.ELEMENT_NODE - textNode = child.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - response.error.code = textNode.nodeValue; - } - } - // get error description - if (child.nodeType === 1 && child.nodeName === "description") { // 1 === node.ELEMENT_NODE - textNode = child.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - response.error.description = textNode.nodeValue; - } - } - } - } - return response; - } - -}; - -/** - * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, - * à l'aide des readers de la classe. - * - * @method AltiResponseReader.read - * @param {DOMElement} root - racine de la réponse XML à lire - * @static - * @memberof AltiResponseReader - */ -AltiResponseReader.read = function (root) { - if (root.nodeName === "elevations") { - var altiResponse = AltiResponseReader.READERS.elevations(root); - return altiResponse; - } else if (root.nodeName === "ExceptionReport") { - var exceptionReport = AltiResponseReader.READERS.exceptionreport(root); - return exceptionReport; - } else if (root.nodeName === "error") { - var error = AltiResponseReader.READERS.error(root); - return error; - } else { - throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu."); - } -}; - -export default AltiResponseReader; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js deleted file mode 100644 index a6aa4c89..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Creation d'une requête en REST ou WPS - * (Factory) - * - * @module AltiRequestFactory - * @alias Gp.Services.Alti.Request.AltiRequestFactory - * @private - */ -import Logger from "../../../Utils/LoggerByDefault"; -import ErrorService from "../../../Exceptions/ErrorService"; -import AltiRequestREST from "./AltiRequestREST"; -import AltiRequestWPS from "./AltiRequestWPS"; - -var AltiRequestFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Alti - * - * @example - * var options = { - * httpMethod : 'GET', // GET|POST - * onSuccess : function (response) {}, - * onError : function (error) {}, - * scope : this, - * positions : [{lon:, lat:}, {lon:, lat:}], - * outputFormat : 'json' // json|xml - * sampling : 3, - * api : 'REST', // REST|WPS - * zonly : false // false|true - * }; - * - */ - build : function (options) { - // logger - var logger = Logger.getLogger("AltiRequestFactory"); - logger.trace(["AltiRequestFactory::build()"]); - - var request = null; - - // on factorise les options par groupe; - // - global, - // - param, les params pour les data inputs - // - wps, les param du service - // - callback - - var settings = { - // ajout des valeurs par defaut spécifiques au service - type : options.sampling ? "Profil" : "Elevation", - method : options.httpMethod, - param : { - positions : null, - delimiter : null, // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !? - indent : null, // par defaut - crs : null, // par defaut - format : null, // (only to POST) - sampling : null, // (only use by Profil) - zonly : null, // (only use by Elevation) - measures : null // (only use by Elevation) - } - }; - - // surcharge des valeurs obligatoires - settings.param.positions = options.positions; - settings.param.format = options.outputFormat; - settings.param.sampling = options.sampling; - settings.param.zonly = options.zonly; - settings.param.measures = options.measures; - settings.param.resource = options.resource; - - // gestion des callback - var bOnError = !!(options.onError !== null && typeof options.onError === "function"); // cast variable to boolean - var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); - - var message = null; - switch (options.api) { - case "REST": - // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! - var myReq = new AltiRequestREST(settings); - if (!myReq.processRequestString()) { - message = "Error in process request (rest) !"; - if (bOnError) { - options.onError.call(options.scope, new ErrorService(message)); - return; - } - throw new Error(message); - } - request = myReq.requestString; - break; - case "WPS": - // ajout des valeurs par defaut spécifiques au service WPS - settings.wps = { - service : null, // par defaut - version : null, // par defaut - identifier : null, // par defaut - rawdataoutput : null, // par defaut - request : null // par defaut - }; - - request = AltiRequestWPS.build(settings); - if (!request) { - message = "Error in process request (wps) !"; - if (bOnError) { - options.onError.call(options.scope, new ErrorService(message)); - return; - } - throw new Error(message); - } - break; - default: - message = "Type of API is not supported by service (REST or WPS) !"; - if (bOnError) { - options.onError.call(options.scope, new ErrorService(message)); - return; - } - throw new Error(message); - } - - if (bOnSuccess) { - options.onSuccess.call(options.scope, request); - } - - return request; - } -}; - -export default AltiRequestFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js deleted file mode 100644 index 1fe1fa77..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js +++ /dev/null @@ -1,209 +0,0 @@ -/* jshint multistr : true */ - -import Logger from "../../../Utils/LoggerByDefault"; -import _ from "../../../Utils/MessagesResources"; -import AltiElevationRequest from "./model/AltiElevationRequest"; -import AltiProfilRequest from "./model/AltiProfilRequest"; - -/** - * @classdesc - * Classe de gestion des requêtes de type REST sur le service altimetrique. - * - * @todo Le service Alti n'implemente pas le POST !? - * @constructor - * @alias Gp.Services.Alti.Request.AltiRequestREST - * @param {Object} options - options - * @param {Object} options.param.positions - tableau de coordonnées lon/lat - * @param {String} options.param.delimiter - '|' - * @param {Boolean} options.param.indent - false|true - * @param {String} options.param.crs - 'CRS:84' - * @param {String} options.param.sampling - 3 - * @param {String} options.param.resource - 'rge_alti_corse2a_float32_zip_lamb93' - * @param {Boolean} options.param.zonly - false|true - * @param {Boolean} options.param.measures - false|true - * @param {String} options.param.format - "JSON|XML" - * @param {String} options.type - "Profil|Elevation" - * @param {String} options.method - GET|POST - * - * @example - * var options = { - * type : 'Profil', // Elevation - * method : 'GET', // par defaut - * param : { - * positions : [ - * {lon:'1.11', lat:'1.11'}, - * {lon:'1.10', lat:'1.10'}, - * {lon:'1.12', lat:'1.12'} - * ], - * delimiter : ";", // par defaut - * indent : true, // par defaut - * crs : 'EPSG:4326', // par defaut - * format : 'json', // par defaut (only to POST) - * sampling : 3 , // par defaut (only use by Profil) - * zonly : false // par defaut (only use by Elevation) - * measures : false // par defaut (only use by Elevation) - * } - * }; - * - * var result; - * try { - * var obj = new AltiRequestREST (options); - * if (! obj.processRequestString ()) { - * throw new Error("Request empty !?") - * } - * result = obj.requestString; - * } catch (e) { - * // exceptions... - * } - * @private - */ -function AltiRequestREST (options) { - this.logger = Logger.getLogger("AltiRequestREST"); - this.logger.trace("[Constructeur AltiRequestREST ()]"); - - if (!(this instanceof AltiRequestREST)) { - throw new TypeError("AltiRequestREST constructor cannot be called as a function."); - } - - this.options = options || {}; - - // existance des options - if (!this.options) { - throw new Error(_.getMessage("PARAM_EMPTY", "options")); - } - - // type de requete : Altitude ou Profil - // (param. à determiner en fonction des parametres d'entrée) - if (!this.options.type) { - throw new Error(_.getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); - } - - // construction du modele de requête - // (test du type d'objet candidat) - this.DataObject = null; - switch (this.options.type) { - case "Elevation": - this.DataObject = new AltiElevationRequest(this.options.param); - break; - case "Profil": - this.DataObject = new AltiProfilRequest(this.options.param); - break; - default: - throw new Error(_.getMessage("PARAM_TYPE", "type (Elevation or Profil)")); - } - - /** - * methode. - * Par defaut, "GET". - */ - this.method = this.options.method || "GET"; -} - -AltiRequestREST.prototype = { - - /** - * request - * @type {String} - */ - requestString : null, - - /** - * Constructeur (alias) - */ - constructor : AltiRequestREST, - - /** - * Template de la requête. - */ - template : { - get : { - // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__' - value : "lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'&resource=__RESOURCE__&measures=__MEASURES__", - input : { - point : "&zonly=__ZONLY__", - profil : "&sampling=__SAMPLING__" - } - }, - post : { - // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\n\ - value : "lon=__LON__\n" + - "lat=__LAT__\n" + - "indent=__INDENT__\n" + - "crs='__CRS__'\n" + - "resource='__RESOURCE__'\n" + - "measures='__MEASURES__'\n", - input : { - point : "zonly=__ZONLY__\n", - profil : "sampling=__SAMPLING__" - } - } - }, - - /** - * Construction de la requête. - * - * @example - * // GET out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84' - * // POST out : Not yet supported method POST ! - * @returns {String} - */ - processRequestString : function () { - this.logger.trace("AltiRequestREST::processRequestString ()"); - - var template = ""; - if (this.method === "POST") { - template = this.template.post.value; - } else if (this.method === "GET") { - template = this.template.get.value; - } - - template = template.replace(/__LON__/g, this.DataObject.getLon()); - template = template.replace(/__LAT__/g, this.DataObject.getLat()); - // FIXME on retire le param 'delimiter' - // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter); - template = template.replace(/__INDENT__/g, this.DataObject.indent); - template = template.replace(/__CRS__/g, this.DataObject.crs); - template = template.replace(/__RESOURCE__/g, this.DataObject.resource); - template = template.replace(/__MEASURES__/g, this.DataObject.measures); - - // ajout + - template = template + this.__addDataInputs(); - this.logger.trace("traduction tmpl", template); - - // sauvegarde - this.requestString = template; - - return this.requestString; - }, - - /** - * Ajout de parametres spécifiques (ex. zonly) - * - * @returns {String} - */ - __addDataInputs : function () { - this.logger.trace("AltiRequestREST::addDataInput ()"); - - var myTemplate; - if (this.method === "POST") { - myTemplate = this.template.post; - } else if (this.method === "GET") { - myTemplate = this.template.get; - } else { - throw new Error("No other HTTP method supported by the service !"); - } - - var tmpl = null; - if (this.DataObject.CLASSNAME === "AltiElevationRequest") { - tmpl = myTemplate.input.point; - return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly.toString()); - } else if (this.DataObject.CLASSNAME === "AltiProfilRequest") { - tmpl = myTemplate.input.profil; - return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling); - } else { - throw new Error("No other object supported than elevation or profil !?"); - } - } -}; - -export default AltiRequestREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js deleted file mode 100644 index f366c891..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Classe d'interface des requêtes de type WPS sur le service altimetrique. - * (Factory) - * - * @module Gp.Services.Alti.Request.AltiRequestWPS - * @alias Gp.Services.Alti.Request.AltiRequestWPS - * @private - */ -import Logger from "../../../Utils/LoggerByDefault"; -import _ from "../../../Utils/MessagesResources"; -import WPS from "../../../Formats/WPS"; -import AltiElevationRequest from "./model/AltiElevationRequest"; -import AltiProfilRequest from "./model/AltiProfilRequest"; - -var AltiRequestWPS = { - - /** - * Interface unique de construction de la requête. - * - * @method build - * @param {Object} options - options - * @param {Object} options.param.positions - tableau de coordonnées lon/lat - * @param {String} options.param.delimiter - '|' - * @param {Boolean} options.param.indent - false|true - * @param {String} options.param.crs - 'CRS:84' - * @param {String} options.param.sampling - 3 - * @param {Boolean} options.param.zonly - false|true - * @param {String} options.param.format - "JSON|XML" (only to POST) - * @param {String} options.wps.service - "WPS" - * @param {String} options.wps.version - "1.0.0" - * @param {String} options.wps.identifier - "gs:WPSElevation|gs:WPSLineElevation" - * @param {String} options.wps.rawdataoutput - "result" - * @param {String} options.wps.request - "Execute" - * @param {String} options.type - "Profil|Elevation" - * @param {String} options.method - GET|POST - * @example - * var options = { - * type : 'Profil', // Elevation - * method : 'GET', // par defaut - * param : { - * positions : [ - * {lon:'1.11', lat:'1.11'}, - * {lon:'1.10', lat:'1.10'}, - * {lon:'1.12', lat:'1.12'} - * ], - * delimiter : ";", // par defaut - * indent : true, // par defaut - * crs : 'EPSG:4326', // par defaut - * format : 'json', // par defaut (only to POST) - * sampling : 3 , // par defaut (only use by Profil) - * zonly : false, // par defaut (only use by Elevation) - * }, - * wps : { - * service : 'WPS', // par defaut - * version : '1.0.0', // par defaut - * identifier : 'gs:WPS', // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation - * rawdataoutput : 'result',// par defaut - * request : 'Execute' // par defaut - * } - * }; - */ - build : function (options) { - // logger - var logger = Logger.getLogger("AltiRequestWPS"); - logger.trace(["AltiRequestWPS::build()"]); - - // existance des options - if (!options) { - throw new Error(_.getMessage("PARAM_EMPTY", "options")); - } - - // type de requete : Altitude ou Profil - // (param. à determiner en fonction des parametres d'entrée) - if (!options.type) { - throw new Error(_.getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); - } - - // construction du modele de requête - // (test du type d'objet candidat) - var DataObject = null; - switch (options.type) { - case "Elevation": - // surcharge - options.wps.identifier = "gs:WPSElevation"; - DataObject = new AltiElevationRequest(options.param); - break; - case "Profil": - // surcharge - options.wps.identifier = "gs:WPSLineElevation"; - DataObject = new AltiProfilRequest(options.param); - break; - default: - throw new Error(_.getMessage("PARAM_TYPE", "type (Elevation or Profil)")); - } - - // construction de la requête WPS - var settings = { - data : DataObject, - method : options.method, - param : options.wps - }; - - var rqstWPS = new WPS(settings); - - if (!rqstWPS.processRequestString()) { - throw new Error("Enable to process request !"); - } - - return rqstWPS.requestString; - } -}; - -export default AltiRequestWPS; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js deleted file mode 100644 index 7c6b6460..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js +++ /dev/null @@ -1,108 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; -import AltiRequest from "./AltiRequest"; - -/** - * @classdesc - * - * Classe de gestion des param. des requêtes de type POINT du service altimetrique. - * - * @constructor - * @alias Gp.Services.Alti.Request.AltiElevationRequest - * @param {Object} options - options - * @param {Boolean} options.zonly - false|true - * - * @private - */ -function AltiElevationRequest (options) { - if (!(this instanceof AltiElevationRequest)) { - throw new TypeError("AltiElevationRequest constructor cannot be called as a function."); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "AltiElevationRequest"; - - // appel du constructeur par heritage - AltiRequest.apply(this, arguments); - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur AltiElevationRequest ()]"); - - /** - * Z uniquement. - * true|false - */ - this.zonly = this.options.zonly || false; // test des options héritées ! -} - -/** - * @lends module:AltiElevationRequest# - */ - -AltiElevationRequest.prototype = Object.create(AltiRequest.prototype, { - - /** - * Setter/getter pour "zonly" - */ - zonly : { - /** getter */ - get : function () { - return this._zonly; - }, - /** setter */ - set : function (z) { - this._zonly = z; - } - } - -}); - -/** - * Constructeur (alias) - */ -AltiElevationRequest.prototype.constructor = AltiElevationRequest; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Array} - */ -AltiElevationRequest.prototype.getData = function () { - // par glop..., appel de AltiRequest::getData () ! - var map = []; - map.push({ - k : "lon", - v : this.getLon() - }); - map.push({ - k : "lat", - v : this.getLat() - }); - // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" - map.push({ - k : "indent", - v : this.indent - }); - map.push({ - k : "crs", - v : this.crs - }); - map.push({ - k : "zonly", - v : this.zonly - }); - map.push({ - k : "format", - v : this.format - }); - map.push({ - k : "resource", - v : this.resource - }); - - return map; -}; - -export default AltiElevationRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js deleted file mode 100644 index bb50ae89..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js +++ /dev/null @@ -1,106 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; -import AltiRequest from "./AltiRequest"; - -/** - * @classdesc - * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique. - * - * @constructor - * @alias Gp.Services.Alti.Request.AltiProfilRequest - * @param {Object} options - options - * @param {String} options.sampling - 3 - * - * @private - */ -function AltiProfilRequest (options) { - if (!(this instanceof AltiProfilRequest)) { - throw new TypeError("AltiProfilRequest constructor cannot be called as a function."); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "AltiProfilRequest"; - - // appel du constructeur par heritage - AltiRequest.apply(this, arguments); - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur AltiProfilRequest ()]"); - - /** - * Sampling - * Par defaut, 3 - */ - this.sampling = this.options.sampling || 3; // test des options héritées ! -} - -/** - * @lends module:AltiProfilRequest# - */ - -AltiProfilRequest.prototype = Object.create(AltiRequest.prototype, { - - /** - * Setter/getter pour "sampling" - */ - sampling : { - /** getter */ - get : function () { - return this._sampling; - }, - /** setter */ - set : function (value) { - this._sampling = value; - } - } -}); - -/** - * Constructeur (alias) - */ -AltiProfilRequest.prototype.constructor = AltiProfilRequest; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Object[]} - */ -AltiProfilRequest.prototype.getData = function () { - // par glop..., appel de AltiRequest::getData () ! - var map = []; - map.push({ - k : "lon", - v : this.getLon() - }); - map.push({ - k : "lat", - v : this.getLat() - }); - // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" - map.push({ - k : "indent", - v : this.indent - }); - map.push({ - k : "crs", - v : this.crs - }); - map.push({ - k : "sampling", - v : this.sampling - }); - map.push({ - k : "format", - v : this.format - }); - map.push({ - k : "resource", - v : this.resource - }); - - return map; -}; - -export default AltiProfilRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js deleted file mode 100644 index 13029882..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js +++ /dev/null @@ -1,220 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * Classe de gestion des param. des requêtes du service altimetrique. - * - * @constructor - * @alias Gp.Services.Alti.Request.AltiRequest - * @param {Object} options - options - * @param {Object} options.positions - tableau de coordonnées lon/lat - * @param {String} options.delimiter - "|" - * @param {Boolean} options.indent - false|true - * @param {String} options.crs - "CRS:84" - * @param {String} options.format - "JSON|XML" - * - * @private - */ -function AltiRequest (options) { - if (!(this instanceof AltiRequest)) { - throw new TypeError("AltiRequest constructor cannot be called as a function."); - } - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur AltiRequest ()]"); - - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - /** - * Liste des coordonnées. - * @example - * var c = [{lon : "", lat : ""}, {lon : "", lat : ""}]; - */ - this.positions = this.options.positions || []; - - /** - * Caractère de séparation. - * Par defaut, "|". - */ - this.delimiter = this.options.delimiter || "|"; - - /** - * Indentation. - * true|false - */ - this.indent = this.options.indent || false; - - /** - * Projection. - * Par defaut, CRS:84. - */ - this.crs = this.options.crs || "CRS:84"; - - /** - * format de sortie. - * Par defaut, "json". - */ - this.format = this.options.format || "json"; - - /* - * Ressource utilisée - */ - this.resource = this.options.resource; - - /** - * Réponse détaillée (source & accuracy) - * true|false - */ - this.measures = this.options.measures || false; -} - -/** - * CLASSNAME - */ -AltiRequest.CLASSNAME = "AltiRequest"; - -AltiRequest.prototype = { - - /** - * @lends module:AltiRequest# - */ - - /** - * Constructeur (alias) - */ - constructor : AltiRequest, - - /** - * Ajout d"une liste de coordonnées. - * - * @param {Object[]} lstPosition - liste de positions - * @example - * obj.setPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); - */ - setPositions : function (lstPosition) { - var positions = []; - for (var i = 0; i < lstPosition.length; i++) { - var o = lstPosition[i]; - if (o.lon && o.lat) { - positions.push(o); - } - } - - this.positions = positions; - }, - - /** - * Liste des coordonnées. - * - * @param {Int} pos - position - * @returns {positions} - * @example - * obj.getPositions (); // [{lon : "", lat : ""}, {lon : "", lat : ""}] - * obj.getPositions (0); // [{lon : "", lat : ""}] - */ - getPositions : function (pos) { - // FIXME test if not a number !? - if (!pos) { - return this.positions; - } - - var index = this.positions.length - 1; - if (pos > index || pos < index) { - this.logger.warn("index out of range !"); - return this.positions; - } - - return this.positions[pos]; - }, - - /** - * Ajout d"une liste de coordonnées. - * - * @param {Object[]} lstPosition - liste de positions - * @example - * obj.addPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); - */ - addPositions : function (lstPosition) { - for (var i = 0; i < lstPosition.length; i++) { - var o = lstPosition[i]; - if (o.lon && o.lat) { - this.positions.push(lstPosition[i]); - } - } - }, - - /** - * Retourne la liste des longitudes avec un caractère de séparation. - * - * @returns {String} - une liste de longitudes - * @example - * // out : 0.2367|2.1570|43.789|... - */ - getLon : function () { - var lstLon = []; - for (var i = 0; i < this.positions.length; i++) { - lstLon.push(this.positions[i].lon); - } - this.logger.trace(lstLon); - return lstLon.join(this.delimiter); - }, - - /** - * Retourne la liste des lattitudes avec un caractère de séparation. - * - * @returns {String} - une liste de lattitudes - * @example - * // out : 0.2367|2.1570|43.789|... - */ - getLat : function () { - var lstLat = []; - for (var i = 0; i < this.positions.length; i++) { - lstLat.push(this.positions[i].lat); - } - this.logger.trace(lstLat); - return lstLat.join(this.delimiter); - } - -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Object[]} - */ -AltiRequest.prototype.getData = function () { - var map = []; - - map.push({ - k : "lon", - v : this.getLon() - }); - map.push({ - k : "lat", - v : this.getLat() - }); - map.push({ - k : "delimiter", - v : this.delimiter - }); - map.push({ - k : "indent", - v : this.indent - }); - map.push({ - k : "crs", - v : this.crs - }); - map.push({ - k : "format", - v : this.format - }); - - return map; -}; - -export default AltiRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js deleted file mode 100644 index bf26cb6b..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON - * (Factory) - * - * @module AltiResponseFactory - * @private - * @alias Gp.Services.Alti.Response.AltiResponseFactory - */ -import Logger from "../../../Utils/LoggerByDefault"; -import MRes from "../../../Utils/MessagesResources"; -import ErrorService from "../../../Exceptions/ErrorService"; -import XML from "../../../Formats/XML"; -import AltiResponseReader from "../Formats/AltiResponseReader"; -import AltiResponse from "./model/AltiResponse"; -import Elevation from "./model/Elevation"; - -var AltiResponseFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Alti - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build : function (options) { - // logger - var logger = Logger.getLogger("AltiResponseFactory"); - logger.trace(["AltiResponseFactory::build()"]); - - var data = null; - - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - switch (options.outputFormat) { - case "xml": - logger.trace("analyze response : xml"); - - try { - var p = new XML({ - reader : AltiResponseReader - }); - - if (typeof options.response === "string") { - p.setXMLString(options.response); - } else { - p.setXMLDoc(options.response); - } - - data = p.parse(); - - if (!data) { - throw new Error(MRes.getMessage("SERVICE_RESPONSE_EXCEPTION_2")); - } - } catch (e) { - var message = e.message; - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", message), - status : 200, - type : ErrorService.TYPE_SRVERR - })); - return; - } - - break; - - case "json": - logger.trace("analyze response : json"); - logger.trace("analyze response : ", typeof options.response); - - var JSONResponse = null; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // le service renvoie t il une erreur ? - if (JSONResponse && JSONResponse.error) { - // ex. {"error": {"code": "BAD_PARAMETER","description": "The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180)."}} - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), - status : 200, - type : ErrorService.TYPE_SRVERR - })); - return; - } - - // analyse de la reponse - if (JSONResponse) { - var elevations = JSONResponse.elevations; - var altiResponse = new AltiResponse(); - var elevation; - if (Array.isArray(elevations) && elevations.length) { - for (var i = 0; i < elevations.length; i++) { - elevation = new Elevation(); - - if (typeof elevations[i] === "object") { - // elevations[i] est un objet elevation - if (elevations[i].lon) { - elevation.lon = elevations[i].lon; - } - if (elevations[i].lat) { - elevation.lat = elevations[i].lat; - } - if (elevations[i].z) { - elevation.z = elevations[i].z; - } - if (elevations[i].acc) { - elevation.acc = elevations[i].acc; - } - if (elevations[i].measures) { - elevation.measures = elevations[i].measures; - } - } else if (typeof elevations[i] === "number") { - // elevations[i] est un nombre, dans le cas de zonly=true notamment - elevation.z = elevations[i]; - } - - if (Array.isArray(altiResponse.elevations)) { - altiResponse.elevations.push(elevation); - } - } - } - data = altiResponse; - } - - if (!data) { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_ANALYSE_2"), - type : ErrorService.TYPE_UNKERR, - status : -1 - })); - return; - } - break; - - default: - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_FORMAT_2"), - type : ErrorService.TYPE_UNKERR, - status : -1 - })); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type : ErrorService.TYPE_SRVERR, - status : 200 - })); - return; - } else if (data.error) { - var errorMess = data.error.description; - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", errorMess), - type : ErrorService.TYPE_SRVERR, - status : 200 - })); - return; - } - } - } else { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - - options.onSuccess.call(options.scope, data); - } -}; - -export default AltiResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js deleted file mode 100644 index 01db7918..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Array.} elevations - Elevations array. - * - * @namespace - * @alias Gp.Services.AltiResponse - */ -function AltiResponse () { - if (!(this instanceof AltiResponse)) { - throw new TypeError("AltiResponse constructor cannot be called as a function."); - } - - this.elevations = []; -} - -AltiResponse.prototype = { - - constructor : AltiResponse - -}; - -export default AltiResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js deleted file mode 100644 index e7214f88..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js +++ /dev/null @@ -1,27 +0,0 @@ - -/** - * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if "zonly" parameter wasn't set to true. - * - * @property {Float} lat - Point latitude. (only if zonly=false) - * @property {Float} lon - Point longitude. (only if zonly=false) - * @property {Float} z - Point elevation. - * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) - * - * @namespace - * @alias Gp.Services.Alti.Elevation - */ -function Elevation () { - if (!(this instanceof Elevation)) { - throw new TypeError("Elevation constructor cannot be called as a function."); - } - - this.z = null; -} - -Elevation.prototype = { - - constructor : Elevation - -}; - -export default Elevation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js deleted file mode 100644 index e46bebb3..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js +++ /dev/null @@ -1,30 +0,0 @@ - -/** - * Single measure object returned by underlying web service if measures = true and zonly = false - * - * @property {String} source_name - Name of the source - * @property {String} source_measure - Name of the measure - * @property {Float} z - Point elevation. - * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) - * - * @namespace - * @alias Gp.Services.Alti.Measure - */ -function Measure () { - if (!(this instanceof Measure)) { - throw new TypeError("Measure constructor cannot be called as a function."); - } - - this.source_name = null; - this.source_measure = null; - this.z = null; - this.acc = null; -} - -Measure.prototype = { - - constructor : Measure - -}; - -export default Measure; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js deleted file mode 100644 index ceae1497..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js +++ /dev/null @@ -1,227 +0,0 @@ -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import AutoCompleteResponseFactory from "./Response/AutoCompleteResponseFactory"; -import Logger from "../../Utils/LoggerByDefault"; -import MR from "../../Utils/MessagesResources"; -import Helper from "../../Utils/Helper"; -import ErrorService from "../../Exceptions/ErrorService"; - -/** - * @classdesc - * Appel du service d'autocomplétion du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.AutoComplete - * - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String} options.text - La chaîne de caractère à compléter. - * Cette chaîne n'est pas "URL encodée". - * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête. - * - * @param {Array.} [options.type = ["StreetAddress"]] - Type de l'objet recherché. - * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'. - * D'autres types pourront être rajoutés selon l'évolution du service. - * Par défaut, type = ['StreetAddress']. - * - * @param {String} [options.territory] - Limitation de la zone de recherche de localisants. - * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE', - * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31' - * Pas de valeur par défaut. - * La valeur par défaut est donc celle du service. - * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié. - * - * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir. - * Pas de valeur par défaut. - * La valeur par défaut sera donc celle du service : 10. - * - * @example - * var options = { - * // options communes aux services - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * text : "", - * type : "StreetAddress", - * territory : 'METROPOLE', - * maximumResponses : 10 - * }; - */ -function AutoComplete (options_) { - if (!(this instanceof AutoComplete)) { - throw new TypeError(MR.getMessage("CLASS_CONSTRUCTOR", "AutoComplete")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "AutoComplete"; - - this.logger = Logger.getLogger("Gp.Services.AutoComplete"); - this.logger.trace("[Constructeur AutoComplete (options)]"); - - var options = this.patchOptionConvertor(options_); - - if (!options.serverUrl) { - options.serverUrl = DefaultUrlService.AutoComplete.newUrl(); - if (options.oldAutocompleteService) { - options.serverUrl = DefaultUrlService.AutoComplete.url(); - } - } - - // appel du constructeur par heritage - CommonService.apply(this, arguments); - - if (!options.text) { - throw new Error(MR.getMessage("PARAM_MISSING", "text")); - } - - // ajout des options spécifiques au service - this.options.text = options.text; - - // on definit des parametres par defaut - if (!options.type) { - options.type = ["StreetAddress,PositionOfInterest"]; - } - - this.options.type = options.type; - this.options.territory = options.territory || ""; - this.options.maximumResponses = options.maximumResponses || 10; - - // INFO - // le service ne repond pas en mode POST (405 Method Not Allowed) - if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") { - this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"); - this.options.httpMethod = "GET"; // on surcharge ! - } - - // attributs d'instances - - /** - * Format forcé de la réponse du service : "json" - * sauf si l'on souhaite une reponse brute (options.rawResponse) - */ - this.options.outputFormat = (this.options.rawResponse) ? "" : "json"; -} - -/** - * @lends module:AutoComplete# - */ - -AutoComplete.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -AutoComplete.prototype.constructor = AutoComplete; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} options_ - options du service - * @return {Object} - options - */ -AutoComplete.prototype.patchOptionConvertor = function (options_) { - const options = options_; - - if (options.filterOptions) { - this.logger.warn("The parameter 'filterOptions' is deprecated"); - - if (options.filterOptions.type) { - this.logger.warn("The parameter 'filterOptions.type' is deprecated"); - if (!options.type) { - options.type = options.filterOptions.type; - } - } - - if (options.filterOptions.territory) { - this.logger.warn("The parameter 'filterOptions.territory' is deprecated"); - if (!options.terr) { - options.terr = options.filterOptions.territory; - } - } - - delete options.filterOptions; - } - - return options; -}; - -/** - * (overwrite) - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -AutoComplete.prototype.buildRequest = function (error, success) { - // ex. - // http://wxs.ign.fr/CLEF/ols/apis/completion? - // text=Brie-Comt& - // type=StreetAddress,PositionOfInterest& - // territory=METROPOLE& - // maximumResponses=10 - - // traitement des param KPV sous forme de tableau - var territory = ""; - if (this.options.territory) { - territory = this.options.territory; - } - - var type = ""; - if (this.options.type) { - type = this.options.type.join(","); - } - - // normalisation de la requete avec param KPV - this.request = Helper.normalyzeParameters({ - text : encodeURIComponent(this.options.text), - type : type, - terr : territory, - maximumResponses : this.options.maximumResponses - }); - - (!this.request) - ? error.call(this, new ErrorService(MR.getMessage("SERVICE_REQUEST_BUILD"))) - : success.call(this, this.request); -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback de succès de l'analyse de la réponse - */ -AutoComplete.prototype.analyzeResponse = function (error, success) { - if (this.response) { - var options = { - response : this.response, - rawResponse : this.options.rawResponse, - onSuccess : success, - onError : error, - scope : this - }; - - AutoCompleteResponseFactory.build(options); - } else { - error.call(this, new ErrorService(MR.getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -export default AutoComplete; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js deleted file mode 100644 index 0b925a30..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON - * (Factory) - * - * @module AutoCompleteResponseFactory - * @private - * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory - */ -import Logger from "../../../Utils/LoggerByDefault"; -import MRes from "../../../Utils/MessagesResources"; -import ErrorService from "../../../Exceptions/ErrorService"; -import AutoCompleteResponse from "./model/AutoCompleteResponse"; -import SuggestedLocation from "./model/SuggestedLocation"; - -var AutoCompleteResponseFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Alti - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build : function (options) { - // logger - var logger = Logger.getLogger("AutoCompleteResponseFactory"); - logger.trace(["AutoCompleteResponseFactory::build()"]); - - var data = null; - - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - var JSONResponse = null; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // analyse de la réponse - if (JSONResponse) { - // le service renvoie t il une erreur ? - if (JSONResponse.error) { - // ex. ? - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), - status : JSONResponse.error.code, - type : ErrorService.TYPE_SRVERR - })); - return; - } - - // création de l'objet réponse - data = new AutoCompleteResponse(); - - // boucle sur les résultats de l'autocomplétion - if (JSONResponse.results && Array.isArray(JSONResponse.results)) { - var suggestedLocation = null; - - for (var i = 0; i < JSONResponse.results.length; i++) { - var result = JSONResponse.results[i]; - suggestedLocation = new SuggestedLocation(); - - if (result) { - if (result.country === "StreetAddress") { - suggestedLocation.street = result.street; - suggestedLocation.type = "StreetAddress"; - } else if (result.country === "PositionOfInterest") { - suggestedLocation.poi = result.street; - suggestedLocation.kind = result.kind; - suggestedLocation.type = "PositionOfInterest"; - } - - if (suggestedLocation.position) { - suggestedLocation.position.x = result.x; - suggestedLocation.position.y = result.y; - } - - suggestedLocation.commune = result.city; - suggestedLocation.fullText = result.fulltext; - suggestedLocation.postalCode = result.zipcode; - suggestedLocation.classification = result.classification; - } - // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation - data.suggestedLocations.push(suggestedLocation); - } - } else { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_FORMAT_3"))); - return; - } - - if (!data.suggestedLocations.length) { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_FORMAT_3"))); - return; - } - } - - if (!data) { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_ANALYSE_2"), - type : ErrorService.TYPE_UNKERR, - status : -1 - })); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type : ErrorService.TYPE_SRVERR, - status : 200 - })); - return; - } - } - } else { - // si la réponse (xmlString) est vide, on appelle le callback d'erreur - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - - // si tout s'est bien passé, on appelle le callback de succès - options.onSuccess.call(options.scope, data); - } -}; - -export default AutoCompleteResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js deleted file mode 100644 index af06041d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Array.} suggestedLocations - SuggestedLocations array. - * - * @namespace - * @alias Gp.Services.AutoCompleteResponse - */ -function AutoCompleteResponse () { - if (!(this instanceof AutoCompleteResponse)) { - throw new TypeError("AutoCompleteResponse constructor cannot be called as a function."); - } - - this.suggestedLocations = []; -} - -AutoCompleteResponse.prototype = { - - constructor : AutoCompleteResponse - -}; - -export default AutoCompleteResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js deleted file mode 100644 index a6e8fb2d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js +++ /dev/null @@ -1,123 +0,0 @@ - -/** - * Single SuggestedLocation Object returned by underlying web service. - * Each suggested location represents a street address ("StreetAddress") or a place name ("PositionOfInterest"). - * - * @property {String} type - Suggested location type : "StreetAddress" ou "PositionOfInterest" - * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system. - * @property {String} commune - Suggested municipality - * @property {String} fullText - Full text representation of the suggested location. - * @property {String} postalCode - Suggested location postcode - * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). - * @property {String} street - Street name of the suggested location ("StreetAddress" only). - * @property {String} kind - Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). - * - * @namespace - * @alias Gp.Services.AutoComplete.SuggestedLocation - */ -function SuggestedLocation () { - if (!(this instanceof SuggestedLocation)) { - throw new TypeError("SuggestedLocation constructor cannot be called as a function."); - } - - /* REPONSE : - { - "status" : "OK", - "results" : [ - { - "country":"PositionOfInterest", - "x":-1.559185, - "y":47.952603, - "city":"Brie", - "zipcode":"35150", - "street":"corbe", - "kind":"Lieu-dit habité", - "fulltext":"corbe, 35150 Brie", - "classification":6 - }, - { - "country":"StreetAddress", - "x":1.538295, - "y":43.19646, - "city":"Brie", - "zipcode":"09700", - "street":"courreste", - "kind":"", - "fulltext":"courreste, 09700 Brie", - "classification":7 - } - ] - } - */ - - /* REPONSE EN ERREUR - { - status : "ERROR", - results : [ ] - } - */ - - /** - * Suggested location type : "StreetAddress" ou "PositionOfInterest" - * @type {String} - */ - this.type = null; - - /** - * Position of the suggested location given in requested coordinates system. - * @type {Gp.Point} - */ - this.position = { - x : null, - y : null - }; - - /** - * Suggested municipality - * @type {String} - */ - this.commune = null; - - /** - * Full text representation of the suggested location. - * @type {String} - */ - this.fullText = null; - - /** - * Suggested location postcode - * @type {Number} - */ - this.postalCode = null; - - /** - * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). - * @type {Integer} - */ - this.classification = null; - - /** - * Street name of the suggested location ("StreetAddress" only). - * @type {String} - */ - this.street = null; - - /** - * Place name of the suggested location ("PositionOfInterest" only). - * @type {String} - */ - this.poi = null; - - /** - * Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). - * @type {String} - */ - this.kind = null; -} - -SuggestedLocation.prototype = { - - constructor : SuggestedLocation -}; - -export default SuggestedLocation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js deleted file mode 100644 index 317c7cdb..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js +++ /dev/null @@ -1,493 +0,0 @@ -import Logger from "../Utils/LoggerByDefault"; -import Helper from "../Utils/Helper"; -import _ from "../Utils/MessagesResources"; -import Protocol from "../Protocols/Protocol"; -import ErrorService from "../Exceptions/ErrorService"; -// import DefaultUrlService from "./DefaultUrlService"; -// package.json (extract version) -import Pkg from "../../package.json"; - -/** - * @classdesc - * Composant Service - * - * @constructor - * @alias Gp.Services.CommonService - * @param {Object} options - options communes à tous les services - * - * @param {String} [options.serverUrl] - URL d'accès au service. Par défaut "https://wxs.ign.fr/calcul/geoportail/SERVICE/". - * Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès. - * Si ce paramètre est renseigné alors, le paramètre par défaut est ignoré. - * - * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service : - * peut valoir 'JSONP' ou 'XHR'. - * Par défaut, c'est le protocole XHR qui sera utilisé. - * Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR). - * - * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https. - * Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS). - * Sur un navigateur, le protocole est automatiquement extrait de l'url du site... - * Par défaut, on utilise le protocole http (ssl=false). - * - * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR. - * Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP. - * - * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP. - * Par défaut, la fonction de callback portera un nom du type "callback"+ID, où ID est soit un identifiant unique généré à chaque requête, - * soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix="_2", la fonction sera "callback_2 ()". - * Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu - * Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'. - * - * @param {String} [options.httpMethod] - La méthode HTTP - * à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'. - * Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET. - * Par défaut, c'est la méthode GET qui est utilisée. - * - * @param {String} [options.contentType] - Content-Type de la requete - * à utiliser dans le cas d'une requête XHR en mode POST. - * Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET. - * Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type. - * - * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête). - * Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0). - * - * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée. - * (Cf. paramètre « onSuccess » pour plus de détails). - * - * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête - * (code HTTP 200, sans message d'erreur). - * Cette fonction prend en paramètre la réponse du service, - * soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ; - * soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ». - * - * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement - * (code HTTP de retour différent de 200 ou pas de réponse). - * - * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse - * Permet de modifier la réponse avant parsing et la fonction doit retourner une String. - * Cette fonction prend en paramètre la réponse telle que renvoyée par le service - * (cad au format json ou xml). - * Pour le JSONP, si le paramètre "rawResponse" a été précisé avec la valeur "true", - * la fonction prend en paramètre un Object JavaScript contenant la réponse XML. - * - * @example - * var options = { - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * ssl : false, - * proxyURL : null, - * callbackName : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * onBeforeParse : function (rawResponse) {} - * }; - */ -function CommonService (options) { - if (!(this instanceof CommonService)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR")); - } - - this.logger = Logger.getLogger("CommonService"); - this.logger.trace("[Constructeur CommonService (options)]"); - - // ##################### - // récupération des options par défaut pour les paramètres optionnels - // ##################### - - /** - * Options du service - * @type {Object} - */ - this.options = { - // protocol : "JSONP", - protocol : "XHR", - ssl : true, - proxyURL : "", - // callbackName : "", - callbackSuffix : null, - httpMethod : "GET", - timeOut : 0, - rawResponse : false, - scope : this, - /** - * callback par defaut pour la reponse - * @param {Object} response - response - * @private - */ - onSuccess : function (response) { - console.log("onSuccess - la reponse est la suivante : ", response); - }, - /** - * callback par defaut pour les erreurs - * @param {Object} error - error - * @private - */ - onFailure : function (error) { - if (error.status === 200 || !error.status) { - console.log("onFailure : ", error.message); - } else { - console.log("onFailure - Erreur (", error.status, ") : ", error.message); - } - } - }; - - // et on ajoute les options en paramètre aux options par défaut - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this.options[opt] = options[opt]; - } - } - - // ##################### - // analyse des options - // ##################### - - // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée - if (this.options.rawResponse && !this.options.onSuccess) { - /** - * callback par defaut pour la reponse - * @param {Object} response - response - * @private - */ - this.options.onSuccess = function (response) { - console.log("onSuccess - la réponse brute du service est la suivante : ", response); - }; - } - - // gestion du callback onSuccess - var bOnSuccess = !!(this.options.onSuccess !== null && typeof this.options.onSuccess === "function"); - if (!bOnSuccess) { - throw new Error(_.getMessage("PARAM_MISSING", "onSuccess()")); - } - - // FIXME traitement au niveau de chaque composant pour tester service WXS / GPF - // gestion de l'url du service par defaut - /* - if (!this.options.serverUrl) { - // INFO - // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut - // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant - // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut - DefaultUrlService.ssl = this.options.ssl; - var urlByDefault = DefaultUrlService[this.CLASSNAME].url("calcul"); - if (typeof urlByDefault === "string") { - this.options.serverUrl = urlByDefault; - } else { - this.logger.trace("URL par defaut à determiner au niveau du composant..."); - } - } - */ - - // FIXME nettoyage des KVP dans l'url du service - // if (this.options.serverUrl) { - // // INFO - // // si l'url est renseignée, il faut la nettoyer de tous ses KVP - // // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait - // // des opérations d'encapsulations des reponses légèrement farfelues ... - // var urlsource = this.options.serverUrl; - // var urlparts = urlsource.split("?"); - // this.options.serverUrl = urlparts[0]; - // } - - // gestion de la methode HTTP - this.options.httpMethod = (typeof options.httpMethod === "string") ? options.httpMethod.toUpperCase() : "GET"; - - switch (this.options.httpMethod) { - case "POST": - case "GET": - break; - case "PUT": - case "DELETE": - case "HEAD": - case "OPTIONS": - throw new Error(_.getMessage("PARAM_NOT_SUPPORT", "httpMethod")); - default: - throw new Error(_.getMessage("PARAM_UNKNOWN", "httpMethod")); - } - - // gestion du protocole - // this.options.protocol = (typeof options.protocol === "string" ) ? options.protocol.toUpperCase() : "JSONP"; - this.options.protocol = (typeof options.protocol === "string") ? options.protocol.toUpperCase() : "XHR"; - - switch (this.options.protocol) { - case "JSONP": - case "XHR": - break; - default: - throw new Error(_.getMessage("PARAM_UNKNOWN", "protocol")); - } - - // on determine l'environnement d'execution : browser ou non ? - // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS... - if (typeof window === "undefined" && this.options.protocol === "JSONP") { - throw new Error(_.getMessage("PARAM_NOT_SUPPORT_NODEJS", "protocol=JSONP (instead use XHR)")); - } - - // le protocole JSONP ne fonctionne qu'en GET. - if (this.options.protocol === "JSONP") { - this.options.httpMethod = "GET"; - } - - // gestion du cache - this.options.nocache = options.nocache || false; - - // ##################### - // attributs d'instances - // ##################### - - /** - * Format de réponse du service - */ - this.options.outputFormat = null; - /** - * Requête envoyée au service - */ - this.request = null; - /** - * Reponse du service - */ - this.response = null; -} - -/** - * @lends module:CommonService - */ -CommonService.prototype = { - - /* - * Constructeur (alias) - */ - constructor : CommonService, - - /** - * Appel du service Géoportail - */ - call : function () { - /* jshint validthis : true */ - this.logger.trace("CommonService::call ()"); - - var context = this; - /** fonction d'execution */ - function run () { - this.logger.trace("CommonService::run ()"); - this.buildRequest.call(context, onError, onBuildRequest); - } - - run.call(context); - - // callback de fin de construction de la requête - function onBuildRequest (result) { - this.logger.trace("CommonService::onBuildRequest : ", result); - this.callService.call(context, onError, onCallService); - } - - // callback de fin d'appel au service - function onCallService (result) { - this.logger.trace("CommonService::onCallService : ", result); - this.analyzeResponse.call(context, onError, onAnalyzeResponse); - } - - // callback de fin de lecture de la reponse - function onAnalyzeResponse (result) { - this.logger.trace("CommonService::onAnalyzeResponse : ", result); - if (result) { - this.options.onSuccess.call(this, result); - } else { - return onError.call(this, new ErrorService("Analyse de la reponse en échec !?")); - } - } - - // callback de gestion des erreurs : renvoit un objet de type ErrorService - function onError (error) { - this.logger.trace("CommonService::onError()"); - // error : l'objet est du type ErrorService ou Error - var e = error; - if (!(e instanceof ErrorService)) { - e = new ErrorService(error.message); - } - this.options.onFailure.call(this, e); - } - }, - - /** - * Création de la requête - * @param {Function} error - callback - * @param {Function} success - callback - */ - buildRequest : function (error, success) { - // INFO - this.logger.error("overwritten method !"); - // retourne l'objet 'this.request' - if (error) { - error.call(this, "This method must be overwritten !"); - } - success.call(this, "This method must be overwritten !"); - }, - - /** - * Appel du service - * @param {Function} error - callback - * @param {Function} success - callback - */ - callService : function (error, success) { - // INFO - // retourne l'objet 'this.response' - - // NOTES - // Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document). - // Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes : - // - natif - // - XML encapsulé : - // {http : {status:200, error:null},xml :'réponse du service'} - // {http : {status:400, error:'reponse du service'},xml :null} - // En XHR, la reponse est directement sauvegardée dans 'this.response'. - // Par contre, en JSONP, on doit analyser la reponse (status ou non vide), - // et ne renvoyer que le contenu (xml ou l'objet) - - // gestion de la proxification du service - var strUrlProxified = null; - var strData = this.request; - - // a t on mis en place un proxy ? - // la proxyfication est valable uniquement en mode XHR ! - var bUrlProxified = !!(this.options.proxyURL && this.options.protocol === "XHR"); - - // rajout de l'option gpbibaccess - // INFO : acces au numero de version de package.conf aprés compilation ! - if (this.CLASSNAME !== "Geocode" && this.CLASSNAME !== "ReverseGeocode" && this.CLASSNAME !== "AutoComplete") { - this.options.serverUrl = Helper.normalyzeUrl(this.options.serverUrl, { - "gp-access-lib" : Pkg.version, - apiKey : this.options.apiKey || "calcul" - }, false); - } - - // si le proxy est renseigné, on proxifie l'url du service - if (bUrlProxified) { - if (this.options.httpMethod === "GET") { - strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, this.request, true); - strData = null; - } - - if (this.options.httpMethod === "POST") { - strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, null, true); - strData = this.request; - } - } - - // contexte du composant spécifique ! - var self = this; - - var options = { - url : strUrlProxified || this.options.serverUrl, - method : this.options.httpMethod, - protocol : this.options.protocol, - timeOut : this.options.timeOut || 0, - format : this.options.outputFormat, // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) ! - nocache : this.options.nocache || false, // ceci permet d'ajouter un timestamp dans la requête - wrap : this.options.protocol !== "XHR", // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR ! - callbackSuffix : this.options.callbackSuffix, - // callbackName : this.options.callbackName || null, - data : strData, - headers : null, // TODO... - content : this.options.contentType || "application/xml", - scope : this.options.scope || this, - // callback de reponse - onResponse : function (response) { - self.logger.trace("callService::onResponse()"); - - // le contenu de la reponse à renvoyer ! - var content = null; - - // XHR : on renvoie toujours la reponse brute du service (json ou xml) - // au parser du composant... - if (self.options.protocol === "XHR") { - self.logger.trace("Response XHR", response); - content = response; // par defaut, la reponse du service ! - } - - // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas) - // avant de l'envoyer au parser du composant... - if (self.options.protocol === "JSONP") { - self.logger.trace("Response JSON", response); - if (response) { - if (response.http) { - // reponse encapsulée : - // ex. reponse du service en xml - // > {http : {status:200, error:null},xml :'réponse du service'} - if (response.http.status !== 200) { - error.call(self, new ErrorService({ - status : response.http.status, - message : response.http.error, - type : ErrorService.TYPE_SRVERR - })); - return; - } else { - content = response.xml; // par defaut ! - if (self.options.rawResponse) { - content = response; - } - } - } else { - // reponse non encapsulée : - // ex. reponse du service en json ou xml - content = response; - } - } else { - error.call(self, new ErrorService("Le contenu de la reponse est vide !?")); - return; - } - } - - // si on souhaite parser la reponse du service - if (typeof self.options.onBeforeParse === "function") { - var newResponse = self.options.onBeforeParse(content); - if (typeof newResponse === "string") { - // la reponse parsée par l'utilisateur est retournée sous - // forme de string ! - content = newResponse; - } - } - // sauvegarde de la reponse dans l'objet parent (CommonService) - self.response = content; - // on renvoie la reponse... - success.call(self, content); - }, - // callback des erreurs - onFailure : function (e) { - self.logger.trace("callService::onFailure()"); - // on est forcement sur une erreur levée par un service ! - e.type = ErrorService.TYPE_SRVERR; - error.call(self, new ErrorService(e)); - }, - // callback de timeOut - onTimeOut : function () { - self.logger.trace("callService::onTimeOut()"); - error.call(self, new ErrorService("TimeOut!")); - } - }; - - Protocol.send(options); - }, - - /** - * Analyse de la réponse - * @param {Function} error - callback - * @param {Function} success - callback - */ - analyzeResponse : function (error, success) { - // INFO - this.logger.error("overwritten method !"); - // retourne l'objet spécifique au type de composant (json) - if (error) { - error.call(this, "This method must be overwritten !"); - } - success.call(this, "This method must be overwritten !"); - } - -}; - -export default CommonService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js deleted file mode 100644 index 9f58c29b..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js +++ /dev/null @@ -1,310 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; -import _ from "../../Utils/MessagesResources"; -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import ConfigInterface from "./ConfigInterface"; - -/** - * @classdesc - * - * Recupération de la configuration de clés Géoportail sous forme de JSON - * - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.Config - * @param {Object} options - options spécifiques au service (+ les options heritées) - * @param {Sting} options.apiKey - clé(s) dont on veut obtenir la configuration. Si plusieurs clés, séparer chacune par une virgule - * @param {Boolean} [options.sync=false] - force le mode synchrone - * @param {String} options.customConfigFile - chemin vers un fichier de configuration personnalisé. Surcharge le paramètre apiKey. - * - * @example - * var options = { - * apiKey : "cartes,ortho", - * sync : false, - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * }; - * - */ -function Config (options) { - if (!(this instanceof Config)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Config")); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "Config"; - - this.logger = Logger.getLogger("Gp.Config"); - this.logger.trace("[Constructeur Config (options)]"); - - // ##################### - // analyse des options - // ##################### - - // gestion du callback onSuccess - var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); - if (!bOnSuccess) { - throw new Error(_.getMessage("PARAM_MISSING", "onSuccess()")); - } - if (!options.apiKey && !options.customConfigFile) { - // si pas de thème spécifié, on récupère toutes les ressources possibles dans l'objet Config - options.apiKey = "full"; - } - this.options = {}; - this.options.onSuccess = options.onSuccess; - this.options.onFailure = options.onFailure; - - // mode sync - this.options.sync = options.sync || false; - - // gestion d'un tableau d'url des fichiers de configuration - this.options.listConfigUrls = (options.customConfigFile) - ? [options.customConfigFile] - : !Array.isArray(options.apiKey) - ? DefaultUrlService.Config.url(options.apiKey.split(",")) - : DefaultUrlService.Config.url(options.apiKey); -} - -/** - * @lends module:Config# - */ -Config.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/** - * Constructeur (alias) - */ -Config.prototype.constructor = Config; - -/** - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - * @overload - */ -Config.prototype.buildRequest = function (error, success) { - // liste des urls des fichiers de configuration en JSON - this.listConfigUrls = this.options.listConfigUrls; - - if (!this.listConfigUrls) { - error.call(this, new Error("url by default not found !")); - return; - } - - // INFO : - // il n'y a pas de construction de requête, - // on passe directement à l'appel des requêtes - success.call(this, this.listConfigUrls); -}; - -/** - * Récupération des configuration - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - * @overload - */ -Config.prototype.callService = function (error, success) { - if (this.options.sync) { - __callServiceSync.call(this, error, success); - } else { - __callService.call(this, error, success); - } -}; - -/** - * Requêtes en mode asynchrone - * - * @param {*} error - * @param {*} success - * @private - */ -var __callService = function (error, success) { - // liste des resultats au format JSON - this.listConfigResults = []; - - // test on env. nodejs or browser - let Fetch = null; - if (typeof window === "undefined") { - var nodefetch = require("node-fetch"); - Fetch = nodefetch; - } else { - Fetch = window.fetch; - } - - // the factory of fetch ! - var fetchFactory = (url) => { - return Fetch(url, { credentials : "same-origin" }) - .then((response) => { - if (response.ok) { - return response.json() - .then((json) => { - // TODO : - // tester le contenu ! - return json; - }) - .catch((error) => { - throw new Error("Exception Json : " + error); - }); - } else { - throw new Error("Exception HTTP : " + response.status + " (status code) !"); - } - }) - .catch((error) => { - return new Promise((resolve, reject) => { - // eslint-disable-line no-unused-vars - reject(error); - }); - }); - }; - - // construction des promises fetch - var promises = []; - for (let index = 0; index < this.listConfigUrls.length; index++) { - const url = this.listConfigUrls[index]; - promises.push(fetchFactory(url)); - } - - Promise.all(promises) - .then((results) => { - if (!results) { - throw new Error("results config empty !?"); - } - results.forEach((result) => { - // TODO : - // verification des resultats - this.listConfigResults.push(result); - }); - }) - .then(() => { - success.call(this, this.listConfigResults); - }) - .catch((e) => { - // TODO : - // construction d'un message - error.call(this, e); - }); -}; - -/** - * Requêtes en mode synchrone - * - * @param {*} error - * @param {*} success - * @private - */ -var __callServiceSync = function (error, success) { - // liste des resultats au format JSON - this.listConfigResults = []; - - // FIXME : - // boucle synchrone ! - for (var i = 0; i < this.listConfigUrls.length; i++) { - const url = this.listConfigUrls[i]; - // TODO : - // prévoir le CORS, headers, ... - const request = new XMLHttpRequest(); - request.open("GET", url, false); - request.send(null); - if (request.status === 200) { - // TODO : - // tester la reponse ! - var response = JSON.parse(request.responseText); - this.listConfigResults.push(response); - } - } - // callback - if (this.listConfigResults.length !== 0) { - success.call(this, this.listConfigResults); - } else { - error.call(this, new Error("...")); - } -}; - -/** - * Analyse et mise en forme de la réponse en fusionnant les configurations - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - * @overload - */ -Config.prototype.analyzeResponse = function (error, success) { - // fonction de merge des objects JSON - var mergeConfig = function (objects) { - // objet fusion des couches - var allLayersConfig = {}; - // objet fusion des clés - var allKeysConfig = {}; - // objet fusion des TMS - var allTMSConfig = {}; - - // on fusionne les résultat - for (var i = 0; i < objects.length; i++) { - if (!objects[i].generalOptions || !objects[i].layers) { - return; - } - allKeysConfig = { - ...allKeysConfig, - ...objects[i].generalOptions.apiKeys - }; - allLayersConfig = { - ...allLayersConfig, - ...objects[i].layers - }; - allTMSConfig = { - ...allTMSConfig, - ...objects[i].tileMatrixSets - }; - } - - var mergedConfig = { - generalOptions : { - apiKeys : allKeysConfig - }, - layers : allLayersConfig, - tileMatrixSets : allTMSConfig - }; - return mergedConfig; - }; - - // fusion des configurations JSON - var ConfigJSON = mergeConfig(this.listConfigResults); - if (!ConfigJSON) { - error.call(this, new Error("configuration structure not conforme !")); - return; - } - - // creation des interfaces - var IConfig = new ConfigInterface(); - // ajout des interfaces avec la configuration JSON - Object.assign(IConfig, ConfigJSON); - - // définition de la variable globale Gp.Config - var scope = typeof window !== "undefined" ? window : {}; - if (!scope.Gp) { - scope.Gp = {}; - } - - // enregistrement - if (scope.Gp.Config) { - Object.assign(scope.Gp.Config, IConfig); - // dans le doute..., ceinture et bretelles ! - for (var property in IConfig) { - scope.Gp.Config[property] = IConfig[property]; - } - } else { - scope.Gp.Config = IConfig; - } - - // INFO : - // il n'y a pas d'analyse des résultats, - // on passe directement à l'appel de la callback utilisateur - success.call(this, scope.Gp.Config); -}; - -export default Config; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js deleted file mode 100644 index 0d245e64..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js +++ /dev/null @@ -1,319 +0,0 @@ - -/** - * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Object} generalOptions - General properties for default map configuration resources. - * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key. - * @property {String} generalOptions.title - Underlying web service Title. - * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array. - * @property {String} generalOptions.theme - default theme (FIXME : for what ?) - * @property {Array.} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel. - * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}). - * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}). - * - * @namespace - * @alias Gp.Services.GetConfigInterface - */ -function ConfigInterface () { - if (!(this instanceof ConfigInterface)) { - throw new TypeError("ConfigInterface constructor cannot be called as a function."); - } - - this.generalOptions = { - apiKeys : {}, - title : null, - defaultGMLGFIStyle : null, - theme : null, - wgs84Resolutions : [] - }; - - this.layers = {}; - - this.tileMatrixSets = {}; -} - -ConfigInterface.prototype = { - - /* - * Constructor (alias) - */ - constructor : ConfigInterface, - - /** - * Check if config is loaded for a given key - * - * @param {String} apiKey - Access key to Geoportal platform - * @returns {Boolean} isKeyConfLoaded - true if config of the key is already loaded, false otherwise - */ - isKeyConfLoaded : function (apiKey) { - if (!apiKey) { - return; - } - if (this.generalOptions.apiKeys[apiKey]) { - return true; - } - return false; - }, - - /** - * Returns an array of Geoportal layers identifiers, corresponding to an API contract key. - * - * @param {String} apiKey - Access key to Geoportal platform - * @returns {Array} apiKeys - Array of geoportal layers identifiers - */ - getLayersId : function (apiKey) { - return this.generalOptions.apiKeys[apiKey]; - }, - - /** - * Returns the id of a Geoportal layer with its name and its service. - * - * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") - * @param {String} service - name of the service (ex. "WMS" ou "WMTS") - * @returns {String} Id of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS") - */ - getLayerId : function (layerName, service) { - if (!layerName || !service) { - return; - } - var layerId = null; - - // layer - // key : [layerName]$[contexte]:OGC:[service] - // ex : "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS" - - // service - // key : [layerName]$[contexte];[service] - // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode - - if (this.layers) { - var layers = this.layers; - for (var key in layers) { - if (layers.hasOwnProperty(key)) { - var parts = key.split("$"); - if (layerName === parts[0]) { - if (parts[1]) { - var servicePartsLayer = parts[1].split(":"); - var servicePartsService = parts[1].split(";"); - - if (servicePartsService[1] === service.toUpperCase()) { - layerId = key; - break; - } - if (servicePartsLayer[2] === service.toUpperCase()) { - layerId = key; - break; - } - } - } - } - } - } - if (!layerId) { - return; - } - return layerId; - }, - - /** - * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key. - * If no key is specified, all layers from configuration are returned. - * - * @param {String} apiKey - Access key to Geoportal platform - * @returns {Object} layers - Object which properties are layers identifiers. - */ - getLayersConf : function (apiKey) { - var layers = {}; - var layersIdArray = this.getLayersId(apiKey); - if (layersIdArray) { - for (var i = 0; i < layersIdArray.length; i++) { - var lyrId = layersIdArray[i]; - layers[lyrId] = this.layers[lyrId]; - } - } - return layers; - }, - - /** - * Returns a geoportal layer configuration, given its identifier - * - * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") - * @return {Object} layer - Layer configuration - */ - getLayerConf : function (layerId) { - if (!this.layers) { - return; - } - return this.layers[layerId]; - }, - - /** - * Get all parameters needed to display a WMS or WMTS layer given its name, its service and its key - * - * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") - * @param {String} service - name of the service (ex. "WMS" ou "WMTS") - * @param {String} [apiKey] - Contract API key - * @returns {Object} params - params of the service (WMS or WMTS) for the given layer - * @returns {String} params.url - Url of the service to reach to display the layer - * @returns {String} params.version - Version of the service - * @returns {String} params.styles - Default style of the layer - * @returns {String} params.format - Default format of the layer - * @returns {String} params.projection - Default projection of the layer - * @returns {Number} params.minScale - Min scale denominator of the layer - * @returns {Number} params.maxScale - Max scale denominator of the layer - * @returns {Gp.BBox} params.extent - Extent of the layer, in the projection of the layer - * @returns {Array} params.legends - Array of legends associated to the layer - * @returns {Array} params.title - Name of the layer, readable by a human - * @returns {Array} params.description - Description of the layer - * @returns {String} params.[TMSLink] - Id of the Tile Matrix Set (TMS), in the case of WMTS layer - * @returns {Gp.Point} params.[matrixOrigin] - Originof the tile matrix (top left corner), in the case of WMTS layer - * @returns {Array} params.[nativeResolutions] - Array with the resolution of each level of the tile matrix set, in the case of WMTS layer - * @returns {Array} params.[matrixIds] - Array with the ID of each level of the tile matrix set, in the case of WMTS layer - */ - getLayerParams : function (layerName, service) { - var params = {}; - - if ((service === "WMS" || Object.keys(this.tileMatrixSets).length !== 0) && Object.keys(this.layers).length !== 0) { - // get the layerId of the layer - var layerId = this.getLayerId(layerName, service); - - if (layerId) { - // get the layer Conf Object - var layerConf = this.getLayerConf(layerId); - - var keys = this.getLayerKey(layerId); - if (keys.length === 0) { - return; - } - - // get services params - for (var i = 0; i < keys.length; i++) { - // only one serverUrl is saved in Gp.Config : with multiKeys, we have to retrieve the key used in the serverUrl property - if (layerConf.serviceParams.serverUrl[keys[i]]) { - params.url = layerConf.serviceParams.serverUrl[keys[i]]; - } - } - - const wmsTypeRegex = /\/v\//; - // WMS vector style always empty (not in getCap) - if (wmsTypeRegex.test(params.url)) { - params.styles = " "; - } else { - // WMS raster style is defined in getCap - params.styles = layerConf.styles[0].name; - } - - params.version = layerConf.serviceParams.version; - params.format = layerConf.formats[0].name; - params.projection = layerConf.defaultProjection; - - // get layer info and constraints - params.minScale = layerConf.globalConstraint.minScaleDenominator; - params.maxScale = layerConf.globalConstraint.maxScaleDenominator; - params.extent = layerConf.globalConstraint.bbox; - params.legends = layerConf.legends; - params.title = layerConf.title; - params.description = layerConf.description; - - if (service === "WMS") { - params.metadata = layerConf.metadata; - } - - // Informations non disponibles avec les getCap - // params.metadata = layerConf.getMetadata(); - // params.originators = layerConf.getOriginators(); - // params.quicklookUrl = layerConf.getQuicklookUrl(); - - // WMTS : get the tileMatrixSetLimits - if (layerConf.wmtsOptions) { - params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits; - var TMSLink = layerConf.wmtsOptions.tileMatrixSetLink; - if (TMSLink) { - params.TMSLink = TMSLink; - var tmsConf = this.getTMSConf(TMSLink); - // Get matrix origin : Gp.Point = Object{x:Float, y:Float} - // params.matrixOrigin = tmsConf.getTopLeftCorner(); - params.matrixIds = Object.keys(tmsConf.tileMatrices); - params.tileMatrices = tmsConf.tileMatrices; - // by default, pseudo mercator resolutions - params.nativeResolutions = tmsConf.nativeResolutions || this.getTMSConf("PM").nativeResolutions; - } - } - } - } - return params; - }, - - /** - * Get the contract key(s) associated to a given layer. - * - * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") - * @return {Array} layerKey - array of key(s) associated to the given layer - */ - getLayerKey : function (layerId) { - var layerKey = []; - if (this.generalOptions && this.generalOptions.apiKeys && Object.keys(this.generalOptions.apiKeys).length !== 0) { - var resourcesByKey = this.generalOptions.apiKeys; - for (var key in resourcesByKey) { - var resourcesArray = resourcesByKey[key]; - resourcesArray.forEach(function (arrayLayerId) { - if (arrayLayerId === layerId) { - layerKey.push(key); - } - }); - } - } - return layerKey; - }, - - /** - * Returns an associative array of Tile Matrix Sets configurations. - * - * @return {Object} tileMatrixSets - Object which properties are TMS identifiers - * - */ - getTileMatrixSets : function () { - return this.tileMatrixSets; - }, - - /** - * Returns a Tile Matrix Sets configuration, given its identifier. - * - * @param {String} tmsID - Tile Matrix Set identifier (e.g. : "PM") - * @return {Object} tileMatrixSet - Tile Matrix Set configuration - */ - getTMSConf : function (tmsID) { - if (!this.tileMatrixSets) { - return; - } - return this.tileMatrixSets[tmsID]; - }, - - /** - * Get global constraints for a given Layer : extent, minScale, maxScale, projection - * - * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") - * @returns {Object} params - layer constraints - * @returns {String} params.projection - default layer projection - * @returns {Number} params.minScale - layer min scale denominator - * @returns {Number} params.maxScale - layer max scale denominator - * @returns {Gp.BBox} params.extent - layer extent expressed in the layer projection - */ - getGlobalConstraints : function (layerId) { - var params = {}; - - if (layerId) { - // get layer configuration object - var layerConf = this.getLayerConf(layerId); - params.projection = layerConf.defaultProjection; - params.minScale = layerConf.globalConstraint.minScaleDenominator; - params.maxScale = layerConf.globalConstraint.maxScaleDenominator; - params.extent = layerConf.globalConstraint.bbox; - } - - return params; - } - -}; - -export default ConfigInterface; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js deleted file mode 100644 index 5d7af509..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js +++ /dev/null @@ -1,295 +0,0 @@ -// cette classe contient les URLs par defaut des services. -// DefaultUrlService.Alti.url(key)[elevation-json] -// DefaultUrlService.Alti.url(key)[elevation-xml] -// DefaultUrlService.Alti.url(key)[profil-json] -// DefaultUrlService.Alti.url(key)[profil-xml] -// DefaultUrlService.ProcessIsoCurve.url(key) -// DefaultUrlService.AutoComplete.url(key) -// DefaultUrlService.ReverseGeocode.url(key) -// DefaultUrlService.Geocode.url(key) -// DefaultUrlService.Route.url(key) - -// Example : -// -// DefaultUrlService.Alti.url('alti')[elevation-json] -// output {String} -> http://wxs.ign.fr/calcul/alti/rest/elevation.json -// -// DefaultUrlService.Alti.url('calcul') -// output {Object|String} -// -> http://wxs.ign.fr/calcul/alti/rest/elevation.json -// -> http://wxs.ign.fr/calcul/alti/rest/elevation.xml -// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.json -// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.xml -// -// ssl by default. -// -// Force to not do ssl : -// DefaultUrlService.ssl = false; -// -// DefaultUrlService.AutoComplete.url('calcul') -// output {Object|String} -// -> https://wxs.ign.fr/calcul/ols/apis/completion - -// constantes internes -var HOSTNAME = "wxs.ign.fr"; - -/** - * Default Geoportal web services URLs access. - * - * @namespace - * @alias Gp.Services.DefaultUrl - */ -var DefaultUrlService = { - - /** if set true, require the use of https protocol */ - ssl : true, - - /** - * base url of services (ssl protocol management) - * @param {String} path - path - * @returns {String} url - */ - url : function (path) { - // comportement par défaut => https - // sinon, il est fixé par l'option 'ssl' (false => http) - var _protocol; - if (DefaultUrlService.ssl === false) { - _protocol = "http://"; - } else { - _protocol = "https://"; - } - - return _protocol + HOSTNAME + path; - }, - - /** - * base new-url of services (ssl protocol management) - * @param {String} path - path - * @returns {String} url - */ - newUrl : function (path, hostname) { - // comportement par défaut => https - // sinon, il est fixé par l'option 'ssl' (false => http) - var _protocol; - if (DefaultUrlService.ssl === false) { - _protocol = "http://"; - } else { - _protocol = "https://"; - } - - return _protocol + hostname + path; - }, - - /** - * Elevation web service access - * - * @member {Object} - * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("elevation-json", "elevation-xml", "profil-json" or "profil-xml"). - */ - Alti : { - new_key : { - // rest - "elevation-json" : "/altimetrie/1.0/calcul/alti/rest/elevation.json", - "elevation-xml" : "/altimetrie/1.0/calcul/alti/rest/elevation.xml", - "profil-json" : "/altimetrie/1.0/calcul/alti/rest/elevationLine.json", - "profil-xml" : "/altimetrie/1.0/calcul/alti/rest/elevationLine.xml" - }, - _key : { - // rest - "elevation-json" : "/calcul/alti/rest/elevation.json", - "elevation-xml" : "/calcul/alti/rest/elevation.xml", - "profil-json" : "/calcul/alti/rest/elevationLine.json", - "profil-xml" : "/calcul/alti/rest/elevationLine.xml", - // other - wps : "/alti/wps" - }, - /** - * newurl from geoplateforme service - * @param {String} key - key - * @returns {String} url - */ - newUrl : function () { - }, - /** - * url from wxs service - * @returns {String} url - */ - url : function () { - return { - // rest - "elevation-json" : DefaultUrlService.url(this._key["elevation-json"]), - "elevation-xml" : DefaultUrlService.url(this._key["elevation-xml"]), - "profil-json" : DefaultUrlService.url(this._key["profil-json"]), - "profil-xml" : DefaultUrlService.url(this._key["profil-xml"]) - }; - } - }, - /** - * IsoCurve web service access - * - * @member {Object} - * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("iso-json" or "iso-xml"). - */ - ProcessIsoCurve : { - - new_key : "/itineraire/isochrone", - - _key : "/calcul/geoportail/isochrone/rest/1.0.0/isochrone", - - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl : function () { - }, - - /** - * url from wxs service - * @returns {String} url - */ - url : function () { - return DefaultUrlService.url(this._key); - } - }, - /** - * Config web service access - * - * @member {Object} - * @property {Function} url (key) - Returns config service default urls with or without geoportal access key given as a parameter. - */ - Config : { - _key : "https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/", - /** - * url - * @param {String} key - key - * @returns {String} url - */ - url : function (key) { - // key must be an array of one or several keys - if (!Array.isArray(key)) { - key = key.split(","); - } - // not homogeneous with others geoportal services URLs - var url = []; - for (var i = 0; i < key.length; i++) { - url[i] = this._key + key[i] + "Config.json"; - } - return url; - } - }, - /** - * Autocompletion web service access - * - * @member {Object} - * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String. - */ - AutoComplete : { - new_key : "/geocodage/completion", - - _key : "/calcul/geoportail/geocodage/rest/0.1/completion", - - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl : function () { - var NEW_AUTOCOMPLETE_HOSTNAME = "data.geopf.fr"; - - return DefaultUrlService.newUrl(this.new_key, NEW_AUTOCOMPLETE_HOSTNAME); - }, - - /** - * url - * @returns {String} url - */ - url : function (key) { - return DefaultUrlService.url(this._key); - } - }, - /** - * Reverse geocoding web service access - * - * @member {Object} - * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. - */ - ReverseGeocode : { - new_key : "/geocodage/reverse", - - _key : "/calcul/geoportail/geocodage/rest/0.1/reverse", - - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl : function () { - var NEW_REVERSE_GEOCODE_HOSTNAME = "data.geopf.fr"; - - return DefaultUrlService.newUrl(this.new_key, NEW_REVERSE_GEOCODE_HOSTNAME); - }, - - /** - * url - * @returns {String} url - */ - url : function () { - return DefaultUrlService.url(this._key); - } - }, - /** - * Geocoding web service access - * - * @member {Object} - * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. - */ - Geocode : { - new_key : "/geocodage/search", - - _key : "/calcul/geoportail/geocodage/rest/0.1/search", - - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl : function () { - var NEW_GEOCODE_HOSTNAME = "data.geopf.fr"; - - return DefaultUrlService.newUrl(this.new_key, NEW_GEOCODE_HOSTNAME); - }, - - /** - * url - * @returns {String} url - */ - url : function () { - return DefaultUrlService.url(this._key); - } - }, - /** - * Routing web service access - * - * @member {Object} - * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols. - */ - Route : { - new_key : "/itineraire/route", - - _key : "/calcul/geoportail/itineraire/rest/1.0.0/route", - - /** - * url from geoplateforme service - * @returns {String} url - */ - newUrl : function () { - }, - - /** - * url from wxs service - * @returns {String} url - */ - url : function () { - return DefaultUrlService.url(this._key); - } - } -}; - -export default DefaultUrlService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js deleted file mode 100644 index edacb237..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js +++ /dev/null @@ -1,134 +0,0 @@ -// import Logger from "../../../Utils/LoggerByDefault"; -import MR from "../../../Utils/MessagesResources"; -import ErrSrv from "../../../Exceptions/ErrorService"; -import GeocodeResponse from "../Response/model/GeocodeResponse"; -import GeocodedLocation from "../Response/model/GeocodedLocation"; - -/** - * Fonction retournant un objet contenant des clés de lecture (readers) - * qui permettent de parser des réponses XML du service de géocodage direct du Géoportail - * afin de récupérer les résultats retournés. - * @module GeocodeResponseParser - * @alias Gp.Services.Geocode.Formats.GeocodeResponseParser - * @private - */ - -/** - * @classdesc - * - * Classe permettant de parser une réponse GeoJSON - * - * @constructor - * @alias Gp.Formats.GeocodeResponseParser - * - * @private - */ -function GeocodeResponseParser () { - if (!(this instanceof GeocodeResponseParser)) { - throw new TypeError("GeocodeResponseParser constructor cannot be called as a function."); - } -} - -GeocodeResponseParser.prototype = { - - /** - * @lends module:GeocodeResponseParser - */ - - /* - * Constructeur (alias) - */ - constructor : GeocodeResponseParser, - - /** - * Méthode permettant de lancer la lecture d'une réponse GeoJSON, - * - * @param {String} json - réponse au format GeoJSON - * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse GeoJSON, - * sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception. - */ - parse : function (json) { - var geocodeResponse = new GeocodeResponse(); - - const obj = JSON.parse(json); - - if (obj.type === "FeatureCollection") { - for (var i = 0; i < obj.features.length; ++i) { - _parseFeature(obj.features[i], geocodeResponse); - } - } else if (obj.type === "Feature") { - _parseFeature(obj, geocodeResponse); - } else if (obj.type === "SERVICE_ERROR") { - return _parseError(obj); - } else { - var mess = MR.getMessage("SERVICE_RESPONSE_ANALYSE", obj.type); - throw new ErrSrv({ - message : mess, - type : ErrSrv.TYPE_UNKERR, - status : 200 - }); - } - - return geocodeResponse; - } -}; - -/** - * Méthode permettant de parser un feature - * - * @private - * - * @param {Object} feature - * @param {Object} geocodeResponse - * - * @memberof GeocodeResponseParser - * @return {Object} objet GeocodedLocation - */ -function _parseFeature (feature, geocodeResponse) { - var location = new GeocodedLocation(); - if (feature.geometry && feature.geometry.type === "Point") { - location.position = { - lon : feature.geometry.coordinates[0], - lat : feature.geometry.coordinates[1] - }; - } - if (feature.properties) { - for (var prop in feature.properties) { - if (prop === "_score") { - location.accuracy = feature.properties[prop]; - } else if (prop === "_type") { - if (feature.properties[prop] === "address") { - location.type = "StreetAddress"; - } else if (feature.properties[prop] === "poi") { - location.type = "PositionOfInterest"; - } else if (feature.properties[prop] === "parcel") { - location.type = "CadastralParcel"; - } - } else { - location.placeAttributes[prop] = feature.properties[prop]; - } - } - if (feature.properties._type === "address") { - location.matchType = feature.properties.number !== undefined && feature.properties.number !== null ? "street number" : "street"; - } - } - geocodeResponse.locations.push(location); -} - -/** - * Méthode permettant de parser une erreur - * - * @private - * - * @param {Object} error - * - * @memberof GeocodeResponseParser - * @return {Object} - */ -function _parseError (error) { - return { - exceptionReport : error - }; -} - -export default GeocodeResponseParser; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js deleted file mode 100644 index 9ba48dfd..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js +++ /dev/null @@ -1,281 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; -import _ from "../../Utils/MessagesResources"; -import ErrorService from "../../Exceptions/ErrorService"; -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import GeocodeRequestFactory from "./Request/GeocodeRequestFactory"; -import GeocodeResponseFactory from "./Response/GeocodeResponseFactory"; - -/** - * @classdesc - * Appel du service de géocodage direct du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * - * - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.Geocode - * - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String|Object} options.query - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée. - * - * @param {Object} [options.filters] - Les propriétés possibles de cet objet sont décrites ci-après. - * @param {String} [options.filters.[prop]] - Critère supplémentaire pour filtrer la recherche sous la forme - * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. - * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : - * "postalCode", "inseeCode", "city". - * Il permet également de filtrer les toponymes avec les propriétés : - * "postalCode", "inseeCode", "type". - * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : - * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * - * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. - * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' - * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. - * L'index 'location' regroupe les indexes 'StreetAddress' et 'PositionOfInterest'. - * D'autres types pourront être rajoutés selon l'évolution du service. - * Par défaut, index = 'StreetAddress'. - * - * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. - * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. - * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. - * - * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. - * Pas de valeur par défaut. - * Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20. - * - * @param {Boolean} [options.returnTrueGeometry = false] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. - * false par défaut. - * - * - * @example - * var options = { - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * proxyURL : null, - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * position : {lon:, lat:}, - * index : 'StreetAddress', - * query : '10 rue du pont Machin-ville' - * (...) - * }; - */ -function Geocode (options_) { - if (!(this instanceof Geocode)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Geocode")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "Geocode"; - - this.logger = Logger.getLogger("Gp.Services.Geocode"); - this.logger.trace("[Constructeur Geocode (options)]"); - - var options = this.patchOptionConvertor(options_); - if (!options.serverUrl) { - options.serverUrl = DefaultUrlService.Geocode.newUrl(); - if (options.oldGeocodeService) { - options.serverUrl = DefaultUrlService.Geocode.url(); - } - } - - // appel du constructeur par heritage - CommonService.apply(this, [options]); - - if (!options.hasOwnProperty("query")) { - throw new Error(_.getMessage("PARAM_MISSING", "query")); - } - - // ajout des options spécifiques au service - this.options.query = options.query; - - // on definit l'index par defaut - if (!options.index) { - this.options.index = options.index = "StreetAddress"; - } - - if (options.filters) { - var filter = Object.keys(options.filters); - for (var i = 0; i < filter.length; i++) { - var key = filter[i]; - // on supprime les filtres vides - if (typeof options.filters[key] === "undefined" || - (typeof options.filters[key] === "object" && Object.keys(options.filters[key]).length === 0) || - (typeof options.filters[key] === "string" && options.filters[key].length === 0) || - (Array.isArray(options.filters[key]) && options.filters[key].length === 0) - ) { - delete this.options.filters[key]; - } - } - } - - this.options.index = options.index || "StreetAddress"; - this.options.maximumResponses = options.maximumResponses || 20; -} - -/** - * @lends module:Geocode# - */ -Geocode.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -Geocode.prototype.constructor = Geocode; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} options_ - options du service - * @return {Object} - options - */ -Geocode.prototype.patchOptionConvertor = function (options_) { - const options = options_; - - if (options.hasOwnProperty("location")) { - this.logger.warn("The parameter 'location' is deprecated"); - - if (!options.query) { - options.query = options.location; - } - delete options.location; - } - - if (options.filterOptions) { - this.logger.warn("The parameter 'filterOptions' is deprecated"); - - if (!options.filters) { - options.filters = options.filterOptions; - - if (options.filters.type) { - this.logger.warn("The parameter 'filterOptions.type' is deprecated"); - if (!options.index) { - if (Array.isArray(options.filters.type) && options.filters.type.length > 0) { - options.index = options.filters.type[0]; - } else { - options.index = options.filters.type; - } - } - delete options.filters.type; - } - - if (options.filters.bbox) { - this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); - delete options.filters.bbox; - } - } - delete options.filterOptions; - } - - if (options.position) { - if (options.position.x) { - this.logger.warn("The parameter 'position.x' is deprecated"); - - if (!options.position.lon) { - options.position.lon = options.position.x; - } - delete options.position.x; - } - - if (options.position.y) { - this.logger.warn("The parameter 'position.y' is deprecated"); - - if (!options.position.lat) { - options.position.lat = options.position.y; - } - delete options.position.y; - } - } - - if (options.returnFreeForm) { - this.logger.warn("The parameter 'returnFreeForm' is deprecated"); - delete options.returnFreeForm; - } - - if (options.srs) { - this.logger.warn("The parameter 'srs' is deprecated"); - delete options.srs; - } - - return options; -}; - -/** - * Création de la requête (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Geocode.prototype.buildRequest = function (error, success) { - var options = { - httpMethod : this.options.httpMethod, - // options specifiques du service - geocodeMethod : "search", - query : this.options.query, - index : this.options.index, - returnTrueGeometry : this.options.returnTrueGeometry, - position : this.options.position, - maxResp : this.options.maximumResponses, - filters : this.options.filters - }; - - this.request = GeocodeRequestFactory.build(options); - - // on teste si la requete a bien été construite ! - (!this.request) - ? error.call(this, new ErrorService(_.getMessage("SERVICE_REQUEST_BUILD"))) - : success.call(this, this.request); -}; - -/** - * Analyse de la reponse (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Geocode.prototype.analyzeResponse = function (error, success) { - /* INFO : - Etape 1 : Création de la requête (URL) - -> stockage de la requête dans this.request - Etape 2 : Envoi de la requête - -> appel du protocol XHR, et envoi (par ex send ()) - -> récupération de la réponse JSON dans la fonction onSuccess () (this.response) - -> si code HTTP 200 et pas de message d'erreur : etape 3 - -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur - Etape 3 : Analyse de la réponse JSON (si rawResponse === false ) - -> appel du parser pour récupérer le document - Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse : - -> JSON (si rawResponse === true) - -> ou geocodedLocations - */ - - if (this.response) { - var options = { - response : this.response, - rawResponse : this.options.rawResponse, - onError : error, - onSuccess : success, - scope : this - }; - - GeocodeResponseFactory.build(options); - } else { - error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -export default Geocode; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js deleted file mode 100644 index 3d9a70c8..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js +++ /dev/null @@ -1,48 +0,0 @@ - -/** - * @classdesc - * - * Liste des attributs des tables de geocodage - * @constructor - * @alias Gp.Services.Geocode.Request.GeocodeLocation - * @private - */ -function GeocodeLocation () { - if (!(this instanceof GeocodeLocation)) { - throw new TypeError("GeocodeLocation constructor cannot be called as a function."); - } - - /** - * Objet qui peut prendre comme propriétés les valeurs du tableau serviceAttributes - * @type {Object} - */ - this.placeAttributes = {}; - - /** - * Tableau qui liste les attributs spécifiques selon le type de la GeocodeLocation. - * Ces attributs correspondent à ceux saisis par l'utilisateur (légèrement différents de ceux du service) - * @type {String[]} - */ - this.attributesList = []; - - /** - * Tableau qui liste les attributs spécifiques selon le type de la GeocodeLocation - * Ces attributs correspondent à ceux interprétés par le service (balises Place). - * @type {String[]} - */ - this.serviceAttributes = []; -} - -/** - * @lends module:GeocodeLocation - */ -GeocodeLocation.prototype = { - - /** - * Constructeur (alias) - */ - constructor : GeocodeLocation - -}; - -export default GeocodeLocation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js deleted file mode 100644 index 1c8812bf..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js +++ /dev/null @@ -1,54 +0,0 @@ -import Logger from "../../../Utils/LoggerByDefault"; -import GeocodeRequestREST from "./GeocodeRequestREST"; - -/** - * Creation d'une requête - * (Factory) - * - * @module GeocodeRequestFactory - * @alias Gp.Services.Geocode.Request.GeocodeRequestFactory - * @private - */ -var GeocodeRequestFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Geocode - * - * @example - * var options = { - * // options specifiques du service - * geocodeMethod: - * query: - * filters: - * maximumResponses: - * }; - * var result = GeocodeRequestFactory.build(options); - * if (!result) { - * // error... - * } - * @returns {String} request - */ - build : function (options) { - // logger - var logger = Logger.getLogger("GeocodeRequestFactory"); - logger.trace(["GeocodeRequestFactory::build()"]); - - var settings = options || {}; - - var myReq = new GeocodeRequestREST(settings); - if (!myReq.processRequestString()) { - throw new Error("Error process request (rest) !"); - } - var request = myReq.requestString; - - logger.trace(request); - - return request; - } -}; - -export default GeocodeRequestFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js deleted file mode 100644 index 8ad68db0..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js +++ /dev/null @@ -1,87 +0,0 @@ - -import Logger from "../../../Utils/LoggerByDefault"; -import _ from "../../../Utils/MessagesResources"; -import GeocodeParamREST from "./model/GeocodeParamREST"; - -/** - * @classdesc - * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire - * (uniquement en GET) - * - * @constructor - * @alias Gp.Services.Geocode.Request.GeocodeRequestREST - * @param {Object} options - options definies dans le composant Route - * - * @example - * var options = { - * (...) - * }; - * - * @private - */ -function GeocodeRequestREST (options) { - this.logger = Logger.getLogger("GeocodeRequestREST"); - this.logger.trace("[Constructeur GeocodeRequestREST ()]"); - - if (!(this instanceof GeocodeRequestREST)) { - throw new TypeError("GeocodeRequestREST constructor cannot be called as a function."); - } - - // existance des options - if (!options) { - throw new Error(_.getMessage("PARAM_EMPTY", "options")); - } - - /** liste des options */ - this.settings = options; -} - -GeocodeRequestREST.prototype = { - - /** - * @lends module:GeocodeRequestREST# - */ - - /** - * request - * @type {String} - */ - requestString : null, - - /** - * Constructeur (alias) - */ - constructor : GeocodeRequestREST, - - /** - * Construction de la requête. - * - * @returns {String} request - */ - processRequestString : function () { - var request = ""; - - // Mapping des options avec le service de l'API REST - const oParams = new GeocodeParamREST(this.settings); - - const params = oParams.getParams(); - for (var i = 0; i < params.length; i++) { - var o = params[i]; - if (request) { - request += "&"; - } - request += o.k + "=" + o.v; - } - - if (!this.settings.geocodeMethod || (this.settings.geocodeMethod !== "search" && this.settings.geocodeMethod !== "reverse")) { - throw new Error("Error geocodeMethod not valid"); - } - - this.requestString = "?" + request; - this.logger.trace(this.requestString); - - return this.requestString; - } -}; - -export default GeocodeRequestREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js deleted file mode 100644 index 06396fd8..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js +++ /dev/null @@ -1,60 +0,0 @@ - -import GeocodeLocation from "../GeocodeLocation"; - -/** - * @classdesc - * Format des attributs d'un filtre de géocodage de type CadastralParcel. - * - * @constructor - * @alias Gp.Services.Geocode.Request.CadastralParcel - * @private - */ -function CadastralParcel () { - if (!(this instanceof CadastralParcel)) { - throw new TypeError("CadastralParcel constructor cannot be called as a function."); - } - - // INFO - // appel du constructeur de la classe mère - // avec passage de param. - GeocodeLocation.apply(this, arguments); - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "CadastralParcel"; - - /** - * Liste des attributs possibles pour une GeocodeLocation de type CadastralParcel - * - **absorbedCity** : Code commune absorbée de la parcelle : - * lorsqu'une parcelle est issue p d'une ancienne commune qui a fusionné avec une autre. - * Sinon, le code vaut '000'. *{String}* - * - **sheet** : Feuille de la parcelle (ex 1). *{String}* - * - **number** : Numéro de la parcelle (ex. 0041) *{String}* - * - **section** : Section de la parcelle (ex 0D). *{String}* - * - **commune** : Ville du filtre. *{String}* - * - **department** : Département du filtre. *{String}* - * - **insee** : Code INSEE du filtre. *{Number}* - * - **municipality** : Municipalité du filtre. *{String}* - * - **origin** : L'origine de l'objet parcellaire renvoyé - * (correspond à l'attribut "type" dans la réponse XML) - * Pour plus d'informations : http://api.ign.fr/tech-docs-js/fr/developpeur/search.html#Recherche_par_parcelles_cadastrales *{Number}* - * - */ - - this.attributesList = ["absorbedCity", "sheet", "number", "section", "commune", "department", "insee", "municipality", "origin"]; - - this.serviceAttributes = ["CommuneAbsorbee", "Feuille", "Numero", "Section", "Commune", "Departement", "INSEE", "Municipality", "Type"]; -} - -/** - * @lends module:CadastralParcel# - */ -CadastralParcel.prototype = Object.create(GeocodeLocation.prototype); - -/** - * Constructeur (alias) - */ -CadastralParcel.prototype.constructor = CadastralParcel; - -export default CadastralParcel; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js deleted file mode 100644 index 15a8e5fe..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js +++ /dev/null @@ -1,175 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). - * Permet le mapping avec les options du service. - * @constructor - * @alias Gp.Services.Route.Request.RouteParamREST - * @param {Object} options - options - * - * @private - */ -function GeocodeParamREST (options) { - if (!(this instanceof GeocodeParamREST)) { - throw new TypeError("GeocodeParamREST constructor cannot be called as a function."); - } - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur GeocodeParamREST ()]"); - - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - // methode de geocodage - if (!this.options.geocodeMethod || (this.options.geocodeMethod !== "search" && this.options.geocodeMethod !== "reverse")) { - throw new Error("Error geocodeMethod not valid"); - } - this.geocodeMethod = this.options.geocodeMethod; - - // mapping des options avec l'API REST - this.query = (typeof this.options !== "undefined") ? this.options.query : null; - - this.searchGeometry = this.options.searchGeometry || null; - - this.index = this.options.index || null; - - this.lon = this.options.position && this.options.position.lon ? this.options.position.lon : null; - - this.lat = this.options.position && this.options.position.lat ? this.options.position.lat : null; - - this.maxResp = this.options.maxResp || null; - - this.returnTrueGeometry = this.options.returnTrueGeometry || null; - - this.filters = this.options.filters || {}; -} - -/** - * CLASSNAME - */ -GeocodeParamREST.CLASSNAME = "GeocodeParamREST"; - -GeocodeParamREST.prototype = { - - /** - * @lends module:GeocodeParamREST# - */ - - /** - * Constructeur (alias) - */ - constructor : GeocodeParamREST, - - /** - * Retourne les filtres - * @returns {String} les filtres - */ - getFilters : function () { - var filters = {}; - for (var prop in this.filters) { - if (this.filters.hasOwnProperty(prop)) { - filters[prop] = this.filters[prop]; - } - } - return filters; - }, - - /** - * Retourne l'index - * @returns {String} l'index - */ - getIndex : function () { - if (this.index === undefined) { - return null; - } - if (this.index === "StreetAddress") { - return "address"; - } else if (this.index === "CadastralParcel") { - return "parcel"; - } else if (this.index === "PositionOfInterest") { - return "poi"; - } else if (this.index === "location") { - return "location"; - } - return this.index; - }, - - /** - * Retourne la géométrie de recherche - * @returns {String} la géométrie de recherche au format json - */ - getSearchGeometry : function () { - return JSON.stringify(this.searchGeometry); - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Array} liste de paramêtres - */ -GeocodeParamREST.prototype.getParams = function () { - var map = []; - - if (this.geocodeMethod === "search") { - map.push({ - k : "q", - v : this.query - }); - } - - if (this.index) { - map.push({ - k : "index", - v : this.getIndex() - }); - } - - if (this.geocodeMethod === "reverse" && this.searchGeometry) { - map.push({ - k : "searchgeom", - v : this.getSearchGeometry() - }); - } - - if (this.lon && this.lat) { - map.push({ - k : "lon", - v : this.lon - }); - map.push({ - k : "lat", - v : this.lat - }); - } - - if (this.maxResp) { - map.push({ - k : "limit", - v : this.maxResp - }); - } - - if (this.returnTrueGeometry) { - map.push({ - k : "returntruegeometry", - v : this.returnTrueGeometry - }); - } - - const filters = this.getFilters(); - for (var key in filters) { - map.push({ - k : key, - v : filters[key] - }); - } - - return map; -}; - -export default GeocodeParamREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js deleted file mode 100644 index 56fea859..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js +++ /dev/null @@ -1,55 +0,0 @@ - -import GeocodeLocation from "../GeocodeLocation"; - -/** - * @classdesc - * Format des attributs d'un résultat de géocodage de type PositionOfInterest - * - * @constructor - * @alias Gp.Services.Geocode.Request.PositionOfInterest - * @private - */ -function PositionOfInterest () { - if (!(this instanceof PositionOfInterest)) { - throw new TypeError("PositionOfInterest constructor cannot be called as a function."); - } - - // INFO - // appel du constructeur de la classe mère - // avec passage de param. - GeocodeLocation.apply(this, arguments); - - /** - * Nom de la classe (heritage) - * @type {String} - */ - this.CLASSNAME = "PositionOfInterest"; - - /** - * Liste des attributs possibles pour une GeocodeLocation de type PositionOfInterest - * - **bbox** : Emprise du toponyme dans le système de coordonnées demandé {left, right, top, bottom} *{Object}* - * - **importance** : Importance du toponyme *{number}* - * - **nature** : Nature du toponyme. *{String}* - * - **territory** : Code du territoire français où se situe le toponyme *{String}* - * - **commune** : Ville du toponyme. *{String}* - * - **department** : Département du toponyme. *{String}* - * - **insee** : Code INSEE de la commune où se situe le toponyme. *{Number}* - * - **municipality** : Municipalité du toponyme. *{String}* - */ - - this.attributesList = ["bbox", "importance", "nature", "territory", "commune", "department", "insee", "municipality"]; - - this.serviceAttributes = ["bbox", "Importance", "Nature", "Territoire", "Commune", "Departement", "INSEE", "Municipality"]; -} - -/** - * @lends module:PositionOfInterest# - */ -PositionOfInterest.prototype = Object.create(GeocodeLocation.prototype); - -/** - * Constructeur (alias) - */ -PositionOfInterest.prototype.constructor = PositionOfInterest; - -export default PositionOfInterest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js deleted file mode 100644 index 659cf2f5..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js +++ /dev/null @@ -1,56 +0,0 @@ - -import GeocodeLocation from "../GeocodeLocation"; - -/** - * @classdesc - * Format des attributs d'un résultat de géocodage de type StreetAddress. - * - * @constructor - * @alias Gp.Services.Geocode.Request.StreetAddress - * @private - */ -function StreetAddress () { - if (!(this instanceof StreetAddress)) { - throw new TypeError("StreetAddress constructor cannot be called as a function."); - } - - // INFO - // appel du constructeur de la classe mère - // avec passage de param. - GeocodeLocation.apply(this, arguments); - - /** - * Nom de la classe (heritage) - * @type {String} - */ - this.CLASSNAME = "StreetAddress"; - - /** - * Liste des attributs possibles pour une GeocodeLocation de type StreetAddress - * - **bbox** : Emprise de l'adresse dans le système de coordonnées demandé {left, right, top, bottom}. *{Object}* - * - **ID** : Identifiant BD ADRESSE dans le cas où le résultat est une adresse. *{String}* - * - **IDTR** : Identifiant "Route Adresse" de la voie portant l'adresse dans la base BD ADRESSE. *{String}* - * - **quality** : Indicateur de qualité du géocodage (pour plus d'infos : http://api.ign.fr/tech-docs-js/fr/developpeur/search.html *{String}* - * - **territory** : Code du territoire français où se situe l'adresse *{String}* - * - **commune** : Ville l'adresse. *{String}* - * - **department** : Département l'adresse. *{String}* - * - **insee** : Code INSEE de l'adresse. *{Number}* - * - **municipality** : Municipalité de l'adresse. *{String}* - */ - - this.attributesList = ["bbox", "ID", "IDTR", "quality", "territory", "commune", "department", "insee", "municipality"]; - - this.serviceAttributes = ["bbox", "ID", "IDTR", "Qualite", "Territoire", "Commune", "Departement", "INSEE", "Municipality"]; -} - -/** - * @lends module:StreetAdress# - */ -StreetAddress.prototype = Object.create(GeocodeLocation.prototype); - -/** - * Constructeur (alias) - */ -StreetAddress.prototype.constructor = StreetAddress; - -export default StreetAddress; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js deleted file mode 100644 index f8fe47bf..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Factory pour générer une reponse JSON à partir d'un XML - * (Factory) - * - * @module GeocodeResponseFactory - * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory - * @private - */ -// import Logger from "../../../Utils/LoggerByDefault"; -import ErrorService from "../../../Exceptions/ErrorService"; -import MRes from "../../../Utils/MessagesResources"; -import GeocodeResponseParser from "../Formats/GeocodeResponseParser"; - -var GeocodeReponseFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Geocode - * - * @example - * var options = { - * response : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build : function (options) { - // data de type GeocodeResponse - var data = null; - - if (options.response) { - if (options.rawResponse) { - data = options.response; - } else { - try { - const parser = new GeocodeResponseParser(); - data = parser.parse(options.response); - - if (!data) { - throw new Error("L'analyse de la réponse du service !?"); - } - } catch (e) { - var message = e.message; - if (typeof options.response === "string") { - message += "('" + options.response + "')"; - } else { - message += "('" + options.response.documentElement.innerHTML + "')"; - } - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_ANALYSE", message), - type : ErrorService.TYPE_UNKERR, - status : -1 - })); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type : ErrorService.TYPE_SRVERR, - status : 200 // FIXME : 200 ? - })); - return; - } - } - } else { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EMPTY"), - type : ErrorService.TYPE_SRVERR, - status : -1 // FIXME : status response - })); - return; - } - - options.onSuccess.call(options.scope, data); - } -}; - -export default GeocodeReponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js deleted file mode 100644 index d79dcfa5..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js +++ /dev/null @@ -1,24 +0,0 @@ - -/** - * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Array.} locations - locations array. - * - * @namespace - * @alias Gp.Services.GeocodeResponse - */ -function GeocodeResponse () { - if (!(this instanceof GeocodeResponse)) { - throw new TypeError("GeocodeResponse constructor cannot be called as a function."); - } - - this.locations = []; -} - -GeocodeResponse.prototype = { - - constructor : GeocodeResponse - -}; - -export default GeocodeResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js deleted file mode 100644 index 0803b0cb..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js +++ /dev/null @@ -1,77 +0,0 @@ - -/** - * Single location object returned by the underlying geocoding web service. - * - * @property {Gp.Point} position - Position of the location given in the requested coordinates system. - * @property {String} type - location type "StreetAddress" (for an address), "PositionOfInterest" (for a place name) or "CadastralParcel" (for cadastral parcel). - * @property {String} matchType - how geocoding is performed : "street number" (exact address), "street enhanced" (street number calculated by interpolation), "street" (only the street), "city" (only the city). - * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match). - * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service : - * - * *Common attributes : * - * - * - **trueGeometry** - the 'real life' geometry if different from 'Point' type. - * - * *if type === "StreetAddress" :* - * - * - **number** - Street number. - * - **postalCode** - PostCode - * - **street** - Street name - * - **city** - City - * - **houseNumberInfos** - additional street number information - * - **inseeCode** - INSEE Code - * - * - * *if type === "PositionOfInterest" :* - * - * - **type** - Place name type - * - **postalCode** - PostCode - * - **toponyme** - Toponyme - * - **extraFields** - additional place name properties - * - **inseeCode** - INSEE Code - * - * - * *si type = "CadastralParcel" :* - * - * - **codeCommuneAbs** - when a parcel comes from a city that was absorbed by another, code of that old city. "000" otherwise. - * - **codeArrondissement** - arrondissement - * - **identifiant** - cadastral parcel code - * - **feuille** - Parcel Sheet (eg. "1"). - * - **numero** - Parcel Number (eg. "0041") - * - **section** - Parcel Section (eg. "0D"). - * - **nomCommune** - Parcel municipality name. - * - **codeCommune** - Parcel municipality. - * - **codeDepartement** - Parcel Department. - * - * @namespace - * @alias Gp.Services.Geocode.GeocodedLocation - */ -function GeocodedLocation () { - if (!(this instanceof GeocodedLocation)) { - throw new TypeError("GeocodedLocation constructor cannot be called as a function."); - } - - this.position = null; - - this.matchType = null; - - this.placeAttributes = {}; - - this.type = null; - - this.accuracy = null; - - /** - * Nom de la classe : "GeocodedLocation" - * @type {String} - */ - this.CLASSNAME = "GeocodedLocation"; -} - -GeocodedLocation.prototype = { - - constructor : GeocodedLocation - -}; - -export default GeocodedLocation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js deleted file mode 100644 index 06e229d8..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js +++ /dev/null @@ -1,341 +0,0 @@ -import Logger from "../../Utils/LoggerByDefault"; -import _ from "../../Utils/MessagesResources"; -import ErrorService from "../../Exceptions/ErrorService"; -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import GeocodeRequestFactory from "./Request/GeocodeRequestFactory"; -import GeocodeResponseFactory from "./Response/GeocodeResponseFactory"; - -/** - * @classdesc - * Appel du service de géocodage inverse du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.ReverseGeocode - * - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. - * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. - * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. - * - * @param {Object} [options.filters] - Les propriétés possibles de cet objet. - * @param {String} [options.filters.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme - * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. - * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : - * "postalCode", "inseeCode", "city". - * Il permet également de filtrer les toponymes avec les propriétés : - * "postalCode", "inseeCode", "type". - * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : - * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * - * @param {Object} [options.searchGeometry] - Emprise dans laquelle on souhaite effectuer la recherche. - * Les propriétés possibles de cet objet sont décrites ci-après. - * @param {String} options.searchGeometry.type - Type de géometrie (Point|Circle|Linestring|Polygon) - * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordonnées des points constituant la géométrie. - * @param {Float} options.searchGeometry.radius - Rayon. Paramètre applicable uniquement pour le type 'Circle'. - * - * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. - * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' - * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. L'index 'location' permet une recherche - * multi-indexes en regroupant les indexes 'PositionOfInterest' et 'StreetAddress'. - * D'autres types pourront être rajoutés selon l'évolution du service. - * Par défaut, index = 'StreetAddress'. - * - * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. - * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20s. - * - * @param {Boolean} [options.returnTrueGeometry] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. - * false par défaut. - * - * @example - * var options = { - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * proxyURL : null, - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * index : 'StreetAddress', - * searchGeometry : { - * type : Circle, - * coordinates : [48, 2], - * radius : 100 - * }, - * position : {lon:2 , lat:48.5}, - * maximumResponses : 25, - * }; - * - */ -function ReverseGeocode (options_) { - if (!(this instanceof ReverseGeocode)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "ReverseGeocode")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "ReverseGeocode"; - - this.logger = Logger.getLogger("Gp.Services.ReverseGeocode"); - this.logger.trace("[Constructeur ReverseGeocode (options)]"); - - var options = this.patchOptionConvertor(options_); - if (!options.serverUrl) { - options.serverUrl = DefaultUrlService.ReverseGeocode.newUrl(); - if (options.oldReverseService) { - options.serverUrl = DefaultUrlService.ReverseGeocode.url(); - } - } - - // appel du constructeur par heritage - CommonService.apply(this, [options]); - - if (!options.searchGeometry) { - if (!options.position) { - throw new Error(_.getMessage("PARAM_MISSING", "searchGeometry")); - } - } else { - this.options.searchGeometry = options.searchGeometry; - } - - // on definit l'index par defaut - if (!options.index) { - this.options.index = options.index = "StreetAddress"; - } - - if (options.filters) { - var filter = Object.keys(options.filters); - for (var i = 0; i < filter.length; i++) { - var key = filter[i]; - // on supprime les filtres vides - if (typeof options.filters[key] === "undefined" || - (typeof options.filters[key] === "object" && Object.keys(options.filters[key]).length === 0) || - (typeof options.filters[key] === "string" && options.filters[key].length === 0) || - (Array.isArray(options.filters[key]) && options.filters[key].length === 0) - ) { - delete this.options.filters[key]; - } - } - } - - this.options.position = options.position; - this.options.index = options.index || "StreetAddress"; - this.options.maximumResponses = options.maximumResponses || 20; -} - -/** - * @lends module:ReverseGeocode# - */ -ReverseGeocode.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -ReverseGeocode.prototype.constructor = ReverseGeocode; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} options_ - options du service - * @return {Object} - options - */ -ReverseGeocode.prototype.patchOptionConvertor = function (options_) { - var options = options_; - - if (options.filterOptions) { - this.logger.warn("The parameter 'filterOptions' is deprecated"); - - if (options.filterOptions.type) { - this.logger.warn("The parameter 'filterOptions.type' is deprecated"); - if (!options.index) { - if (Array.isArray(options.filterOptions.type) && options.filterOptions.type.length > 0) { - options.index = options.filterOptions.type[0]; - } else { - options.index = options.filterOptions.type; - } - } - delete options.filterOptions.type; - } - - if (options.filterOptions.bbox) { - this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); - if (!options.searchGeometry) { - // convertir la geometrie - options.searchGeometry = this.bbox2Json(options.filterOptions.bbox); - } - delete options.filterOptions.bbox; - } - - if (options.filterOptions.circle) { - this.logger.warn("The parameter 'filterOptions.circle' is deprecated"); - if (!options.searchGeometry) { - // convertir la geometrie - options.searchGeometry = this.circle2Json(options.filterOptions.circle); - } - delete options.filterOptions.circle; - } - - if (options.filterOptions.polygon) { - this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"); - if (!options.searchGeometry) { - // convertir la geometrie - options.searchGeometry = this.polygon2Json(options.filterOptions.polygon); - } - delete options.filterOptions.polygon; - } - - if (!options.filters && Object.keys(options.filterOptions).length > 0) { - options.filters = options.filterOptions; - } - - delete options.filterOptions; - } - - if (options.position) { - if (options.position.x) { - this.logger.warn("The parameter 'position.x' is deprecated"); - - if (!options.position.lon) { - options.position.lon = options.position.x; - } - delete options.position.x; - } - - if (options.position.y) { - this.logger.warn("The parameter 'position.y' is deprecated"); - - if (!options.position.lat) { - options.position.lat = options.position.y; - } - delete options.position.y; - } - } - - if (options.srs) { - this.logger.warn("The parameter 'srs' is deprecated"); - delete options.srs; - } - - return options; -}; - -/** - * (overwrite) - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -ReverseGeocode.prototype.buildRequest = function (error, success) { - var options = { - httpMethod : this.options.httpMethod, - // options specifiques du service - geocodeMethod : "reverse", - searchGeometry : this.options.searchGeometry, - index : this.options.index, - position : this.options.position, - returnTrueGeometry : this.options.returnTrueGeometry, - maxResp : this.options.maximumResponses, - filters : this.options.filters - }; - - this.request = GeocodeRequestFactory.build(options); - - // on teste si la requete a bien été construite ! - (!this.request) - ? error.call(this, new ErrorService(_.getMessage("SERVICE_REQUEST_BUILD"))) - : success.call(this, this.request); -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -ReverseGeocode.prototype.analyzeResponse = function (error, success) { - if (this.response) { - var options = { - response : this.response, - rawResponse : this.options.rawResponse, - onError : error, - onSuccess : success, - scope : this - }; - - GeocodeResponseFactory.build(options); - } else { - error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Array} bbox - bbox - * @return {Object} - geometrie au format json - */ -ReverseGeocode.prototype.bbox2Json = function (bbox) { - return { - type : "Polygon", - coordinates : [[ - [bbox.left, bbox.top], - [bbox.right, bbox.top], - [bbox.right, bbox.bottom], - [bbox.left, bbox.bottom], - [bbox.left, bbox.top] - ]] - }; -}; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Object} circle - circle - * @return {Object} - geometrie au format json - */ -ReverseGeocode.prototype.circle2Json = function (circle) { - return { - type : "Circle", - radius : circle.radius, - coordinates : [circle.x, circle.y] - }; -}; - -/** - * Patch pour la convertion des options vers le nouveau formalisme. - * - * @param {Array} polygon - polygon - * @return {Object} - geometrie au format json - */ -ReverseGeocode.prototype.polygon2Json = function (polygon) { - var jsonGeom = { - type : "Polygon", - coordinates : [[]] - }; - - for (var i = 0; i < polygon.length; ++i) { - jsonGeom.coordinates[0].push([polygon[i].x, polygon[i].y]); - } - - return jsonGeom; -}; - -/** - * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées. - */ -ReverseGeocode.geoEPSG = ["EPSG:4326"]; - -export default ReverseGeocode; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js deleted file mode 100644 index b5c8ce6d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Analyse de la reponse XML - * - * @module ProcessIsoCurveResponseReader - * @alias Gp.Services.ProcessIsoCurve.Formats.ProcessIsoCurveResponseReader - * @todo not yet implemented ! - * @private - */ - -import MessagesResources from "../../../Utils/MessagesResources"; -import WKT from "../../../Formats/WKT"; -import ErrSrv from "../../../Exceptions/ErrorService"; -import ProcessIsoCurveResponse from "../Response/model/ProcessIsoCurveResponse"; - -/** - * Objet ProcessIsoCurveResponseReader - * - * @member {Object} ProcessIsoCurveResponseReader - * - * @property {Object} ProcessIsoCurveResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers" - * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire - * et la valeur associée est une fonction (node, data) - * où node est un noeud du document DOM - * et data est un objet où l'on stocke les informations lues dans le XML. - * - * @property {Method} ProcessIsoCurveResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML - * du service de calcul isochrone/isodistance, à l'aide des readers de la classe. - * - */ - -var ProcessIsoCurveResponseReader = {}; - -/* - // INFO - // Exemple d'erreur du service - // - // - // Location point must have 2 components separated with a , - // ERROR - // - - // - // - // ServiceException : Error in isochron computation Error in smartrouting null - // ERROR - // - - // INFO - // Exemple d'erreur NGinx - // Resource parameter not found -*/ - -/* - // INFO - // Exemple de réponse du service - - // - // OK - // - // -1.557189,47.217122 - // - // 5000 - // POLYGON ((-1.545312 47.178178, -1.545312 47.180418, ...)) - // - - // - // OK - // 1 - // -1.557189,47.217122 - // - // - // POLYGON ((-1.556864 47.216487, -1.556864 47.216948, ...)) - // -*/ - -ProcessIsoCurveResponseReader.READERS = { - - /** TODO : jsdoc block */ - isochronResult : function (root) { - // racine de la réponse XML : on crée l'objet de réponse - var response = new ProcessIsoCurveResponse(); - - if (root.hasChildNodes()) { - var children = root.childNodes; - var child; - - for (var i = 0; i < children.length; i++) { - child = children[i]; - - if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) { - ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response); - } - } - } - - if (response.status === "error") { - var message = MessagesResources.getMessage("SERVICE_RESPONSE_EXCEPTION", - response.message); - throw new ErrSrv({ - message : message, - type : ErrSrv.TYPE_SRVERR - }); - } - return response; - }, - - /** TODO : jsdoc block */ - message : function (node, response) { - if (response) { - response.message = __getChildValue(node); - } - }, - - /** TODO : jsdoc block */ - status : function (node, response) { - var status = __getChildValue(node); - if (status === "ERROR" || status === "error") { - if (response) { - response.status = "error"; - } - } - }, - - /** TODO : jsdoc block */ - id : function (node, response) { - if (response) { - response.id = __getChildValue(node); - } - }, - - /** TODO : jsdoc block */ - location : function (node, response) { - var coords = __getChildValue(node); - if (response && response.location) { - response.location.x = parseFloat(coords.split(",")[0]); - response.location.y = parseFloat(coords.split(",")[1]); - } - }, - - /** TODO : jsdoc block */ - srs : function (node, response) { - if (response) { - response.srs = __getChildValue(node); - } - }, - - /** TODO : jsdoc block */ - distance : function (node, response) { - if (response) { - response.distance = parseFloat(__getChildValue(node)); - } - }, - - /** TODO : jsdoc block */ - time : function (node, response) { - if (response) { - response.time = parseFloat(__getChildValue(node)); - } - }, - - /** TODO : jsdoc block */ - wktGeometry : function (node, response) { - if (response) { - var wktGeometry = node.innerHTML; - /** TODO : jsdoc block */ - var onWKTSuccess = function (json) { - response.geometry = json; - }; - /** TODO : jsdoc block */ - var onWKTError = function () { - var msg = MessagesResources.getMessage("PARAM_FORMAT", ["wktGeometry"]); - throw new Error(msg); - }; - if (response.hasOwnProperty("geometry")) { - WKT.toJson(wktGeometry, onWKTSuccess, onWKTError); - } - } - }, - - /** TODO : jsdoc block */ - serviceResult : function (node) { - // en cas d'exception du service - var response = {}; - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) { - ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response); - } - } - } - return response; - }, - - /** TODO : jsdoc block */ - ExceptionReport : function (node) { - var response = {}; - if (node.hasChildNodes()) { - var children = node.childNodes; - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (child.nodeName === "Exception") { - response.exceptionReport = ProcessIsoCurveResponseReader.READERS["Exception"](child); - } - } - } - return response; - }, - - /** TODO : jsdoc block */ - Exception : function (node) { - var exceptionReport = {}; - - // get exception code - var exceptionCode = node.getAttribute("exceptionCode"); - if (exceptionCode) { - exceptionReport.exceptionCode = exceptionCode; - } - - // get exception message - var textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - exceptionReport.exception = textNode.nodeValue; - } - - return exceptionReport; - } -}; - -/** TODO : jsdoc block */ -ProcessIsoCurveResponseReader.read = function (root) { - var response; - - if (root.nodeName === "isochronResult" || root.nodeName === "isochroneResult" || root.nodeName === "IsochroneResult") { - response = ProcessIsoCurveResponseReader.READERS["isochronResult"](root); - return response; - } else if (root.nodeName === "ExceptionReport") { - response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root); - return response; - } else if (ProcessIsoCurveResponseReader.READERS[root.nodeName]) { - response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root); - if (response.status === "error") { - var errMsg = MessagesResources.getMessage("SERVICE_RESPONSE_EXCEPTION", - response.message); - throw new ErrSrv({ - message : errMsg, - type : ErrSrv.TYPE_SRVERR - }); - } - return response; - } else { - throw new ErrSrv({ - message : MessagesResources.getMessage("SERVICE_RESPONSE_ANALYSE", root.nodeName), - type : ErrSrv.TYPE_UNKERR - }); - } -}; - -/** - * Lecture de la valeur du premier child d'un noeud, si elle existe. - * - * @private - * @memberof ProcessIsoCurveResponseReader - * @method __getChildValue - * @param {DOMElement} node - a DOM node - * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide. - */ -function __getChildValue (node) { - var textNode; - var value = ""; - - if (node.hasChildNodes()) { - textNode = node.firstChild; - if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE - value = textNode.nodeValue; - } - } - return value; -} - -export default ProcessIsoCurveResponseReader; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js deleted file mode 100644 index 69ce0e1d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js +++ /dev/null @@ -1,323 +0,0 @@ - -import Logger from "../../Utils/LoggerByDefault"; -import _ from "../../Utils/MessagesResources"; -import ErrorService from "../../Exceptions/ErrorService"; -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import ProcessIsoCurveRequest from "./Request/ProcessIsoCurveRequest"; -import ProcessIsoCurveResponseFactory from "./Response/ProcessIsoCurveResponseFactory"; - -/** - * @classdesc - * Appel du service d'isochrone/distance du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * @constructor - * @extends {Gp.Services.CommonService} - * @alias Gp.Services.ProcessIsoCurve - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. - * - * @param {String} options.outputFormat - Le format de la réponse du service iso : 'json' uniquement et par défaut. - * - * @param {Object} options.position - Point de départ du calcul. - * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) - * @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance. - * @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance. - * - * @param {String} options.srs - Projection. - * Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et - * dans lequel la géométrie de la courbe résultante sera exprimée. - * Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ». - * - * @param {String} [options.graph = "voiture"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »). - * La valeur par défaut est : «voiture» - * - * @param {Array.} [options.exclusions] - DEPRECATED: Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints. - * Critères d'exclusions à appliquer pour le calcul. - * On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte - * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). - * - * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. - * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". - * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". - * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". - * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". - * - * @param {String} [options.method = "time"] - Méthode utilisée pour le calcul de la courbe iso. - * Les valeurs possible sont "time" pour un calcul d'isochrone, "distance" pour un calcul d'isodistance. - * Pas de valeur spécifié équivaut à un calcul d'isochrone. - * - * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse ("m" or "km"). - * - * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse ("standard", "second", "minute", "hour"). Il peut-être formatté hh:mm::ss avec la valeur standard. - * - * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ». - * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "time". - * Si l'option method n'est pas renseignée, ce paramètre doit être renseigné. - * - * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ». - * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "DISTANCE". - * Si l'option "method" n'est pas renseignée, ce paramètre sera ignoré. - * - * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. - * Par défaut, la valeur « false » est appliquée. - * - * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. - * Par défaut, la valeur « false » est appliquée. - * - * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »). - * Par défaut, la valeur « false » est appliquée. - * - * @example - * var options = { - * // options communes aux services - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'JSONP', // JSONP|XHR - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * position : { - * x : 2.3242664298058053, - * y : 48.86118017324745 - * }, - * distance : 200, - * [time : ] - * method : "distance", - * graph : "voiture", - * reverse : false - * }; - */ - -function ProcessIsoCurve (options) { - if (!(this instanceof ProcessIsoCurve)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "ProcessIsoCurve")); - } - - /** - * Nom de la classe (heritage) - * FIXME instance ou classe ? - */ - this.CLASSNAME = "ProcessIsoCurve"; - - // appel du constructeur par heritage - CommonService.apply(this, arguments); - - this.logger = Logger.getLogger("Gp.Services.ProcessIsoCurve"); - this.logger.trace("[Constructeur ProcessIsoCurve (options)]"); - - if (!options.position) { - throw new Error(_.getMessage("PARAM_MISSING", "position")); - } - - // on lance une exception afin d'eviter au service de le faire... - if (options.position.x === null) { - throw new Error(_.getMessage("PARAM_MISSING", "position.x")); - } - - if (options.position.y === null) { - throw new Error(_.getMessage("PARAM_MISSING", "position.y")); - } - - if (!options.time && !options.distance) { - throw new Error("Parameter (s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance"); - } - - // si on a que le paramètre "distance" en entrée, on calcule une isodistance. - // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "distance" - if (!options.time && options.distance) { - this.options.method = "distance"; - // on supprime l'éventuel attribut time, résidu d'un appel antérieur - if (this.options.time) { - delete this.options.time; - } - } - - // si on a que le paramètre "time" en entrée, on calcule une isochrone. - // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "time" - if (options.time && !options.distance) { - this.options.method = "time"; - // on supprime l'éventuel attribut time, résidu d'un appel antérieur - if (this.options.distance) { - delete this.options.distance; - } - } - - // au cas où on a ni l'un, ni l'autre... - this.options.method = this.options.method || "time"; - - // options par defaut du service - // TODO: modifier la ressource lors de la mise en production du service - this.options.resource = options.resource || "bdtopo-iso"; - this.options.exclusions = options.exclusions || []; - this.options.reverse = options.reverse || false; - this.options.srs = options.srs || "EPSG:4326"; - this.options.distanceUnit = options.distanceUnit || "m"; - this.options.timeUnit = options.timeUnit || "second"; - - // options depreciees - if (options.smoothing) { - this.logger.warn("options.smoothing is DEPRECATED"); - } - this.options.smoothing = false; - if (options.holes) { - this.logger.warn("options.holes is DEPRECATED"); - } - this.options.holes = false; - - // Gestion du graphe - if (options.graph) { - if (options.graph === "Voiture") { - this.options.graph = "car"; - } - if (options.graph === "Pieton") { - this.options.graph = "pedestrian"; - } - } else { - this.options.graph = "car"; - } - - // Gestions des contraintes - this.options.constraints = []; - if (options.constraints) { - if (Array.isArray(options.constraints)) { - for (var k = 0; k < options.constraints.length; k++) { - this.options.constraints.push(options.constraints[k]); - } - } else { - throw new Error(_.getMessage("PARAM_TYPE", "constraints")); - } - } - - // Gestion de l'ancien paramètre exclusions - var constraintTunnel = {}; - var constraintPont = {}; - var constraintAutoroute = {}; - if (options.exclusions) { - if (options.exclusions.length !== 0) { - this.logger.warn("options.exclusions is DEPRECATED !!"); - for (var c = 0; c < options.exclusions.length; c++) { - if (typeof options.exclusions[c] === "string") { - options.exclusions[c] = options.exclusions[c].toLowerCase(); - } else { - // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions - continue; - } - if (options.exclusions[c] === "toll") { - constraintAutoroute.constraintType = "banned"; - constraintAutoroute.key = "wayType"; - constraintAutoroute.operator = "="; - constraintAutoroute.value = "autoroute"; - this.options.constraints.push(constraintAutoroute); - } - if (options.exclusions[c] === "tunnel") { - constraintTunnel.constraintType = "banned"; - constraintTunnel.key = "wayType"; - constraintTunnel.operator = "="; - constraintTunnel.value = "tunnel"; - this.options.constraints.push(constraintTunnel); - } - if (options.exclusions[c] === "bridge") { - constraintPont.constraintType = "banned"; - constraintPont.key = "wayType"; - constraintPont.operator = "="; - constraintPont.value = "pont"; - this.options.constraints.push(constraintPont); - } - } - } - } - - // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. - this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "json"; - if (options.outputFormat && options.outputFormat !== "json") { - throw new Error(_.getMessage("PARAM_NOT_SUPPORT", "outputFormat")); - } - this.options.outputFormat = "json"; - - // gestion de l'url du service par defaut - // si l'url n'est pas renseignée, il faut utiliser les urls par defaut - if (!this.options.serverUrl) { - // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone - /* var urlFound = DefaultUrlService.ProcessIsoCurve.newUrl(); - if (this.options.oldIsoService) { - urlFound = DefaultUrlService.ProcessIsoCurve.url(); - } */ - // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone - var urlFound = DefaultUrlService.ProcessIsoCurve.url(); - if (!urlFound) { - throw new Error("Url by default not found !"); - } - this.options.serverUrl = urlFound; - this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); - } -} - -/** - * @lends module:ProcessIsoCurve# - */ -ProcessIsoCurve.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -ProcessIsoCurve.prototype.constructor = ProcessIsoCurve; - -/** - * Création de la requête (overwrite) - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -ProcessIsoCurve.prototype.buildRequest = function (error, success) { - try { - var oIsoCurve = new ProcessIsoCurveRequest(this.options); - if (!oIsoCurve.processRequestString()) { - throw new Error(_.getMessage("SERVICE_REQUEST_BUILD")); - } - - this.request = oIsoCurve.requestString; - } catch (e) { - error.call(this, new ErrorService(e.message)); - return; - } - - success.call(this, this.request); -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} onError - callback des erreurs - * @param {Function} onSuccess - callback de succès de l'analyse de la réponse - */ -ProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) { - if (this.response) { - var options = { - response : this.response, - outputFormat : this.options.outputFormat, - rawResponse : this.options.rawResponse, - onSuccess : onSuccess, - onError : onError, - scope : this - }; - - ProcessIsoCurveResponseFactory.build(options); - } else { - onError.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -export default ProcessIsoCurve; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js deleted file mode 100644 index b353be51..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js +++ /dev/null @@ -1,190 +0,0 @@ - -import Logger from "../../../Utils/LoggerByDefault"; -import _ from "../../../Utils/MessagesResources"; -import ProcessIsoCurveParam from "./model/ProcessIsoCurveParam"; - -/** - * @classdesc - * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance. - * Les requêtes peuvent être en mode GET ou POST, - * et le format de sorti est en JSON. - * - * @constructor - * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest - * @param {Object} options - options - * - * @example - * var options = { - * httpMethod : 'GET', // GET|POST - * // spécifique au service - * position : { - * x : 2.3242664298058053, - * y : 48.86118017324745 - * }, - * graph : "car", - * method : 'time', - * time : 1000, //distance : 200 - * reverse : false, - * srs : 'EPSG:4326' - * }; - * - * try { - * - * var oIsoCurve = new ProcessIsoCurveRequest (options); - * if (!oIsoCurve.processRequestString ()) { - * // error - * } - * - * var request = oIsoCurve.requestString; - * - * } catch (e) { - * // error - * } - * @private - */ -function ProcessIsoCurveRequest (options) { - this.logger = Logger.getLogger("ProcessIsoCurveRequest"); - this.logger.trace("[Constructeur ProcessIsoCurveRequest ()]"); - - if (!(this instanceof ProcessIsoCurveRequest)) { - throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function."); - } - - // existance des options - if (!options) { - throw new Error(_.getMessage("PARAM_EMPTY", "options")); - } - - /** - * Liste des options - */ - this.settings = options; - - /** - * Mode HTPP. - * Par defaut, "GET". - * @type {String} - */ - this.mode = this.settings.httpMethod || "GET"; -} - -ProcessIsoCurveRequest.prototype = { - - /** - * @lends module:ProcessIsoCurveRequest# - */ - - /** - * Requête - * @type {String} - */ - requestString : null, - - /** - * Constructeur (alias) - */ - constructor : ProcessIsoCurveRequest, - - /** - * Construction de la requête. - * - * @example - * // GET out : - * // (http://wxs.ign.fr/KEY/isochrone?) - * // resource=& - * // point=& - * // costValue=& - * // costType=& - * // profile=& - * // constraints=& - * // direction=& - * // crs= - * - * // POST out : - * { - * resource: "bduni-idf-pgr", - * point: "2.337306,48.849319", - * costValue: 100, - * costType: "time", - * profile: "car", - * constraints: [{ - * constraintType: "banned", - * key: "ways_type", - * operator: "=", - * value: "autoroute" - * }] - * } - * - * @returns {String} request - */ - processRequestString : function () { - var request = ""; - var i = 0; - - switch (this.mode) { - case "GET": - this.logger.trace("Process GET Request"); - - // Mapping des options avec le service de l'API REST - var oParams = new ProcessIsoCurveParam(this.settings); - var params = oParams.getParams(); - - for (i = 0; i < params.length; i++) { - var o = params[i]; - if (request) { - request += "&"; - } - request += o.k + "=" + o.v; - } - - break; - - case "POST": - this.logger.trace("Process POST Request"); - // creation du JSON - var postRequest = {}; - - postRequest.resource = this.settings.resource; - - postRequest.point = this.settings.position.x + "," + this.settings.position.y; - - if (this.settings.method === "distance") { - postRequest.costType = "distance"; - postRequest.costValue = this.settings.distance; - } else { - postRequest.costType = "time"; - postRequest.costValue = this.settings.time; - } - - postRequest.profile = this.settings.graph; - - if (this.settings.reverse) { - postRequest.direction = "arrival"; - } else { - postRequest.direction = "departure"; - } - - postRequest.constraints = this.settings.constraints; - - postRequest.distanceUnit = this.settings.distanceUnit; - - postRequest.timeUnit = this.settings.timeUnit; - - postRequest.crs = this.settings.srs; - - // conversion en chaîne de caractères - request = JSON.stringify(postRequest); - break; - - default: - this.logger.error("No other HTTP method supported by the service !"); - } - - this.logger.trace(request); - this.requestString = request; - - return this.requestString; - } -}; - -export default ProcessIsoCurveRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js deleted file mode 100644 index e358018d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js +++ /dev/null @@ -1,202 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * - * Classe de gestion des param. des requêtes du service de calcul des iso. - * Permet le mapping avec les options du service. - * - * @constructor - * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam - * @param {Object} options - options - * @private - * - */ -function ProcessIsoCurveParam (options) { - if (!(this instanceof ProcessIsoCurveParam)) { - throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function."); - } - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur ProcessIsoCurveParam ()]"); - - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - // mapping des options avec l'API REST - - /** Identifiant de l’isochrone */ - this.id = this.options.id; - - /** Resource */ - this.resource = this.options.resource; - - /** Coordonnées de départ (ou arrivée si le reverse est à true). */ - this.point = this.options.position; - - /** projection (code EPSG comme epsg:4326 ou wgs84) */ - this.crs = this.options.srs; - - /** - * Profil de véhicule à utiliser pour le calcul. - * Voiture ou Pieton - */ - this.profile = this.options.graph; - - /** Liste des règles de restrictions à utiliser */ - this.constraints = this.options.constraints; - - this.reverse = this.options.reverse; - - this.timeUnit = this.options.timeUnit; - - this.distanceUnit = this.options.distanceUnit; - - /** - * "time" pour isochrone ou "distance" for isodistance. - * Par defaut, time... - */ - if (this.options.method === "distance") { - this.costType = "distance"; - this.costValue = this.options.distance; - } else { - this.costType = "time"; - this.costValue = this.options.time; - } -} - -/** - * CLASSNAME - */ -ProcessIsoCurveParam.CLASSNAME = "ProcessIsoCurveParam"; - -ProcessIsoCurveParam.prototype = { - - /** - * @lends module:ProcessIsoCurveParam# - */ - - /** - * Constructeur (alias) - */ - constructor : ProcessIsoCurveParam, - - /** - * Retourne le point - * @returns {String} x,y - */ - getLocation : function () { - return this.point.x + "," + this.point.y; - }, - - /** - * Retourne l'unité de la distance - * @returns {String} - */ - getDistanceUnit : function () { - if (this.distanceUnit === "m") { - return "meter"; - } - if (this.distanceUnit === "km") { - return "kilometer"; - } - return ""; - }, - - /** - * Retourne la liste des contraintes - * @returns {String} - */ - getConstraints : function () { - var constraintArray = []; - - if (this.constraints.length !== 0) { - for (var k = 0; k < this.constraints.length; k++) { - constraintArray.push(JSON.stringify(this.constraints[k])); - } - } - return constraintArray.join("|"); - }, - - /** - * Retourne la direction - * @returns {String} - */ - getDirection : function () { - if (this.reverse) { - return "arrival"; - } else { - return "departure"; - } - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Object[]} KVP - */ -ProcessIsoCurveParam.prototype.getParams = function () { - var map = []; - - map.push({ - k : "resource", - v : this.resource - }); - - map.push({ - k : "point", - v : this.getLocation() - }); - - map.push({ - k : "direction", - v : this.getDirection() - }); - - map.push({ - k : "costType", - v : this.costType - }); - - map.push({ - k : "costValue", - v : this.costValue - }); - - map.push({ - k : "profile", - v : this.profile - }); - - map.push({ - k : "timeUnit", - v : this.timeUnit - }); - - map.push({ - k : "distanceUnit", - v : this.getDistanceUnit() - }); - - if (this.crs) { - map.push({ - k : "crs", - v : this.crs - }); - } - - if (this.constraints) { - map.push({ - k : "constraints", - v : this.getConstraints() - }); - } - - return map; -}; - -export default ProcessIsoCurveParam; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js deleted file mode 100644 index 042ae724..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js +++ /dev/null @@ -1,106 +0,0 @@ -import Logger from "../../../Utils/LoggerByDefault"; -import MRes from "../../../Utils/MessagesResources"; -import ErrorService from "../../../Exceptions/ErrorService"; -import ProcessIsoCurveResponse from "./model/ProcessIsoCurveResponse"; - -/** - * Factory pour générer une reponse JSON à partir d'un JSON - * (Factory) - * - * @module ProcessIsoCurveResponseFactory - * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory - * @private - */ -var ProcessIsoCurveResponseFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant ProcessIsoCurve - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build : function (options) { - // logger - var logger = Logger.getLogger("ProcessIsoCurveResponseFactory"); - logger.trace(["ProcessIsoCurveResponseFactory::build()"]); - - var data = null; - - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - logger.trace("analyze response : json"); - - var JSONResponse; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // analyse de la reponse - // création de l'objet de réponse - data = new ProcessIsoCurveResponse(); - - // remplissage de l'objet créé avec les attribtuts de la réponse du service - if (JSONResponse) { - if (JSONResponse.costType === "distance") { - data.time = ""; - data.distance = JSONResponse.costValue; - } else { - data.time = JSONResponse.costValue; - data.distance = ""; - } - - data.message = ""; - data.id = ""; - data.srs = JSONResponse.crs; - data.geometry = JSONResponse.geometry; - var coords = JSONResponse.point.split(","); - if (data.location) { - data.location.x = coords[0]; - data.location.y = coords[1]; - } - } else { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_ANALYSE", options.response))); - return; - } - - // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !! - // ex. Key does not exist or has expired - // mais le statut est 403, l'erreur est donc remontée plus tôt. - if (data.exceptionReport) { - options.onError.call(options.scope, new ErrorService({ - message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), - type : ErrorService.TYPE_SRVERR, - status : 200 - })); - return; - } - } - } else { - // si la réponse est vide, on appelle le callback d'erreur - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - - // si tout s'est bien passé, on appelle le callback de succès - options.onSuccess.call(options.scope, data); - } -}; - -export default ProcessIsoCurveResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js deleted file mode 100644 index c73e08d2..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js +++ /dev/null @@ -1,45 +0,0 @@ - -/** - * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Float} distance - distance (expressed in meters) used for the request. - * @property {Float} time - time (expressed in seconds) used for the request. - * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve. - * @property {String} id - request id (used by underlying webservice). - * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in "srs" coordinates system). - * @property {String} message - message - * @property {String} srs - Identifier of the coordinates system used for the isocurve. - * - * @namespace - * @alias Gp.Services.IsoCurveResponse - * - */ -function ProcessIsoCurveResponse () { - if (!(this instanceof ProcessIsoCurveResponse)) { - throw new TypeError("ProcessIsoCurveResponse constructor cannot be called as a function."); - } - - this.message = null; - - this.id = null; - - this.location = {}; - this.location.x = null; - this.location.y = null; - - this.srs = null; - - this.geometry = null; - - this.time = null; - - this.distance = null; -} - -ProcessIsoCurveResponse.prototype = { - - constructor : ProcessIsoCurveResponse - -}; - -export default ProcessIsoCurveResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js deleted file mode 100644 index 4f1ab6f9..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js +++ /dev/null @@ -1,86 +0,0 @@ -import Logger from "../../../Utils/LoggerByDefault"; -import ErrorService from "../../../Exceptions/ErrorService"; -import RouteRequestREST from "./RouteRequestREST"; - -/** - * Creation d'une requête REST en mode POST ou GET - * (Factory) - * - * @module RouteRequestFactory - * @alias Gp.Services.Route.Request.RouteRequestFactory - * @private - */ -var RouteRequestFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Route - * - * @example - * // utilisation avec les callback - * var options = { - * (...) - * onSuccess : function (response) {}, - * onError : function (error) {}, - * // spécifique au service - * startPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * endPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * provideBbox : false, - * exclusions : ["bridge", "tunnel", "toll"], - * distanceUnit : "km", - * graph : "Voiture", - * geometryInInstructions : false, - * routePreference : "fastest" - * }; - * RouteRequestFactory.build(options); - * - * // utilisation sans callback - * var options = {...}; - * try { - * var result = RouteRequestFactory.build(options); - * if (! result) { throw new Error("..."):} - * } catch (e) { - * // todo - * } - * @returns {String} request - */ - build : function (options) { - // logger - var logger = Logger.getLogger("RouteRequestFactory"); - logger.trace(["RouteRequestFactory::build()"]); - - var request = null; - - var settings = options || {}; - - // gestion des callback - var bOnError = !!(options.onError !== null && typeof options.onError === "function"); - - var message = null; - - // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! - var myReq = new RouteRequestREST(settings); - if (!myReq.processRequestString()) { - message = "Error process request (rest) !"; - if (bOnError) { - options.onError.call(options.scope, new ErrorService(message)); - return; - } - throw new Error(message); - } - request = myReq.requestString; - - return request; - } -}; - -export default RouteRequestFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js deleted file mode 100644 index d6eac5aa..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js +++ /dev/null @@ -1,102 +0,0 @@ - -import Logger from "../../../Utils/LoggerByDefault"; -import _ from "../../../Utils/MessagesResources"; -import RouteParamREST from "./model/RouteParamREST"; - -/** - * @classdesc - * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire - * (uniquement en GET) - * - * @constructor - * @alias Gp.Services.Route.Request.RouteRequestREST - * @param {Object} options - options definies dans le composant Route - * - * @example - * var options = { - * (...) - * }; - * - * @private - */ -function RouteRequestREST (options) { - this.logger = Logger.getLogger("RouteRequestREST"); - this.logger.trace("[Constructeur RouteRequestREST ()]"); - - if (!(this instanceof RouteRequestREST)) { - throw new TypeError("RouteRequestREST constructor cannot be called as a function."); - } - - // existance des options - if (!options) { - throw new Error(_.getMessage("PARAM_EMPTY", "options")); - } - - /** liste des options */ - this.settings = options; -} - -RouteRequestREST.prototype = { - - /** - * @lends module:RouteRequestREST# - */ - - /** - * request - * @type {String} - */ - requestString : null, - - /** - * Constructeur (alias) - */ - constructor : RouteRequestREST, - - /** - * Construction de la requête. - * - * @example - * // GET out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838 - * // POST out : Not yet supported method POST ! - * @returns {String} request - */ - processRequestString : function () { - // INFO - // construction simple sans template..., - // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE ! - this.logger.warn(" PROTOTYPE !"); - - // Mapping des options avec le service de l'API REST - var oParams = new RouteParamREST(this.settings); - var params = oParams.getParams(); - - var request = ""; - for (var i = 0; i < params.length; i++) { - var o = params[i]; - if (request) { - request += "&"; - } - request += o.k + "=" + o.v; - } - - // Exemple : - // http://wxs.ign.fr/KEY/itineraire/rest/route.json? - // origin=& - // destination=& - // waypoints=& - // method=DISTANCE& - // graph=Pieton& - // graphName=Pieton& - // exclusions=& - // tolerance=10& - // srs= - - this.logger.trace(request); - this.requestString = request; - - return this.requestString; - } -}; - -export default RouteRequestREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js deleted file mode 100644 index 2276e046..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js +++ /dev/null @@ -1,242 +0,0 @@ - -import Logger from "../../../../Utils/LoggerByDefault"; - -/** - * @classdesc - * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). - * Permet le mapping avec les options du service. - * @constructor - * @alias Gp.Services.Route.Request.RouteParamREST - * @param {Object} options - options - * - * @private - */ -function RouteParamREST (options) { - if (!(this instanceof RouteParamREST)) { - throw new TypeError("RouteParamREST constructor cannot be called as a function."); - } - - this.logger = Logger.getLogger(); - this.logger.trace("[Constructeur RouteParamREST ()]"); - /** - * Options en paramêtres du constructeur. - */ - this.options = options || {}; - - // mapping des options avec l'API REST - - /** Ressource utilisée */ - this.resource = this.options.resource; - - /** Coordonnées du point de départ. */ - this.start = this.options.startPoint.x + "," + this.options.startPoint.y; - - /** Coordonnées du point d’arrivée. */ - this.end = this.options.endPoint.x + "," + this.options.endPoint.y; - - /** Coordonnées des étapes point de départ. */ - this.intermediates = this.options.viaPoints; - - /** Nom du profile à utiliser */ - this.profile = this.options.graph; - - /** projection (code EPSG comme epsg:4326 ou wgs84) */ - this.crs = this.options.srs; - - /** Liste des contraintes */ - this.constraints = this.options.constraints; - - /** Nom de l'optimisation à utiliser */ - this.optimization = this.options.routePreference; - - /** Format de sortie (résumé de l’itinéraire) */ - this.getSteps = (this.options.geometryInInstructions) ? "true" : "false"; - - /** Unité des distances */ - this.distanceUnit = this.options.distanceUnit; - - /** Unité des durées */ - this.timeUnit = this.options.timeUnit; - - /** Attributs des voies */ - this.waysAttributes = this.options.waysAttributes; -} - -/** - * CLASSNAME - */ -RouteParamREST.CLASSNAME = "RouteParamREST"; - -RouteParamREST.prototype = { - - /** - * @lends module:RouteParamREST# - */ - - /** - * Constructeur (alias) - */ - constructor : RouteParamREST, - - /** - * Retourne une liste de points - * @returns {String} une liste de points (sep '|') - */ - getIntermediates : function () { - var array = []; - if (this.intermediates.length !== 0) { - for (var i = 0; i < this.intermediates.length; i++) { - var obj = this.intermediates[i]; - array.push(obj.x + "," + obj.y); - } - } - - return array.join("|"); - }, - - /** - * Retourne une liste d'attributs - * @returns {String} une liste d'attributs (sep '|') - */ - getWaysAttributes : function () { - return this.waysAttributes.join("|"); - }, - - /** - * Retourne un profile - * @returns {String} profile - */ - getProfile : function () { - return this.profile; - }, - - /** - * Retourne un distanceUnit - * @returns {String} distanceUnit - */ - getDistanceUnit : function () { - if (this.distanceUnit === "m") { - return "meter"; - } - if (this.distanceUnit === "km") { - return "kilometer"; - } - return ""; - }, - - /** - * Retourne une optimisation - * @returns {String} optimization - */ - getOptimization : function () { - if (this.optimization) { - return this.optimization; - } else { - return ""; - } - }, - - /** - * Retourne la liste des constraints - * @returns {String} une liste des constraints (sep '|') - */ - getConstraints : function () { - var constraintArray = []; - - if (this.constraints.length !== 0) { - for (var k = 0; k < this.constraints.length; k++) { - constraintArray.push(JSON.stringify(this.constraints[k])); - } - } - return constraintArray.join("|"); - } -}; - -/** - * Tableau de clefs/valeurs pour param. - * - * @returns {Array} liste de paramêtres - */ -RouteParamREST.prototype.getParams = function () { - var map = []; - - map.push({ - k : "resource", - v : this.resource - }); - - map.push({ - k : "start", - v : this.start - }); - - map.push({ - k : "end", - v : this.end - }); - - map.push({ - k : "geometryFormat", - v : "geojson" - }); - - if (this.optimization) { - map.push({ - k : "optimization", - v : this.getOptimization() - }); - } - - if (this.intermediates) { - map.push({ - k : "intermediates", - v : this.getIntermediates() - }); - } - - if (this.profile) { - map.push({ - k : "profile", - v : this.getProfile() - }); - } - - if (this.constraints) { - map.push({ - k : "constraints", - v : this.getConstraints() - }); - } - - if (this.crs) { - map.push({ - k : "crs", - v : this.crs - }); - } - - if (this.distanceUnit) { - map.push({ - k : "distanceUnit", - v : this.getDistanceUnit() - }); - } - - if (this.timeUnit) { - map.push({ - k : "timeUnit", - v : this.timeUnit - }); - } - - if (this.waysAttributes) { - map.push({ - k : "waysAttributes", - v : this.getWaysAttributes() - }); - } - - return map; -}; - -export default RouteParamREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js deleted file mode 100644 index 5be48a66..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js +++ /dev/null @@ -1,247 +0,0 @@ -import Logger from "../../../Utils/LoggerByDefault"; -import MRes from "../../../Utils/MessagesResources"; -import ErrorService from "../../../Exceptions/ErrorService"; -import RouteResponse from "./model/RouteResponse"; -import RouteInstruction from "./model/RouteInstruction"; - -/** - * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON - * (Factory) - * - * @module RouteResponseFactory - * @alias Gp.Services.Route.Response.RouteResponseFactory - * @private - */ -var RouteResponseFactory = { - - /** - * interface unique - * - * @method build - * @static - * @param {Object} options - options definies dans le composant Route - * - * @example - * var options = { - * response : - * outputFormat : - * rawResponse : - * scope : - * onSuccess : - * onError : - * }; - * - */ - build : function (options) { - // logger - var logger = Logger.getLogger("RouteResponseFactory"); - logger.trace("RouteResponseFactory::build()"); - - var data = null; - - if (options.response) { - if (options.rawResponse) { - logger.trace("analyze response : raw"); - data = options.response; - } else { - logger.trace("analyze response : json"); - - var JSONResponse; - if (typeof options.response === "string") { - JSONResponse = JSON.parse(options.response); - } else { - JSONResponse = options.response; - } - - // construction de l'objet réponse JSON - if (JSONResponse) { - // le service renvoie t il une erreur ? - if (JSONResponse.message) { - // ex. {"message":"message not null", "status":"ERROR"} - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.message))); - return; - } - var legs = []; - var legSteps = []; - var steps = []; - - data = new RouteResponse(); - - if (data.hasOwnProperty("totalTime")) { - data.totalTime = parseFloat(JSONResponse.duration); - } - if (data.hasOwnProperty("totalDistance")) { - data.totalDistance = parseFloat(JSONResponse.distance); - } - - if (data.hasOwnProperty("bbox")) { - data.bbox.left = parseFloat(JSONResponse.bbox[0]); - data.bbox.bottom = parseFloat(JSONResponse.bbox[1]); - data.bbox.right = parseFloat(JSONResponse.bbox[2]); - data.bbox.top = parseFloat(JSONResponse.bbox[3]); - } - - if (data.hasOwnProperty("routeGeometry") && !options.geometryInInstructions) { - data.routeGeometry = JSONResponse.geometry; - } - - if (data.hasOwnProperty("routeInstructions") && options.geometryInInstructions) { - var legList = JSONResponse.portions; - var i; - if (Array.isArray(legList) && legList.length) { - for (i = 0; i < legList.length; i++) { - legs.push(legList[i]); - } - } - if (legs.length) { - for (i = 0; i < legs.length; i++) { - legSteps.push(legs[i].steps); - } - } - if (legSteps.length) { - for (i = 0; i < legSteps.length; i++) { - steps = steps.concat(legSteps[i]); - } - } - - steps.forEach(function (step) { - data.routeInstructions.push(new RouteInstruction()); - data.routeInstructions[data.routeInstructions.length - 1].duration = step.duration; - data.routeInstructions[data.routeInstructions.length - 1].distance = step.distance; - data.routeInstructions[data.routeInstructions.length - 1].code = ""; - data.routeInstructions[data.routeInstructions.length - 1].instruction = ""; - data.routeInstructions[data.routeInstructions.length - 1].geometry = step.geometry; - - // on ne souhaite pas de ce type de valeur... - if (step.name === "Valeur non renseignée") { - step.name = ""; - } - - switch (step.instruction.type) { - case "turn": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Tourner"; - break; - case "new name": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer tout droit"; - break; - case "depart": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Départ"; - break; - case "arrive": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Arrivée"; - break; - case "merge": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Rejoindre"; - break; - case "ramp": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; - break; - case "on ramp": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; - break; - case "off ramp": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la sortie"; - break; - case "fork": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Sur la bifurcation, prendre"; - break; - case "end of road": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "À la fin de la route, prendre"; - break; - case "use lane": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Utiliser la file"; - break; - case "continue": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer"; - break; - case "roundabout": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; - break; - case "rotary": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; - break; - case "roundabout turn": - data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond point, tourner"; - break; - case "notification": - data.routeInstructions[data.routeInstructions.length - 1].instruction += ""; - break; - default: - data.routeInstructions[data.routeInstructions.length - 1].instruction += "?" + step.instruction.type + "?"; - break; - } - - if (step.instruction.modifier) { - switch (step.instruction.modifier) { - case "uturn": - data.routeInstructions[data.routeInstructions.length - 1].instruction = "Faire demi-tour"; - break; - case "sharp right": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à droite"; - break; - case "right": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " à droite"; - break; - case "slight right": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " légèrement à droite"; - break; - case "straight": - data.routeInstructions[data.routeInstructions.length - 1].instruction = "Continuer tout droit"; - break; - case "slight left": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " lègèrement à gauche"; - break; - case "left": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " à gauche"; - break; - case "sharp left": - data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à gauche"; - break; - default: - data.routeInstructions[data.routeInstructions.length - 1].instruction += " ?" + step.instruction.modifier + "?"; - break; - } - } - - if (step.instruction.exit) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += `${step.instruction.exit}e sortie`; - } - - if (step.attributes.name) { - if (step.attributes.name.nom_1_droite || step.attributes.name.toponyme) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += " sur"; - } - - if (step.attributes.name.nom_1_droite) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += ` ${step.attributes.name.nom_1_droite}`; - } - - if (step.attributes.name.toponyme) { - data.routeInstructions[data.routeInstructions.length - 1].instruction += ` ${step.attributes.name.toponyme}`; - } - } - }); - } - } - - if (!data) { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_ANALYSE", "json"))); - return; - } - - // Si la réponse contenait une exception renvoyée par le service - if (data.exceptionReport) { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EXCEPTION_2"))); - return; - } - } - } else { - options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EMPTY"))); - return; - } - - options.onSuccess.call(options.scope, data); - } -}; - -export default RouteResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js deleted file mode 100644 index bada11b9..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js +++ /dev/null @@ -1,48 +0,0 @@ - -/** - * Single Route Instruction object. - * - * @property {String} code - Instruction code : - * - * - "F" : Straight forward - * - "B" : U-turn - * - "L" : turn left - * - "R" : turn right - * - "BL" : turn left strongly - * - "BR" : turn right strongly - * - "FL" : turn lightly to the left - * - "FR" : turn lightly to the right - * - "round_about_entry" : round about entry - * - "round_about_exit" : round about exit - * - * @property {String} instruction - Instruction text : translated code + street name - * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street. - * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter. - * @property {Float} duration - Instruction duration in seconds. - * - * @namespace - * @alias Gp.Services.Route.RouteInstruction - */ -function RouteInstruction () { - if (!(this instanceof RouteInstruction)) { - throw new TypeError("RouteInstruction constructor cannot be called as a function."); - } - - this.duration = null; - - this.distance = null; - - this.code = null; - - this.instruction = null; - - this.geometry = null; // FIXME can be null if option 'geometryInInstructions' is false ! -} - -RouteInstruction.prototype = { - - constructor : RouteInstruction - -}; - -export default RouteInstruction; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js deleted file mode 100644 index 9ee0208f..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function. - * - * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call. - * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route. - * @property {Array.} routeInstructions - Instructions of the route. - * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to "km" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by " Km" (e.g. : "19.6 Km"). If distanceUnit parameter was set to "m", totalDistance is a string containing the total distance expressed in meters (e.g. : "19599.14"). - * @property {Float} totalTime - Route duration in seconds. - * - * @namespace - * @alias Gp.Services.RouteResponse - */ -function RouteResponse () { - if (!(this instanceof RouteResponse)) { - throw new TypeError("RouteResponse constructor cannot be called as a function."); - } - - this.totalTime = null; - - this.totalDistance = null; - - this.bbox = { - left : null, - right : null, - top : null, - bottom : null - }; - - this.routeGeometry = null; // FIXME can be null if option 'geometryInInstructions' is true ! - - this.routeInstructions = []; -} - -RouteResponse.prototype = { - - constructor : RouteResponse - -}; - -export default RouteResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js deleted file mode 100644 index 0b584655..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js +++ /dev/null @@ -1,328 +0,0 @@ - -import Logger from "../../Utils/LoggerByDefault"; -import _ from "../../Utils/MessagesResources"; -import ErrorService from "../../Exceptions/ErrorService"; -import CommonService from "../CommonService"; -import DefaultUrlService from "../DefaultUrlService"; -import RouteRequestFactory from "./Request/RouteRequestFactory"; -import RouteResponseFactory from "./Response/RouteResponseFactory"; - -/** - * @classdesc - * Appel du service d'itinéraire du Géoportail : - * envoi de la requête construite selon les paramètres en options, - * éventuellement parsing et analyse de la réponse, - * retour d'une réponse en paramètre de la fonction onSuccess. - * - * @alias Gp.Services.Route - * @constructor - * @extends {Gp.Services.CommonService} - * @param {Object} options - options spécifiques au service (+ les options heritées) - * - * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. - * - * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'json' uniquement et par défaut. - * - * @param {String} [options.routePreference = "fastest"] - Mode de calcul à utiliser : - * - le plus rapide « fastest » - * - le plus court « shortest » - * Par défaut : « fastest ». - * - * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) - * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire. - * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire. - * - * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) - * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire. - * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire. - * - * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau. - * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float} - * - * @param {String} [options.graph = "voiture"] - Type de graphe utilisé : "Voiture" ou "Pieton". - * Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non. - * Par défaut, c'est la valeur "Voiture" qui sera utilisée. - * - * @param {String[]} [options.exclusions] - DEPRECATED: Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre "avoidFeature" d'OpenLS) - * On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte - * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). - * Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints - * - * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. - * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". - * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". - * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". - * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". - * - * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions. - * (correspond au paramètre "provideGeometry" d'OpenLS) Par défaut : false. - * - * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse. - * Par défaut : true. - * - * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse. - * Par défaut : m. - * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse. Il peut-être formatté hh:mm::ss avec la valeur standard. - * Les valeurs possibles sont "standard", "second", "minute" ou "hour". - * Par défaut : "standard". - * - * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés. - * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'. - * - * @param {String[]} [options.waysAttributes] - Nom des attributs des voies. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. - * - * @example - * var options = { - * // options communes aux services - * apiKey : null, - * serverUrl : 'http://localhost/service/', - * protocol : 'XHR', - * proxyURL : null, - * httpMethod : 'GET', // GET|POST - * timeOut : 10000, // ms - * rawResponse : false, // true|false - * scope : null, // this - * onSuccess : function (response) {}, - * onFailure : function (error) {}, - * // spécifique au service - * resource : 'bdtopo' - * outputFormat : 'json', - * startPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * endPoint : { - * x : 42.1121, - * y : 1.5557 - * }, - * provideBbox : true, - * exclusions : ["Bridge", "Tunnel", "Toll"], - * distanceUnit : "km", - * graph : "Voiture", - * geometryInInstructions : true, - * routePreference : "fastest" - * }; - * - */ -function Route (options) { - if (!(this instanceof Route)) { - throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Route")); - } - - /** - * Nom de la classe (heritage) - */ - this.CLASSNAME = "Route"; - - // appel du constructeur par heritage - CommonService.apply(this, arguments); - - this.logger = Logger.getLogger("Gp.Services.Route"); - this.logger.trace("[Constructeur Route (options)]"); - - if (!options.startPoint) { - throw new Error(_.getMessage("PARAM_MISSING", "startPoint")); - } - - // on lance une exception afin d'eviter au service de le faire... - if (options.startPoint.x === null) { - throw new Error(_.getMessage("PARAM_MISSING", "startPoint.x")); - } - - if (options.startPoint.y === null) { - throw new Error(_.getMessage("PARAM_MISSING", "startPoint.y")); - } - - if (!options.endPoint) { - throw new Error(_.getMessage("PARAM_MISSING", "endPoint")); - } - - // on lance une exception afin d'eviter au service de le faire... - if (options.endPoint.x === null) { - throw new Error(_.getMessage("PARAM_MISSING", "endPoint.x")); - } - - if (options.endPoint.y === null) { - throw new Error(_.getMessage("PARAM_MISSING", "endPoint.y")); - } - - // options par defaut - - // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. - if (options.outputFormat && options.outputFormat !== "json") { - this.logger.warn("options.outputFormat could only be json"); - } - this.options.outputFormat = "json"; - - this.options.resource = options.resource || "bdtopo-osrm"; - this.options.startPoint = options.startPoint; - this.options.endPoint = options.endPoint; - this.options.viaPoints = options.viaPoints || []; - this.options.routePreference = options.routePreference || "fastest"; - /** Gestion des anciennes valeurs de graph */ - if (options.graph) { - if (options.graph === "Voiture") { - this.options.graph = "car"; - } - if (options.graph === "Pieton") { - this.options.graph = "pedestrian"; - } - } else { - this.options.graph = "car"; - } - this.options.constraints = []; - if (options.constraints) { - if (Array.isArray(options.constraints)) { - for (var k = 0; k < options.constraints.length; k++) { - this.options.constraints.push(options.constraints[k]); - } - } else { - throw new Error(_.getMessage("PARAM_TYPE", "constraints")); - } - } - - /** Gestion de l'ancien paramètre exclusion */ - var constraintTunnel = {}; - var constraintPont = {}; - var constraintAutoroute = {}; - if (options.exclusions) { - if (options.exclusions.length !== 0) { - this.logger.warn("options.exclusions is DEPRECATED !!"); - for (var c = 0; c < options.exclusions.length; c++) { - if (typeof options.exclusions[c] === "string") { - options.exclusions[c] = options.exclusions[c].toLowerCase(); - } else { - // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions - continue; - } - if (options.exclusions[c] === "toll") { - constraintAutoroute.constraintType = "banned"; - constraintAutoroute.key = "wayType"; - constraintAutoroute.operator = "="; - constraintAutoroute.value = "autoroute"; - this.options.constraints.push(constraintAutoroute); - } - if (options.exclusions[c] === "tunnel") { - constraintTunnel.constraintType = "banned"; - constraintTunnel.key = "wayType"; - constraintTunnel.operator = "="; - constraintTunnel.value = "tunnel"; - this.options.constraints.push(constraintTunnel); - } - if (options.exclusions[c] === "bridge") { - constraintPont.constraintType = "banned"; - constraintPont.key = "wayType"; - constraintPont.operator = "="; - constraintPont.value = "pont"; - this.options.constraints.push(constraintPont); - } - } - } - } - - this.options.geometryInInstructions = options.geometryInInstructions || false; - this.options.provideBbox = options.provideBbox || true; - this.options.distanceUnit = options.distanceUnit || "m"; - this.options.timeUnit = options.timeUnit || "second"; - this.options.expectedStartTime = null; // FIXME not yet implemented ! - this.options.srs = options.srs || "EPSG:4326"; - this.options.waysAttributes = options.waysAttributes || []; - - // gestion de l'url du service par defaut - // si l'url n'est pas renseignée, il faut utiliser les urls par defaut - if (!this.options.serverUrl) { - // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire - /* var UrlByDefault = DefaultUrlService.Route.newUrl(); - if (this.options.oldRouteService) { - UrlByDefault = DefaultUrlService.Route.url(); - } */ - // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire - var UrlByDefault = DefaultUrlService.Route.url(); - - if (!UrlByDefault) { - throw new Error("Url by default not found !"); - } - this.options.serverUrl = UrlByDefault; - this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); - } -} - -/** - * @lends module:Route# - */ -Route.prototype = Object.create(CommonService.prototype, { - // todo - // getter/setter -}); - -/* - * Constructeur (alias) - */ -Route.prototype.constructor = Route; - -/** - * (overwrite) - * Création de la requête - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Route.prototype.buildRequest = function (error, success) { - var options = { - // spécifique au service - resource : this.options.resource, - startPoint : this.options.startPoint, - endPoint : this.options.endPoint, - viaPoints : this.options.viaPoints, - provideBbox : this.options.provideBbox, - constraints : this.options.constraints, - distanceUnit : this.options.distanceUnit, - timeUnit : this.options.timeUnit, - graph : this.options.graph, - geometryInInstructions : this.options.geometryInInstructions, - routePreference : this.options.routePreference, - srs : this.options.srs, - waysAttributes : this.options.waysAttributes - }; - - this.request = RouteRequestFactory.build(options); - - // on teste si la requete a bien été construite ! - if (!this.request) { - error.call(this, new ErrorService(_.getMessage("SERVICE_REQUEST_BUILD"))); - } else { - success.call(this, this.request); - } -}; - -/** - * (overwrite) - * Analyse de la reponse - * - * @param {Function} error - callback des erreurs - * @param {Function} success - callback - */ -Route.prototype.analyzeResponse = function (error, success) { - // INFO - // Factory pour masquer la complexité du retour du service - - if (this.response) { - var options = { - distanceUnit : this.options.distanceUnit, - timeUnit : this.options.timeUnit, - response : this.response, - outputFormat : this.options.outputFormat, // utile pour parser la string en mode XHR : JSON ou XML ! - rawResponse : this.options.rawResponse, - onError : error, - onSuccess : success, - scope : this, - geometryInInstructions : this.options.geometryInInstructions - }; - - RouteResponseFactory.build(options); - } else { - error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); - } -}; - -export default Route; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js deleted file mode 100644 index 36f7039e..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js +++ /dev/null @@ -1,290 +0,0 @@ -/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "point|circle|bbox" }] */ - -/** -* Geoportal web services invocation namespace. -* -* @module Services -* @alias Gp.Services -*/ -import Config from "./Config/Config"; -import Alti from "./Alti/Alti"; -import Geocode from "./Geocode/Geocode"; -import ReverseGeocode from "./Geocode/ReverseGeocode"; -import AutoComplete from "./AutoComplete/AutoComplete"; -import Route from "./Route/Route"; -import ProcessIsoCurve from "./ProcessIsoCurve/ProcessIsoCurve"; - -var Services = { - /** - * Access to Geoportal resources metadata availables with one ore several keys - * - * @method getConfig - * @param {Object} options - Options for function call. - * @param {String} [options.apiKey] - Access key(s) ("," as separator, no spaces) to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web} - * @param {String} [options.customConfigFile] - path to a local config file. Overload the apiKey parameter - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if "rawResponse" parameter is set to true : a String will be returned. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - */ - getConfig : function (options) { - var configService = new Config(options); - configService.call(); - }, - /** - * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.
- * Two use cases are availables :
- * 1. getting elevations of the given points : don't use the options.sampling parameter ;
- * 2. getting a regular set of elevations along the given points : use the options.sampling parameter. - * - * @method getAltitude - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {Array.} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter. - * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.
- * If not used, only elevations of these positions will be returned. - * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST'. Only use if you know what you are doing. - * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing. - */ - getAltitude : function (options) { - var altiService = new Alti(options); - altiService.call(); - }, - /** - * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}. - * - * @example - * Gp.Services.geocode ({ - * apiKey : "carte", - * location : "73 avenue de Paris, Saint-Mandé", - * // traitement des resultats - * onSuccess : function (result) { - * console.log("found (x:"+result.position.x+", y:"+result.position.y+")") ; - * } - * }) ; - * - * - * @method geocode - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". - * @param {String} options.query - Geographic identifier to locate. - * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. - * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". - *

- * Properties availables for address search :
- * "postalCode", "inseeCode" and "city". - *

- * Properties availables for place names search :
- * "postalCode", "inseeCode" and "type". - *

- * Properties availables for cadastral parcels search :
- * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. - * @param {Boolean} [options.returnTrueGeometry=false] - Set this parameter to true if you wish to have the true geometrie returned. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - geocode : function (options) { - var geocodeService = new Geocode(options); - geocodeService.call(); - }, - /** - * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}. - * - * @method reverseGeocode - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". - * @param {Object} options.position - Reference position where to search geographical identifiers. - * @param {Float} options.position.lon - Longitude - * @param {Float} options.position.lat - Latitude - * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. - * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". - *

- * Properties availables for address search :
- * "postalCode", "inseeCode" and "city". - *

- * Properties availables for place names search :
- * "postalCode", "inseeCode" and "type". - *

- * Properties availables for cadastral parcels search :
- * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". - * @param {Object} [options.searchGeometry] - Location where to perform the search. - * @param {String} options.searchGeometry.type - Geometry type (Point|Circle|Linestring|Polygon) - * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordinates - * @param {Float} [options.searchGeometry.radius] - Radius (only for type 'Circle') - * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - reverseGeocode : function (options) { - var reverseGeocodeService = new ReverseGeocode(options); - reverseGeocodeService.call(); - }, - /** - * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html} - * - * @method autoComplete - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} options.text - Text input to complete. - * @param {Array.} [options.filterOptions.type = "StreetAddress"] - Suggestion types to provide : address ("StreetAddress") and/or place name ("PositionOfInterest"). - * @param {Array.} [options.filterOptions.territory] - Places where to limit the search of suggestions : "METROPOLE" (Corsica and metropolitan France), "DOMTOM" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31'] - * @param {Number} [options.maximumResponses = 10] - Maximum number of responses. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - autoComplete : function (options) { - var autoCompleteService = new AutoComplete(options); - autoCompleteService.call(); - }, - /** - * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}. - * - * @method route - * @param {Object} options - Options for function call. - * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} [options.routePreference = "fastest"] - Indicates the way to compute the route : "fastest" (time optimisation) or "shortest" (distance optimisation). Available values are in the GetCapabilities. - * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. - * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. - * @param {Array.} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude). Available bbox are in the GetCapabilities. - * @param {String} [options.graph = "Voiture"] - User profile to use to compute the route : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads the route may use and the average speed. Available bbox are in the GetCapabilities. - * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). - * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions. - * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response. - * @param {String} [options.distanceUnit = "m"] - The unit used to provide distances in the response ("meter" or "kilometer"). - * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). - * @param {Array.} [options.waysAttributes] - Way Attributes to add in the response. Available values are in the GetCapabilities. - * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.outputFormat='json'] - Output format ("json" or "xml") to use for underlying webService. Only use if you know what you are doing. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - route : function (options) { - var routeService = new Route(options); - routeService.call(); - }, - /** - * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}. - * - * @method isoCurve - * @param {Object} options - Options for function call. - * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. - * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. - * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude). - * @param {String} [options.graph = "Voiture"] - User profile to use to compute the isoCurve : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads to use and the average speed. Available values are in the GetCapabilities. - * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). - * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. - * @param {String} [options.method = "time"] - Computing method to use : "time" (using a duration as a constraint) or "distance" (using a distance as a constraint). Available values are in the GetCapabilities. - * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to "time". - * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to "distance". - * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing. - * @param {String} [options.distanceUnit = "km"] - The unit used to provide distances in the response ("m" or "km"). - * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). - * @param {Boolean} [options.smoothing = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry to be smoothed. - * @param {Boolean} [options.holes = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent. - * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if "rawResponse" is set to true. - * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. - * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. - * @param {String} [options.outputFormat='json'] - Output format ("json") to use for underlying webService. Only use if you know what you are doing. - * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. - * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). - * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. - * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. - * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. - * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. - * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. - * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. - */ - isoCurve : function (options) { - var processIsoCurveService = new ProcessIsoCurve(options); - processIsoCurveService.call(); - } -}; - -/** - * Point object. - * - * @namespace - * @alias Gp.Point - * - * @property {Float} x - Point abscissa - * @property {Float} y - Point ordinate - */ -var point = {}; - -/** - * Circle object. - * - * @namespace - * @alias Gp.Circle - * - * @property {Float} x - Circle center abscissa. - * @property {Float} y - Circle center ordinate. - * @property {Float} radius - Circle radius. - */ -var circle = {}; - -/** - * Bounding box object, expressed with four coordinates. - * - * @namespace - * @alias Gp.BBox - * - * @property {Float} left - minimum abscissa - * @property {Float} right - maximum abscissa - * @property {Float} bottom - minimum ordinate - * @property {Float} top - maximum ordinate - */ -var bbox = {}; - -export default Services; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js deleted file mode 100644 index 24cd5dc6..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Classe utilitaire - * - * @module Helper - * @alias Gp.Helper - */ -var Helper = { - - /** - * concatenation des parametres key/value dans les urls - * - * @method normalyzeParameters - * @static - * @param {Object} params - tableau de clef/valeur - * - * @example - * Gp.Utils.Helper.normalyzeParameters ({ - * key1:value1, - * key2:value2, - * key3:value3 - * }); - * // out : "key1=value1&key2=value2&key3=value3" - * - * @returns {String} retourne les paramètres concaténés - */ - normalyzeParameters : function (params) { - var myParams = null; - - if (params) { - var tabParams = []; - for (var key in params) { - if (params.hasOwnProperty(key)) { - var value = params[key]; - if (!value) { - value = ""; - } - tabParams.push(key + "=" + value); - } - } - - myParams = tabParams.join("&"); - } - - return myParams; - }, - - /** - * Concaténation et encodage des urls. - * - * @method normalyzeUrl - * @static - * @param {String} url - url - * @param {Object|String} params - tableau de clef/valeur ou string - * @param {Boolean} encode - true|false, false par defaut - * - * @example - * Gp.Utils.Helper.normalyzeUrl (url, { - * key1:value1, - * key2=:value2, - * key3:value3 - * }); - * // out : "url?key1=value1&key2=value2&key3=value3" - * - * @returns {String} retourne une url normalisée - */ - normalyzeUrl : function (url, params, encode) { - var myUrl = url; - - if (url) { - var k = url.indexOf("?"); - if (k === -1) { // pas de ? et KVP - myUrl += "?"; - } - - if (k !== -1 && k !== url.length - 1) { // KVP - myUrl += "&"; - } - } - - if (params) { - if (typeof params === "string") { - myUrl += params; - } else { - myUrl += this.normalyzeParameters(params); - } - } - - if (encode) { - // FIXME bonne idée ? - myUrl = encodeURIComponent(myUrl); - } - - return myUrl; - }, - - /** - * Indentation d'une chaine - * - * @method indent - * @static - * @param {Number} n - nombre de tabulation - * @param {String} msg - chaine - * - * @example - * Gp.Utils.Helper.indent (2, "message à indenter") - * // out - * // ........message à indenter - * - * @returns {String} retourne une chaine indentée - */ - indent : function (n, msg) { - var num = n || 0; - return new Array(num + 1).join("\t") + msg; - } -}; - -export default Helper; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js deleted file mode 100644 index 9f0b155d..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js +++ /dev/null @@ -1,21 +0,0 @@ -import * as Log from "loglevel"; - -var LoggerByDefault = { - /** - * logger statique - * - * @static - * @param {String} name - nom du logger - * @returns {Object} retourne un logger - */ - getLogger : function (name) { - // Substitute global constants configured at compile time - // cf. webpack.config.js - // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ? - ("__PRODUCTION__".match(/true/)) ? Log.disableAll() : Log.enableAll(); - var logname = name || "default"; - return Log.getLogger(logname); - } -}; - -export default LoggerByDefault; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js deleted file mode 100644 index 09223cd7..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée. - * - * @example - * MessagesResources.getMessage("ERROR_PARAM_MISSING", "x", "y", "z"))); - * // --> output : Parameter(s) 'x - y - z' missing - * - * @module MessagesResources - * @alias Gp.Utils.MessagesResources - * @private - */ -var MessagesResources = { - - // Paramètres - PARAM_MISSING : "Parameter(s) '%var%' missing", - PARAM_EMPTY : "Parameter(s) '%var%' empty", - PARAM_TYPE : "Wrong type(s) for parameter(s) '%var%'", - PARAM_FORMAT : "Parameter(s) '%var%' not correctly formatted", - PARAM_NOT_SUPPORT : "Value(s) for parameter(s) '%var%' not supported", - PARAM_NOT_SUPPORT_NODEJS : "Value(s) for parameter(s) '%var%' not supported to NodeJS", - PARAM_UNKNOWN : "Value(s) for parameter(s) '%var%' unknown", - - // Services - // Requête - SERVICE_REQUEST_BUILD : "An error occurred during the request building of the service", - SERVICE_REQUEST_EMPTY : "The request sent to the service is empty", - - // Réponse - SERVICE_RESPONSE_EXCEPTION : "The service returned an exception : '%var%'", - SERVICE_RESPONSE_EXCEPTION_2 : "The service returned an exception", - SERVICE_RESPONSE_ANALYSE : "An error occurred while parsing the response '%var%' of the service", - SERVICE_RESPONSE_ANALYSE_2 : "An unknown error occurred while parsing the response", - SERVICE_RESPONSE_EMPTY : "The response of the service is empty", - SERVICE_RESPONSE_EMPTY_2 : "The response from the service could not be analyzed or is empty", - SERVICE_RESPONSE_FORMAT : "The format of the service response is not supported (handled format(s) : '%var%')", - SERVICE_RESPONSE_FORMAT_2 : "The format of the service response is not supported", - SERVICE_RESPONSE_FORMAT_3 : "No suggestion matching the search", - - // Classes - CLASS_CONSTRUCTOR : "'%var%' constructor cannot be called as a function.", - - /** - * Fonction qui va retourner le message d'erreur associé à la clé donnée - * - * @method getMessage - * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM) - * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée - * @return {String} message - String contenant le message de l'exception - */ - getMessage : function (clef, parametres) { - // param de la fonction uniquement pour la documentation... - - if (Object.keys(arguments).length === 0) { - return "Message indefined !"; - } - - var params = Array.prototype.slice.call(arguments); - var key = params.shift(); - var args = params; - - var message = this[key]; - - try { - if (Array.isArray(args) && args.length > 0) { - message = message.replace("%var%", args.join(" - ")); - } else { - message = message.replace("%var%", "%var% (not specified)"); - } - } catch (e) { - // error de string.replace() - - } - - return message; - } -}; - -export default MessagesResources;

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 R($ol79JrX)$pd!a`40v0^MU{X diff --git a/geoportal-access-lib-3.4.0-beta2/package/LICENCE.md b/geoportal-access-lib-3.4.0-beta2/package/LICENCE.md deleted file mode 100644 index 71697e36..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/LICENCE.md +++ /dev/null @@ -1,47 +0,0 @@ - -# Geoportal resources access library - -This software is released under the licence CeCILL-B (Free BSD compatible) - -You may obtain a copy of the License at : - -http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt (english) - -http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt (french) - -see http://www.cecill.info/ - -Copyright (c) 2016-2017 IGN - - -## Third party code : - -The Geoportal resources access library includes the following third party code : - -### ES6-Promise - -A tiny implementation of Promises/A+. -Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont ributors (Conversion to ES6 API by Jake Archibald) -Licensed under MIT license -See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE -Version v4.2.4 - -> Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of -> this software and associated documentation files (the "Software"), to deal in -> the Software without restriction, including without limitation the rights to -> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -> of the Software, and to permit persons to whom the Software is furnished to do -> so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. diff --git a/geoportal-access-lib-3.4.0-beta2/package/README.md b/geoportal-access-lib-3.4.0-beta2/package/README.md deleted file mode 100644 index 399a34a3..00000000 --- a/geoportal-access-lib-3.4.0-beta2/package/README.md +++ /dev/null @@ -1,376 +0,0 @@ -# Bibliothèque d'accès aux ressources du Géoportail - -[![Build](https://github.com/IGNF/geoportal-access-lib/actions/workflows/build.yml/badge.svg)](https://github.com/IGNF/geoportal-access-lib/actions/workflows/build.yml) -[![GitHub release](https://img.shields.io/github/release/IGNF/geoportal-access-lib.svg)](https://github.com/IGNF/geoportal-access-lib) -[![DeepScan grade](https://deepscan.io/api/teams/12425/projects/15468/branches/309615/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=12425&pid=15468&bid=309615) - - - -La bibliothèque d’accès aux ressources de la plateforme Géoportail est une bibliothèque de fonctions javascript permettant d'accéder aux ressources délivrées par les services web du Géoportail. - -Elle permet plus particulièrement d'effectuer les opérations suivantes utilisant les données de l'IGN : - -* [Géocoder des adresses, toponymes et parcelles cadastrales](#geocode) - -* [Obtenir des suggestions d'adresses ou de toponymes à partir de textes incomplets](#autocomplete) - -* [Obtenir des localisants (toponymes, adresses, parcelles cadastrales) proche d'une position donnée (géocodage inverse)](#reverseGeocode) - -* [Obtenir des altitudes en un ou plusieurs points ou calculer des profils altimétriques](#alti) - -* [Calculer un itinéraire piéton ou routier](#route) - -* [Calculer des isochrones / isodistances autour d'un point](#isoCurve) - -* [Obtenir des informations relatives à un contrat d'accès au Géoportail](#getConfig) - -## Mise en oeuvre - -Vous pouvez récupérer la bibliothèque d'accès soit en la [téléchargeant directement](#t%C3%A9l%C3%A9chargement-direct), soit en utilisant le [gestionnaire de dépendances javascript NPM](#r%C3%A9cup%C3%A9ration-avec-npm). - -Une documentation technique (jsdoc) et un testeur sont disponibles [ici](https://ignf.github.io/geoportal-access-lib/). - -### Téléchargement direct - -Vous pouvez récupérer ici la version compilée et autonome de la bibliothèque d'accès : [GpServices.js](https://github.com/IGNF/geoportal-access-lib/releases/latest), dans la partie "Downloads". - -### Récupération avec NPM - -La bibliothèque d'accès est aussi disponible dans les dépôts [NPM](https://www.npmjs.com/package/geoportal-access-lib). - -Prérequis : [NodeJS](https://nodejs.org/en/) et [npm](https://www.npmjs.com/) installés. - -``` bash -npm install geoportal-access-lib -``` - -#### Accès direct - -Vous pouvez aussi choisir d'utiliser des fichiers hébergés en ligne, pour y accéder directement, lors de vos tests par exemple. Cependant, pour une utilisation en production, nous vous conseillons de télécharger ces fichiers et de les héberger vous-même, sur le même serveur qui héberge votre application. - -Par exemple sur Github Pages : - -``` -https://ignf.github.io/geoportal-access-lib/latest/dist/GpServices.js -https://ignf.github.io/geoportal-access-lib/latest/dist/GpServices-src.js -``` - -### Intégration dans une page web - -Intégrez la bibliothèque d'accès dans votre page WEB classiquement à l'aide d'une balise **script**. - -``` html - -``` - -### Intégration dans [NodeJS](https://nodejs.org/en/) - -Intégrez la bibliothèque d'accès dans votre script à l'aide de la fonction **require**. - -``` js -var Gp = require("chemin/vers/GpServices.js"); -``` - -> **Note :** -Par défaut, les services sont intérrogés en HTTP. On a la possibilité de forcer le HTTPS avec l'option **ssl**. Ce comportement est ignoré dans les environnements clients (navigateur). Les services sont alors interrogés suivant le même protocole que la page en cours. - -``` js -var Gp = require("chemin/vers/GpServices.js"); - -Gp.Services.geocode({ - apiKey : "...", - ssl : true, - location : "...", - onSuccess : function (result) { - ... - } -}); -// --> https://wxs.ign.fr/KEY/geoportail/ols? -``` - -> **Note :** -Dans un environnement **NodeJS**, il faut installer les 2 dépendances suivantes dans votre projet : -- xmldom -- request - -### Intégration dans un module ES6 - -Intégrez la bibliothèque d'accès dans votre page WEB à l'aide d'une balise **script** de type *module*. - -``` html - -``` - -### Intégration dans un front-end type Angular ou React - -Intégrez la bibliothèque d'accès dans votre module à l'aide de la fonction **import**. - -``` js -import * as Gp from "chemin/vers/GpServices.js"; -``` - -> **Note :** -Dans un environnement **Front-End**, il faut installer les 2 dépendances suivantes dans votre projet : -- xmldom -- request - -