UNPKG

mapbox-gl-draw-freehand-mode

Version:
2 lines 186 kB
(()=>{"use strict";const e="add",t="polygon",o="Feature",n="Polygon",r="simple_select",i="vertex",a="true",s="false";function u(e){const t=e.featureTarget;return!!t&&!!t.properties&&t.properties.meta===i}const c={enable(e){setTimeout((()=>{e.map&&e.map.doubleClickZoom&&e._ctx&&e._ctx.store&&e._ctx.store.getInitialConfigValue&&e._ctx.store.getInitialConfigValue("doubleClickZoom")&&e.map.doubleClickZoom.enable()}),0)},disable(e){setTimeout((()=>{e.map&&e.map.doubleClickZoom&&e.map.doubleClickZoom.disable()}),0)}};function l(e,t,n,r){return{type:o,properties:{meta:i,parent:e,coord_path:n,active:r?a:s},geometry:{type:"Point",coordinates:t}}}const p={onSetup:function(){const r=this.newFeature({type:o,properties:{},geometry:{type:n,coordinates:[[]]}});return this.addFeature(r),this.clearSelectedFeatures(),c.disable(this),this.updateUIClasses({mouse:e}),this.activateUIButton(t),this.setActionableState({trash:!0}),{polygon:r,currentVertexPosition:0}},clickAnywhere:function(t,o){if(t.currentVertexPosition>0&&(n=o,i=t.polygon.coordinates[0][t.currentVertexPosition-1],n.lngLat&&n.lngLat.lng===i[0]&&n.lngLat.lat===i[1]))return this.changeMode(r,{featureIds:[t.polygon.id]});var n,i;this.updateUIClasses({mouse:e}),t.polygon.updateCoordinate(`0.${t.currentVertexPosition}`,o.lngLat.lng,o.lngLat.lat),t.currentVertexPosition++,t.polygon.updateCoordinate(`0.${t.currentVertexPosition}`,o.lngLat.lng,o.lngLat.lat)},clickOnVertex:function(e){return this.changeMode(r,{featureIds:[e.polygon.id]})},onMouseMove:function(e,t){e.polygon.updateCoordinate(`0.${e.currentVertexPosition}`,t.lngLat.lng,t.lngLat.lat),u(t)&&this.updateUIClasses({mouse:"pointer"})}};p.onTap=p.onClick=function(e,t){return u(t)?this.clickOnVertex(e,t):this.clickAnywhere(e,t)},p.onKeyUp=function(e,t){!function(e){return 27===e.keyCode}(t)?function(e){return 13===e.keyCode}(t)&&this.changeMode(r,{featureIds:[e.polygon.id]}):(this.deleteFeature([e.polygon.id],{silent:!0}),this.changeMode(r))},p.onStop=function(e){this.updateUIClasses({mouse:"none"}),c.enable(this),this.activateUIButton(),void 0!==this.getFeature(e.polygon.id)&&(e.polygon.removeCoordinate(`0.${e.currentVertexPosition}`),e.polygon.isValid()?this.map.fire("draw.create",{features:[e.polygon.toGeoJSON()]}):(this.deleteFeature([e.polygon.id],{silent:!0}),this.changeMode(r,{},{silent:!0})))},p.toDisplayFeatures=function(e,t,n){const r=t.properties.id===e.polygon.id;if(t.properties.active=r?a:s,!r)return n(t);if(0===t.geometry.coordinates.length)return;const i=t.geometry.coordinates[0].length;if(!(i<3)){if(t.properties.meta="feature",n(l(e.polygon.id,t.geometry.coordinates[0][0],"0.0",!1)),i>3){const o=t.geometry.coordinates[0].length-3;n(l(e.polygon.id,t.geometry.coordinates[0][o],`0.${o}`,!1))}if(i<=4){const e=[[t.geometry.coordinates[0][0][0],t.geometry.coordinates[0][0][1]],[t.geometry.coordinates[0][1][0],t.geometry.coordinates[0][1][1]]];if(n({type:o,properties:t.properties,geometry:{coordinates:e,type:"LineString"}}),3===i)return}return n(t)}},p.onTrash=function(e){this.deleteFeature([e.polygon.id],{silent:!0}),this.changeMode(r)};const g=p;function d(e){if(Array.isArray(e))return e;if("Feature"===e.type){if(null!==e.geometry)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function y(e){var t=d(e);if(2===t.length&&!f(t[0],t[1]))return t;var o=[],n=t.length-1,r=o.length;o.push(t[0]);for(var i=1;i<n;i++){var a=o[o.length-1];t[i][0]===a[0]&&t[i][1]===a[1]||(o.push(t[i]),(r=o.length)>2&&h(o[r-3],o[r-1],o[r-2])&&o.splice(o.length-2,1))}if(o.push(t[t.length-1]),r=o.length,f(t[0],t[t.length-1])&&r<4)throw new Error("invalid polygon");return h(o[r-3],o[r-1],o[r-2])&&o.splice(o.length-2,1),o}function f(e,t){return e[0]===t[0]&&e[1]===t[1]}function h(e,t,o){var n=o[0],r=o[1],i=e[0],a=e[1],s=t[0],u=t[1],c=s-i,l=u-a;return 0==(n-i)*l-(r-a)*c&&(Math.abs(c)>=Math.abs(l)?c>0?i<=n&&n<=s:s<=n&&n<=i:l>0?a<=r&&r<=u:u<=r&&r<=a)}function m(e){var t={type:"Feature"};return Object.keys(e).forEach((function(o){switch(o){case"type":case"properties":case"geometry":return;default:t[o]=e[o]}})),t.properties=b(e.properties),t.geometry=v(e.geometry),t}function b(e){var t={};return e?(Object.keys(e).forEach((function(o){var n=e[o];"object"==typeof n?null===n?t[o]=null:Array.isArray(n)?t[o]=n.map((function(e){return e})):t[o]=b(n):t[o]=n})),t):t}function v(e){var t={type:e.type};return e.bbox&&(t.bbox=e.bbox),"GeometryCollection"===e.type?(t.geometries=e.geometries.map((function(e){return v(e)})),t):(t.coordinates=x(e.coordinates),t)}function x(e){var t=e;return"object"!=typeof t[0]?t.slice():t.map((function(e){return x(e)}))}function w(e,t,o){var n=t.x,r=t.y,i=o.x-n,a=o.y-r;if(0!==i||0!==a){var s=((e.x-n)*i+(e.y-r)*a)/(i*i+a*a);s>1?(n=o.x,r=o.y):s>0&&(n+=i*s,r+=a*s)}return(i=e.x-n)*i+(a=e.y-r)*a}function C(e,t,o,n,r){for(var i,a=n,s=t+1;s<o;s++){var u=w(e[s],e[t],e[o]);u>a&&(i=s,a=u)}a>n&&(i-t>1&&C(e,t,i,n,r),r.push(e[i]),o-i>1&&C(e,i,o,n,r))}function M(e,t){var o=e.length-1,n=[e[0]];return C(e,0,o,t,n),n.push(e[o]),n}function P(e,t,o){if(e.length<=2)return e;var n=void 0!==t?t*t:1;return M(e=o?e:function(e,t){for(var o,n,r,i,a,s=e[0],u=[s],c=1,l=e.length;c<l;c++)r=s,void 0,void 0,(i=(n=o=e[c]).x-r.x)*i+(a=n.y-r.y)*a>t&&(u.push(o),s=o);return s!==o&&u.push(o),u}(e,n),n)}function k(e,t,o){return P(e.map((function(e){return{x:e[0],y:e[1],z:e[2]}})),t,o).map((function(e){return e.z?[e.x,e.y,e.z]:[e.x,e.y]}))}function F(e,t,o){return e.map((function(e){var n=e.map((function(e){return{x:e[0],y:e[1]}}));if(n.length<4)throw new Error("invalid polygon");for(var r=P(n,t,o).map((function(e){return[e.x,e.y]}));!S(r);)r=P(n,t-=.01*t,o).map((function(e){return[e.x,e.y]}));return r[r.length-1][0]===r[0][0]&&r[r.length-1][1]===r[0][1]||r.push(r[0]),r}))}function S(e){return!(e.length<3||3===e.length&&e[2][0]===e[0][0]&&e[2][1]===e[0][1])}const L=function(e,t){if(!(o=t=t||{})||o.constructor!==Object)throw new Error("options is invalid");var o,n=void 0!==t.tolerance?t.tolerance:1,r=t.highQuality||!1,i=t.mutate||!1;if(!e)throw new Error("geojson is required");if(n&&n<0)throw new Error("invalid tolerance");return!0!==i&&(e=function(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return m(e);case"FeatureCollection":return function(e){var t={type:"FeatureCollection"};return Object.keys(e).forEach((function(o){switch(o){case"type":case"features":return;default:t[o]=e[o]}})),t.features=e.features.map((function(e){return m(e)})),t}(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return v(e);default:throw new Error("unknown GeoJSON type")}}(e)),function(e,t){var o,n,r,i,a,s,u,c,l,p,g=0,d="FeatureCollection"===e.type,y="Feature"===e.type,f=d?e.features.length:1;for(o=0;o<f;o++){for(s=d?e.features[o].geometry:y?e.geometry:e,c=d?e.features[o].properties:y?e.properties:{},l=d?e.features[o].bbox:y?e.bbox:void 0,p=d?e.features[o].id:y?e.id:void 0,a=(u=!!s&&"GeometryCollection"===s.type)?s.geometries.length:1,r=0;r<a;r++)if(null!==(i=u?s.geometries[r]:s))switch(i.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":if(!1===t(i,g,c,l,p))return!1;break;case"GeometryCollection":for(n=0;n<i.geometries.length;n++)if(!1===t(i.geometries[n],g,c,l,p))return!1;break;default:throw new Error("Unknown Geometry Type")}else if(!1===t(null,g,c,l,p))return!1;g++}}(e,(function(e){!function(e,t,o){var n=e.type;if("Point"===n||"MultiPoint"===n)return e;!function(e,t){void 0===t&&(t={});var o="object"==typeof t?t.mutate:t;if(!e)throw new Error("geojson is required");var n=function(e,t){return"FeatureCollection"===e.type?"FeatureCollection":"GeometryCollection"===e.type?"GeometryCollection":"Feature"===e.type&&null!==e.geometry?e.geometry.type:e.type}(e),r=[];switch(n){case"LineString":r=y(e);break;case"MultiLineString":case"Polygon":d(e).forEach((function(e){r.push(y(e))}));break;case"MultiPolygon":d(e).forEach((function(e){var t=[];e.forEach((function(e){t.push(y(e))})),r.push(t)}));break;case"Point":return e;case"MultiPoint":var i={};d(e).forEach((function(e){var t=e.join("-");i.hasOwnProperty(t)||(r.push(e),i[t]=!0)}));break;default:throw new Error(n+" geometry not supported")}e.coordinates?!0===o&&(e.coordinates=r):!0===o?e.geometry.coordinates=r:function(e,t,o){void 0===o&&(o={});var n={type:"Feature"};(0===o.id||o.id)&&(n.id=o.id),o.bbox&&(n.bbox=o.bbox),n.properties=t||{},n.geometry=e}({type:n,coordinates:r},e.properties,{bbox:e.bbox,id:e.id})}(e,!0);var r=e.coordinates;switch(n){case"LineString":e.coordinates=k(r,t,o);break;case"MultiLineString":e.coordinates=r.map((function(e){return k(e,t,o)}));break;case"Polygon":e.coordinates=F(r,t,o);break;case"MultiPolygon":e.coordinates=r.map((function(e){return F(e,t,o)}))}}(e,n,r)})),e},E=Object.assign({},g);E.onSetup=function(){const r=this.newFeature({type:o,properties:{},geometry:{type:n,coordinates:[[]]}});return this.addFeature(r),this.clearSelectedFeatures(),setTimeout((()=>{this.map&&this.map.dragPan&&this.map.dragPan.disable()}),0),this.updateUIClasses({mouse:e}),this.activateUIButton(t),this.setActionableState({trash:!0}),{polygon:r,currentVertexPosition:0,dragMoving:!1}},E.onDrag=E.onTouchMove=function(t,o){t.dragMoving=!0,this.updateUIClasses({mouse:e}),t.polygon.updateCoordinate(`0.${t.currentVertexPosition}`,o.lngLat.lng,o.lngLat.lat),t.currentVertexPosition++,t.polygon.updateCoordinate(`0.${t.currentVertexPosition}`,o.lngLat.lng,o.lngLat.lat)},E.onMouseUp=function(e,t){e.dragMoving&&(this.simplify(e.polygon),this.fireUpdate(),this.changeMode(r,{featureIds:[e.polygon.id]}))},E.onTouchEnd=function(e,t){this.onMouseUp(e,t)},E.fireUpdate=function(){this.map.fire("draw.update",{action:"move",features:this.getSelected().map((e=>e.toGeoJSON()))})},E.simplify=function(e){const t=1/Math.pow(1.05,10*this.map.getZoom());L(e,{mutate:!0,tolerance:t,highQuality:!0})};const V=E;mapboxgl.accessToken="pk.eyJ1IjoiYmVuZWhta2UiLCJhIjoiY2plYTl6b3c2MHg5ODJxbGV4aXR4Z3p6YSJ9.d3jSAbsqSmpJwyVcp9iXbw";var I=new mapboxgl.Map({container:document.getElementById("map"),style:"mapbox://styles/mapbox/streets-v11",center:[-94.737236,32.514885],zoom:12}),j=new MapboxDraw({modes:Object.assign(MapboxDraw.modes,{draw_polygon:V})});I.addControl(j,"top-left"),I.on("draw.create",(function(){console.log(arguments,j.getAll())}))})(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tYXBib3gtZ2wtZHJhdy1mcmVlaGFuZC1tb2RlLy4vbm9kZV9tb2R1bGVzL0BtYXBib3gvbWFwYm94LWdsLWRyYXcvc3JjL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9tYXBib3gtZ2wtZHJhdy1mcmVlaGFuZC1tb2RlLy4vbm9kZV9tb2R1bGVzL0BtYXBib3gvbWFwYm94LWdsLWRyYXcvc3JjL2xpYi9jb21tb25fc2VsZWN0b3JzLmpzIiwid2VicGFjazovL21hcGJveC1nbC1kcmF3LWZyZWVoYW5kLW1vZGUvLi9ub2RlX21vZHVsZXMvQG1hcGJveC9tYXBib3gtZ2wtZHJhdy9zcmMvbGliL2RvdWJsZV9jbGlja196b29tLmpzIiwid2VicGFjazovL21hcGJveC1nbC1kcmF3LWZyZWVoYW5kLW1vZGUvLi9ub2RlX21vZHVsZXMvQG1hcGJveC9tYXBib3gtZ2wtZHJhdy9zcmMvbGliL2NyZWF0ZV92ZXJ0ZXguanMiLCJ3ZWJwYWNrOi8vbWFwYm94LWdsLWRyYXctZnJlZWhhbmQtbW9kZS8uL25vZGVfbW9kdWxlcy9AbWFwYm94L21hcGJveC1nbC1kcmF3L3NyYy9tb2Rlcy9kcmF3X3BvbHlnb24uanMiLCJ3ZWJwYWNrOi8vbWFwYm94LWdsLWRyYXctZnJlZWhhbmQtbW9kZS8uL25vZGVfbW9kdWxlcy9AbWFwYm94L21hcGJveC1nbC1kcmF3L3NyYy9saWIvaXNfZXZlbnRfYXRfY29vcmRpbmF0ZXMuanMiLCJ3ZWJwYWNrOi8vbWFwYm94LWdsLWRyYXctZnJlZWhhbmQtbW9kZS8uL25vZGVfbW9kdWxlcy9AdHVyZi9pbnZhcmlhbnQvZGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYXBib3gtZ2wtZHJhdy1mcmVlaGFuZC1tb2RlLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2NsZWFuLWNvb3Jkcy9kaXN0L2VzL2luZGV4LmpzIiwid2VicGFjazovL21hcGJveC1nbC1kcmF3LWZyZWVoYW5kLW1vZGUvLi9ub2RlX21vZHVsZXMvQHR1cmYvY2xvbmUvZGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYXBib3gtZ2wtZHJhdy1mcmVlaGFuZC1tb2RlLy4vbm9kZV9tb2R1bGVzL0B0dXJmL3NpbXBsaWZ5L2Rpc3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbWFwYm94LWdsLWRyYXctZnJlZWhhbmQtbW9kZS8uL25vZGVfbW9kdWxlcy9AdHVyZi9oZWxwZXJzL2Rpc3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbWFwYm94LWdsLWRyYXctZnJlZWhhbmQtbW9kZS8uL25vZGVfbW9kdWxlcy9AdHVyZi9tZXRhL2Rpc3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbWFwYm94LWdsLWRyYXctZnJlZWhhbmQtbW9kZS8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYXBib3gtZ2wtZHJhdy1mcmVlaGFuZC1tb2RlLy4vZG9jcy9pbmRleC5qcyJdLCJuYW1lcyI6WyJjdXJzb3JzIiwidHlwZXMiLCJnZW9qc29uVHlwZXMiLCJtb2RlcyIsIm1ldGEiLCJhY3RpdmVTdGF0ZXMiLCJpc1ZlcnRleCIsImUiLCJmZWF0dXJlVGFyZ2V0IiwicHJvcGVydGllcyIsImN0eCIsInNldFRpbWVvdXQiLCJtYXAiLCJkb3VibGVDbGlja1pvb20iLCJfY3R4Iiwic3RvcmUiLCJnZXRJbml0aWFsQ29uZmlnVmFsdWUiLCJlbmFibGUiLCJkaXNhYmxlIiwicGFyZW50SWQiLCJjb29yZGluYXRlcyIsInBhdGgiLCJzZWxlY3RlZCIsInR5cGUiLCJwYXJlbnQiLCJjb29yZF9wYXRoIiwiYWN0aXZlIiwiZ2VvbWV0cnkiLCJEcmF3UG9seWdvbiIsInBvbHlnb24iLCJ0aGlzIiwibmV3RmVhdHVyZSIsImFkZEZlYXR1cmUiLCJjbGVhclNlbGVjdGVkRmVhdHVyZXMiLCJ1cGRhdGVVSUNsYXNzZXMiLCJtb3VzZSIsImFjdGl2YXRlVUlCdXR0b24iLCJzZXRBY3Rpb25hYmxlU3RhdGUiLCJ0cmFzaCIsImN1cnJlbnRWZXJ0ZXhQb3NpdGlvbiIsInN0YXRlIiwiZXZlbnQiLCJsbmdMYXQiLCJsbmciLCJsYXQiLCJjaGFuZ2VNb2RlIiwiZmVhdHVyZUlkcyIsImlkIiwidXBkYXRlQ29vcmRpbmF0ZSIsIm9uVGFwIiwib25DbGljayIsImNsaWNrT25WZXJ0ZXgiLCJjbGlja0FueXdoZXJlIiwib25LZXlVcCIsImtleUNvZGUiLCJkZWxldGVGZWF0dXJlIiwic2lsZW50Iiwib25TdG9wIiwidW5kZWZpbmVkIiwiZ2V0RmVhdHVyZSIsInJlbW92ZUNvb3JkaW5hdGUiLCJpc1ZhbGlkIiwiZmlyZSIsImZlYXR1cmVzIiwidG9HZW9KU09OIiwidG9EaXNwbGF5RmVhdHVyZXMiLCJnZW9qc29uIiwiZGlzcGxheSIsImlzQWN0aXZlUG9seWdvbiIsImxlbmd0aCIsImNvb3JkaW5hdGVDb3VudCIsImVuZFBvcyIsImxpbmVDb29yZGluYXRlcyIsIm9uVHJhc2giLCJnZXRDb29yZHMiLCJjb29yZHMiLCJBcnJheSIsImlzQXJyYXkiLCJFcnJvciIsImNsZWFuTGluZSIsImxpbmUiLCJwb2ludHMiLCJlcXVhbHMiLCJuZXdQb2ludHMiLCJzZWNvbmRUb0xhc3QiLCJuZXdQb2ludHNMZW5ndGgiLCJwdXNoIiwiaSIsInByZXZBZGRlZFBvaW50IiwiaXNQb2ludE9uTGluZVNlZ21lbnQiLCJzcGxpY2UiLCJwdDEiLCJwdDIiLCJzdGFydCIsImVuZCIsInBvaW50IiwieCIsInkiLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsImR4bCIsImR5bCIsIk1hdGgiLCJhYnMiLCJjbG9uZUZlYXR1cmUiLCJjbG9uZWQiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImNsb25lUHJvcGVydGllcyIsImNsb25lR2VvbWV0cnkiLCJ2YWx1ZSIsIml0ZW0iLCJnZW9tIiwiYmJveCIsImdlb21ldHJpZXMiLCJnIiwiZGVlcFNsaWNlIiwic2xpY2UiLCJjb29yZCIsImdldFNxU2VnRGlzdCIsInAiLCJwMSIsInAyIiwiZHgiLCJkeSIsInQiLCJzaW1wbGlmeURQU3RlcCIsImZpcnN0IiwibGFzdCIsInNxVG9sZXJhbmNlIiwic2ltcGxpZmllZCIsImluZGV4IiwibWF4U3FEaXN0Iiwic3FEaXN0Iiwic2ltcGxpZnlEb3VnbGFzUGV1Y2tlciIsInNpbXBsaWZ5IiwidG9sZXJhbmNlIiwiaGlnaGVzdFF1YWxpdHkiLCJwcmV2UG9pbnQiLCJsZW4iLCJzaW1wbGlmeVJhZGlhbERpc3QiLCJzaW1wbGlmeUxpbmUiLCJoaWdoUXVhbGl0eSIsInoiLCJzaW1wbGlmeVBvbHlnb24iLCJyaW5nIiwicHRzIiwic2ltcGxlUmluZyIsImNoZWNrVmFsaWRpdHkiLCJvcHRpb25zIiwiaW5wdXQiLCJjb25zdHJ1Y3RvciIsIm11dGF0ZSIsImZlYXR1cmUiLCJjbG9uZUZlYXR1cmVDb2xsZWN0aW9uIiwiY2FsbGJhY2siLCJqIiwic3RvcEciLCJnZW9tZXRyeU1heWJlQ29sbGVjdGlvbiIsImlzR2VvbWV0cnlDb2xsZWN0aW9uIiwiZmVhdHVyZVByb3BlcnRpZXMiLCJmZWF0dXJlQkJveCIsImZlYXR1cmVJZCIsImZlYXR1cmVJbmRleCIsImlzRmVhdHVyZUNvbGxlY3Rpb24iLCJpc0ZlYXR1cmUiLCJzdG9wIiwiZ2VvbUVhY2giLCJfbmFtZSIsImdldFR5cGUiLCJuZXdDb29yZHMiLCJwb2x5Z29ucyIsInBvbHlQb2ludHMiLCJleGlzdGluZyIsImpvaW4iLCJoYXNPd25Qcm9wZXJ0eSIsImZlYXQiLCJsaW5lcyIsInJpbmdzIiwic2ltcGxpZnlHZW9tIiwiRnJlZWhhbmRNb2RlIiwiYXNzaWduIiwib25TZXR1cCIsImRyYWdQYW4iLCJkcmFnTW92aW5nIiwib25EcmFnIiwib25Ub3VjaE1vdmUiLCJvbk1vdXNlVXAiLCJmaXJlVXBkYXRlIiwib25Ub3VjaEVuZCIsImFjdGlvbiIsImdldFNlbGVjdGVkIiwiZiIsInBvdyIsImdldFpvb20iLCJtYXBib3hnbCIsImFjY2Vzc1Rva2VuIiwiTWFwIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInN0eWxlIiwiY2VudGVyIiwiem9vbSIsIkRyYXciLCJNYXBib3hEcmF3IiwiZHJhd19wb2x5Z29uIiwiYWRkQ29udHJvbCIsIm9uIiwiY29uc29sZSIsImxvZyIsImFyZ3VtZW50cyIsImdldEFsbCJdLCJtYXBwaW5ncyI6Im1CQUFPLE1BcUJNQSxFQUNOLE1BT01DLEVBQ0YsVUFLRUMsRUFDRixVQURFQSxFQUVGLFVBVUVDLEVBSUksZ0JBc0JKQyxFQUdILFNBR0dDLEVBQ0gsT0FER0EsRUFFRCxRQ3hDTCxTQUFTQyxFQUFTQyxHQUN2QixNQUFNQyxFQUFnQkQsRUFBRUMsY0FDeEIsUUFBS0EsS0FDQUEsRUFBY0MsWUFDWkQsRUFBY0MsV0FBV0wsT0FBUyxFQzdDM0MsU0FDRSxPQUFPTSxHQUNMQyxZQUFXLEtBRUpELEVBQUlFLEtBQVFGLEVBQUlFLElBQUlDLGlCQUFvQkgsRUFBSUksTUFBU0osRUFBSUksS0FBS0MsT0FBVUwsRUFBSUksS0FBS0MsTUFBTUMsdUJBRXZGTixFQUFJSSxLQUFLQyxNQUFNQyxzQkFBc0Isb0JBQzFDTixFQUFJRSxJQUFJQyxnQkFBZ0JJLFdBQ3ZCLElBRUwsUUFBUVAsR0FDTkMsWUFBVyxLQUNKRCxFQUFJRSxLQUFRRixFQUFJRSxJQUFJQyxpQkFFekJILEVBQUlFLElBQUlDLGdCQUFnQkssWUFDdkIsS0NGUSxXQUFTQyxFQUFVQyxFQUFhQyxFQUFNQyxHQUNuRCxNQUFPLENBQ0xDLEtBQU0sRUFDTmQsV0FBWSxDQUNWTCxLQUFNLEVBQ05vQixPQUFRTCxFQUNSTSxXQUFZSixFQUNaSyxPQUFRLEVBQWEsRUFBZ0MsR0FFdkRDLFNBQVUsQ0FDUkosS0hnQkcsUUdmSEgsZ0JDbEJOLE1BQU1RLEVBQWMsQ0FFcEIsUUFBc0IsV0FDcEIsTUFBTUMsRUFBVUMsS0FBS0MsV0FBVyxDQUM5QlIsS0FBTSxFQUNOZCxXQUFZLEdBQ1prQixTQUFVLENBQ1JKLEtBQU0sRUFDTkgsWUFBYSxDQUFDLE9BY2xCLE9BVkFVLEtBQUtFLFdBQVdILEdBRWhCQyxLQUFLRyx3QkFDTCxVQUF3QkgsTUFDeEJBLEtBQUtJLGdC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bEIsSUFBSWtELEtaQUgsY1lBdUIsQ0FDekJvSSxPWlNBLE9ZUkFuSSxTQUFVakMsS0FBS3FLLGNBQWN2TCxLQUFJd0wsR0FBS0EsRUFBRXBJLGlCQUloRHdILEVBQWE3QyxTQUFXLFNBQVM5RyxHQUMvQixNQUFNK0csRUFBWSxFQUFJcEMsS0FBSzZGLElBQUksS0FBTSxHQUFLdkssS0FBS2xCLElBQUkwTCxXQUNuRCxFQUFTekssRUFBUyxDQUNkK0gsUUFBUSxFQUNSaEIsVUFBV0EsRUFDWE0sYUFBYSxLQUluQixVQ3hFQXFELFNBQVNDLFlBQWMsNkZBQ3JCLElBQUk1TCxFQUFNLElBQUkyTCxTQUFTRSxJQUFJLENBQzNCQyxVQUFXQyxTQUFTQyxlQUFlLE9BQ25DQyxNQUFPLHFDQUNQQyxPQUFRLEVBQUUsVUFBWSxXQUN0QkMsS0FBTSxLQUdKQyxFQUFPLElBQUlDLFdBQVcsQ0FDeEI5TSxNQUFPeUcsT0FBTzZFLE9BQU93QixXQUFXOU0sTUFBTyxDQUNyQytNLGFBQWMsTUFJbEJ0TSxFQUFJdU0sV0FBV0gsRUFBTSxZQUNyQnBNLEVBQUl3TSxHQUFHLGVBQ1AsV0FDSUMsUUFBUUMsSUFBSUMsVUFBV1AsRUFBS1EsYyIsImZpbGUiOiJpbmRleC5jb21waWxlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjbGFzc2VzID0ge1xuICBDT05UUk9MX0JBU0U6ICdtYXBib3hnbC1jdHJsJyxcbiAgQ09OVFJPTF9QUkVGSVg6ICdtYXBib3hnbC1jdHJsLScsXG4gIENPTlRST0xfQlVUVE9OOiAnbWFwYm94LWdsLWRyYXdfY3RybC1kcmF3LWJ0bicsXG4gIENPTlRST0xfQlVUVE9OX0xJTkU6ICdtYXBib3gtZ2wtZHJhd19saW5lJyxcbiAgQ09OVFJPTF9CVVRUT05fUE9MWUdPTjogJ21hcGJveC1nbC1kcmF3X3BvbHlnb24nLFxuICBDT05UUk9MX0JVVFRPTl9QT0lOVDogJ21hcGJveC1nbC1kcmF3X3BvaW50JyxcbiAgQ09OVFJPTF9CVVRUT05fVFJBU0g6ICdtYXBib3gtZ2wtZHJhd190cmFzaCcsXG4gIENPTlRST0xfQlVUVE9OX0NPTUJJTkVfRkVBVFVSRVM6ICdtYXBib3gtZ2wtZHJhd19jb21iaW5lJyxcbiAgQ09OVFJPTF9CVVRUT05fVU5DT01CSU5FX0ZFQVRVUkVTOiAnbWFwYm94LWdsLWRyYXdfdW5jb21iaW5lJyxcbiAgQ09OVFJPTF9HUk9VUDogJ21hcGJveGdsLWN0cmwtZ3JvdXAnLFxuICBBVFRSSUJVVElPTjogJ21hcGJveGdsLWN0cmwtYXR0cmliJyxcbiAgQUNUSVZFX0JVVFRPTjogJ2FjdGl2ZScsXG4gIEJPWF9TRUxFQ1Q6ICdtYXBib3gtZ2wtZHJhd19ib3hzZWxlY3QnXG59O1xuXG5leHBvcnQgY29uc3Qgc291cmNlcyA9IHtcbiAgSE9UOiAnbWFwYm94LWdsLWRyYXctaG90JyxcbiAgQ09MRDogJ21hcGJveC1nbC1kcmF3LWNvbGQnXG59O1xuXG5leHBvcnQgY29uc3QgY3Vyc29ycyA9IHtcbiAgQUREOiAnYWRkJyxcbiAgTU9WRTogJ21vdmUnLFxuICBEUkFHOiAnZHJhZycsXG4gIFBPSU5URVI6ICdwb2ludGVyJyxcbiAgTk9ORTogJ25vbmUnXG59O1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIFBPTFlHT046ICdwb2x5Z29uJyxcbiAgTElORTogJ2xpbmVfc3RyaW5nJyxcbiAgUE9JTlQ6ICdwb2ludCdcbn07XG5cbmV4cG9ydCBjb25zdCBnZW9qc29uVHlwZXMgPSB7XG4gIEZFQVRVUkU6ICdGZWF0dXJlJyxcbiAgUE9MWUdPTjogJ1BvbHlnb24nLFxuICBMSU5FX1NUUklORzogJ0xpbmVTdHJpbmcnLFxuICBQT0lOVDogJ1BvaW50JyxcbiAgRkVBVFVSRV9DT0xMRUNUSU9OOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICBNVUxUSV9QUkVGSVg6ICdNdWx0aScsXG4gIE1VTFRJX1BPSU5UOiAnTXVsdGlQb2ludCcsXG4gIE1VTFRJX0xJTkVfU1RSSU5HOiAnTXVsdGlMaW5lU3RyaW5nJyxcbiAgTVVMVElfUE9MWUdPTjogJ011bHRpUG9seWdvbidcbn07XG5cbmV4cG9ydCBjb25zdCBtb2RlcyA9IHtcbiAgRFJBV19MSU5FX1NUUklORzogJ2RyYXdfbGluZV9zdHJpbmcnLFxuICBEUkFXX1BPTFlHT046ICdkcmF3X3BvbHlnb24nLFxuICBEUkFXX1BPSU5UOiAnZHJhd19wb2ludCcsXG4gIFNJTVBMRV9TRUxFQ1Q6ICdzaW1wbGVfc2VsZWN0JyxcbiAgRElSRUNUX1NFTEVDVDogJ2RpcmVjdF9zZWxlY3QnLFxuICBTVEFUSUM6ICdzdGF0aWMnXG59O1xuXG5leHBvcnQgY29uc3QgZXZlbnRzID0ge1xuICBDUkVBVEU6ICdkcmF3LmNyZWF0ZScsXG4gIERFTEVURTogJ2RyYXcuZGVsZXRlJyxcbiAgVVBEQVRFOiAnZHJhdy51cGRhdGUnLFxuICBTRUxFQ1RJT05fQ0hBTkdFOiAnZHJhdy5zZWxlY3Rpb25jaGFuZ2UnLFxuICBNT0RFX0NIQU5HRTogJ2RyYXcubW9kZWNoYW5nZScsXG4gIEFDVElPTkFCTEU6ICdkcmF3LmFjdGlvbmFibGUnLFxuICBSRU5ERVI6ICdkcmF3LnJlbmRlcicsXG4gIENPTUJJTkVfRkVBVFVSRVM6ICdkcmF3LmNvbWJpbmUnLFxuICBVTkNPTUJJTkVfRkVBVFVSRVM6ICdkcmF3LnVuY29tYmluZSdcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY3Rpb25zID0ge1xuICBNT1ZFOiAnbW92ZScsXG4gIENIQU5HRV9DT09SRElOQVRFUzogJ2NoYW5nZV9jb29yZGluYXRlcydcbn07XG5cbmV4cG9ydCBjb25zdCBtZXRhID0ge1xuICBGRUFUVVJFOiAnZmVhdHVyZScsXG4gIE1JRFBPSU5UOiAnbWlkcG9pbnQnLFxuICBWRVJURVg6ICd2ZXJ0ZXgnXG59O1xuXG5leHBvcnQgY29uc3QgYWN0aXZlU3RhdGVzID0ge1xuICBBQ1RJVkU6ICd0cnVlJyxcbiAgSU5BQ1RJVkU6ICdmYWxzZSdcbn07XG5cbmV4cG9ydCBjb25zdCBpbnRlcmFjdGlvbnMgPSBbXG4gICdzY3JvbGxab29tJyxcbiAgJ2JveFpvb20nLFxuICAnZHJhZ1JvdGF0ZScsXG4gICdkcmFnUGFuJyxcbiAgJ2tleWJvYXJkJyxcbiAgJ2RvdWJsZUNsaWNrWm9vbScsXG4gICd0b3VjaFpvb21Sb3RhdGUnXG5dO1xuXG5leHBvcnQgY29uc3QgTEFUX01JTiA9IC05MDtcbmV4cG9ydCBjb25zdCBMQVRfUkVOREVSRURfTUlOID0gLTg1O1xuZXhwb3J0IGNvbnN0IExBVF9NQVggPSA5MDtcbmV4cG9ydCBjb25zdCBMQVRfUkVOREVSRURfTUFYID0gODU7XG5leHBvcnQgY29uc3QgTE5HX01JTiA9IC0yNzA7XG5leHBvcnQgY29uc3QgTE5HX01BWCA9IDI3MDtcbiIsImltcG9ydCAqIGFzIENvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNPZk1ldGFUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICBjb25zdCBmZWF0dXJlVGFyZ2V0ID0gZS5mZWF0dXJlVGFyZ2V0O1xuICAgIGlmICghZmVhdHVyZVRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghZmVhdHVyZVRhcmdldC5wcm9wZXJ0aWVzKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGZlYXR1cmVUYXJnZXQucHJvcGVydGllcy5tZXRhID09PSB0eXBlO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaGlmdE1vdXNlZG93bihlKSB7XG4gIGlmICghZS5vcmlnaW5hbEV2ZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmICghZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlLm9yaWdpbmFsRXZlbnQuYnV0dG9uID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBY3RpdmVGZWF0dXJlKGUpIHtcbiAgaWYgKCFlLmZlYXR1cmVUYXJnZXQpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFlLmZlYXR1cmVUYXJnZXQucHJvcGVydGllcykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZS5mZWF0dXJlVGFyZ2V0LnByb3BlcnRpZXMuYWN0aXZlID09PSBDb25zdGFudHMuYWN0aXZlU3RhdGVzLkFDVElWRSAmJlxuICAgIGUuZmVhdHVyZVRhcmdldC5wcm9wZXJ0aWVzLm1ldGEgPT09IENvbnN0YW50cy5tZXRhLkZFQVRVUkU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luYWN0aXZlRmVhdHVyZShlKSB7XG4gIGlmICghZS5mZWF0dXJlVGFyZ2V0KSByZXR1cm4gZmFsc2U7XG4gIGlmICghZS5mZWF0dXJlVGFyZ2V0LnByb3BlcnRpZXMpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGUuZmVhdHVyZVRhcmdldC5wcm9wZXJ0aWVzLmFjdGl2ZSA9PT0gQ29uc3RhbnRzLmFjdGl2ZVN0YXRlcy5JTkFDVElWRSAmJlxuICAgIGUuZmVhdHVyZVRhcmdldC5wcm9wZXJ0aWVzLm1ldGEgPT09IENvbnN0YW50cy5tZXRhLkZFQVRVUkU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub1RhcmdldChlKSB7XG4gIHJldHVybiBlLmZlYXR1cmVUYXJnZXQgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmVhdHVyZShlKSB7XG4gIGlmICghZS5mZWF0dXJlVGFyZ2V0KSByZXR1cm4gZmFsc2U7XG4gIGlmICghZS5mZWF0dXJlVGFyZ2V0LnByb3BlcnRpZXMpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGUuZmVhdHVyZVRhcmdldC5wcm9wZXJ0aWVzLm1ldGEgPT09IENvbnN0YW50cy5tZXRhLkZFQVRVUkU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnRleChlKSB7XG4gIGNvbnN0IGZlYXR1cmVUYXJnZXQgPSBlLmZlYXR1cmVUYXJnZXQ7XG4gIGlmICghZmVhdHVyZVRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWZlYXR1cmVUYXJnZXQucHJvcGVydGllcykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZmVhdHVyZVRhcmdldC5wcm9wZXJ0aWVzLm1ldGEgPT09IENvbnN0YW50cy5tZXRhLlZFUlRFWDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2hpZnREb3duKGUpIHtcbiAgaWYgKCFlLm9yaWdpbmFsRXZlbnQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXNjYXBlS2V5KGUpIHtcbiAgcmV0dXJuIGUua2V5Q29kZSA9PT0gMjc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VudGVyS2V5KGUpIHtcbiAgcmV0dXJuIGUua2V5Q29kZSA9PT0gMTM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBlbmFibGUoY3R4KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBGaXJzdCBjaGVjayB3ZSd2ZSBnb3QgYSBtYXAgYW5kIHNvbWUgY29udGV4dC5cbiAgICAgIGlmICghY3R4Lm1hcCB8fCAhY3R4Lm1hcC5kb3VibGVDbGlja1pvb20gfHwgIWN0eC5fY3R4IHx8ICFjdHguX2N0eC5zdG9yZSB8fCAhY3R4Ll9jdHguc3RvcmUuZ2V0SW5pdGlhbENvbmZpZ1ZhbHVlKSByZXR1cm47XG4gICAgICAvLyBOb3cgY2hlY2sgaW5pdGlhbCBzdGF0ZSB3YXNuJ3QgZmFsc2UgKHdlIGxlYXZlIGl0IGRpc2FibGVkIGlmIHNvKVxuICAgICAgaWYgKCFjdHguX2N0eC5zdG9yZS5nZXRJbml0aWFsQ29uZmlnVmFsdWUoJ2RvdWJsZUNsaWNrWm9vbScpKSByZXR1cm47XG4gICAgICBjdHgubWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGUoKTtcbiAgICB9LCAwKTtcbiAgfSxcbiAgZGlzYWJsZShjdHgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghY3R4Lm1hcCB8fCAhY3R4Lm1hcC5kb3VibGVDbGlja1pvb20pIHJldHVybjtcbiAgICAgIC8vIEFsd2F5cyBkaXNhYmxlIGhlcmUsIGFzIGl0J3MgbmVjZXNzYXJ5IGluIHNvbWUgY2FzZXMuXG4gICAgICBjdHgubWFwLmRvdWJsZUNsaWNrWm9vbS5kaXNhYmxlKCk7XG4gICAgfSwgMCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgKiBhcyBDb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBSZXR1cm5zIEdlb0pTT04gZm9yIGEgUG9pbnQgcmVwcmVzZW50aW5nIHRoZVxuICogdmVydGV4IG9mIGFub3RoZXIgZmVhdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50SWRcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRG90LXNlcGFyYXRlZCBudW1iZXJzIGluZGljYXRpbmcgZXhhY3RseVxuICogICB3aGVyZSB0aGUgcG9pbnQgZXhpc3RzIHdpdGhpbiBpdHMgcGFyZW50IGZlYXR1cmUncyBjb29yZGluYXRlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ZWRcbiAqIEByZXR1cm4ge0dlb0pTT059IFBvaW50XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudElkLCBjb29yZGluYXRlcywgcGF0aCwgc2VsZWN0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDb25zdGFudHMuZ2VvanNvblR5cGVzLkZFQVRVUkUsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgbWV0YTogQ29uc3RhbnRzLm1ldGEuVkVSVEVYLFxuICAgICAgcGFyZW50OiBwYXJlbnRJZCxcbiAgICAgIGNvb3JkX3BhdGg6IHBhdGgsXG4gICAgICBhY3RpdmU6IChzZWxlY3RlZCkgPyBDb25zdGFudHMuYWN0aXZlU3RhdGVzLkFDVElWRSA6IENvbnN0YW50cy5hY3RpdmVTdGF0ZXMuSU5BQ1RJVkVcbiAgICB9LFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICB0eXBlOiBDb25zdGFudHMuZ2VvanNvblR5cGVzLlBPSU5ULFxuICAgICAgY29vcmRpbmF0ZXNcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgKiBhcyBDb21tb25TZWxlY3RvcnMgZnJvbSAnLi4vbGliL2NvbW1vbl9zZWxlY3RvcnMnO1xuaW1wb3J0IGRvdWJsZUNsaWNrWm9vbSBmcm9tICcuLi9saWIvZG91YmxlX2NsaWNrX3pvb20nO1xuaW1wb3J0ICogYXMgQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgaXNFdmVudEF0Q29vcmRpbmF0ZXMgZnJvbSAnLi4vbGliL2lzX2V2ZW50X2F0X2Nvb3JkaW5hdGVzJztcbmltcG9ydCBjcmVhdGVWZXJ0ZXggZnJvbSAnLi4vbGliL2NyZWF0ZV92ZXJ0ZXgnO1xuXG5jb25zdCBEcmF3UG9seWdvbiA9IHt9O1xuXG5EcmF3UG9seWdvbi5vblNldHVwID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHBvbHlnb24gPSB0aGlzLm5ld0ZlYXR1cmUoe1xuICAgIHR5cGU6IENvbnN0YW50cy5nZW9qc29uVHlwZXMuRkVBVFVSRSxcbiAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICBnZW9tZXRyeToge1xuICAgICAgdHlwZTogQ29uc3RhbnRzLmdlb2pzb25UeXBlcy5QT0xZR09OLFxuICAgICAgY29vcmRpbmF0ZXM6IFtbXV1cbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuYWRkRmVhdHVyZShwb2x5Z29uKTtcblxuICB0aGlzLmNsZWFyU2VsZWN0ZWRGZWF0dXJlcygpO1xuICBkb3VibGVDbGlja1pvb20uZGlzYWJsZSh0aGlzKTtcbiAgdGhpcy51cGRhdGVVSUNsYXNzZXMoeyBtb3VzZTogQ29uc3RhbnRzLmN1cnNvcnMuQUREIH0pO1xuICB0aGlzLmFjdGl2YXRlVUlCdXR0b24oQ29uc3RhbnRzLnR5cGVzLlBPTFlHT04pO1xuICB0aGlzLnNldEFjdGlvbmFibGVTdGF0ZSh7XG4gICAgdHJhc2g6IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwb2x5Z29uLFxuICAgIGN1cnJlbnRWZXJ0ZXhQb3NpdGlvbjogMFxuICB9O1xufTtcblxuRHJhd1BvbHlnb24uY2xpY2tBbnl3aGVyZSA9IGZ1bmN0aW9uKHN0YXRlLCBlKSB7XG4gIGlmIChzdGF0ZS5jdXJyZW50VmVydGV4UG9zaXRpb24gPiAwICYmIGlzRXZlbnRBdENvb3JkaW5hdGVzKGUsIHN0YXRlLnBvbHlnb24uY29vcmRpbmF0ZXNbMF1bc3RhdGUuY3VycmVudFZlcnRleFBvc2l0aW9uIC0gMV0pKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlTW9kZShDb25zdGFudHMubW9kZXMuU0lNUExFX1NFTEVDVCwgeyBmZWF0dXJlSWRzOiBbc3RhdGUucG9seWdvbi5pZF0gfSk7XG4gIH1cbiAgdGhpcy51cGRhdGVVSUNsYXNzZXMoeyBtb3VzZTogQ29uc3RhbnRzLmN1cnNvcnMuQUREIH0pO1xuICBzdGF0ZS5wb2x5Z29uLnVwZGF0ZUNvb3JkaW5hdGUoYDAuJHtzdGF0ZS5jdXJyZW50VmVydGV4UG9zaXRpb259YCwgZS5sbmdMYXQubG5nLCBlLmxuZ0xhdC5sYXQpO1xuICBzdGF0ZS5jdXJyZW50VmVydGV4UG9zaXRpb24rKztcbiAgc3RhdGUucG9seWdvbi51cGRhdGVDb29yZGluYXRlKGAwLiR7c3RhdGUuY3VycmVudFZlcnRleFBvc2l0aW9ufWAsIGUubG5nTGF0LmxuZywgZS5sbmdMYXQubGF0KTtcbn07XG5cbkRyYXdQb2x5Z29uLmNsaWNrT25WZXJ0ZXggPSBmdW5jdGlvbihzdGF0ZSkge1xuICByZXR1cm4gdGhpcy5jaGFuZ2VNb2RlKENvbnN0YW50cy5tb2Rlcy5TSU1QTEVfU0VMRUNULCB7IGZlYXR1cmVJZHM6IFtzdGF0ZS5wb2x5Z29uLmlkXSB9KTtcbn07XG5cbkRyYXdQb2x5Z29uLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24oc3RhdGUsIGUpIHtcbiAgc3RhdGUucG9seWdvbi51cGRhdGVDb29yZGluYXRlKGAwLiR7c3RhdGUuY3VycmVudFZlcnRleFBvc2l0aW9ufWAsIGUubG5nTGF0LmxuZywgZS5sbmdMYXQubGF0KTtcbiAgaWYgKENvbW1vblNlbGVjdG9ycy5pc1ZlcnRleChlKSkge1xuICAgIHRoaXMudXBkYXRlVUlDbGFzc2VzKHsgbW91c2U6IENvbnN0YW50cy5jdXJzb3JzLlBPSU5URVIgfSk7XG4gIH1cbn07XG5cbkRyYXdQb2x5Z29uLm9uVGFwID0gRHJhd1BvbHlnb24ub25DbGljayA9IGZ1bmN0aW9uKHN0YXRlLCBlKSB7XG4gIGlmIChDb21tb25TZWxlY3RvcnMuaXNWZXJ0ZXgoZSkpIHJldHVybiB0aGlzLmNsaWNrT25WZXJ0ZXgoc3RhdGUsIGUpO1xuICByZXR1cm4gdGhpcy5jbGlja0FueXdoZXJlKHN0YXRlLCBlKTtcbn07XG5cbkRyYXdQb2x5Z29uLm9uS2V5VXAgPSBmdW5jdGlvbihzdGF0ZSwgZSkge1xuICBpZiAoQ29tbW9uU2VsZWN0b3JzLmlzRXNjYXBlS2V5KGUpKSB7XG4gICAgdGhpcy5kZWxldGVGZWF0dXJlKFtzdGF0ZS5wb2x5Z29uLmlkXSwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gICAgdGhpcy5jaGFuZ2VNb2RlKENvbnN0YW50cy5tb2Rlcy5TSU1QTEVfU0VMRUNUKTtcbiAgfSBlbHNlIGlmIChDb21tb25TZWxlY3RvcnMuaXNFbnRlcktleShlKSkge1xuICAgIHRoaXMuY2hhbmdlTW9kZShDb25zdGFudHMubW9kZXMuU0lNUExFX1NFTEVDVCwgeyBmZWF0dXJlSWRzOiBbc3RhdGUucG9seWdvbi5pZF0gfSk7XG4gIH1cbn07XG5cbkRyYXdQb2x5Z29uLm9uU3RvcCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHRoaXMudXBkYXRlVUlDbGFzc2VzKHsgbW91c2U6IENvbnN0YW50cy5jdXJzb3JzLk5PTkUgfSk7XG4gIGRvdWJsZUNsaWNrWm9vbS5lbmFibGUodGhpcyk7XG4gIHRoaXMuYWN0aXZhdGVVSUJ1dHRvbigpO1xuXG4gIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBkZWxldGVkIHRoaXMgZmVhdHVyZVxuICBpZiAodGhpcy5nZXRGZWF0dXJlKHN0YXRlLnBvbHlnb24uaWQpID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAvL3JlbW92ZSBsYXN0IGFkZGVkIGNvb3JkaW5hdGVcbiAgc3RhdGUucG9seWdvbi5yZW1vdmVDb29yZGluYXRlKGAwLiR7c3RhdGUuY3VycmVudFZlcnRleFBvc2l0aW9ufWApO1xuICBpZiAoc3RhdGUucG9seWdvbi5pc1ZhbGlkKCkpIHtcbiAgICB0aGlzLm1hcC5maXJlKENvbnN0YW50cy5ldmVudHMuQ1JFQVRFLCB7XG4gICAgICBmZWF0dXJlczogW3N0YXRlLnBvbHlnb24udG9HZW9KU09OKCldXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kZWxldGVGZWF0dXJlKFtzdGF0ZS5wb2x5Z29uLmlkXSwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gICAgdGhpcy5jaGFuZ2VNb2RlKENvbnN0YW50cy5tb2Rlcy5TSU1QTEVfU0VMRUNULCB7fSwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gIH1cbn07XG5cbkRyYXdQb2x5Z29uLnRvRGlzcGxheUZlYXR1cmVzID0gZnVuY3Rpb24oc3RhdGUsIGdlb2pzb24sIGRpc3BsYXkpIHtcbiAgY29uc3QgaXNBY3RpdmVQb2x5Z29uID0gZ2VvanNvbi5wcm9wZXJ0aWVzLmlkID09PSBzdGF0ZS5wb2x5Z29uLmlkO1xuICBnZW9qc29uLnByb3BlcnRpZXMuYWN0aXZlID0gKGlzQWN0aXZlUG9seWdvbikgPyBDb25zdGFudHMuYWN0aXZlU3RhdGVzLkFDVElWRSA6IENvbnN0YW50cy5hY3RpdmVTdGF0ZXMuSU5BQ1RJVkU7XG4gIGlmICghaXNBY3RpdmVQb2x5Z29uKSByZXR1cm4gZGlzcGxheShnZW9qc29uKTtcblxuICAvLyBEb24ndCByZW5kZXIgYSBwb2x5Z29uIHVudGlsIGl0IGhhcyB0d28gcG9zaXRpb25zXG4gIC8vIChhbmQgYSAzcmQgd2hpY2ggaXMganVzdCB0aGUgZmlyc3QgcmVwZWF0ZWQpXG4gIGlmIChnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvb3JkaW5hdGVDb3VudCA9IGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubGVuZ3RoO1xuICAvLyAyIGNvb3JkaW5hdGVzIGFmdGVyIHNlbGVjdGluZyBhIGRyYXcgdHlwZVxuICAvLyAzIGFmdGVyIGNyZWF0aW5nIHRoZSBmaXJzdCBwb2ludFxuICBpZiAoY29vcmRpbmF0ZUNvdW50IDwgMykge1xuICAgIHJldHVybjtcbiAgfVxuICBnZW9qc29uLnByb3BlcnRpZXMubWV0YSA9IENvbnN0YW50cy5tZXRhLkZFQVRVUkU7XG4gIGRpc3BsYXkoY3JlYXRlVmVydGV4KHN0YXRlLnBvbHlnb24uaWQsIGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF0sICcwLjAnLCBmYWxzZSkpO1xuICBpZiAoY29vcmRpbmF0ZUNvdW50ID4gMykge1xuICAgIC8vIEFkZCBhIHN0YXJ0IHBvc2l0aW9uIG1hcmtlciB0byB0aGUgbWFwLCBjbGlja2luZyBvbiB0aGlzIHdpbGwgZmluaXNoIHRoZSBmZWF0dXJlXG4gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBzaG93biB3aGVuIHdlJ3JlIGluIGEgdmFsaWQgc3BvdFxuICAgIGNvbnN0IGVuZFBvcyA9IGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubGVuZ3RoIC0gMztcbiAgICBkaXNwbGF5KGNyZWF0ZVZlcnRleChzdGF0ZS5wb2x5Z29uLmlkLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2VuZFBvc10sIGAwLiR7ZW5kUG9zfWAsIGZhbHNlKSk7XG4gIH1cbiAgaWYgKGNvb3JkaW5hdGVDb3VudCA8PSA0KSB7XG4gICAgLy8gSWYgd2UndmUgb25seSBkcmF3biB0d28gcG9zaXRpb25zIChwbHVzIHRoZSBjbG9zZXIpLFxuICAgIC8vIG1ha2UgYSBMaW5lU3RyaW5nIGluc3RlYWQgb2YgYSBQb2x5Z29uXG4gICAgY29uc3QgbGluZUNvb3JkaW5hdGVzID0gW1xuICAgICAgW2dlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF1bMF0sIGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF1bMV1dLCBbZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXVsxXVswXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXVsxXVsxXV1cbiAgICBdO1xuICAgIC8vIGNyZWF0ZSBhbiBpbml0aWFsIHZlcnRleCBzbyB0aGF0IHdlIGNhbiB0cmFjayB0aGUgZmlyc3QgcG9pbnQgb24gbW9iaWxlIGRldmljZXNcbiAgICBkaXNwbGF5KHtcbiAgICAgIHR5cGU6IENvbnN0YW50cy5nZW9qc29uVHlwZXMuRkVBVFVSRSxcbiAgICAgIHByb3BlcnRpZXM6IGdlb2pzb24ucHJvcGVydGllcyxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIGNvb3JkaW5hdGVzOiBsaW5lQ29vcmRpbmF0ZXMsXG4gICAgICAgIHR5cGU6IENvbnN0YW50cy5nZW9qc29uVHlwZXMuTElORV9TVFJJTkdcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoY29vcmRpbmF0ZUNvdW50ID09PSAzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIC8vIHJlbmRlciB0aGUgUG9seWdvblxuICByZXR1cm4gZGlzcGxheShnZW9qc29uKTtcbn07XG5cbkRyYXdQb2x5Z29uLm9uVHJhc2ggPSBmdW5jdGlvbihzdGF0ZSkge1xuICB0aGlzLmRlbGV0ZUZlYXR1cmUoW3N0YXRlLnBvbHlnb24uaWRdLCB7IHNpbGVudDogdHJ1ZSB9KTtcbiAgdGhpcy5jaGFuZ2VNb2RlKENvbnN0YW50cy5tb2Rlcy5TSU1QTEVfU0VMRUNUKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERyYXdQb2x5Z29uO1xuIiwiZnVuY3Rpb24gaXNFdmVudEF0Q29vcmRpbmF0ZXMoZXZlbnQsIGNvb3JkaW5hdGVzKSB7XG4gIGlmICghZXZlbnQubG5nTGF0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBldmVudC5sbmdMYXQubG5nID09PSBjb29yZGluYXRlc1swXSAmJiBldmVudC5sbmdMYXQubGF0ID09PSBjb29yZGluYXRlc1sxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNFdmVudEF0Q29vcmRpbmF0ZXM7XG4iLCJpbXBvcnQgeyBpc051bWJlciwgfSBmcm9tIFwiQHR1cmYvaGVscGVyc1wiO1xuLyoqXG4gKiBVbndyYXAgYSBjb29yZGluYXRlIGZyb20gYSBQb2ludCBGZWF0dXJlLCBHZW9tZXRyeSBvciBhIHNpbmdsZSBjb29yZGluYXRlLlxuICpcbiAqIEBuYW1lIGdldENvb3JkXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj58R2VvbWV0cnk8UG9pbnQ+fEZlYXR1cmU8UG9pbnQ+fSBjb29yZCBHZW9KU09OIFBvaW50IG9yIGFuIEFycmF5IG9mIG51bWJlcnNcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBjb29yZGluYXRlc1xuICogQGV4YW1wbGVcbiAqIHZhciBwdCA9IHR1cmYucG9pbnQoWzEwLCAxMF0pO1xuICpcbiAqIHZhciBjb29yZCA9IHR1cmYuZ2V0Q29vcmQocHQpO1xuICogLy89IFsxMCwgMTBdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZChjb29yZCkge1xuICAgIGlmICghY29vcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmQgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb29yZCkpIHtcbiAgICAgICAgaWYgKGNvb3JkLnR5cGUgPT09IFwiRmVhdHVyZVwiICYmXG4gICAgICAgICAgICBjb29yZC5nZW9tZXRyeSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29vcmQuZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY29vcmQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkLnR5cGUgPT09IFwiUG9pbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGNvb3JkLmNvb3JkaW5hdGVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvb3JkKSAmJlxuICAgICAgICBjb29yZC5sZW5ndGggPj0gMiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb29yZFswXSkgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29vcmRbMV0pKSB7XG4gICAgICAgIHJldHVybiBjb29yZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY29vcmQgbXVzdCBiZSBHZW9KU09OIFBvaW50IG9yIGFuIEFycmF5IG9mIG51bWJlcnNcIik7XG59XG4vKipcbiAqIFVud3JhcCBjb29yZGluYXRlcyBmcm9tIGEgRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5XG4gKlxuICogQG5hbWUgZ2V0Q29vcmRzXG4gKiBAcGFyYW0ge0FycmF5PGFueT58R2VvbWV0cnl8RmVhdHVyZX0gY29vcmRzIEZlYXR1cmUsIEdlb21ldHJ5IE9iamVjdCBvciBhbiBBcnJheVxuICogQHJldHVybnMge0FycmF5PGFueT59IGNvb3JkaW5hdGVzXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvbHkgPSB0dXJmLnBvbHlnb24oW1tbMTE5LjMyLCAtOC43XSwgWzExOS41NSwgLTguNjldLCBbMTE5LjUxLCAtOC41NF0sIFsxMTkuMzIsIC04LjddXV0pO1xuICpcbiAqIHZhciBjb29yZHMgPSB0dXJmLmdldENvb3Jkcyhwb2x5KTtcbiAqIC8vPSBbW1sxMTkuMzIsIC04LjddLCBbMTE5LjU1LCAtOC42OV0sIFsxMTkuNTEsIC04LjU0XSwgWzExOS4zMiwgLTguN11dXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRzKGNvb3Jkcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvb3JkcykpIHtcbiAgICAgICAgcmV0dXJuIGNv