@kepler.gl/deckgl-layers 3.3.0-alpha.1 → 3.3.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
- package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
- package/dist/cjs/3d-building-layer/types.js +6 -0
- package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
- package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
- package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
- package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
- package/dist/cjs/globe/atmosphere-layer.js +341 -0
- package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
- package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
- package/dist/cjs/globe/globe-layers.js +574 -0
- package/dist/cjs/globe/globe-stars-layer.js +99 -0
- package/dist/cjs/globe/globe-stars-layer.spec.js +42 -0
- package/dist/cjs/globe/globe-view.js +404 -0
- package/dist/cjs/globe/index.js +140 -0
- package/dist/cjs/globe/mvt-label-layer.js +190 -0
- package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
- package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
- package/dist/cjs/index.js +163 -0
- package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
- package/dist/cjs/layer-utils/cluster-utils.js +95 -0
- package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
- package/dist/cjs/layer-utils/globe-cell-utils.js +203 -0
- package/dist/cjs/layer-utils/globe-cell-utils.spec.js +118 -0
- package/dist/cjs/layer-utils/shader-utils.js +38 -0
- package/dist/cjs/line-layer/line-layer.js +95 -0
- package/dist/cjs/raster/images.js +271 -0
- package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
- package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
- package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
- package/dist/cjs/raster/types.js +6 -0
- package/dist/cjs/raster/util.js +139 -0
- package/dist/cjs/raster/webgl/color/colormap.js +45 -0
- package/dist/cjs/raster/webgl/color/filter.js +58 -0
- package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
- package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
- package/dist/cjs/raster/webgl/color/saturation.js +42 -0
- package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
- package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
- package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
- package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
- package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
- package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
- package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
- package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
- package/dist/{raster → cjs/raster}/webgl/texture/mask.js +5 -2
- package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
- package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
- package/dist/cjs/raster/webgl/types.js +6 -0
- package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
- package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
- package/dist/cjs/wms/wms-layer.js +624 -0
- package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
- package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
- package/dist/esm/3d-building-layer/types.js +3 -0
- package/dist/esm/cluster-layer/cluster-layer.js +286 -0
- package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
- package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
- package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
- package/dist/esm/globe/atmosphere-layer.js +335 -0
- package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
- package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
- package/dist/esm/globe/globe-layers.js +566 -0
- package/dist/esm/globe/globe-stars-layer.js +92 -0
- package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
- package/dist/esm/globe/globe-view.js +398 -0
- package/dist/esm/globe/index.js +26 -0
- package/dist/esm/globe/mvt-label-layer.js +187 -0
- package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
- package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/layer-utils/aggregation-utils.js +172 -0
- package/dist/esm/layer-utils/cluster-utils.js +89 -0
- package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
- package/dist/esm/layer-utils/globe-cell-utils.js +197 -0
- package/dist/esm/layer-utils/globe-cell-utils.spec.js +115 -0
- package/dist/esm/layer-utils/shader-utils.js +32 -0
- package/dist/esm/line-layer/line-layer.js +91 -0
- package/dist/esm/raster/images.js +267 -0
- package/dist/esm/raster/pipeline-validation-patch.js +94 -0
- package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
- package/dist/esm/raster/raster-processing-uniforms.js +118 -0
- package/dist/esm/raster/types.js +3 -0
- package/dist/esm/raster/util.js +134 -0
- package/dist/esm/raster/webgl/color/colormap.js +39 -0
- package/dist/esm/raster/webgl/color/filter.js +52 -0
- package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
- package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
- package/dist/esm/raster/webgl/color/saturation.js +36 -0
- package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
- package/dist/esm/raster/webgl/index.js +26 -0
- package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
- package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
- package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
- package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
- package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
- package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
- package/dist/esm/raster/webgl/texture/mask.js +47 -0
- package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
- package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
- package/dist/esm/raster/webgl/types.js +3 -0
- package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
- package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
- package/dist/esm/wms/wms-layer.js +619 -0
- package/dist/globe/atmosphere-layer.d.ts +58 -0
- package/dist/globe/enhanced-multi-icon-layer.d.ts +6 -0
- package/dist/globe/globe-depth-disk-layer.d.ts +19 -0
- package/dist/globe/globe-layers.d.ts +108 -0
- package/dist/globe/globe-stars-layer.d.ts +10 -0
- package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
- package/dist/globe/globe-view.d.ts +23 -0
- package/dist/globe/index.d.ts +8 -0
- package/dist/globe/mvt-label-layer.d.ts +7928 -0
- package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +138 -56
- package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +138 -56
- package/dist/index.d.ts +1 -0
- package/dist/layer-utils/cluster-utils.d.ts +6 -1
- package/dist/layer-utils/globe-cell-utils.d.ts +30 -0
- package/dist/layer-utils/globe-cell-utils.spec.d.ts +1 -0
- package/dist/raster/images.d.ts +10 -1
- package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
- package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
- package/dist/wms/wms-layer.d.ts +27 -0
- package/package.json +22 -13
- package/dist/3d-building-layer/3d-building-layer.js +0 -66
- package/dist/3d-building-layer/3d-building-utils.js +0 -166
- package/dist/3d-building-layer/types.js +0 -6
- package/dist/cluster-layer/cluster-layer.js +0 -293
- package/dist/column-layer/enhanced-column-layer.js +0 -135
- package/dist/deckgl-extensions/filter-shader-module.js +0 -26
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -90
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -108
- package/dist/index.js +0 -152
- package/dist/layer-utils/aggregation-utils.js +0 -181
- package/dist/layer-utils/cluster-utils.js +0 -93
- package/dist/layer-utils/cpu-aggregator.js +0 -798
- package/dist/layer-utils/shader-utils.js +0 -38
- package/dist/line-layer/line-layer.js +0 -95
- package/dist/raster/images.js +0 -259
- package/dist/raster/pipeline-validation-patch.js +0 -101
- package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
- package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer.js +0 -237
- package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
- package/dist/raster/raster-mesh-layer/matrix.js +0 -18
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -271
- package/dist/raster/raster-processing-uniforms.js +0 -124
- package/dist/raster/types.js +0 -6
- package/dist/raster/util.js +0 -139
- package/dist/raster/webgl/color/colormap.js +0 -45
- package/dist/raster/webgl/color/filter.js +0 -58
- package/dist/raster/webgl/color/gamma-contrast.js +0 -68
- package/dist/raster/webgl/color/linear-rescale.js +0 -35
- package/dist/raster/webgl/color/saturation.js +0 -42
- package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
- package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
- package/dist/raster/webgl/spectral-indices/evi.js +0 -26
- package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
- package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
- package/dist/raster/webgl/spectral-indices/savi.js +0 -21
- package/dist/raster/webgl/texture/combine-bands.js +0 -65
- package/dist/raster/webgl/texture/reorder-bands.js +0 -72
- package/dist/raster/webgl/texture/rgba-image.js +0 -34
- package/dist/raster/webgl/types.js +0 -6
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -51
- package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
- package/dist/wms/wms-layer.js +0 -424
package/dist/wms/wms-layer.js
DELETED
|
@@ -1,424 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.WGS84ToPseudoMercator = WGS84ToPseudoMercator;
|
|
8
|
-
exports["default"] = void 0;
|
|
9
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
12
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
14
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
15
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
16
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
17
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
18
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
|
-
var _webMercator = require("@math.gl/web-mercator");
|
|
20
|
-
var _core = require("@deck.gl/core");
|
|
21
|
-
var _layers = require("@deck.gl/layers");
|
|
22
|
-
var _wms = require("@loaders.gl/wms");
|
|
23
|
-
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; }
|
|
24
|
-
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) { (0, _defineProperty2["default"])(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; }
|
|
25
|
-
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
26
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
27
|
-
function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } // SPDX-License-Identifier: MIT
|
|
28
|
-
// Copyright contributors to the kepler.gl project
|
|
29
|
-
// TODO: This is a modified copy of WMSLayer from deck.gl. Remove this once we upgrade deck.gl and loaders.gl.
|
|
30
|
-
|
|
31
|
-
/** All props supported by the TileLayer */
|
|
32
|
-
|
|
33
|
-
/** Props added by the TileLayer */
|
|
34
|
-
|
|
35
|
-
var defaultProps = {
|
|
36
|
-
id: 'imagery-layer',
|
|
37
|
-
data: '',
|
|
38
|
-
serviceType: 'auto',
|
|
39
|
-
srs: 'auto',
|
|
40
|
-
layers: {
|
|
41
|
-
type: 'array',
|
|
42
|
-
compare: true,
|
|
43
|
-
value: []
|
|
44
|
-
},
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
46
|
-
onMetadataLoad: {
|
|
47
|
-
type: 'function',
|
|
48
|
-
value: function value() {}
|
|
49
|
-
},
|
|
50
|
-
// eslint-disable-next-line
|
|
51
|
-
onMetadataLoadError: {
|
|
52
|
-
type: 'function',
|
|
53
|
-
value: console.error
|
|
54
|
-
},
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
56
|
-
onImageLoadStart: {
|
|
57
|
-
type: 'function',
|
|
58
|
-
value: function value() {}
|
|
59
|
-
},
|
|
60
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
61
|
-
onImageLoad: {
|
|
62
|
-
type: 'function',
|
|
63
|
-
value: function value() {}
|
|
64
|
-
},
|
|
65
|
-
onImageLoadError: {
|
|
66
|
-
type: 'function',
|
|
67
|
-
compare: false,
|
|
68
|
-
// eslint-disable-next-line
|
|
69
|
-
value: function value(requestId, error) {
|
|
70
|
-
return console.error(error, requestId);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
|
|
75
|
-
function WMSLayer() {
|
|
76
|
-
(0, _classCallCheck2["default"])(this, WMSLayer);
|
|
77
|
-
return _callSuper(this, WMSLayer, arguments);
|
|
78
|
-
}
|
|
79
|
-
(0, _inherits2["default"])(WMSLayer, _CompositeLayer);
|
|
80
|
-
return (0, _createClass2["default"])(WMSLayer, [{
|
|
81
|
-
key: "isLoaded",
|
|
82
|
-
get: /** Returns true if all async resources are loaded */
|
|
83
|
-
function get() {
|
|
84
|
-
// Track the explicit loading done by this layer
|
|
85
|
-
return Boolean(this.state) && this.state.loadCounter === 0 && _superPropGet(WMSLayer, "isLoaded", this, 1);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** Lets deck.gl know that we want viewport change events */
|
|
89
|
-
}, {
|
|
90
|
-
key: "shouldUpdateState",
|
|
91
|
-
value: function shouldUpdateState() {
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
}, {
|
|
95
|
-
key: "initializeState",
|
|
96
|
-
value: function initializeState() {
|
|
97
|
-
// intentionally empty, initialization is done in updateState
|
|
98
|
-
this.state._nextRequestId = 0;
|
|
99
|
-
this.state.lastRequestId = -1;
|
|
100
|
-
this.state.loadCounter = 0;
|
|
101
|
-
this.state._lastRequestZoom = -1;
|
|
102
|
-
}
|
|
103
|
-
}, {
|
|
104
|
-
key: "updateState",
|
|
105
|
-
value: function updateState(_ref) {
|
|
106
|
-
var _this = this;
|
|
107
|
-
var changeFlags = _ref.changeFlags,
|
|
108
|
-
props = _ref.props,
|
|
109
|
-
oldProps = _ref.oldProps;
|
|
110
|
-
var viewport = this.context.viewport;
|
|
111
|
-
|
|
112
|
-
// Check if data source has changed
|
|
113
|
-
if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {
|
|
114
|
-
this.state.imageSource = this._createImageSource(props);
|
|
115
|
-
this._loadMetadata();
|
|
116
|
-
this.debounce(function () {
|
|
117
|
-
return _this.loadImage(viewport, 'image source changed');
|
|
118
|
-
}, 0);
|
|
119
|
-
} else if (!(0, _core._deepEqual)(props.layers, oldProps.layers, 1)) {
|
|
120
|
-
this.debounce(function () {
|
|
121
|
-
return _this.loadImage(viewport, 'layers changed');
|
|
122
|
-
}, 0);
|
|
123
|
-
} else if (changeFlags.viewportChanged) {
|
|
124
|
-
var _gl$getContextAttribu;
|
|
125
|
-
// Check if preserveDrawingBuffer is enabled (indicates video recording or image export)
|
|
126
|
-
// Use minimal debounce (10ms) during export for responsive frame capture
|
|
127
|
-
// Request deduplication in loadImage prevents spam from redundant viewport updates
|
|
128
|
-
var gl = this.context.gl;
|
|
129
|
-
var isPreservingBuffer = gl === null || gl === void 0 || (_gl$getContextAttribu = gl.getContextAttributes) === null || _gl$getContextAttribu === void 0 || (_gl$getContextAttribu = _gl$getContextAttribu.call(gl)) === null || _gl$getContextAttribu === void 0 ? void 0 : _gl$getContextAttribu.preserveDrawingBuffer;
|
|
130
|
-
var debounceDelay = isPreservingBuffer ? 10 : undefined;
|
|
131
|
-
this.debounce(function () {
|
|
132
|
-
return _this.loadImage(viewport, 'viewport changed');
|
|
133
|
-
}, debounceDelay);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}, {
|
|
137
|
-
key: "renderLayers",
|
|
138
|
-
value: function renderLayers() {
|
|
139
|
-
var _this$state = this.state,
|
|
140
|
-
bounds = _this$state.bounds,
|
|
141
|
-
image = _this$state.image,
|
|
142
|
-
lastRequestParameters = _this$state.lastRequestParameters;
|
|
143
|
-
return image && new _layers.BitmapLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps({
|
|
144
|
-
id: 'bitmap'
|
|
145
|
-
})), {}, {
|
|
146
|
-
_imageCoordinateSystem: lastRequestParameters.srs === 'EPSG:4326' ? _core.COORDINATE_SYSTEM.LNGLAT : _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
147
|
-
bounds: bounds,
|
|
148
|
-
image: image,
|
|
149
|
-
pickable: this.props.pickable
|
|
150
|
-
}));
|
|
151
|
-
}
|
|
152
|
-
}, {
|
|
153
|
-
key: "getFeatureInfoText",
|
|
154
|
-
value: function () {
|
|
155
|
-
var _getFeatureInfoText = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(x, y) {
|
|
156
|
-
var lastRequestParameters, _this$state$imageSour, _this$state$imageSour2, featureInfo;
|
|
157
|
-
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
158
|
-
while (1) switch (_context.prev = _context.next) {
|
|
159
|
-
case 0:
|
|
160
|
-
lastRequestParameters = this.state.lastRequestParameters;
|
|
161
|
-
if (!lastRequestParameters) {
|
|
162
|
-
_context.next = 6;
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
_context.next = 4;
|
|
166
|
-
return (_this$state$imageSour = (_this$state$imageSour2 = this.state.imageSource).getFeatureInfoText) === null || _this$state$imageSour === void 0 ? void 0 : _this$state$imageSour.call(_this$state$imageSour2, _objectSpread(_objectSpread({}, lastRequestParameters), {}, {
|
|
167
|
-
query_layers: lastRequestParameters.layers,
|
|
168
|
-
x: x,
|
|
169
|
-
y: y,
|
|
170
|
-
info_format: 'application/vnd.ogc.gml'
|
|
171
|
-
}));
|
|
172
|
-
case 4:
|
|
173
|
-
featureInfo = _context.sent;
|
|
174
|
-
return _context.abrupt("return", featureInfo);
|
|
175
|
-
case 6:
|
|
176
|
-
return _context.abrupt("return", '');
|
|
177
|
-
case 7:
|
|
178
|
-
case "end":
|
|
179
|
-
return _context.stop();
|
|
180
|
-
}
|
|
181
|
-
}, _callee, this);
|
|
182
|
-
}));
|
|
183
|
-
function getFeatureInfoText(_x, _x2) {
|
|
184
|
-
return _getFeatureInfoText.apply(this, arguments);
|
|
185
|
-
}
|
|
186
|
-
return getFeatureInfoText;
|
|
187
|
-
}()
|
|
188
|
-
}, {
|
|
189
|
-
key: "_createImageSource",
|
|
190
|
-
value: function _createImageSource(props) {
|
|
191
|
-
if (props.data instanceof _wms.ImageSource) {
|
|
192
|
-
return props.data;
|
|
193
|
-
}
|
|
194
|
-
if (typeof props.data === 'string') {
|
|
195
|
-
return new _wms.WMSImageSource(props.data, {
|
|
196
|
-
loadOptions: props.loadOptions
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
throw new Error('invalid image source in props.data');
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/** Run a getMetadata on the image service */
|
|
203
|
-
}, {
|
|
204
|
-
key: "_loadMetadata",
|
|
205
|
-
value: (function () {
|
|
206
|
-
var _loadMetadata2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
207
|
-
var imageSource, metadata, _this$getCurrentLayer, _this$getCurrentLayer2;
|
|
208
|
-
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
209
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
210
|
-
case 0:
|
|
211
|
-
imageSource = this.state.imageSource;
|
|
212
|
-
_context2.prev = 1;
|
|
213
|
-
this.state.loadCounter++;
|
|
214
|
-
_context2.next = 5;
|
|
215
|
-
return imageSource.getMetadata();
|
|
216
|
-
case 5:
|
|
217
|
-
metadata = _context2.sent;
|
|
218
|
-
// If a request takes a long time, it may no longer be expected
|
|
219
|
-
if (this.state.imageSource === imageSource) {
|
|
220
|
-
(_this$getCurrentLayer = this.getCurrentLayer()) === null || _this$getCurrentLayer === void 0 || _this$getCurrentLayer.props.onMetadataLoad(metadata);
|
|
221
|
-
}
|
|
222
|
-
_context2.next = 12;
|
|
223
|
-
break;
|
|
224
|
-
case 9:
|
|
225
|
-
_context2.prev = 9;
|
|
226
|
-
_context2.t0 = _context2["catch"](1);
|
|
227
|
-
(_this$getCurrentLayer2 = this.getCurrentLayer()) === null || _this$getCurrentLayer2 === void 0 || _this$getCurrentLayer2.props.onMetadataLoadError(_context2.t0);
|
|
228
|
-
case 12:
|
|
229
|
-
_context2.prev = 12;
|
|
230
|
-
this.state.loadCounter--;
|
|
231
|
-
return _context2.finish(12);
|
|
232
|
-
case 15:
|
|
233
|
-
case "end":
|
|
234
|
-
return _context2.stop();
|
|
235
|
-
}
|
|
236
|
-
}, _callee2, this, [[1, 9, 12, 15]]);
|
|
237
|
-
}));
|
|
238
|
-
function _loadMetadata() {
|
|
239
|
-
return _loadMetadata2.apply(this, arguments);
|
|
240
|
-
}
|
|
241
|
-
return _loadMetadata;
|
|
242
|
-
}() /** Load an image */)
|
|
243
|
-
}, {
|
|
244
|
-
key: "loadImage",
|
|
245
|
-
value: (function () {
|
|
246
|
-
var _loadImage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(viewport, _reason) {
|
|
247
|
-
var _gl$getContextAttribu2;
|
|
248
|
-
var _this$props, layers, serviceType, transparent, bounds, width, height, srs, requestParams, _WGS84ToPseudoMercato, _WGS84ToPseudoMercato2, minX, minY, _WGS84ToPseudoMercato3, _WGS84ToPseudoMercato4, maxX, maxY, gl, isExporting, currentZoom, lastZoom, isZoomingIn, requestId, image, _this$getCurrentLayer3, _this$context$onError, _this$context, _this$getCurrentLayer4;
|
|
249
|
-
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
250
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
251
|
-
case 0:
|
|
252
|
-
_this$props = this.props, layers = _this$props.layers, serviceType = _this$props.serviceType, transparent = _this$props.transparent; // TODO - move to ImageSource?
|
|
253
|
-
if (!(serviceType === 'wms' && layers.length === 0)) {
|
|
254
|
-
_context3.next = 3;
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
return _context3.abrupt("return");
|
|
258
|
-
case 3:
|
|
259
|
-
bounds = viewport.getBounds();
|
|
260
|
-
width = viewport.width, height = viewport.height;
|
|
261
|
-
srs = this.props.srs;
|
|
262
|
-
if (srs === 'auto') {
|
|
263
|
-
// BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)
|
|
264
|
-
srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
|
|
265
|
-
}
|
|
266
|
-
requestParams = {
|
|
267
|
-
width: width,
|
|
268
|
-
height: height,
|
|
269
|
-
// TODO: remove bbox once deck.gl is upgraded to ^8.10 with loaders.gl ^4
|
|
270
|
-
bbox: bounds,
|
|
271
|
-
boundingBox: [[bounds[0], bounds[1]], [bounds[2], bounds[3]]],
|
|
272
|
-
layers: layers,
|
|
273
|
-
srs: srs,
|
|
274
|
-
transparent: transparent
|
|
275
|
-
};
|
|
276
|
-
if (srs === 'EPSG:3857') {
|
|
277
|
-
_WGS84ToPseudoMercato = WGS84ToPseudoMercator([bounds[0], bounds[1]]), _WGS84ToPseudoMercato2 = (0, _slicedToArray2["default"])(_WGS84ToPseudoMercato, 2), minX = _WGS84ToPseudoMercato2[0], minY = _WGS84ToPseudoMercato2[1];
|
|
278
|
-
_WGS84ToPseudoMercato3 = WGS84ToPseudoMercator([bounds[2], bounds[3]]), _WGS84ToPseudoMercato4 = (0, _slicedToArray2["default"])(_WGS84ToPseudoMercato3, 2), maxX = _WGS84ToPseudoMercato4[0], maxY = _WGS84ToPseudoMercato4[1];
|
|
279
|
-
requestParams.boundingBox = [[minX, minY], [maxX, maxY]];
|
|
280
|
-
// TODO: remove bbox once deck.gl is upgraded to ^8.10 with loaders.gl ^4
|
|
281
|
-
requestParams.bbox = [minX, minY, maxX, maxY];
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Skip request if parameters haven't meaningfully changed
|
|
285
|
-
if (!(this.state.lastRequestParameters && this._areRequestParamsEqual(this.state.lastRequestParameters, requestParams))) {
|
|
286
|
-
_context3.next = 11;
|
|
287
|
-
break;
|
|
288
|
-
}
|
|
289
|
-
return _context3.abrupt("return");
|
|
290
|
-
case 11:
|
|
291
|
-
// During video export, throttle zoom-in requests to only fire on zoom level crossings.
|
|
292
|
-
// The existing image is stretched by the BitmapLayer until the next level is reached.
|
|
293
|
-
gl = this.context.gl;
|
|
294
|
-
isExporting = gl === null || gl === void 0 || (_gl$getContextAttribu2 = gl.getContextAttributes) === null || _gl$getContextAttribu2 === void 0 || (_gl$getContextAttribu2 = _gl$getContextAttribu2.call(gl)) === null || _gl$getContextAttribu2 === void 0 ? void 0 : _gl$getContextAttribu2.preserveDrawingBuffer;
|
|
295
|
-
if (!(isExporting && this.state._lastRequestZoom >= 0)) {
|
|
296
|
-
_context3.next = 19;
|
|
297
|
-
break;
|
|
298
|
-
}
|
|
299
|
-
currentZoom = viewport.zoom;
|
|
300
|
-
lastZoom = this.state._lastRequestZoom;
|
|
301
|
-
isZoomingIn = currentZoom > lastZoom;
|
|
302
|
-
if (!(isZoomingIn && Math.floor(currentZoom) === Math.floor(lastZoom))) {
|
|
303
|
-
_context3.next = 19;
|
|
304
|
-
break;
|
|
305
|
-
}
|
|
306
|
-
return _context3.abrupt("return");
|
|
307
|
-
case 19:
|
|
308
|
-
// Update lastRequestParameters BEFORE making the request to prevent race conditions
|
|
309
|
-
// where multiple debounced calls see the same old parameters and all proceed
|
|
310
|
-
this.state.lastRequestParameters = requestParams;
|
|
311
|
-
this.state._lastRequestZoom = viewport.zoom;
|
|
312
|
-
requestId = this.getRequestId();
|
|
313
|
-
_context3.prev = 22;
|
|
314
|
-
this.state.loadCounter++;
|
|
315
|
-
this.props.onImageLoadStart(requestId);
|
|
316
|
-
_context3.next = 27;
|
|
317
|
-
return this.state.imageSource.getImage(requestParams);
|
|
318
|
-
case 27:
|
|
319
|
-
image = _context3.sent;
|
|
320
|
-
// If a request takes a long time, later requests may have already loaded.
|
|
321
|
-
if (this.state.lastRequestId < requestId) {
|
|
322
|
-
(_this$getCurrentLayer3 = this.getCurrentLayer()) === null || _this$getCurrentLayer3 === void 0 || _this$getCurrentLayer3.props.onImageLoad(requestId);
|
|
323
|
-
// Not type safe...
|
|
324
|
-
this.setState({
|
|
325
|
-
image: image,
|
|
326
|
-
bounds: bounds,
|
|
327
|
-
lastRequestId: requestId
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
_context3.next = 35;
|
|
331
|
-
break;
|
|
332
|
-
case 31:
|
|
333
|
-
_context3.prev = 31;
|
|
334
|
-
_context3.t0 = _context3["catch"](22);
|
|
335
|
-
(_this$context$onError = (_this$context = this.context).onError) === null || _this$context$onError === void 0 || _this$context$onError.call(_this$context, _context3.t0, this);
|
|
336
|
-
(_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 || _this$getCurrentLayer4.props.onImageLoadError(requestId, _context3.t0);
|
|
337
|
-
case 35:
|
|
338
|
-
_context3.prev = 35;
|
|
339
|
-
this.state.loadCounter--;
|
|
340
|
-
return _context3.finish(35);
|
|
341
|
-
case 38:
|
|
342
|
-
case "end":
|
|
343
|
-
return _context3.stop();
|
|
344
|
-
}
|
|
345
|
-
}, _callee3, this, [[22, 31, 35, 38]]);
|
|
346
|
-
}));
|
|
347
|
-
function loadImage(_x3, _x4) {
|
|
348
|
-
return _loadImage.apply(this, arguments);
|
|
349
|
-
}
|
|
350
|
-
return loadImage;
|
|
351
|
-
}() // HELPERS
|
|
352
|
-
/** Global counter for issuing unique request ids */
|
|
353
|
-
)
|
|
354
|
-
}, {
|
|
355
|
-
key: "getRequestId",
|
|
356
|
-
value: function getRequestId() {
|
|
357
|
-
return this.state._nextRequestId++;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/** Runs an action in the future, cancels it if the new action is issued before it executes */
|
|
361
|
-
}, {
|
|
362
|
-
key: "debounce",
|
|
363
|
-
value: function debounce(fn) {
|
|
364
|
-
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
|
|
365
|
-
clearTimeout(this.state._timeoutId);
|
|
366
|
-
this.state._timeoutId = setTimeout(function () {
|
|
367
|
-
return fn();
|
|
368
|
-
}, ms);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/** Compare request parameters to determine if a new request is needed */
|
|
372
|
-
}, {
|
|
373
|
-
key: "_areRequestParamsEqual",
|
|
374
|
-
value: function _areRequestParamsEqual(prev, next) {
|
|
375
|
-
// Compare dimensions
|
|
376
|
-
if (prev.width !== next.width || prev.height !== next.height) {
|
|
377
|
-
return false;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Compare SRS
|
|
381
|
-
if (prev.srs !== next.srs) {
|
|
382
|
-
return false;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Compare layers
|
|
386
|
-
if (!(0, _core._deepEqual)(prev.layers, next.layers)) {
|
|
387
|
-
return false;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Compare transparent
|
|
391
|
-
if (prev.transparent !== next.transparent) {
|
|
392
|
-
return false;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
// Compare bounds with tolerance for floating point precision
|
|
396
|
-
var tolerance = 1e-10;
|
|
397
|
-
var prevBbox = prev.bbox;
|
|
398
|
-
var nextBbox = next.bbox;
|
|
399
|
-
if (prevBbox && nextBbox) {
|
|
400
|
-
for (var i = 0; i < 4; i++) {
|
|
401
|
-
if (Math.abs(prevBbox[i] - nextBbox[i]) > tolerance) {
|
|
402
|
-
return false;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
return true;
|
|
407
|
-
}
|
|
408
|
-
}]);
|
|
409
|
-
}(_core.CompositeLayer); // https://epsg.io/3857
|
|
410
|
-
// +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
|
|
411
|
-
(0, _defineProperty2["default"])(WMSLayer, "layerName", 'WMSLayer');
|
|
412
|
-
(0, _defineProperty2["default"])(WMSLayer, "defaultProps", defaultProps);
|
|
413
|
-
var HALF_EARTH_CIRCUMFERENCE = 6378137 * Math.PI;
|
|
414
|
-
|
|
415
|
-
/** Projects EPSG:4326 to EPSG:3857
|
|
416
|
-
* This is a lightweight replacement of proj4. Use tests to ensure conformance.
|
|
417
|
-
*/
|
|
418
|
-
function WGS84ToPseudoMercator(coord) {
|
|
419
|
-
var mercator = (0, _webMercator.lngLatToWorld)(coord);
|
|
420
|
-
mercator[0] = (mercator[0] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
|
|
421
|
-
mercator[1] = (mercator[1] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
|
|
422
|
-
return mercator;
|
|
423
|
-
}
|
|
424
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViTWVyY2F0b3IiLCJyZXF1aXJlIiwiX2NvcmUiLCJfbGF5ZXJzIiwiX3dtcyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsImRlZmF1bHRQcm9wcyIsImlkIiwiZGF0YSIsInNlcnZpY2VUeXBlIiwic3JzIiwibGF5ZXJzIiwidHlwZSIsImNvbXBhcmUiLCJ2YWx1ZSIsIm9uTWV0YWRhdGFMb2FkIiwib25NZXRhZGF0YUxvYWRFcnJvciIsImNvbnNvbGUiLCJlcnJvciIsIm9uSW1hZ2VMb2FkU3RhcnQiLCJvbkltYWdlTG9hZCIsIm9uSW1hZ2VMb2FkRXJyb3IiLCJyZXF1ZXN0SWQiLCJXTVNMYXllciIsImV4cG9ydHMiLCJfQ29tcG9zaXRlTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJzdGF0ZSIsImxvYWRDb3VudGVyIiwic2hvdWxkVXBkYXRlU3RhdGUiLCJpbml0aWFsaXplU3RhdGUiLCJfbmV4dFJlcXVlc3RJZCIsImxhc3RSZXF1ZXN0SWQiLCJfbGFzdFJlcXVlc3Rab29tIiwidXBkYXRlU3RhdGUiLCJfcmVmIiwiX3RoaXMiLCJjaGFuZ2VGbGFncyIsInByb3BzIiwib2xkUHJvcHMiLCJ2aWV3cG9ydCIsImNvbnRleHQiLCJkYXRhQ2hhbmdlZCIsImltYWdlU291cmNlIiwiX2NyZWF0ZUltYWdlU291cmNlIiwiX2xvYWRNZXRhZGF0YSIsImRlYm91bmNlIiwibG9hZEltYWdlIiwiZGVlcEVxdWFsIiwidmlld3BvcnRDaGFuZ2VkIiwiX2dsJGdldENvbnRleHRBdHRyaWJ1IiwiZ2wiLCJpc1ByZXNlcnZpbmdCdWZmZXIiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsImRlYm91bmNlRGVsYXkiLCJ1bmRlZmluZWQiLCJyZW5kZXJMYXllcnMiLCJfdGhpcyRzdGF0ZSIsImJvdW5kcyIsImltYWdlIiwibGFzdFJlcXVlc3RQYXJhbWV0ZXJzIiwiQml0bWFwTGF5ZXIiLCJnZXRTdWJMYXllclByb3BzIiwiX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbSIsIkNPT1JESU5BVEVfU1lTVEVNIiwiTE5HTEFUIiwiQ0FSVEVTSUFOIiwicGlja2FibGUiLCJfZ2V0RmVhdHVyZUluZm9UZXh0IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ4IiwieSIsIl90aGlzJHN0YXRlJGltYWdlU291ciIsIl90aGlzJHN0YXRlJGltYWdlU291cjIiLCJmZWF0dXJlSW5mbyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJnZXRGZWF0dXJlSW5mb1RleHQiLCJxdWVyeV9sYXllcnMiLCJpbmZvX2Zvcm1hdCIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiX3giLCJfeDIiLCJJbWFnZVNvdXJjZSIsIldNU0ltYWdlU291cmNlIiwibG9hZE9wdGlvbnMiLCJFcnJvciIsIl9sb2FkTWV0YWRhdGEyIiwiX2NhbGxlZTIiLCJtZXRhZGF0YSIsIl90aGlzJGdldEN1cnJlbnRMYXllciIsIl90aGlzJGdldEN1cnJlbnRMYXllcjIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJnZXRNZXRhZGF0YSIsImdldEN1cnJlbnRMYXllciIsInQwIiwiZmluaXNoIiwiX2xvYWRJbWFnZSIsIl9jYWxsZWUzIiwiX3JlYXNvbiIsIl9nbCRnZXRDb250ZXh0QXR0cmlidTIiLCJfdGhpcyRwcm9wcyIsInRyYW5zcGFyZW50Iiwid2lkdGgiLCJoZWlnaHQiLCJyZXF1ZXN0UGFyYW1zIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvMiIsIm1pblgiLCJtaW5ZIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvMyIsIl9XR1M4NFRvUHNldWRvTWVyY2F0bzQiLCJtYXhYIiwibWF4WSIsImlzRXhwb3J0aW5nIiwiY3VycmVudFpvb20iLCJsYXN0Wm9vbSIsImlzWm9vbWluZ0luIiwiX3RoaXMkZ2V0Q3VycmVudExheWVyMyIsIl90aGlzJGNvbnRleHQkb25FcnJvciIsIl90aGlzJGNvbnRleHQiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXI0IiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiZ2V0Qm91bmRzIiwicmVzb2x1dGlvbiIsImJib3giLCJib3VuZGluZ0JveCIsIldHUzg0VG9Qc2V1ZG9NZXJjYXRvciIsIl9zbGljZWRUb0FycmF5MiIsIl9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwiLCJ6b29tIiwiTWF0aCIsImZsb29yIiwiZ2V0UmVxdWVzdElkIiwiZ2V0SW1hZ2UiLCJzZXRTdGF0ZSIsIm9uRXJyb3IiLCJfeDMiLCJfeDQiLCJmbiIsIm1zIiwiY2xlYXJUaW1lb3V0IiwiX3RpbWVvdXRJZCIsInNldFRpbWVvdXQiLCJ0b2xlcmFuY2UiLCJwcmV2QmJveCIsIm5leHRCYm94IiwiaSIsImFicyIsIkNvbXBvc2l0ZUxheWVyIiwiSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFIiwiUEkiLCJjb29yZCIsIm1lcmNhdG9yIiwibG5nTGF0VG9Xb3JsZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93bXMvd21zLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7bG5nTGF0VG9Xb3JsZH0gZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJztcblxuaW1wb3J0IHtcbiAgTGF5ZXIsXG4gIENvbXBvc2l0ZUxheWVyLFxuICBDb21wb3NpdGVMYXllclByb3BzLFxuICBVcGRhdGVQYXJhbWV0ZXJzLFxuICBEZWZhdWx0UHJvcHMsXG4gIFZpZXdwb3J0LFxuICBDT09SRElOQVRFX1NZU1RFTSxcbiAgX2RlZXBFcXVhbCBhcyBkZWVwRXF1YWxcbn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge0JpdG1hcExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtJbWFnZVNvdXJjZSwgV01TSW1hZ2VTb3VyY2V9IGZyb20gJ0Bsb2FkZXJzLmdsL3dtcyc7XG5cbmltcG9ydCB0eXBlIHtJbWFnZVNvdXJjZU1ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuaW1wb3J0IHR5cGUge0ltYWdlVHlwZX0gZnJvbSAnQGxvYWRlcnMuZ2wvd21zJztcblxuLy8gVE9ETzogVGhpcyBpcyBhIG1vZGlmaWVkIGNvcHkgb2YgV01TTGF5ZXIgZnJvbSBkZWNrLmdsLiBSZW1vdmUgdGhpcyBvbmNlIHdlIHVwZ3JhZGUgZGVjay5nbCBhbmQgbG9hZGVycy5nbC5cblxuLyoqIEFsbCBwcm9wcyBzdXBwb3J0ZWQgYnkgdGhlIFRpbGVMYXllciAqL1xuZXhwb3J0IHR5cGUgV01TTGF5ZXJQcm9wcyA9IENvbXBvc2l0ZUxheWVyUHJvcHMgJiBfV01TTGF5ZXJQcm9wcztcblxuLyoqIFByb3BzIGFkZGVkIGJ5IHRoZSBUaWxlTGF5ZXIgKi9cbnR5cGUgX1dNU0xheWVyUHJvcHMgPSB7XG4gIGRhdGE6IHN0cmluZyB8IEltYWdlU291cmNlO1xuICBzZXJ2aWNlVHlwZT86IHN0cmluZyB8ICdhdXRvJztcbiAgbGF5ZXJzPzogc3RyaW5nW107XG4gIHNycz86ICdFUFNHOjQzMjYnIHwgJ0VQU0c6Mzg1NycgfCAnYXV0byc7XG4gIHRyYW5zcGFyZW50PzogYm9vbGVhbjtcbiAgb25NZXRhZGF0YUxvYWQ/OiAobWV0YWRhdGE6IEltYWdlU291cmNlTWV0YWRhdGEpID0+IHZvaWQ7XG4gIG9uTWV0YWRhdGFMb2FkRXJyb3I/OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZFN0YXJ0PzogKHJlcXVlc3RJZDogdW5rbm93bikgPT4gdm9pZDtcbiAgb25JbWFnZUxvYWQ/OiAocmVxdWVzdElkOiB1bmtub3duKSA9PiB2b2lkO1xuICBvbkltYWdlTG9hZEVycm9yPzogKHJlcXVlc3RJZDogdW5rbm93biwgZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxuY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHM8V01TTGF5ZXJQcm9wcz4gPSB7XG4gIGlkOiAnaW1hZ2VyeS1sYXllcicsXG4gIGRhdGE6ICcnLFxuICBzZXJ2aWNlVHlwZTogJ2F1dG8nLFxuICBzcnM6ICdhdXRvJyxcbiAgbGF5ZXJzOiB7dHlwZTogJ2FycmF5JywgY29tcGFyZTogdHJ1ZSwgdmFsdWU6IFtdfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbk1ldGFkYXRhTG9hZDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiAoKSA9PiB7fX0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBvbk1ldGFkYXRhTG9hZEVycm9yOiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6IGNvbnNvbGUuZXJyb3J9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uSW1hZ2VMb2FkU3RhcnQ6IHt0eXBlOiAnZnVuY3Rpb24nLCB2YWx1ZTogKCkgPT4ge319LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uSW1hZ2VMb2FkOiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6ICgpID0+IHt9fSxcbiAgb25JbWFnZUxvYWRFcnJvcjoge1xuICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgY29tcGFyZTogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgdmFsdWU6IChyZXF1ZXN0SWQ6IHVua25vd24sIGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvciwgcmVxdWVzdElkKVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXTVNMYXllciBleHRlbmRzIENvbXBvc2l0ZUxheWVyPFJlcXVpcmVkPF9XTVNMYXllclByb3BzPj4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ1dNU0xheWVyJztcbiAgc3RhdGljIGRlZmF1bHRQcm9wczogRGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4gIGRlY2xhcmUgc3RhdGU6IHtcbiAgICBpbWFnZVNvdXJjZTogSW1hZ2VTb3VyY2U7XG4gICAgaW1hZ2U6IEltYWdlVHlwZTtcbiAgICBib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIGxhc3RSZXF1ZXN0UGFyYW1ldGVyczoge1xuICAgICAgLy8gVE9ETzogcmVtb3ZlIGJib3ggb25jZSBkZWNrLmdsIGlzIHVwZ3JhZGVkIHRvIF44LjEwIHdpdGggbG9hZGVycy5nbCBeNFxuICAgICAgYmJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgICBib3VuZGluZ0JveDogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dO1xuICAgICAgbGF5ZXJzOiBzdHJpbmdbXTtcbiAgICAgIHNyczogJ0VQU0c6NDMyNicgfCAnRVBTRzozODU3JztcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB9O1xuICAgIGxhc3RSZXF1ZXN0SWQ6IG51bWJlcjtcbiAgICBfbmV4dFJlcXVlc3RJZDogbnVtYmVyO1xuICAgIC8qKiBUT0RPOiBDaGFuZ2UgYW55ID0+IHNldFRpbWVvdXQgcmV0dXJuIHR5cGUuIERpZmZlcmVudCBiZXR3ZWVuIE5vZGUgYW5kIGJyb3dzZXIuLi4gKi9cbiAgICBfdGltZW91dElkOiBhbnk7XG4gICAgbG9hZENvdW50ZXI6IG51bWJlcjtcbiAgICBfbGFzdFJlcXVlc3Rab29tOiBudW1iZXI7XG4gIH07XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhbGwgYXN5bmMgcmVzb3VyY2VzIGFyZSBsb2FkZWQgKi9cbiAgZ2V0IGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRyYWNrIHRoZSBleHBsaWNpdCBsb2FkaW5nIGRvbmUgYnkgdGhpcyBsYXllclxuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RhdGUpICYmIHRoaXMuc3RhdGUubG9hZENvdW50ZXIgPT09IDAgJiYgc3VwZXIuaXNMb2FkZWQ7XG4gIH1cblxuICAvKiogTGV0cyBkZWNrLmdsIGtub3cgdGhhdCB3ZSB3YW50IHZpZXdwb3J0IGNoYW5nZSBldmVudHMgKi9cbiAgb3ZlcnJpZGUgc2hvdWxkVXBkYXRlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdmVycmlkZSBpbml0aWFsaXplU3RhdGUoKTogdm9pZCB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBlbXB0eSwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB1cGRhdGVTdGF0ZVxuICAgIHRoaXMuc3RhdGUuX25leHRSZXF1ZXN0SWQgPSAwO1xuICAgIHRoaXMuc3RhdGUubGFzdFJlcXVlc3RJZCA9IC0xO1xuICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXIgPSAwO1xuICAgIHRoaXMuc3RhdGUuX2xhc3RSZXF1ZXN0Wm9vbSA9IC0xO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlU3RhdGUoe2NoYW5nZUZsYWdzLCBwcm9wcywgb2xkUHJvcHN9OiBVcGRhdGVQYXJhbWV0ZXJzPHRoaXM+KTogdm9pZCB7XG4gICAgY29uc3Qge3ZpZXdwb3J0fSA9IHRoaXMuY29udGV4dDtcblxuICAgIC8vIENoZWNrIGlmIGRhdGEgc291cmNlIGhhcyBjaGFuZ2VkXG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkIHx8IHByb3BzLnNlcnZpY2VUeXBlICE9PSBvbGRQcm9wcy5zZXJ2aWNlVHlwZSkge1xuICAgICAgdGhpcy5zdGF0ZS5pbWFnZVNvdXJjZSA9IHRoaXMuX2NyZWF0ZUltYWdlU291cmNlKHByb3BzKTtcblxuICAgICAgdGhpcy5fbG9hZE1ldGFkYXRhKCk7XG4gICAgICB0aGlzLmRlYm91bmNlKCgpID0+IHRoaXMubG9hZEltYWdlKHZpZXdwb3J0LCAnaW1hZ2Ugc291cmNlIGNoYW5nZWQnKSwgMCk7XG4gICAgfSBlbHNlIGlmICghZGVlcEVxdWFsKHByb3BzLmxheWVycywgb2xkUHJvcHMubGF5ZXJzLCAxKSkge1xuICAgICAgdGhpcy5kZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRJbWFnZSh2aWV3cG9ydCwgJ2xheWVycyBjaGFuZ2VkJyksIDApO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICAvLyBDaGVjayBpZiBwcmVzZXJ2ZURyYXdpbmdCdWZmZXIgaXMgZW5hYmxlZCAoaW5kaWNhdGVzIHZpZGVvIHJlY29yZGluZyBvciBpbWFnZSBleHBvcnQpXG4gICAgICAvLyBVc2UgbWluaW1hbCBkZWJvdW5jZSAoMTBtcykgZHVyaW5nIGV4cG9ydCBmb3IgcmVzcG9uc2l2ZSBmcmFtZSBjYXB0dXJlXG4gICAgICAvLyBSZXF1ZXN0IGRlZHVwbGljYXRpb24gaW4gbG9hZEltYWdlIHByZXZlbnRzIHNwYW0gZnJvbSByZWR1bmRhbnQgdmlld3BvcnQgdXBkYXRlc1xuICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICBjb25zdCBpc1ByZXNlcnZpbmdCdWZmZXIgPSBnbD8uZ2V0Q29udGV4dEF0dHJpYnV0ZXM/LigpPy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XG5cbiAgICAgIGNvbnN0IGRlYm91bmNlRGVsYXkgPSBpc1ByZXNlcnZpbmdCdWZmZXIgPyAxMCA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGVib3VuY2UoKCkgPT4gdGhpcy5sb2FkSW1hZ2Uodmlld3BvcnQsICd2aWV3cG9ydCBjaGFuZ2VkJyksIGRlYm91bmNlRGVsYXkpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlckxheWVycygpOiBMYXllcjxhbnk+IHtcbiAgICBjb25zdCB7Ym91bmRzLCBpbWFnZSwgbGFzdFJlcXVlc3RQYXJhbWV0ZXJzfSA9IHRoaXMuc3RhdGU7XG5cbiAgICByZXR1cm4gKFxuICAgICAgaW1hZ2UgJiZcbiAgICAgIG5ldyBCaXRtYXBMYXllcih7XG4gICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7aWQ6ICdiaXRtYXAnfSksXG4gICAgICAgIF9pbWFnZUNvb3JkaW5hdGVTeXN0ZW06XG4gICAgICAgICAgbGFzdFJlcXVlc3RQYXJhbWV0ZXJzLnNycyA9PT0gJ0VQU0c6NDMyNidcbiAgICAgICAgICAgID8gQ09PUkRJTkFURV9TWVNURU0uTE5HTEFUXG4gICAgICAgICAgICA6IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICAgICAgYm91bmRzLFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgcGlja2FibGU6IHRoaXMucHJvcHMucGlja2FibGVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVJbmZvVGV4dCh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHtsYXN0UmVxdWVzdFBhcmFtZXRlcnN9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAobGFzdFJlcXVlc3RQYXJhbWV0ZXJzKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVuZG9jdW1lbnRlZCBtZXRob2RcbiAgICAgIGNvbnN0IGZlYXR1cmVJbmZvID0gYXdhaXQgdGhpcy5zdGF0ZS5pbWFnZVNvdXJjZS5nZXRGZWF0dXJlSW5mb1RleHQ/Lih7XG4gICAgICAgIC4uLmxhc3RSZXF1ZXN0UGFyYW1ldGVycyxcbiAgICAgICAgcXVlcnlfbGF5ZXJzOiBsYXN0UmVxdWVzdFBhcmFtZXRlcnMubGF5ZXJzLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBpbmZvX2Zvcm1hdDogJ2FwcGxpY2F0aW9uL3ZuZC5vZ2MuZ21sJ1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmVhdHVyZUluZm87XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIF9jcmVhdGVJbWFnZVNvdXJjZShwcm9wczogV01TTGF5ZXJQcm9wcyk6IEltYWdlU291cmNlIHtcbiAgICBpZiAocHJvcHMuZGF0YSBpbnN0YW5jZW9mIEltYWdlU291cmNlKSB7XG4gICAgICByZXR1cm4gcHJvcHMuZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFdNU0ltYWdlU291cmNlKHByb3BzLmRhdGEsIHtcbiAgICAgICAgbG9hZE9wdGlvbnM6IHByb3BzLmxvYWRPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW1hZ2Ugc291cmNlIGluIHByb3BzLmRhdGEnKTtcbiAgfVxuXG4gIC8qKiBSdW4gYSBnZXRNZXRhZGF0YSBvbiB0aGUgaW1hZ2Ugc2VydmljZSAqL1xuICBhc3luYyBfbG9hZE1ldGFkYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtpbWFnZVNvdXJjZX0gPSB0aGlzLnN0YXRlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyKys7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGltYWdlU291cmNlLmdldE1ldGFkYXRhKCk7XG5cbiAgICAgIC8vIElmIGEgcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSwgaXQgbWF5IG5vIGxvbmdlciBiZSBleHBlY3RlZFxuICAgICAgaWYgKHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UgPT09IGltYWdlU291cmNlKSB7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uTWV0YWRhdGFMb2FkKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5nZXRDdXJyZW50TGF5ZXIoKT8ucHJvcHMub25NZXRhZGF0YUxvYWRFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXItLTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZCBhbiBpbWFnZSAqL1xuICBhc3luYyBsb2FkSW1hZ2Uodmlld3BvcnQ6IFZpZXdwb3J0LCBfcmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bGF5ZXJzLCBzZXJ2aWNlVHlwZSwgdHJhbnNwYXJlbnR9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIFRPRE8gLSBtb3ZlIHRvIEltYWdlU291cmNlP1xuICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gJ3dtcycgJiYgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kcyA9IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuICAgIGxldCB7c3JzfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHNycyA9PT0gJ2F1dG8nKSB7XG4gICAgICAvLyBCaXRtYXBMYXllciBvbmx5IHN1cHBvcnRzIExOR0xBVCBvciBDQVJURVNJQU4gKFdlYi1NZXJjYXRvcilcbiAgICAgIHNycyA9IHZpZXdwb3J0LnJlc29sdXRpb24gPyAnRVBTRzo0MzI2JyA6ICdFUFNHOjM4NTcnO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICBiYm94OiBib3VuZHMsXG4gICAgICBib3VuZGluZ0JveDogW1xuICAgICAgICBbYm91bmRzWzBdLCBib3VuZHNbMV1dLFxuICAgICAgICBbYm91bmRzWzJdLCBib3VuZHNbM11dXG4gICAgICBdIGFzIFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICAgIGxheWVycyxcbiAgICAgIHNycyxcbiAgICAgIHRyYW5zcGFyZW50XG4gICAgfTtcbiAgICBpZiAoc3JzID09PSAnRVBTRzozODU3Jykge1xuICAgICAgY29uc3QgW21pblgsIG1pblldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMF0sIGJvdW5kc1sxXV0pO1xuICAgICAgY29uc3QgW21heFgsIG1heFldID0gV0dTODRUb1BzZXVkb01lcmNhdG9yKFtib3VuZHNbMl0sIGJvdW5kc1szXV0pO1xuICAgICAgcmVxdWVzdFBhcmFtcy5ib3VuZGluZ0JveCA9IFtcbiAgICAgICAgW21pblgsIG1pblldLFxuICAgICAgICBbbWF4WCwgbWF4WV1cbiAgICAgIF07XG4gICAgICAvLyBUT0RPOiByZW1vdmUgYmJveCBvbmNlIGRlY2suZ2wgaXMgdXBncmFkZWQgdG8gXjguMTAgd2l0aCBsb2FkZXJzLmdsIF40XG4gICAgICByZXF1ZXN0UGFyYW1zLmJib3ggPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gICAgfVxuXG4gICAgLy8gU2tpcCByZXF1ZXN0IGlmIHBhcmFtZXRlcnMgaGF2ZW4ndCBtZWFuaW5nZnVsbHkgY2hhbmdlZFxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUubGFzdFJlcXVlc3RQYXJhbWV0ZXJzICYmXG4gICAgICB0aGlzLl9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwodGhpcy5zdGF0ZS5sYXN0UmVxdWVzdFBhcmFtZXRlcnMsIHJlcXVlc3RQYXJhbXMpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRHVyaW5nIHZpZGVvIGV4cG9ydCwgdGhyb3R0bGUgem9vbS1pbiByZXF1ZXN0cyB0byBvbmx5IGZpcmUgb24gem9vbSBsZXZlbCBjcm9zc2luZ3MuXG4gICAgLy8gVGhlIGV4aXN0aW5nIGltYWdlIGlzIHN0cmV0Y2hlZCBieSB0aGUgQml0bWFwTGF5ZXIgdW50aWwgdGhlIG5leHQgbGV2ZWwgaXMgcmVhY2hlZC5cbiAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICBjb25zdCBpc0V4cG9ydGluZyA9IGdsPy5nZXRDb250ZXh0QXR0cmlidXRlcz8uKCk/LnByZXNlcnZlRHJhd2luZ0J1ZmZlcjtcbiAgICBpZiAoaXNFeHBvcnRpbmcgJiYgdGhpcy5zdGF0ZS5fbGFzdFJlcXVlc3Rab29tID49IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRab29tID0gdmlld3BvcnQuem9vbTtcbiAgICAgIGNvbnN0IGxhc3Rab29tID0gdGhpcy5zdGF0ZS5fbGFzdFJlcXVlc3Rab29tO1xuICAgICAgY29uc3QgaXNab29taW5nSW4gPSBjdXJyZW50Wm9vbSA+IGxhc3Rab29tO1xuICAgICAgaWYgKGlzWm9vbWluZ0luICYmIE1hdGguZmxvb3IoY3VycmVudFpvb20pID09PSBNYXRoLmZsb29yKGxhc3Rab29tKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxhc3RSZXF1ZXN0UGFyYW1ldGVycyBCRUZPUkUgbWFraW5nIHRoZSByZXF1ZXN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgLy8gd2hlcmUgbXVsdGlwbGUgZGVib3VuY2VkIGNhbGxzIHNlZSB0aGUgc2FtZSBvbGQgcGFyYW1ldGVycyBhbmQgYWxsIHByb2NlZWRcbiAgICB0aGlzLnN0YXRlLmxhc3RSZXF1ZXN0UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbXM7XG4gICAgdGhpcy5zdGF0ZS5fbGFzdFJlcXVlc3Rab29tID0gdmlld3BvcnQuem9vbTtcblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2V0UmVxdWVzdElkKCk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXIrKztcbiAgICAgIHRoaXMucHJvcHMub25JbWFnZUxvYWRTdGFydChyZXF1ZXN0SWQpO1xuXG4gICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UuZ2V0SW1hZ2UocmVxdWVzdFBhcmFtcyk7XG5cbiAgICAgIC8vIElmIGEgcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSwgbGF0ZXIgcmVxdWVzdHMgbWF5IGhhdmUgYWxyZWFkeSBsb2FkZWQuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5sYXN0UmVxdWVzdElkIDwgcmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uSW1hZ2VMb2FkKHJlcXVlc3RJZCk7XG4gICAgICAgIC8vIE5vdCB0eXBlIHNhZmUuLi5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgYm91bmRzLFxuICAgICAgICAgIGxhc3RSZXF1ZXN0SWQ6IHJlcXVlc3RJZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jb250ZXh0Lm9uRXJyb3I/LihlcnJvciBhcyBFcnJvciwgdGhpcyk7XG4gICAgICB0aGlzLmdldEN1cnJlbnRMYXllcigpPy5wcm9wcy5vbkltYWdlTG9hZEVycm9yKHJlcXVlc3RJZCwgZXJyb3IgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgLy8gSEVMUEVSU1xuXG4gIC8qKiBHbG9iYWwgY291bnRlciBmb3IgaXNzdWluZyB1bmlxdWUgcmVxdWVzdCBpZHMgKi9cbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5fbmV4dFJlcXVlc3RJZCsrO1xuICB9XG5cbiAgLyoqIFJ1bnMgYW4gYWN0aW9uIGluIHRoZSBmdXR1cmUsIGNhbmNlbHMgaXQgaWYgdGhlIG5ldyBhY3Rpb24gaXMgaXNzdWVkIGJlZm9yZSBpdCBleGVjdXRlcyAqL1xuICBwcml2YXRlIGRlYm91bmNlKGZuOiAoKSA9PiB2b2lkLCBtcyA9IDUwMCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnN0YXRlLl90aW1lb3V0SWQpO1xuICAgIHRoaXMuc3RhdGUuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gZm4oKSwgbXMpO1xuICB9XG5cbiAgLyoqIENvbXBhcmUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGRldGVybWluZSBpZiBhIG5ldyByZXF1ZXN0IGlzIG5lZWRlZCAqL1xuICBwcml2YXRlIF9hcmVSZXF1ZXN0UGFyYW1zRXF1YWwocHJldjogYW55LCBuZXh0OiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDb21wYXJlIGRpbWVuc2lvbnNcbiAgICBpZiAocHJldi53aWR0aCAhPT0gbmV4dC53aWR0aCB8fCBwcmV2LmhlaWdodCAhPT0gbmV4dC5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIFNSU1xuICAgIGlmIChwcmV2LnNycyAhPT0gbmV4dC5zcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIGxheWVyc1xuICAgIGlmICghZGVlcEVxdWFsKHByZXYubGF5ZXJzLCBuZXh0LmxheWVycykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIHRyYW5zcGFyZW50XG4gICAgaWYgKHByZXYudHJhbnNwYXJlbnQgIT09IG5leHQudHJhbnNwYXJlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wYXJlIGJvdW5kcyB3aXRoIHRvbGVyYW5jZSBmb3IgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uXG4gICAgY29uc3QgdG9sZXJhbmNlID0gMWUtMTA7XG4gICAgY29uc3QgcHJldkJib3ggPSBwcmV2LmJib3g7XG4gICAgY29uc3QgbmV4dEJib3ggPSBuZXh0LmJib3g7XG5cbiAgICBpZiAocHJldkJib3ggJiYgbmV4dEJib3gpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhwcmV2QmJveFtpXSAtIG5leHRCYm94W2ldKSA+IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZXBzZy5pby8zODU3XG4vLyArcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAgK2xvbl8wPTAgK3hfMD0wICt5XzA9MCAraz0xICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArd2t0ZXh0ICtub19kZWZzICt0eXBlPWNyc1xuY29uc3QgSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFID0gNjM3ODEzNyAqIE1hdGguUEk7XG5cbi8qKiBQcm9qZWN0cyBFUFNHOjQzMjYgdG8gRVBTRzozODU3XG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgcmVwbGFjZW1lbnQgb2YgcHJvajQuIFVzZSB0ZXN0cyB0byBlbnN1cmUgY29uZm9ybWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXR1M4NFRvUHNldWRvTWVyY2F0b3IoY29vcmQ6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbWVyY2F0b3IgPSBsbmdMYXRUb1dvcmxkKGNvb3JkKTtcbiAgbWVyY2F0b3JbMF0gPSAobWVyY2F0b3JbMF0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgbWVyY2F0b3JbMV0gPSAobWVyY2F0b3JbMV0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgcmV0dXJuIG1lcmNhdG9yO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFVQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFBNEQsU0FBQUksUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEs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
|