mage-engine 3.21.2 → 3.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/.nvmrc +1 -0
  2. package/dist/mage.js +638 -498
  3. package/package.json +1 -1
package/dist/mage.js CHANGED
@@ -371,28 +371,7 @@ function _createForOfIteratorHelper(o, allowArrayLike) {
371
371
  }
372
372
  }
373
373
  };
374
- }var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
375
-
376
- function getAugmentedNamespace(n) {
377
- if (n.__esModule) return n;
378
- var a = Object.defineProperty({}, '__esModule', {value: true});
379
- Object.keys(n).forEach(function (k) {
380
- var d = Object.getOwnPropertyDescriptor(n, k);
381
- Object.defineProperty(a, k, d.get ? d : {
382
- enumerable: true,
383
- get: function () {
384
- return n[k];
385
- }
386
- });
387
- });
388
- return a;
389
- }var between$1 = {exports: {}};/* Between.js v0.1.2-fix.2 */
390
-
391
- (function (module, exports) {
392
- !function(t,n){module.exports=n();}(commonjsGlobal,function(){function O(t){return (O="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 r(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r);}}function n(t,n,e){return n&&r(t.prototype,n),e&&r(t,e),t}function M(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function I(t){return (I=Object.getPrototypeOf||function(t){return t.__proto__})(t)}function o(t,n){return (o=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function u(t,n,e){return (u="undefined"!=typeof Reflect&&Reflect.construct?Reflect.construct:function(t,n,e){var r=[null];r.push.apply(r,n);var u=new(t.bind.apply(t,r));return e&&o(u,e.prototype),u}).apply(null,arguments)}function _(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var t=function(o){var a={},i=[];(o=o||this).on=function(t,n,e){return (a[t]=a[t]||[]).push([n,e]),o},o.off=function(t,n){t||(a={});for(var e=a[t]||i,r=e.length=n?e.length:0;r--;)n==e[r][0]&&e.splice(r,1);return o},o.emit=function(t){for(var n,e=a[t]||i,r=0<e.length?e.slice(0,e.length):e,u=0;n=r[u++];)n[0].apply(n[1],i.slice.call(arguments,1));return o};};var V=function(t,n,e){return t*(1-e)+n*e},e="undefined"!=typeof window?window:"undefined"!=typeof commonjsGlobal?commonjsGlobal:"undefined"!=typeof self?self:{};function a(t,n){return t(n={exports:{}},n.exports),n.exports}for(var i=a(function(t){var n=t.exports={Linear:{None:function(t){return t}},Quadratic:{In:function(t){return t*t},Out:function(t){return t*(2-t)},InOut:function(t){return (t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},Cubic:{In:function(t){return t*t*t},Out:function(t){return --t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},Quartic:{In:function(t){return t*t*t*t},Out:function(t){return 1- --t*t*t*t},InOut:function(t){return (t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},Quintic:{In:function(t){return t*t*t*t*t},Out:function(t){return --t*t*t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},Sinusoidal:{In:function(t){return 1-Math.cos(t*Math.PI/2)},Out:function(t){return Math.sin(t*Math.PI/2)},InOut:function(t){return .5*(1-Math.cos(Math.PI*t))}},Exponential:{In:function(t){return 0===t?0:Math.pow(1024,t-1)},Out:function(t){return 1===t?1:1-Math.pow(2,-10*t)},InOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))}},Circular:{In:function(t){return 1-Math.sqrt(1-t*t)},Out:function(t){return Math.sqrt(1- --t*t)},InOut:function(t){return (t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},Elastic:{In:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),-e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4))},Out:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),e*Math.pow(2,-10*t)*Math.sin((t-n)*(2*Math.PI)/.4)+1)},InOut:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),(t*=2)<1?e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*-.5:e*Math.pow(2,-10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*.5+1)}},Back:{In:function(t){return t*t*(2.70158*t-1.70158)},Out:function(t){return --t*t*(2.70158*t+1.70158)+1},InOut:function(t){var n=2.5949095;return (t*=2)<1?t*t*((n+1)*t-n)*.5:.5*((t-=2)*t*((n+1)*t+n)+2)}},Bounce:{In:function(t){return 1-n.Bounce.Out(1-t)},Out:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},InOut:function(t){return t<.5?.5*n.Bounce.In(2*t):.5*n.Bounce.Out(2*t-1)+.5}}};}),c=(i.Linear,i.Quadratic,i.Cubic,i.Quartic,i.Quintic,i.Sinusoidal,i.Exponential,i.Circular,i.Elastic,i.Back,i.Bounce,a(function(a){(function(){var t,n,e,r,u,o;"undefined"!=typeof performance&&null!==performance&&performance.now?a.exports=function(){return performance.now()}:"undefined"!=typeof process&&null!==process&&process.hrtime?(a.exports=function(){return (t()-u)/1e6},n=process.hrtime,r=(t=function(){var t;return 1e9*(t=n())[0]+t[1]})(),o=1e9*process.uptime(),u=r-o):Date.now?(a.exports=function(){return Date.now()-e},e=Date.now()):(a.exports=function(){return (new Date).getTime()-e},e=(new Date).getTime());}).call(e);})),l="undefined"==typeof window?e:window,f=["moz","webkit"],s="AnimationFrame",p=l["request"+s],h=l["cancel"+s]||l["cancelRequest"+s],m=0;!p&&m<f.length;m++)p=l[f[m]+"Request"+s],h=l[f[m]+"Cancel"+s]||l[f[m]+"CancelRequest"+s];if(!p||!h){var d=0,y=0,v=[];p=function(t){if(0===v.length){var n=c(),e=Math.max(0,1e3/60-(n-d));d=e+n,setTimeout(function(){for(var t=v.slice(0),n=v.length=0;n<t.length;n++)if(!t[n].cancelled)try{t[n].callback(d);}catch(t){setTimeout(function(){throw t},0);}},Math.round(e));}return v.push({handle:++y,callback:t,cancelled:!1}),y},h=function(t){for(var n=0;n<v.length;n++)v[n].handle===t&&(v[n].cancelled=!0);};}var b=function(t){return p.call(l,t)};b.cancel=function(){h.apply(l,arguments);},b.polyfill=function(t){t||(t=l),t.requestAnimationFrame=p,t.cancelAnimationFrame=h;};var w,k,P=[],T=Symbol("type"),j=Symbol("start_time"),x=Symbol("completed"),D=Symbol("paused"),g=requestAnimationFrame||b,A=Date.now();!function t(){g(t),w=Date.now(),k=w-A;for(var n=0;n<P.length;n++)P[n][x]||P[n](k,Date.now()-P[n][j]);A=w;}();var E=function(t){function g(e,t){var n,r,u,o;!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,g),u=this,o=I(g).call(this),M(_(_(r=!o||"object"!=typeof o&&"function"!=typeof o?_(u):o)),"update",function(){var e=_(_(r))._updateValue;return function(t,n){r[x]||r[D]||(0===r.localTime&&r.emit("start",r.value,_(_(r))),e(r.ease(r.loopFunction.progress(Math.min(1,(n||r.localTime)/r.duration)))),r.emit("update",r.value,_(_(r)),t),r.localTime>=r.duration&&r.loopFunction.complete(function(){r[x]=!0,r.emit("complete",r.value,_(_(r)));}),r.localTime+=t);}});var a=r.plugin=Object.values(g._plugins).reduce(function(t,n){return t||n&&n.test&&n.test(e)&&n},!1),i=a&&a.name||("object"===O(e)?Array.isArray(e)?"array":"object":"number");if(a){var c=a.initialize(e,t);e=c.startValue,t=c.destValue,r.data=c.data;}switch(Object.assign(_(_(r)),(M(n={duration:1e3,localTime:0,startValue:e,destValue:t,loopMode:"once",loopFunction:g.DEFAULT_LOOP,ease:function(t){return t},value:"array"===i?[].concat(e):"object"===i?Object.assign({},e):e},x,!1),M(n,T,i),M(n,j,Date.now()),M(n,D,!1),n)),r[T]){case"number":r._updateValue=function(t){r.value=V(r.startValue,r.destValue,t);};break;case"array":var l=r.value.length,f=_(_(r)),s=f.startValue,p=f.destValue,h=f.value;r._updateValue=function(t){for(var n=0;n<l;n++)h[n]=V(s[n],p[n],t);};break;case"object":var m=Object.keys(r.startValue),d=m.length,y=_(_(r)),v=y.startValue,b=y.destValue,w=y.value;r._updateValue=function(t){for(var n=0;n<d;n++){var e=m[n];w[e]=V(v[e],b[e],t);}};break;default:r.plugin?r._updateValue=function(t){r.value=r.plugin.interpolate(r.startValue,r.destValue,t,r.data);}:(console.warn("Between: startValue type was unrecognized."),r._updateValue=function(){return null});}return P.push(r.update()),r}return n(g,null,[{key:"between",value:function(){for(var t=arguments.length,n=new Array(t),e=0;e<t;e++)n[e]=arguments[e];return u(g,n)}}]),n(g,[{key:"pause",value:function(){return this[D]=!0,this.emit("pause",this.value,this,k),this}},{key:"play",value:function(){return this[D]=!1,this.emit("play",this.value,this,k),this}},{key:"easing",value:function(t){return this.ease=t,this}},{key:"time",value:function(t){return this.duration=t,this}},{key:"loop",value:function(){for(var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"once",n="__loop_".concat(t),e=arguments.length,r=new Array(1<e?e-1:0),u=1;u<e;u++)r[u-1]=arguments[u];return this.loopFunction=n in this?Object.assign({},g.DEFAULT_LOOP,this[n].apply(this,r)):g.DEFAULT_LOOP,this}},{key:"__loop_repeat",value:function(t){var n=this,e=t;return this.times=0,{complete:function(t){n.localTime=0,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;}}}},{key:"__loop_bounce",value:function(t){var n=this,e=t,r=1;return this.times=0,{complete:function(t){n.localTime=0,r=-r,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;},progress:function(t){return 0<r?t:1-t}}}},{key:"isPaused",get:function(){return this[D]}}]),function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");o(t.prototype,n&&n.prototype),n&&o(t,n);}(g,t),g}(t);return M(E,"DEFAULT_LOOP",{complete:function(t){return t()},progress:function(t){return t}}),E.Easing=i,E._plugins={},E});
393
- }(between$1));
394
-
395
- var between = between$1.exports;/*! *****************************************************************************
374
+ }/*! *****************************************************************************
396
375
  Copyright (c) Microsoft Corporation. All rights reserved.
397
376
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
398
377
  this file except in compliance with the License. You may obtain a copy of the
@@ -53939,13 +53918,17 @@ if ( typeof window !== 'undefined' ) {
53939
53918
 
53940
53919
  }
53941
53920
 
53942
- }var three_module=/*#__PURE__*/Object.freeze({__proto__:null,ACESFilmicToneMapping:ACESFilmicToneMapping,AddEquation:AddEquation,AddOperation:AddOperation,AdditiveAnimationBlendMode:AdditiveAnimationBlendMode,AdditiveBlending:AdditiveBlending,AlphaFormat:AlphaFormat,AlwaysDepth:AlwaysDepth,AlwaysStencilFunc:AlwaysStencilFunc,AmbientLight:AmbientLight$1,AmbientLightProbe:AmbientLightProbe,AnimationClip:AnimationClip,AnimationLoader:AnimationLoader,AnimationMixer:AnimationMixer,AnimationObjectGroup:AnimationObjectGroup,AnimationUtils:AnimationUtils,ArcCurve:ArcCurve,ArrayCamera:ArrayCamera,ArrowHelper:ArrowHelper,Audio:Audio$2,AudioAnalyser:AudioAnalyser,AudioContext:AudioContext,AudioListener:AudioListener,AudioLoader:AudioLoader,AxesHelper:AxesHelper$1,AxisHelper:AxisHelper,BackSide:BackSide,BasicDepthPacking:BasicDepthPacking,BasicShadowMap:BasicShadowMap,BinaryTextureLoader:BinaryTextureLoader,Bone:Bone,BooleanKeyframeTrack:BooleanKeyframeTrack,BoundingBoxHelper:BoundingBoxHelper,Box2:Box2,Box3:Box3,Box3Helper:Box3Helper,BoxBufferGeometry:BoxGeometry,BoxGeometry:BoxGeometry,BoxHelper:BoxHelper,BufferAttribute:BufferAttribute,BufferGeometry:BufferGeometry,BufferGeometryLoader:BufferGeometryLoader,ByteType:ByteType,Cache:Cache,Camera:Camera$1,CameraHelper:CameraHelper,CanvasRenderer:CanvasRenderer,CanvasTexture:CanvasTexture,CatmullRomCurve3:CatmullRomCurve3,CineonToneMapping:CineonToneMapping,CircleBufferGeometry:CircleGeometry,CircleGeometry:CircleGeometry,ClampToEdgeWrapping:ClampToEdgeWrapping,Clock:Clock,Color:Color$1,ColorKeyframeTrack:ColorKeyframeTrack,CompressedTexture:CompressedTexture,CompressedTextureLoader:CompressedTextureLoader,ConeBufferGeometry:ConeGeometry,ConeGeometry:ConeGeometry,CubeCamera:CubeCamera,CubeReflectionMapping:CubeReflectionMapping,CubeRefractionMapping:CubeRefractionMapping,CubeTexture:CubeTexture,CubeTextureLoader:CubeTextureLoader,CubeUVReflectionMapping:CubeUVReflectionMapping,CubeUVRefractionMapping:CubeUVRefractionMapping,CubicBezierCurve:CubicBezierCurve,CubicBezierCurve3:CubicBezierCurve3,CubicInterpolant:CubicInterpolant,CullFaceBack:CullFaceBack,CullFaceFront:CullFaceFront,CullFaceFrontBack:CullFaceFrontBack,CullFaceNone:CullFaceNone,Curve:Curve,CurvePath:CurvePath,CustomBlending:CustomBlending,CustomToneMapping:CustomToneMapping,CylinderBufferGeometry:CylinderGeometry,CylinderGeometry:CylinderGeometry,Cylindrical:Cylindrical,DataTexture:DataTexture,DataTexture2DArray:DataTexture2DArray,DataTexture3D:DataTexture3D,DataTextureLoader:DataTextureLoader,DataUtils:DataUtils,DecrementStencilOp:DecrementStencilOp,DecrementWrapStencilOp:DecrementWrapStencilOp,DefaultLoadingManager:DefaultLoadingManager,DepthFormat:DepthFormat,DepthStencilFormat:DepthStencilFormat,DepthTexture:DepthTexture,DirectionalLight:DirectionalLight,DirectionalLightHelper:DirectionalLightHelper,DiscreteInterpolant:DiscreteInterpolant,DodecahedronBufferGeometry:DodecahedronGeometry,DodecahedronGeometry:DodecahedronGeometry,DoubleSide:DoubleSide,DstAlphaFactor:DstAlphaFactor,DstColorFactor:DstColorFactor,DynamicBufferAttribute:DynamicBufferAttribute,DynamicCopyUsage:DynamicCopyUsage,DynamicDrawUsage:DynamicDrawUsage,DynamicReadUsage:DynamicReadUsage,EdgesGeometry:EdgesGeometry,EdgesHelper:EdgesHelper,EllipseCurve:EllipseCurve,EqualDepth:EqualDepth,EqualStencilFunc:EqualStencilFunc,EquirectangularReflectionMapping:EquirectangularReflectionMapping,EquirectangularRefractionMapping:EquirectangularRefractionMapping,Euler:Euler,EventDispatcher:EventDispatcher,ExtrudeBufferGeometry:ExtrudeGeometry,ExtrudeGeometry:ExtrudeGeometry,FaceColors:FaceColors,FileLoader:FileLoader,FlatShading:FlatShading,Float16BufferAttribute:Float16BufferAttribute,Float32Attribute:Float32Attribute,Float32BufferAttribute:Float32BufferAttribute,Float64Attribute:Float64Attribute,Float64BufferAttribute:Float64BufferAttribute,FloatType:FloatType$1,Fog:Fog,FogExp2:FogExp2,Font:Font,FontLoader:FontLoader,FrontSide:FrontSide,Frustum:Frustum$1,GLBufferAttribute:GLBufferAttribute,GLSL1:GLSL1,GLSL3:GLSL3,GammaEncoding:GammaEncoding,GreaterDepth:GreaterDepth,GreaterEqualDepth:GreaterEqualDepth,GreaterEqualStencilFunc:GreaterEqualStencilFunc,GreaterStencilFunc:GreaterStencilFunc,GridHelper:GridHelper,Group:Group,HalfFloatType:HalfFloatType,HemisphereLight:HemisphereLight$1,HemisphereLightHelper:HemisphereLightHelper,HemisphereLightProbe:HemisphereLightProbe,IcosahedronBufferGeometry:IcosahedronGeometry,IcosahedronGeometry:IcosahedronGeometry,ImageBitmapLoader:ImageBitmapLoader,ImageLoader:ImageLoader,ImageUtils:ImageUtils,ImmediateRenderObject:ImmediateRenderObject,IncrementStencilOp:IncrementStencilOp,IncrementWrapStencilOp:IncrementWrapStencilOp,InstancedBufferAttribute:InstancedBufferAttribute,InstancedBufferGeometry:InstancedBufferGeometry,InstancedInterleavedBuffer:InstancedInterleavedBuffer,InstancedMesh:InstancedMesh,Int16Attribute:Int16Attribute,Int16BufferAttribute:Int16BufferAttribute,Int32Attribute:Int32Attribute,Int32BufferAttribute:Int32BufferAttribute,Int8Attribute:Int8Attribute,Int8BufferAttribute:Int8BufferAttribute,IntType:IntType,InterleavedBuffer:InterleavedBuffer,InterleavedBufferAttribute:InterleavedBufferAttribute,Interpolant:Interpolant,InterpolateDiscrete:InterpolateDiscrete,InterpolateLinear:InterpolateLinear,InterpolateSmooth:InterpolateSmooth,InvertStencilOp:InvertStencilOp,JSONLoader:JSONLoader,KeepStencilOp:KeepStencilOp,KeyframeTrack:KeyframeTrack,LOD:LOD,LatheBufferGeometry:LatheGeometry,LatheGeometry:LatheGeometry,Layers:Layers,LensFlare:LensFlare,LessDepth:LessDepth,LessEqualDepth:LessEqualDepth,LessEqualStencilFunc:LessEqualStencilFunc,LessStencilFunc:LessStencilFunc,Light:Light$1,LightProbe:LightProbe,Line:Line$1,Line3:Line3,LineBasicMaterial:LineBasicMaterial,LineCurve:LineCurve,LineCurve3:LineCurve3,LineDashedMaterial:LineDashedMaterial,LineLoop:LineLoop,LinePieces:LinePieces,LineSegments:LineSegments,LineStrip:LineStrip,LinearEncoding:LinearEncoding,LinearFilter:LinearFilter,LinearInterpolant:LinearInterpolant,LinearMipMapLinearFilter:LinearMipMapLinearFilter,LinearMipMapNearestFilter:LinearMipMapNearestFilter,LinearMipmapLinearFilter:LinearMipmapLinearFilter,LinearMipmapNearestFilter:LinearMipmapNearestFilter,LinearToneMapping:LinearToneMapping,Loader:Loader$1,LoaderUtils:LoaderUtils,LoadingManager:LoadingManager,LogLuvEncoding:LogLuvEncoding,LoopOnce:LoopOnce,LoopPingPong:LoopPingPong,LoopRepeat:LoopRepeat,LuminanceAlphaFormat:LuminanceAlphaFormat,LuminanceFormat:LuminanceFormat,MOUSE:MOUSE,Material:Material,MaterialLoader:MaterialLoader,Math:MathUtils,MathUtils:MathUtils,Matrix3:Matrix3,Matrix4:Matrix4,MaxEquation:MaxEquation,Mesh:Mesh,MeshBasicMaterial:MeshBasicMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshFaceMaterial:MeshFaceMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshMatcapMaterial:MeshMatcapMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshToonMaterial:MeshToonMaterial,MinEquation:MinEquation,MirroredRepeatWrapping:MirroredRepeatWrapping,MixOperation:MixOperation,MultiMaterial:MultiMaterial,MultiplyBlending:MultiplyBlending,MultiplyOperation:MultiplyOperation,NearestFilter:NearestFilter,NearestMipMapLinearFilter:NearestMipMapLinearFilter,NearestMipMapNearestFilter:NearestMipMapNearestFilter,NearestMipmapLinearFilter:NearestMipmapLinearFilter,NearestMipmapNearestFilter:NearestMipmapNearestFilter,NeverDepth:NeverDepth,NeverStencilFunc:NeverStencilFunc,NoBlending:NoBlending,NoColors:NoColors,NoToneMapping:NoToneMapping,NormalAnimationBlendMode:NormalAnimationBlendMode,NormalBlending:NormalBlending,NotEqualDepth:NotEqualDepth,NotEqualStencilFunc:NotEqualStencilFunc,NumberKeyframeTrack:NumberKeyframeTrack,Object3D:Object3D,ObjectLoader:ObjectLoader,ObjectSpaceNormalMap:ObjectSpaceNormalMap,OctahedronBufferGeometry:OctahedronGeometry,OctahedronGeometry:OctahedronGeometry,OneFactor:OneFactor,OneMinusDstAlphaFactor:OneMinusDstAlphaFactor,OneMinusDstColorFactor:OneMinusDstColorFactor,OneMinusSrcAlphaFactor:OneMinusSrcAlphaFactor,OneMinusSrcColorFactor:OneMinusSrcColorFactor,OrthographicCamera:OrthographicCamera,PCFShadowMap:PCFShadowMap,PCFSoftShadowMap:PCFSoftShadowMap,PMREMGenerator:PMREMGenerator,ParametricBufferGeometry:ParametricGeometry,ParametricGeometry:ParametricGeometry,Particle:Particle,ParticleBasicMaterial:ParticleBasicMaterial,ParticleSystem:ParticleSystem,ParticleSystemMaterial:ParticleSystemMaterial,Path:Path,PerspectiveCamera:PerspectiveCamera,Plane:Plane$1,PlaneBufferGeometry:PlaneGeometry,PlaneGeometry:PlaneGeometry,PlaneHelper:PlaneHelper,PointCloud:PointCloud,PointCloudMaterial:PointCloudMaterial,PointLight:PointLight$1,PointLightHelper:PointLightHelper,Points:Points,PointsMaterial:PointsMaterial,PolarGridHelper:PolarGridHelper,PolyhedronBufferGeometry:PolyhedronGeometry,PolyhedronGeometry:PolyhedronGeometry,PositionalAudio:PositionalAudio,PropertyBinding:PropertyBinding,PropertyMixer:PropertyMixer,QuadraticBezierCurve:QuadraticBezierCurve,QuadraticBezierCurve3:QuadraticBezierCurve3,Quaternion:Quaternion,QuaternionKeyframeTrack:QuaternionKeyframeTrack,QuaternionLinearInterpolant:QuaternionLinearInterpolant,REVISION:REVISION,RGBADepthPacking:RGBADepthPacking,RGBAFormat:RGBAFormat,RGBAIntegerFormat:RGBAIntegerFormat,RGBA_ASTC_10x10_Format:RGBA_ASTC_10x10_Format,RGBA_ASTC_10x5_Format:RGBA_ASTC_10x5_Format,RGBA_ASTC_10x6_Format:RGBA_ASTC_10x6_Format,RGBA_ASTC_10x8_Format:RGBA_ASTC_10x8_Format,RGBA_ASTC_12x10_Format:RGBA_ASTC_12x10_Format,RGBA_ASTC_12x12_Format:RGBA_ASTC_12x12_Format,RGBA_ASTC_4x4_Format:RGBA_ASTC_4x4_Format,RGBA_ASTC_5x4_Format:RGBA_ASTC_5x4_Format,RGBA_ASTC_5x5_Format:RGBA_ASTC_5x5_Format,RGBA_ASTC_6x5_Format:RGBA_ASTC_6x5_Format,RGBA_ASTC_6x6_Format:RGBA_ASTC_6x6_Format,RGBA_ASTC_8x5_Format:RGBA_ASTC_8x5_Format,RGBA_ASTC_8x6_Format:RGBA_ASTC_8x6_Format,RGBA_ASTC_8x8_Format:RGBA_ASTC_8x8_Format,RGBA_BPTC_Format:RGBA_BPTC_Format,RGBA_ETC2_EAC_Format:RGBA_ETC2_EAC_Format,RGBA_PVRTC_2BPPV1_Format:RGBA_PVRTC_2BPPV1_Format,RGBA_PVRTC_4BPPV1_Format:RGBA_PVRTC_4BPPV1_Format,RGBA_S3TC_DXT1_Format:RGBA_S3TC_DXT1_Format,RGBA_S3TC_DXT3_Format:RGBA_S3TC_DXT3_Format,RGBA_S3TC_DXT5_Format:RGBA_S3TC_DXT5_Format,RGBDEncoding:RGBDEncoding,RGBEEncoding:RGBEEncoding,RGBEFormat:RGBEFormat,RGBFormat:RGBFormat,RGBIntegerFormat:RGBIntegerFormat,RGBM16Encoding:RGBM16Encoding,RGBM7Encoding:RGBM7Encoding,RGB_ETC1_Format:RGB_ETC1_Format,RGB_ETC2_Format:RGB_ETC2_Format,RGB_PVRTC_2BPPV1_Format:RGB_PVRTC_2BPPV1_Format,RGB_PVRTC_4BPPV1_Format:RGB_PVRTC_4BPPV1_Format,RGB_S3TC_DXT1_Format:RGB_S3TC_DXT1_Format,RGFormat:RGFormat,RGIntegerFormat:RGIntegerFormat,RawShaderMaterial:RawShaderMaterial,Ray:Ray,Raycaster:Raycaster,RectAreaLight:RectAreaLight,RedFormat:RedFormat,RedIntegerFormat:RedIntegerFormat,ReinhardToneMapping:ReinhardToneMapping,RepeatWrapping:RepeatWrapping$1,ReplaceStencilOp:ReplaceStencilOp,ReverseSubtractEquation:ReverseSubtractEquation,RingBufferGeometry:RingGeometry,RingGeometry:RingGeometry,SRGB8_ALPHA8_ASTC_10x10_Format:SRGB8_ALPHA8_ASTC_10x10_Format,SRGB8_ALPHA8_ASTC_10x5_Format:SRGB8_ALPHA8_ASTC_10x5_Format,SRGB8_ALPHA8_ASTC_10x6_Format:SRGB8_ALPHA8_ASTC_10x6_Format,SRGB8_ALPHA8_ASTC_10x8_Format:SRGB8_ALPHA8_ASTC_10x8_Format,SRGB8_ALPHA8_ASTC_12x10_Format:SRGB8_ALPHA8_ASTC_12x10_Format,SRGB8_ALPHA8_ASTC_12x12_Format:SRGB8_ALPHA8_ASTC_12x12_Format,SRGB8_ALPHA8_ASTC_4x4_Format:SRGB8_ALPHA8_ASTC_4x4_Format,SRGB8_ALPHA8_ASTC_5x4_Format:SRGB8_ALPHA8_ASTC_5x4_Format,SRGB8_ALPHA8_ASTC_5x5_Format:SRGB8_ALPHA8_ASTC_5x5_Format,SRGB8_ALPHA8_ASTC_6x5_Format:SRGB8_ALPHA8_ASTC_6x5_Format,SRGB8_ALPHA8_ASTC_6x6_Format:SRGB8_ALPHA8_ASTC_6x6_Format,SRGB8_ALPHA8_ASTC_8x5_Format:SRGB8_ALPHA8_ASTC_8x5_Format,SRGB8_ALPHA8_ASTC_8x6_Format:SRGB8_ALPHA8_ASTC_8x6_Format,SRGB8_ALPHA8_ASTC_8x8_Format:SRGB8_ALPHA8_ASTC_8x8_Format,Scene:Scene$2,SceneUtils:SceneUtils,ShaderChunk:ShaderChunk,ShaderLib:ShaderLib,ShaderMaterial:ShaderMaterial,ShadowMaterial:ShadowMaterial,Shape:Shape,ShapeBufferGeometry:ShapeGeometry,ShapeGeometry:ShapeGeometry,ShapePath:ShapePath,ShapeUtils:ShapeUtils,ShortType:ShortType,Skeleton:Skeleton,SkeletonHelper:SkeletonHelper,SkinnedMesh:SkinnedMesh,SmoothShading:SmoothShading,Sphere:Sphere$1,SphereBufferGeometry:SphereGeometry,SphereGeometry:SphereGeometry,Spherical:Spherical,SphericalHarmonics3:SphericalHarmonics3,SplineCurve:SplineCurve,SpotLight:SpotLight$1,SpotLightHelper:SpotLightHelper,Sprite:Sprite$1,SpriteMaterial:SpriteMaterial,SrcAlphaFactor:SrcAlphaFactor,SrcAlphaSaturateFactor:SrcAlphaSaturateFactor,SrcColorFactor:SrcColorFactor,StaticCopyUsage:StaticCopyUsage,StaticDrawUsage:StaticDrawUsage,StaticReadUsage:StaticReadUsage,StereoCamera:StereoCamera,StreamCopyUsage:StreamCopyUsage,StreamDrawUsage:StreamDrawUsage,StreamReadUsage:StreamReadUsage,StringKeyframeTrack:StringKeyframeTrack,SubtractEquation:SubtractEquation,SubtractiveBlending:SubtractiveBlending,TOUCH:TOUCH,TangentSpaceNormalMap:TangentSpaceNormalMap,TetrahedronBufferGeometry:TetrahedronGeometry,TetrahedronGeometry:TetrahedronGeometry,TextBufferGeometry:TextGeometry,TextGeometry:TextGeometry,Texture:Texture,TextureLoader:TextureLoader,TorusBufferGeometry:TorusGeometry,TorusGeometry:TorusGeometry,TorusKnotBufferGeometry:TorusKnotGeometry,TorusKnotGeometry:TorusKnotGeometry,Triangle:Triangle,TriangleFanDrawMode:TriangleFanDrawMode,TriangleStripDrawMode:TriangleStripDrawMode,TrianglesDrawMode:TrianglesDrawMode,TubeBufferGeometry:TubeGeometry,TubeGeometry:TubeGeometry,UVMapping:UVMapping,Uint16Attribute:Uint16Attribute,Uint16BufferAttribute:Uint16BufferAttribute,Uint32Attribute:Uint32Attribute,Uint32BufferAttribute:Uint32BufferAttribute,Uint8Attribute:Uint8Attribute,Uint8BufferAttribute:Uint8BufferAttribute,Uint8ClampedAttribute:Uint8ClampedAttribute,Uint8ClampedBufferAttribute:Uint8ClampedBufferAttribute,Uniform:Uniform,UniformsLib:UniformsLib,UniformsUtils:UniformsUtils,UnsignedByteType:UnsignedByteType,UnsignedInt248Type:UnsignedInt248Type,UnsignedIntType:UnsignedIntType,UnsignedShort4444Type:UnsignedShort4444Type,UnsignedShort5551Type:UnsignedShort5551Type,UnsignedShort565Type:UnsignedShort565Type,UnsignedShortType:UnsignedShortType,VSMShadowMap:VSMShadowMap,Vector2:Vector2,Vector3:Vector3$1,Vector4:Vector4,VectorKeyframeTrack:VectorKeyframeTrack,Vertex:Vertex,VertexColors:VertexColors,VideoTexture:VideoTexture,WebGL1Renderer:WebGL1Renderer,WebGLCubeRenderTarget:WebGLCubeRenderTarget,WebGLMultisampleRenderTarget:WebGLMultisampleRenderTarget,WebGLRenderTarget:WebGLRenderTarget,WebGLRenderTargetCube:WebGLRenderTargetCube,WebGLRenderer:WebGLRenderer,WebGLUtils:WebGLUtils,WireframeGeometry:WireframeGeometry,WireframeHelper:WireframeHelper,WrapAroundEnding:WrapAroundEnding,XHRLoader:XHRLoader,ZeroCurvatureEnding:ZeroCurvatureEnding,ZeroFactor:ZeroFactor,ZeroSlopeEnding:ZeroSlopeEnding,ZeroStencilOp:ZeroStencilOp,sRGBEncoding:sRGBEncoding});var PREFIX = '[Mage]';
53943
- var DEPRECATED = '[DEPRECATED]';
53921
+ }var three_module=/*#__PURE__*/Object.freeze({__proto__:null,ACESFilmicToneMapping:ACESFilmicToneMapping,AddEquation:AddEquation,AddOperation:AddOperation,AdditiveAnimationBlendMode:AdditiveAnimationBlendMode,AdditiveBlending:AdditiveBlending,AlphaFormat:AlphaFormat,AlwaysDepth:AlwaysDepth,AlwaysStencilFunc:AlwaysStencilFunc,AmbientLight:AmbientLight$1,AmbientLightProbe:AmbientLightProbe,AnimationClip:AnimationClip,AnimationLoader:AnimationLoader,AnimationMixer:AnimationMixer,AnimationObjectGroup:AnimationObjectGroup,AnimationUtils:AnimationUtils,ArcCurve:ArcCurve,ArrayCamera:ArrayCamera,ArrowHelper:ArrowHelper,Audio:Audio$2,AudioAnalyser:AudioAnalyser,AudioContext:AudioContext,AudioListener:AudioListener,AudioLoader:AudioLoader,AxesHelper:AxesHelper$1,AxisHelper:AxisHelper,BackSide:BackSide,BasicDepthPacking:BasicDepthPacking,BasicShadowMap:BasicShadowMap,BinaryTextureLoader:BinaryTextureLoader,Bone:Bone,BooleanKeyframeTrack:BooleanKeyframeTrack,BoundingBoxHelper:BoundingBoxHelper,Box2:Box2,Box3:Box3,Box3Helper:Box3Helper,BoxBufferGeometry:BoxGeometry,BoxGeometry:BoxGeometry,BoxHelper:BoxHelper,BufferAttribute:BufferAttribute,BufferGeometry:BufferGeometry,BufferGeometryLoader:BufferGeometryLoader,ByteType:ByteType,Cache:Cache,Camera:Camera$1,CameraHelper:CameraHelper,CanvasRenderer:CanvasRenderer,CanvasTexture:CanvasTexture,CatmullRomCurve3:CatmullRomCurve3,CineonToneMapping:CineonToneMapping,CircleBufferGeometry:CircleGeometry,CircleGeometry:CircleGeometry,ClampToEdgeWrapping:ClampToEdgeWrapping,Clock:Clock,Color:Color$1,ColorKeyframeTrack:ColorKeyframeTrack,CompressedTexture:CompressedTexture,CompressedTextureLoader:CompressedTextureLoader,ConeBufferGeometry:ConeGeometry,ConeGeometry:ConeGeometry,CubeCamera:CubeCamera,CubeReflectionMapping:CubeReflectionMapping,CubeRefractionMapping:CubeRefractionMapping,CubeTexture:CubeTexture,CubeTextureLoader:CubeTextureLoader,CubeUVReflectionMapping:CubeUVReflectionMapping,CubeUVRefractionMapping:CubeUVRefractionMapping,CubicBezierCurve:CubicBezierCurve,CubicBezierCurve3:CubicBezierCurve3,CubicInterpolant:CubicInterpolant,CullFaceBack:CullFaceBack,CullFaceFront:CullFaceFront,CullFaceFrontBack:CullFaceFrontBack,CullFaceNone:CullFaceNone,Curve:Curve,CurvePath:CurvePath,CustomBlending:CustomBlending,CustomToneMapping:CustomToneMapping,CylinderBufferGeometry:CylinderGeometry,CylinderGeometry:CylinderGeometry,Cylindrical:Cylindrical,DataTexture:DataTexture,DataTexture2DArray:DataTexture2DArray,DataTexture3D:DataTexture3D,DataTextureLoader:DataTextureLoader,DataUtils:DataUtils,DecrementStencilOp:DecrementStencilOp,DecrementWrapStencilOp:DecrementWrapStencilOp,DefaultLoadingManager:DefaultLoadingManager,DepthFormat:DepthFormat,DepthStencilFormat:DepthStencilFormat,DepthTexture:DepthTexture,DirectionalLight:DirectionalLight,DirectionalLightHelper:DirectionalLightHelper,DiscreteInterpolant:DiscreteInterpolant,DodecahedronBufferGeometry:DodecahedronGeometry,DodecahedronGeometry:DodecahedronGeometry,DoubleSide:DoubleSide,DstAlphaFactor:DstAlphaFactor,DstColorFactor:DstColorFactor,DynamicBufferAttribute:DynamicBufferAttribute,DynamicCopyUsage:DynamicCopyUsage,DynamicDrawUsage:DynamicDrawUsage,DynamicReadUsage:DynamicReadUsage,EdgesGeometry:EdgesGeometry,EdgesHelper:EdgesHelper,EllipseCurve:EllipseCurve,EqualDepth:EqualDepth,EqualStencilFunc:EqualStencilFunc,EquirectangularReflectionMapping:EquirectangularReflectionMapping,EquirectangularRefractionMapping:EquirectangularRefractionMapping,Euler:Euler,EventDispatcher:EventDispatcher,ExtrudeBufferGeometry:ExtrudeGeometry,ExtrudeGeometry:ExtrudeGeometry,FaceColors:FaceColors,FileLoader:FileLoader,FlatShading:FlatShading,Float16BufferAttribute:Float16BufferAttribute,Float32Attribute:Float32Attribute,Float32BufferAttribute:Float32BufferAttribute,Float64Attribute:Float64Attribute,Float64BufferAttribute:Float64BufferAttribute,FloatType:FloatType$1,Fog:Fog,FogExp2:FogExp2,Font:Font,FontLoader:FontLoader,FrontSide:FrontSide,Frustum:Frustum$1,GLBufferAttribute:GLBufferAttribute,GLSL1:GLSL1,GLSL3:GLSL3,GammaEncoding:GammaEncoding,GreaterDepth:GreaterDepth,GreaterEqualDepth:GreaterEqualDepth,GreaterEqualStencilFunc:GreaterEqualStencilFunc,GreaterStencilFunc:GreaterStencilFunc,GridHelper:GridHelper,Group:Group,HalfFloatType:HalfFloatType,HemisphereLight:HemisphereLight$1,HemisphereLightHelper:HemisphereLightHelper,HemisphereLightProbe:HemisphereLightProbe,IcosahedronBufferGeometry:IcosahedronGeometry,IcosahedronGeometry:IcosahedronGeometry,ImageBitmapLoader:ImageBitmapLoader,ImageLoader:ImageLoader,ImageUtils:ImageUtils,ImmediateRenderObject:ImmediateRenderObject,IncrementStencilOp:IncrementStencilOp,IncrementWrapStencilOp:IncrementWrapStencilOp,InstancedBufferAttribute:InstancedBufferAttribute,InstancedBufferGeometry:InstancedBufferGeometry,InstancedInterleavedBuffer:InstancedInterleavedBuffer,InstancedMesh:InstancedMesh,Int16Attribute:Int16Attribute,Int16BufferAttribute:Int16BufferAttribute,Int32Attribute:Int32Attribute,Int32BufferAttribute:Int32BufferAttribute,Int8Attribute:Int8Attribute,Int8BufferAttribute:Int8BufferAttribute,IntType:IntType,InterleavedBuffer:InterleavedBuffer,InterleavedBufferAttribute:InterleavedBufferAttribute,Interpolant:Interpolant,InterpolateDiscrete:InterpolateDiscrete,InterpolateLinear:InterpolateLinear,InterpolateSmooth:InterpolateSmooth,InvertStencilOp:InvertStencilOp,JSONLoader:JSONLoader,KeepStencilOp:KeepStencilOp,KeyframeTrack:KeyframeTrack,LOD:LOD,LatheBufferGeometry:LatheGeometry,LatheGeometry:LatheGeometry,Layers:Layers,LensFlare:LensFlare,LessDepth:LessDepth,LessEqualDepth:LessEqualDepth,LessEqualStencilFunc:LessEqualStencilFunc,LessStencilFunc:LessStencilFunc,Light:Light$1,LightProbe:LightProbe,Line:Line$1,Line3:Line3,LineBasicMaterial:LineBasicMaterial,LineCurve:LineCurve,LineCurve3:LineCurve3,LineDashedMaterial:LineDashedMaterial,LineLoop:LineLoop,LinePieces:LinePieces,LineSegments:LineSegments,LineStrip:LineStrip,LinearEncoding:LinearEncoding,LinearFilter:LinearFilter,LinearInterpolant:LinearInterpolant,LinearMipMapLinearFilter:LinearMipMapLinearFilter,LinearMipMapNearestFilter:LinearMipMapNearestFilter,LinearMipmapLinearFilter:LinearMipmapLinearFilter,LinearMipmapNearestFilter:LinearMipmapNearestFilter,LinearToneMapping:LinearToneMapping,Loader:Loader$1,LoaderUtils:LoaderUtils,LoadingManager:LoadingManager,LogLuvEncoding:LogLuvEncoding,LoopOnce:LoopOnce,LoopPingPong:LoopPingPong,LoopRepeat:LoopRepeat,LuminanceAlphaFormat:LuminanceAlphaFormat,LuminanceFormat:LuminanceFormat,MOUSE:MOUSE,Material:Material,MaterialLoader:MaterialLoader,Math:MathUtils,MathUtils:MathUtils,Matrix3:Matrix3,Matrix4:Matrix4,MaxEquation:MaxEquation,Mesh:Mesh,MeshBasicMaterial:MeshBasicMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshFaceMaterial:MeshFaceMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshMatcapMaterial:MeshMatcapMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshToonMaterial:MeshToonMaterial,MinEquation:MinEquation,MirroredRepeatWrapping:MirroredRepeatWrapping,MixOperation:MixOperation,MultiMaterial:MultiMaterial,MultiplyBlending:MultiplyBlending,MultiplyOperation:MultiplyOperation,NearestFilter:NearestFilter,NearestMipMapLinearFilter:NearestMipMapLinearFilter,NearestMipMapNearestFilter:NearestMipMapNearestFilter,NearestMipmapLinearFilter:NearestMipmapLinearFilter,NearestMipmapNearestFilter:NearestMipmapNearestFilter,NeverDepth:NeverDepth,NeverStencilFunc:NeverStencilFunc,NoBlending:NoBlending,NoColors:NoColors,NoToneMapping:NoToneMapping,NormalAnimationBlendMode:NormalAnimationBlendMode,NormalBlending:NormalBlending,NotEqualDepth:NotEqualDepth,NotEqualStencilFunc:NotEqualStencilFunc,NumberKeyframeTrack:NumberKeyframeTrack,Object3D:Object3D,ObjectLoader:ObjectLoader,ObjectSpaceNormalMap:ObjectSpaceNormalMap,OctahedronBufferGeometry:OctahedronGeometry,OctahedronGeometry:OctahedronGeometry,OneFactor:OneFactor,OneMinusDstAlphaFactor:OneMinusDstAlphaFactor,OneMinusDstColorFactor:OneMinusDstColorFactor,OneMinusSrcAlphaFactor:OneMinusSrcAlphaFactor,OneMinusSrcColorFactor:OneMinusSrcColorFactor,OrthographicCamera:OrthographicCamera,PCFShadowMap:PCFShadowMap,PCFSoftShadowMap:PCFSoftShadowMap,PMREMGenerator:PMREMGenerator,ParametricBufferGeometry:ParametricGeometry,ParametricGeometry:ParametricGeometry,Particle:Particle,ParticleBasicMaterial:ParticleBasicMaterial,ParticleSystem:ParticleSystem,ParticleSystemMaterial:ParticleSystemMaterial,Path:Path,PerspectiveCamera:PerspectiveCamera,Plane:Plane$1,PlaneBufferGeometry:PlaneGeometry,PlaneGeometry:PlaneGeometry,PlaneHelper:PlaneHelper,PointCloud:PointCloud,PointCloudMaterial:PointCloudMaterial,PointLight:PointLight$1,PointLightHelper:PointLightHelper,Points:Points,PointsMaterial:PointsMaterial,PolarGridHelper:PolarGridHelper,PolyhedronBufferGeometry:PolyhedronGeometry,PolyhedronGeometry:PolyhedronGeometry,PositionalAudio:PositionalAudio,PropertyBinding:PropertyBinding,PropertyMixer:PropertyMixer,QuadraticBezierCurve:QuadraticBezierCurve,QuadraticBezierCurve3:QuadraticBezierCurve3,Quaternion:Quaternion,QuaternionKeyframeTrack:QuaternionKeyframeTrack,QuaternionLinearInterpolant:QuaternionLinearInterpolant,REVISION:REVISION,RGBADepthPacking:RGBADepthPacking,RGBAFormat:RGBAFormat,RGBAIntegerFormat:RGBAIntegerFormat,RGBA_ASTC_10x10_Format:RGBA_ASTC_10x10_Format,RGBA_ASTC_10x5_Format:RGBA_ASTC_10x5_Format,RGBA_ASTC_10x6_Format:RGBA_ASTC_10x6_Format,RGBA_ASTC_10x8_Format:RGBA_ASTC_10x8_Format,RGBA_ASTC_12x10_Format:RGBA_ASTC_12x10_Format,RGBA_ASTC_12x12_Format:RGBA_ASTC_12x12_Format,RGBA_ASTC_4x4_Format:RGBA_ASTC_4x4_Format,RGBA_ASTC_5x4_Format:RGBA_ASTC_5x4_Format,RGBA_ASTC_5x5_Format:RGBA_ASTC_5x5_Format,RGBA_ASTC_6x5_Format:RGBA_ASTC_6x5_Format,RGBA_ASTC_6x6_Format:RGBA_ASTC_6x6_Format,RGBA_ASTC_8x5_Format:RGBA_ASTC_8x5_Format,RGBA_ASTC_8x6_Format:RGBA_ASTC_8x6_Format,RGBA_ASTC_8x8_Format:RGBA_ASTC_8x8_Format,RGBA_BPTC_Format:RGBA_BPTC_Format,RGBA_ETC2_EAC_Format:RGBA_ETC2_EAC_Format,RGBA_PVRTC_2BPPV1_Format:RGBA_PVRTC_2BPPV1_Format,RGBA_PVRTC_4BPPV1_Format:RGBA_PVRTC_4BPPV1_Format,RGBA_S3TC_DXT1_Format:RGBA_S3TC_DXT1_Format,RGBA_S3TC_DXT3_Format:RGBA_S3TC_DXT3_Format,RGBA_S3TC_DXT5_Format:RGBA_S3TC_DXT5_Format,RGBDEncoding:RGBDEncoding,RGBEEncoding:RGBEEncoding,RGBEFormat:RGBEFormat,RGBFormat:RGBFormat,RGBIntegerFormat:RGBIntegerFormat,RGBM16Encoding:RGBM16Encoding,RGBM7Encoding:RGBM7Encoding,RGB_ETC1_Format:RGB_ETC1_Format,RGB_ETC2_Format:RGB_ETC2_Format,RGB_PVRTC_2BPPV1_Format:RGB_PVRTC_2BPPV1_Format,RGB_PVRTC_4BPPV1_Format:RGB_PVRTC_4BPPV1_Format,RGB_S3TC_DXT1_Format:RGB_S3TC_DXT1_Format,RGFormat:RGFormat,RGIntegerFormat:RGIntegerFormat,RawShaderMaterial:RawShaderMaterial,Ray:Ray,Raycaster:Raycaster,RectAreaLight:RectAreaLight,RedFormat:RedFormat,RedIntegerFormat:RedIntegerFormat,ReinhardToneMapping:ReinhardToneMapping,RepeatWrapping:RepeatWrapping$1,ReplaceStencilOp:ReplaceStencilOp,ReverseSubtractEquation:ReverseSubtractEquation,RingBufferGeometry:RingGeometry,RingGeometry:RingGeometry,SRGB8_ALPHA8_ASTC_10x10_Format:SRGB8_ALPHA8_ASTC_10x10_Format,SRGB8_ALPHA8_ASTC_10x5_Format:SRGB8_ALPHA8_ASTC_10x5_Format,SRGB8_ALPHA8_ASTC_10x6_Format:SRGB8_ALPHA8_ASTC_10x6_Format,SRGB8_ALPHA8_ASTC_10x8_Format:SRGB8_ALPHA8_ASTC_10x8_Format,SRGB8_ALPHA8_ASTC_12x10_Format:SRGB8_ALPHA8_ASTC_12x10_Format,SRGB8_ALPHA8_ASTC_12x12_Format:SRGB8_ALPHA8_ASTC_12x12_Format,SRGB8_ALPHA8_ASTC_4x4_Format:SRGB8_ALPHA8_ASTC_4x4_Format,SRGB8_ALPHA8_ASTC_5x4_Format:SRGB8_ALPHA8_ASTC_5x4_Format,SRGB8_ALPHA8_ASTC_5x5_Format:SRGB8_ALPHA8_ASTC_5x5_Format,SRGB8_ALPHA8_ASTC_6x5_Format:SRGB8_ALPHA8_ASTC_6x5_Format,SRGB8_ALPHA8_ASTC_6x6_Format:SRGB8_ALPHA8_ASTC_6x6_Format,SRGB8_ALPHA8_ASTC_8x5_Format:SRGB8_ALPHA8_ASTC_8x5_Format,SRGB8_ALPHA8_ASTC_8x6_Format:SRGB8_ALPHA8_ASTC_8x6_Format,SRGB8_ALPHA8_ASTC_8x8_Format:SRGB8_ALPHA8_ASTC_8x8_Format,Scene:Scene$2,SceneUtils:SceneUtils,ShaderChunk:ShaderChunk,ShaderLib:ShaderLib,ShaderMaterial:ShaderMaterial,ShadowMaterial:ShadowMaterial,Shape:Shape,ShapeBufferGeometry:ShapeGeometry,ShapeGeometry:ShapeGeometry,ShapePath:ShapePath,ShapeUtils:ShapeUtils,ShortType:ShortType,Skeleton:Skeleton,SkeletonHelper:SkeletonHelper,SkinnedMesh:SkinnedMesh,SmoothShading:SmoothShading,Sphere:Sphere$1,SphereBufferGeometry:SphereGeometry,SphereGeometry:SphereGeometry,Spherical:Spherical,SphericalHarmonics3:SphericalHarmonics3,SplineCurve:SplineCurve,SpotLight:SpotLight$1,SpotLightHelper:SpotLightHelper,Sprite:Sprite$1,SpriteMaterial:SpriteMaterial,SrcAlphaFactor:SrcAlphaFactor,SrcAlphaSaturateFactor:SrcAlphaSaturateFactor,SrcColorFactor:SrcColorFactor,StaticCopyUsage:StaticCopyUsage,StaticDrawUsage:StaticDrawUsage,StaticReadUsage:StaticReadUsage,StereoCamera:StereoCamera,StreamCopyUsage:StreamCopyUsage,StreamDrawUsage:StreamDrawUsage,StreamReadUsage:StreamReadUsage,StringKeyframeTrack:StringKeyframeTrack,SubtractEquation:SubtractEquation,SubtractiveBlending:SubtractiveBlending,TOUCH:TOUCH,TangentSpaceNormalMap:TangentSpaceNormalMap,TetrahedronBufferGeometry:TetrahedronGeometry,TetrahedronGeometry:TetrahedronGeometry,TextBufferGeometry:TextGeometry,TextGeometry:TextGeometry,Texture:Texture,TextureLoader:TextureLoader,TorusBufferGeometry:TorusGeometry,TorusGeometry:TorusGeometry,TorusKnotBufferGeometry:TorusKnotGeometry,TorusKnotGeometry:TorusKnotGeometry,Triangle:Triangle,TriangleFanDrawMode:TriangleFanDrawMode,TriangleStripDrawMode:TriangleStripDrawMode,TrianglesDrawMode:TrianglesDrawMode,TubeBufferGeometry:TubeGeometry,TubeGeometry:TubeGeometry,UVMapping:UVMapping,Uint16Attribute:Uint16Attribute,Uint16BufferAttribute:Uint16BufferAttribute,Uint32Attribute:Uint32Attribute,Uint32BufferAttribute:Uint32BufferAttribute,Uint8Attribute:Uint8Attribute,Uint8BufferAttribute:Uint8BufferAttribute,Uint8ClampedAttribute:Uint8ClampedAttribute,Uint8ClampedBufferAttribute:Uint8ClampedBufferAttribute,Uniform:Uniform,UniformsLib:UniformsLib,UniformsUtils:UniformsUtils,UnsignedByteType:UnsignedByteType,UnsignedInt248Type:UnsignedInt248Type,UnsignedIntType:UnsignedIntType,UnsignedShort4444Type:UnsignedShort4444Type,UnsignedShort5551Type:UnsignedShort5551Type,UnsignedShort565Type:UnsignedShort565Type,UnsignedShortType:UnsignedShortType,VSMShadowMap:VSMShadowMap,Vector2:Vector2,Vector3:Vector3$1,Vector4:Vector4,VectorKeyframeTrack:VectorKeyframeTrack,Vertex:Vertex,VertexColors:VertexColors,VideoTexture:VideoTexture,WebGL1Renderer:WebGL1Renderer,WebGLCubeRenderTarget:WebGLCubeRenderTarget,WebGLMultisampleRenderTarget:WebGLMultisampleRenderTarget,WebGLRenderTarget:WebGLRenderTarget,WebGLRenderTargetCube:WebGLRenderTargetCube,WebGLRenderer:WebGLRenderer,WebGLUtils:WebGLUtils,WireframeGeometry:WireframeGeometry,WireframeHelper:WireframeHelper,WrapAroundEnding:WrapAroundEnding,XHRLoader:XHRLoader,ZeroCurvatureEnding:ZeroCurvatureEnding,ZeroFactor:ZeroFactor,ZeroSlopeEnding:ZeroSlopeEnding,ZeroStencilOp:ZeroStencilOp,sRGBEncoding:sRGBEncoding});var PREFIX = "[Mage]";
53922
+ var DEPRECATED = "[DEPRECATED]";
53944
53923
  var DEPRECATIONS = {
53945
53924
  PARTICLES_ADD_PARTICLE_EMITTER: "".concat(PREFIX, " ").concat(DEPRECATED, " Particles.addParticleEmitter is deprecated, use Particles.add instead. Will be removed in the next major release"),
53946
53925
  MODELS_GETMODEL: "".concat(PREFIX, " ").concat(DEPRECATED, " Models.getModel is deprecated, use Models.get instead. Will be removed in next major release"),
53947
53926
  SCRIPTS_CREATE: "".concat(PREFIX, " ").concat(DEPRECATED, " Scripts.create is deprecated, use Scripts.register instead. Will be removed in next major release."),
53948
- ELEMENT_SET_TEXTURE_MAP: "".concat(PREFIX, " ").concat(DEPRECATED, " Element.setTextureMap is deprecated, use Element.setTexture() instead. Will be removed in next major release.")
53927
+ ELEMENT_SET_TEXTURE_MAP: "".concat(PREFIX, " ").concat(DEPRECATED, " Element.setTextureMap is deprecated, use Element.setTexture() instead. Will be removed in next major release."),
53928
+ SET_ORBIT_CONTROL: "".concat(PREFIX, " ").concat(DEPRECATED, " Controls.setOrbitControl() is deprecated, use Controls.setOrbitControls() instead. Will be removed in next major release."),
53929
+ SET_TRANSFORM_CONTROL: "".concat(PREFIX, " ").concat(DEPRECATED, " Controls.setTransformControl() is deprecated, use Controls.setTransformControls() instead. Will be removed in next major release."),
53930
+ SET_FIRST_PERSON_CONTROL: "".concat(PREFIX, " ").concat(DEPRECATED, " Controls.setFirstPersonControl() is deprecated, use Controls.setFirstPersonControls() instead. Will be removed in next major release."),
53931
+ SET_FLY_CONTROL: "".concat(PREFIX, " ").concat(DEPRECATED, " Controls.setFlyControl() is deprecated, use Controls.setFlyControls() instead. Will be removed in next major release.")
53949
53932
  };
53950
53933
  var ONCREATE_NOT_AVAILABLE = "".concat(PREFIX, " Your scene needs a onCreate method.");
53951
53934
  var PATH_NOT_FOUND = "".concat(PREFIX, " can't find requested path");
@@ -53990,6 +53973,11 @@ var LABEL_DOMELEMENT_MISSING = "".concat(PREFIX, " Could not create Label, domEl
53990
53973
  value: function __check() {
53991
53974
  return true;
53992
53975
  }
53976
+ }, {
53977
+ key: "__isStatic",
53978
+ value: function __isStatic() {
53979
+ return false;
53980
+ }
53993
53981
  }, {
53994
53982
  key: "__hasStarted",
53995
53983
  value: function __hasStarted() {
@@ -54017,6 +54005,7 @@ var LABEL_DOMELEMENT_MISSING = "".concat(PREFIX, " Could not create Label, domEl
54017
54005
 
54018
54006
  this.__name = name || this.constructor.name;
54019
54007
  this.hasStarted = false;
54008
+ this.isDisposed = false;
54020
54009
  this.options = {};
54021
54010
  }
54022
54011
 
@@ -54730,7 +54719,52 @@ var Keyboard = /*#__PURE__*/function (_EventDispatcher) {
54730
54719
  }]);
54731
54720
 
54732
54721
  return Keyboard;
54733
- }(EventDispatcher);var SHADOW_TYPES = {
54722
+ }(EventDispatcher);var ENTITY_TYPES = {
54723
+ SCENE: 'SCENE',
54724
+ CAMERA: 'CAMERA',
54725
+ MESH: 'MESH',
54726
+ LABEL: 'LABEL',
54727
+ LIGHT: {
54728
+ DEFAULT: 'LIGHT.DEFAULT',
54729
+ AMBIENT: 'LIGHT.AMBIENT',
54730
+ SUN: 'LIGHT.SUN',
54731
+ HEMISPHERE: 'LIGHT.HEMISPHERE',
54732
+ POINT: 'LIGHT.POINT',
54733
+ SPOT: 'LIGHT.SPOT'
54734
+ },
54735
+ AUDIO: {
54736
+ DEFAULT: 'AUDIO.DEFAULT',
54737
+ DIRECTIONAL: 'AUDIO.DIRECTIONAL',
54738
+ AMBIENT: 'AUDIO.AMBIENT'
54739
+ },
54740
+ MODEL: 'MODEL',
54741
+ SPRITE: 'SPRITE',
54742
+ PARTICLE: 'PARTICLE',
54743
+ EFFECT: {
54744
+ PARTICLE: 'EFFECT.PARTICLE',
54745
+ SCENERY: 'EFFECT.SCENERY'
54746
+ },
54747
+ HELPER: {
54748
+ GRID: 'HELPER.GRID',
54749
+ AXES: 'HELPER.AXES'
54750
+ },
54751
+ UNKNOWN: 'UNKNOWN'
54752
+ };
54753
+ var FLAT_ENTITY_TYPES = [ENTITY_TYPES.SCENE, ENTITY_TYPES.CAMERA, ENTITY_TYPES.MESH, ENTITY_TYPES.LABEL, ENTITY_TYPES.LIGHT.DEFAULT, ENTITY_TYPES.LIGHT.AMBIENT, ENTITY_TYPES.LIGHT.SUN, ENTITY_TYPES.LIGHT.HEMISPHERE, ENTITY_TYPES.LIGHT.POINT, ENTITY_TYPES.LIGHT.SPOT, ENTITY_TYPES.AUDIO.DEFAULT, ENTITY_TYPES.AUDIO.AMBIENT, ENTITY_TYPES.AUDIO.DIRECTIONAL, ENTITY_TYPES.AUDIO.BACKGROUND, ENTITY_TYPES.MODEL, ENTITY_TYPES.SPRITE, ENTITY_TYPES.PARTICLE, ENTITY_TYPES.EFFECT.PARTICLE, ENTITY_TYPES.EFFECT.SCENERY, ENTITY_TYPES.HELPER.GRID, ENTITY_TYPES.HELPER.AXES, ENTITY_TYPES.UNKNOWN];
54754
+ var ENTITY_EVENTS = {
54755
+ DISPOSE: 'DISPOSE',
54756
+ STATE_MACHINE: {
54757
+ CHANGE: 'STATE_MACHINE_CHANGE'
54758
+ },
54759
+ ANIMATION: {
54760
+ LOOP: 'LOOP',
54761
+ FINISHED: 'FINISHED'
54762
+ },
54763
+ AUDIO: {
54764
+ ENDED: 'ended'
54765
+ }
54766
+ };
54767
+ var DEFAULT_TAG = 'all';var SHADOW_TYPES = {
54734
54768
  BASIC: 'BASIC',
54735
54769
  SOFT: 'SOFT',
54736
54770
  HARD: 'HARD'
@@ -55082,12 +55116,12 @@ var Universe$1 = new Universe();var generateUUID = function generateUUID() {
55082
55116
  var generateRandomName = function generateRandomName(prefix) {
55083
55117
  return "".concat(prefix, "_").concat(generateUUID());
55084
55118
  };var uuid$1=/*#__PURE__*/Object.freeze({__proto__:null,generateUUID:generateUUID,generateRandomName:generateRandomName});var ALMOST_ZERO = 0.00001;
55085
- var UP$1 = 'UP';
55086
- var DOWN$1 = 'DOWN';
55087
- var LEFT = 'LEFT';
55088
- var RIGHT = 'RIGHT';
55089
- var FRONT = 'FRONT';
55090
- var BACK = 'BACK';
55119
+ var UP$1 = "UP";
55120
+ var DOWN$1 = "DOWN";
55121
+ var LEFT = "LEFT";
55122
+ var RIGHT = "RIGHT";
55123
+ var FRONT = "FRONT";
55124
+ var BACK = "BACK";
55091
55125
  var VECTOR_UP = {
55092
55126
  type: UP$1,
55093
55127
  vector: new Vector3$1(0, 1, 0)
@@ -55115,54 +55149,54 @@ var VECTOR_BACK = {
55115
55149
  var ORIGIN = new Vector3$1(0, 0, 0);
55116
55150
  var ZERO_QUATERNION = new Quaternion().identity();
55117
55151
  var MATERIALS = {
55118
- BASIC: 'BASIC',
55119
- LAMBERT: 'LAMBERT',
55120
- PHONG: 'PHONG',
55121
- DEPTH: 'DEPTH',
55122
- STANDARD: 'STANDARD',
55123
- TOON: 'TOOM',
55124
- THREE_TOON: 'THREE_TOON'
55152
+ BASIC: "BASIC",
55153
+ LAMBERT: "LAMBERT",
55154
+ PHONG: "PHONG",
55155
+ DEPTH: "DEPTH",
55156
+ STANDARD: "STANDARD",
55157
+ TOON: "TOOM",
55158
+ THREE_TOON: "THREE_TOON"
55125
55159
  };
55126
55160
  var TEXTURES = {
55127
- ALPHA: 'alphaMap',
55128
- AO: 'aoMap',
55129
- ENV: 'envMap',
55130
- MAP: 'map',
55131
- LIGHT: 'lightMap',
55132
- SPECULAR: 'specularMap',
55133
- EMISSIVE: 'emissiveMap',
55134
- BUMP: 'bumpMap',
55135
- DISPLACEMENT: 'displacementMap',
55136
- NORMAL: 'normalMap',
55137
- METALNESS: 'metalnessMap',
55138
- ROUGHNESS: 'roughnessMap',
55139
- GRADIENT: 'gradientMap'
55161
+ ALPHA: "alphaMap",
55162
+ AO: "aoMap",
55163
+ ENV: "envMap",
55164
+ MAP: "map",
55165
+ LIGHT: "lightMap",
55166
+ SPECULAR: "specularMap",
55167
+ EMISSIVE: "emissiveMap",
55168
+ BUMP: "bumpMap",
55169
+ DISPLACEMENT: "displacementMap",
55170
+ NORMAL: "normalMap",
55171
+ METALNESS: "metalnessMap",
55172
+ ROUGHNESS: "roughnessMap",
55173
+ GRADIENT: "gradientMap"
55140
55174
  };
55141
55175
  var EFFECTS = {
55142
- SEPIA: 'SEPIAEFFECT',
55143
- HUE_SATURATION: 'HUESATURATIONEFFECT',
55144
- BLOOM: 'BLOOM',
55145
- DEPTH_OF_FIELD: 'DOF',
55146
- SELECTIVE_OUTLINE: 'SELECTIVEOUTLINE',
55147
- OUTLINE: 'OUTLINE',
55148
- GLITCH: 'GLITCH',
55149
- PIXEL: 'PIXEL'
55176
+ SEPIA: "SEPIAEFFECT",
55177
+ HUE_SATURATION: "HUESATURATIONEFFECT",
55178
+ BLOOM: "BLOOM",
55179
+ DEPTH_OF_FIELD: "DOF",
55180
+ SELECTIVE_OUTLINE: "SELECTIVEOUTLINE",
55181
+ OUTLINE: "OUTLINE",
55182
+ GLITCH: "GLITCH",
55183
+ PIXEL: "PIXEL"
55150
55184
  };
55151
- var COLLISION_EVENT = 'COLLISION_EVENT';
55185
+ var COLLISION_EVENT = "COLLISION_EVENT";
55152
55186
  var COLORS = {
55153
- WHITE: '#ffffff',
55154
- BLACK: '#000000'
55187
+ WHITE: "#ffffff",
55188
+ BLACK: "#000000"
55155
55189
  };
55156
55190
  var ASSETS_TYPES = {
55157
- AUDIO: 'audio',
55158
- VIDEO: 'video',
55159
- IMAGES: 'images',
55160
- TEXTURES: 'textures',
55161
- CUBETEXTURES: 'cubetextures',
55162
- MODELS: 'models',
55163
- PARTICLES: 'particles',
55164
- SCRIPTS: 'scripts',
55165
- SHADERS: 'shaders'
55191
+ AUDIO: "audio",
55192
+ VIDEO: "video",
55193
+ IMAGES: "images",
55194
+ TEXTURES: "textures",
55195
+ CUBETEXTURES: "cubetextures",
55196
+ MODELS: "models",
55197
+ PARTICLES: "particles",
55198
+ SCRIPTS: "scripts",
55199
+ SHADERS: "shaders"
55166
55200
  };
55167
55201
  var OUTPUT_ENCODINGS = {
55168
55202
  LINEAR: LinearEncoding,
@@ -55176,14 +55210,21 @@ var OUTPUT_ENCODINGS = {
55176
55210
  RGBADEPTH: RGBADepthPacking
55177
55211
  };
55178
55212
  var DEFAULT_OUTPUT_ENCODING = OUTPUT_ENCODINGS.LINEAR;
55179
- var ROOT = '/';
55180
- var DIVIDER = '/';
55181
- var HASH = '#';
55182
- var EMPTY$2 = '';
55183
- var QUERY_START = '?';
55184
- var DEFAULT_SELECTOR = '#gameContainer';
55185
- var BEFORE_UNLOAD = 'beforeunload';
55186
- var HASH_CHANGE = 'hashchange';var lib_constants=/*#__PURE__*/Object.freeze({__proto__:null,ALMOST_ZERO:ALMOST_ZERO,UP:UP$1,DOWN:DOWN$1,LEFT:LEFT,RIGHT:RIGHT,FRONT:FRONT,BACK:BACK,VECTOR_UP:VECTOR_UP,VECTOR_DOWN:VECTOR_DOWN,VECTOR_LEFT:VECTOR_LEFT,VECTOR_RIGHT:VECTOR_RIGHT,VECTOR_FRONT:VECTOR_FRONT,VECTOR_BACK:VECTOR_BACK,ORIGIN:ORIGIN,ZERO_QUATERNION:ZERO_QUATERNION,MATERIALS:MATERIALS,TEXTURES:TEXTURES,EFFECTS:EFFECTS,COLLISION_EVENT:COLLISION_EVENT,COLORS:COLORS,ASSETS_TYPES:ASSETS_TYPES,OUTPUT_ENCODINGS:OUTPUT_ENCODINGS,DEFAULT_OUTPUT_ENCODING:DEFAULT_OUTPUT_ENCODING,ROOT:ROOT,DIVIDER:DIVIDER,HASH:HASH,EMPTY:EMPTY$2,QUERY_START:QUERY_START,DEFAULT_SELECTOR:DEFAULT_SELECTOR,BEFORE_UNLOAD:BEFORE_UNLOAD,HASH_CHANGE:HASH_CHANGE});var buildAssetId = function buildAssetId(name, level) {
55213
+ var ROOT = "/";
55214
+ var DIVIDER = "/";
55215
+ var HASH = "#";
55216
+ var EMPTY$2 = "";
55217
+ var QUERY_START = "?";
55218
+ var DEFAULT_SELECTOR = "#gameContainer";
55219
+ var BEFORE_UNLOAD = "beforeunload";
55220
+ var HASH_CHANGE = "hashchange";
55221
+ var TAGS = {
55222
+ LIGHTS: {
55223
+ HOLDER: "TAGS.LIGHTS.HOLDER",
55224
+ HELPER: "TAGS.LIGHTS.HELPER",
55225
+ TARGET: "TAGS.LIGHTS.TARGET"
55226
+ }
55227
+ };var lib_constants=/*#__PURE__*/Object.freeze({__proto__:null,ALMOST_ZERO:ALMOST_ZERO,UP:UP$1,DOWN:DOWN$1,LEFT:LEFT,RIGHT:RIGHT,FRONT:FRONT,BACK:BACK,VECTOR_UP:VECTOR_UP,VECTOR_DOWN:VECTOR_DOWN,VECTOR_LEFT:VECTOR_LEFT,VECTOR_RIGHT:VECTOR_RIGHT,VECTOR_FRONT:VECTOR_FRONT,VECTOR_BACK:VECTOR_BACK,ORIGIN:ORIGIN,ZERO_QUATERNION:ZERO_QUATERNION,MATERIALS:MATERIALS,TEXTURES:TEXTURES,EFFECTS:EFFECTS,COLLISION_EVENT:COLLISION_EVENT,COLORS:COLORS,ASSETS_TYPES:ASSETS_TYPES,OUTPUT_ENCODINGS:OUTPUT_ENCODINGS,DEFAULT_OUTPUT_ENCODING:DEFAULT_OUTPUT_ENCODING,ROOT:ROOT,DIVIDER:DIVIDER,HASH:HASH,EMPTY:EMPTY$2,QUERY_START:QUERY_START,DEFAULT_SELECTOR:DEFAULT_SELECTOR,BEFORE_UNLOAD:BEFORE_UNLOAD,HASH_CHANGE:HASH_CHANGE,TAGS:TAGS});var buildAssetId = function buildAssetId(name, level) {
55187
55228
  return level ? "".concat(level, "_").concat(name) : name;
55188
55229
  };
55189
55230
  var isLevelName = function isLevelName(level) {
@@ -55356,7 +55397,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
55356
55397
  url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
55357
55398
  return new Worker(url, options);
55358
55399
  };
55359
- }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczplbGVtZW50OnJlc2V0JywKICAgICAgICBBUFBMWTogewogICAgICAgICAgSU1QVUxTRTogJ3BoeXNpY3M6ZWxlbWVudDphcHBseTppbXB1bHNlJwogICAgICAgIH0KICAgICAgfSwKICAgICAgVkVISUNMRTogewogICAgICAgIFNFVDogewogICAgICAgICAgUE9TSVRJT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnBvc2l0aW9uJywKICAgICAgICAgIFFVQVRFUk5JT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnF1YXRlcm5pb24nCiAgICAgICAgfSwKICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsCiAgICAgICAgU1BFRUQ6ICdwaHlzaWNzOnZlaGljbGU6c3BlZWQnLAogICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nCiAgICAgIH0sCiAgICAgIEVGRkVDVFM6IHsKICAgICAgICBFWFBMT1NJT046ICdwaHlzaWNzOmVmZmVjdHM6ZXhwbG9zaW9uJwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgewogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CgogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkgewogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OwogICAgICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7CiAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgfSk7CiAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBEaXNwYXRjaGVyID0gZnVuY3Rpb24gRGlzcGF0Y2hlcigpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BhdGNoZXIpOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUGh5c2ljc1VwZGF0ZSIsIGZ1bmN0aW9uIChkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuVVBEQVRFLAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUmVhZHlFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kVGVybWluYXRlRXZlbnQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEUKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRCb2R5VXBkYXRlIiwgZnVuY3Rpb24gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZShfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9CiAgICAgICAgfSwgZXh0cmFEYXRhKSwge30sIHsKICAgICAgICAgIGR0OiBkdAogICAgICAgIH0pKTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmREaXNwYXRjaEV2ZW50IiwgZnVuY3Rpb24gKHV1aWQsIGV2ZW50TmFtZSwgZXZlbnREYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5ESVNQQVRDSCwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKICAgICAgICAgIGV2ZW50RGF0YTogZXZlbnREYXRhCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICAgIHZhciBkaXNwYXRjaGVyJDEgPSBuZXcgRGlzcGF0Y2hlcigpOwoKICAgIHZhciBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSBmdW5jdGlvbiBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoX3JlZikgewogICAgICB2YXIgX3JlZiR4ID0gX3JlZi54LAogICAgICAgICAgeCA9IF9yZWYkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeCwKICAgICAgICAgIF9yZWYkeSA9IF9yZWYueSwKICAgICAgICAgIHkgPSBfcmVmJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHksCiAgICAgICAgICBfcmVmJHogPSBfcmVmLnosCiAgICAgICAgICB6ID0gX3JlZiR6ID09PSB2b2lkIDAgPyAwIDogX3JlZiR6OwogICAgICB2YXIgbWF0cml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTsKICAgICAgdmFyIHcgPSAxIC8gKG1hdHJpeFszXSAqIHggKyBtYXRyaXhbN10gKiB5ICsgbWF0cml4WzExXSAqIHogKyBtYXRyaXhbMTVdKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAobWF0cml4WzBdICogeCArIG1hdHJpeFs0XSAqIHkgKyBtYXRyaXhbOF0gKiB6ICsgbWF0cml4WzEyXSkgKiB3LAogICAgICAgIHk6IChtYXRyaXhbMV0gKiB4ICsgbWF0cml4WzVdICogeSArIG1hdHJpeFs5XSAqIHogKyBtYXRyaXhbMTNdKSAqIHcsCiAgICAgICAgejogKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbNl0gKiB5ICsgbWF0cml4WzEwXSAqIHogKyBtYXRyaXhbMTRdKSAqIHcKICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZVJpZ2lkQm9keSA9IGZ1bmN0aW9uIGNyZWF0ZVJpZ2lkQm9keShzaGFwZSwgb3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgX29wdGlvbnMkcmVzdGl0dXRpb24gPSBvcHRpb25zLnJlc3RpdHV0aW9uLAogICAgICAgICAgcmVzdGl0dXRpb24gPSBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9PT0gdm9pZCAwID8gLjkgOiBfb3B0aW9ucyRyZXN0aXR1dGlvbiwKICAgICAgICAgIF9vcHRpb25zJGRhbXBpbmcgPSBvcHRpb25zLmRhbXBpbmcsCiAgICAgICAgICBkYW1waW5nID0gX29wdGlvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gewogICAgICAgIGxpbmVhcjogMC4yLAogICAgICAgIGFuZ3VsYXI6IDAuMgogICAgICB9IDogX29wdGlvbnMkZGFtcGluZzsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIHNoYXBlLmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgcmJJbmZvID0gbmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBzaGFwZSwgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pOwoKICAgICAgaWYgKG1hc3MgPiAwKSB7CiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7CiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7CiAgICAgICAgYm9keS5zZXREYW1waW5nKGRhbXBpbmcubGluZWFyLCBkYW1waW5nLmFuZ3VsYXIpOwogICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgfSAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2UKCgogICAgICBib2R5LnV1aWQgPSB1dWlkOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgIHJldHVybiBib2R5OwogICAgfTsKICAgIHZhciBhZGRNb2RlbCA9IGZ1bmN0aW9uIGFkZE1vZGVsKG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICB2ZXJ0aWNlcyA9IG9wdGlvbnMudmVydGljZXMsCiAgICAgICAgICBtYXRyaWNlcyA9IG9wdGlvbnMubWF0cmljZXMsCiAgICAgICAgICBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIF9vcHRpb25zJG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBtYXNzID0gX29wdGlvbnMkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJG1hc3MsCiAgICAgICAgICBfb3B0aW9ucyRmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9vcHRpb25zJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX29wdGlvbnMkZnJpY3Rpb247CiAgICAgIHZhciBzY2FsZSA9IERFRkFVTFRfU0NBTEU7CiAgICAgIHZhciBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRjID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb21wb25lbnRzID0gdmVydGljZXNbaV07CiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsOwogICAgICAgIHZhciBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTsKCiAgICAgICAgaWYgKGluZGV4KSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluZGV4Lmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgICAgIHZhciBhaSA9IGluZGV4W2pdICogMzsKICAgICAgICAgICAgdmFyIGJpID0gaW5kZXhbaiArIDFdICogMzsKICAgICAgICAgICAgdmFyIGNpID0gaW5kZXhbaiArIDJdICogMzsKICAgICAgICAgICAgdmFyIHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2FpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2FpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1thaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tiaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tiaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYmkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbY2ldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2NpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBjb21wb25lbnRzLmxlbmd0aDsgX2ogKz0gOSkgewogICAgICAgICAgICB2YXIgX3ZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgMF0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDNdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA0XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgNV0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyA2XSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgN10sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDhdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICBidGEuc2V0VmFsdWUoX3ZhLngsIF92YS55LCBfdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZShfdmIueCwgX3ZiLnksIF92Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKF92Yy54LCBfdmMueSwgX3ZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsb2NhbFNjYWxlID0gbmV3IEFtbW8uYnRWZWN0b3IzKHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopOwogICAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7CiAgICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTsKICAgICAgdmFyIGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTsKICAgICAgY29sbGlzaW9uU2hhcGUucmVzb3VyY2VzID0gW3RyaU1lc2hdOwogICAgICBBbW1vLmRlc3Ryb3koYnRhKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yik7CiAgICAgIEFtbW8uZGVzdHJveShidGMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5NRVNILAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkQm94ID0gZnVuY3Rpb24gYWRkQm94KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb247CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogMC41LCBoZWlnaHQgKiAwLjUsIGxlbmd0aCAqIDAuNSkpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5CT1gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRTcGhlcmUgPSBmdW5jdGlvbiBhZGRTcGhlcmUoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHJhZGl1cyA9IGRhdGEucmFkaXVzLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MyID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MyID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzczIsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbjIgPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbjIgPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjI7CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuU1BIRVJFLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0TGluZWFyVmVsb2NpdHkgPSBmdW5jdGlvbiBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgX2RhdGEkdmVsb2NpdHkgPSBkYXRhLnZlbG9jaXR5LAogICAgICAgICAgdmVsb2NpdHkgPSBfZGF0YSR2ZWxvY2l0eSA9PT0gdm9pZCAwID8gREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgOiBfZGF0YSR2ZWxvY2l0eTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTsKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFBvc2l0aW9uID0gZnVuY3Rpb24gc2V0UG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDIgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50Mi5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIHJlc2V0RWxlbWVudCA9IGZ1bmN0aW9uIHJlc2V0RWxlbWVudChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDMgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50My5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIGFwcGx5SW1wdXNlID0gZnVuY3Rpb24gYXBwbHlJbXB1c2UoX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkaW1wdWxzZSA9IF9yZWYuaW1wdWxzZSwKICAgICAgICAgIGltcHVsc2UgPSBfcmVmJGltcHVsc2UgPT09IHZvaWQgMCA/IERFRkFVTFRfSU1QVUxTRSA6IF9yZWYkaW1wdWxzZTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50NC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGltcHVsc2VWZWN0b3IgPSBuZXcgQW1tby5idFZlY3RvcjMoaW1wdWxzZS54LCBpbXB1bHNlLnksIGltcHVsc2Uueik7CiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpOwogICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVFbGVtZW50VXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlRWxlbWVudFVwZGF0ZShfcmVmMiwgZHQpIHsKICAgICAgdmFyIGJvZHkgPSBfcmVmMi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50OwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uOwogICAgICAgICAgdmFyIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbjsKICAgICAgICAgIHN0YXRlLnF1YXRlcm5pb247CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnNpbXVsYXRlLmJpbmQoX3RoaXMpKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJjYWxjdWxhdGVDb2xsaXNpb25zIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGFtbW9EaXNwYXRjaGVyID0gX3RoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7CgogICAgICAgICAgdmFyIG51bU1hbmlmb2xkcyA9IGFtbW9EaXNwYXRjaGVyLmdldE51bU1hbmlmb2xkcygpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTWFuaWZvbGRzOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbnRhY3RNYW5pZm9sZCA9IGFtbW9EaXNwYXRjaGVyLmdldE1hbmlmb2xkQnlJbmRleEludGVybmFsKGkpOwogICAgICAgICAgICB2YXIgcmIwID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MCgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpOyAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHMKCiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTsKICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNvbnRhY3RzOyBqKyspIHsKICAgICAgICAgICAgICB2YXIgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTsKICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTsKICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTAgPSByYjAuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkxID0gcmIxLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25BKCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25CKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QSgpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEIoKTsKICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbewogICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MC55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MS55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMS51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRFbGVtZW50IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInVwZGF0ZUJvZHlTdGF0ZSIsIGZ1bmN0aW9uIChfcmVmKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGU7CgogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUpLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidGVybWluYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmR5bmFtaWNzV29ybGQpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLnNvbHZlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuZGlzcGF0Y2hlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7CiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFRlcm1pbmF0ZUV2ZW50KCk7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuZWxlbWVudHMgPSB7fTsKICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmJyb2FkcGhhc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsOwogICAgICAgIHRoaXMuY2xvY2sgPSBuZXcgQ2xvY2soKTsKICAgICAgfQoKICAgICAgX2NyZWF0ZUNsYXNzKFdvcmxkLCBbewogICAgICAgIGtleTogImRpc3Bvc2VCb2R5IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZUJvZHkoX3JlZjIpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZjIudXVpZDsKICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpOwogICAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpOwogICAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHV1aWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRFbGVtZW50RGlzcG9zZWQoewogICAgICAgICAgICB1dWlkOiB1dWlkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBXb3JsZDsKICAgIH0oKTsKICAgIHZhciB3b3JsZCA9IG5ldyBXb3JsZCgpOwoKICAgIHZhciBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yOwogICAgdmFyIERFRkFVTFRfRlJJQ1RJT04gPSAxMDAwOwogICAgdmFyIERFRkFVTFRfTUFTUyA9IDgwMDsKICAgIHZhciBhZGRWZWhpY2xlID0gZnVuY3Rpb24gYWRkVmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdoZWVscyA9IGRhdGEud2hlZWxzLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyBERUZBVUxUX01BU1MgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgd2lkdGggPSBfZGF0YSR3aWR0aCA9PT0gdm9pZCAwID8gMS44IDogX2RhdGEkd2lkdGgsCiAgICAgICAgICBfZGF0YSRoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIGhlaWdodCA9IF9kYXRhJGhlaWdodCA9PT0gdm9pZCAwID8gLjYgOiBfZGF0YSRoZWlnaHQsCiAgICAgICAgICBfZGF0YSRsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGxlbmd0aCA9IF9kYXRhJGxlbmd0aCA9PT0gdm9pZCAwID8gNCA6IF9kYXRhJGxlbmd0aCwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IERFRkFVTFRfRlJJQ1RJT04gOiBfZGF0YSRmcmljdGlvbiwKICAgICAgICAgIF9kYXRhJHJvbGxJbmZsdWVuY2UgPSBkYXRhLnJvbGxJbmZsdWVuY2UsCiAgICAgICAgICByb2xsSW5mbHVlbmNlID0gX2RhdGEkcm9sbEluZmx1ZW5jZSA9PT0gdm9pZCAwID8gREVGQVVMVF9ST0xMX0lORkxVRU5DRSA6IF9kYXRhJHJvbGxJbmZsdWVuY2UsCiAgICAgICAgICBfZGF0YSR3aGVlbHNPcHRpb25zID0gZGF0YS53aGVlbHNPcHRpb25zLAogICAgICAgICAgd2hlZWxzT3B0aW9ucyA9IF9kYXRhJHdoZWVsc09wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkd2hlZWxzT3B0aW9ucywKICAgICAgICAgIF9kYXRhJHN1c3BlbnNpb25zID0gZGF0YS5zdXNwZW5zaW9ucywKICAgICAgICAgIHN1c3BlbnNpb25zID0gX2RhdGEkc3VzcGVuc2lvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkc3VzcGVuc2lvbnM7CiAgICAgIHZhciBfd2hlZWxzT3B0aW9ucyRiYWNrID0gd2hlZWxzT3B0aW9ucy5iYWNrLAogICAgICAgICAgYmFjayA9IF93aGVlbHNPcHRpb25zJGJhY2sgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkYmFjaywKICAgICAgICAgIF93aGVlbHNPcHRpb25zJGZyb250ID0gd2hlZWxzT3B0aW9ucy5mcm9udCwKICAgICAgICAgIGZyb250ID0gX3doZWVsc09wdGlvbnMkZnJvbnQgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkZnJvbnQ7CiAgICAgIHZhciBfYmFjayRheGlzUG9zaXRpb24gPSBiYWNrLmF4aXNQb3NpdGlvbiwKICAgICAgICAgIGF4aXNQb3NpdGlvbkJhY2sgPSBfYmFjayRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IC0xIDogX2JhY2skYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2JhY2skcmFkaXVzID0gYmFjay5yYWRpdXMsCiAgICAgICAgICB3aGVlbFJhZGl1c0JhY2sgPSBfYmFjayRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2JhY2skcmFkaXVzLAogICAgICAgICAgX2JhY2skaGFsZlRyYWNrID0gYmFjay5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0JhY2sgPSBfYmFjayRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfYmFjayRoYWxmVHJhY2ssCiAgICAgICAgICBfYmFjayRheGlzSGVpZ2h0ID0gYmFjay5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0QmFjayA9IF9iYWNrJGF4aXNIZWlnaHQgPT09IHZvaWQgMCA/IC4zIDogX2JhY2skYXhpc0hlaWdodDsKICAgICAgdmFyIF9mcm9udCRheGlzUG9zaXRpb24gPSBmcm9udC5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25Gcm9udCA9IF9mcm9udCRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IDEuNyA6IF9mcm9udCRheGlzUG9zaXRpb24sCiAgICAgICAgICBfZnJvbnQkcmFkaXVzID0gZnJvbnQucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNGcm9udCA9IF9mcm9udCRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2Zyb250JHJhZGl1cywKICAgICAgICAgIF9mcm9udCRoYWxmVHJhY2sgPSBmcm9udC5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0Zyb250ID0gX2Zyb250JGhhbGZUcmFjayA9PT0gdm9pZCAwID8gMSA6IF9mcm9udCRoYWxmVHJhY2ssCiAgICAgICAgICBfZnJvbnQkYXhpc0hlaWdodCA9IGZyb250LmF4aXNIZWlnaHQsCiAgICAgICAgICB3aGVlbEF4aXNIZWlnaHRGcm9udCA9IF9mcm9udCRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9mcm9udCRheGlzSGVpZ2h0OwogICAgICB2YXIgX3N1c3BlbnNpb25zJHN0aWZmbmVzID0gc3VzcGVuc2lvbnMuc3RpZmZuZXNzLAogICAgICAgICAgc3RpZmZuZXNzID0gX3N1c3BlbnNpb25zJHN0aWZmbmVzID09PSB2b2lkIDAgPyAyMC4wIDogX3N1c3BlbnNpb25zJHN0aWZmbmVzLAogICAgICAgICAgX3N1c3BlbnNpb25zJGRhbXBpbmcgPSBzdXNwZW5zaW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9zdXNwZW5zaW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyAyLjMgOiBfc3VzcGVuc2lvbnMkZGFtcGluZywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRjb21wcmVzcyA9IHN1c3BlbnNpb25zLmNvbXByZXNzaW9uLAogICAgICAgICAgY29tcHJlc3Npb24gPSBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPT09IHZvaWQgMCA/IDQuNCA6IF9zdXNwZW5zaW9ucyRjb21wcmVzcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9IHN1c3BlbnNpb25zLnJlc3RMZW5ndGgsCiAgICAgICAgICByZXN0TGVuZ3RoID0gX3N1c3BlbnNpb25zJHJlc3RMZW5nID09PSB2b2lkIDAgPyAwLjYgOiBfc3VzcGVuc2lvbnMkcmVzdExlbmc7IC8vIENoYXNzaXMKCiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogLjUsIGhlaWdodCAqIC41LCBsZW5ndGggKiAuNSkpOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgZ2VvbWV0cnkuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBjaGFzc2lzID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkobmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBnZW9tZXRyeSwgbG9jYWxJbmVydGlhKSk7CiAgICAgIGNoYXNzaXMuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpOyAvLyBSYXljYXN0IFZlaGljbGUKCiAgICAgIHZhciB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTsKICAgICAgdmFyIHJheUNhc3RlciA9IG5ldyBBbW1vLmJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIod29ybGQuZ2V0RHluYW1pY3NXb3JsZCgpKTsKICAgICAgdmFyIHZlaGljbGUgPSBuZXcgQW1tby5idFJheWNhc3RWZWhpY2xlKHR1bmluZywgY2hhc3NpcywgcmF5Q2FzdGVyKTsKICAgICAgdmVoaWNsZS5zZXRDb29yZGluYXRlU3lzdGVtKDAsIDEsIDIpOwogICAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7CiAgICAgIHZhciB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7CiAgICAgIHZhciB3aGVlbEF4bGVDUyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygtMSwgMCwgMCk7CgogICAgICB2YXIgYWRkV2hlZWwgPSBmdW5jdGlvbiBhZGRXaGVlbChpc0Zyb250LCBwb3MsIHJhZGl1cykgewogICAgICAgIHZhciB3aGVlbEluZm8gPSB2ZWhpY2xlLmFkZFdoZWVsKHBvcywgd2hlZWxEaXJlY3Rpb25DUzAsIHdoZWVsQXhsZUNTLCByZXN0TGVuZ3RoLCByYWRpdXMsIHR1bmluZywgaXNGcm9udCk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ1JlbGF4YXRpb24oZGFtcGluZyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbihjb21wcmVzc2lvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3JvbGxJbmZsdWVuY2Uocm9sbEluZmx1ZW5jZSk7CiAgICAgIH07CgogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMygtd2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tCYWNrLCB3aGVlbEF4aXNIZWlnaHRCYWNrLCBheGlzUG9zaXRpb25CYWNrKSwgd2hlZWxSYWRpdXNCYWNrKTsKICAgICAgdmVoaWNsZS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdHlwZTogVFlQRVMuVkVISUNMRSwKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHZlaGljbGU6IHZlaGljbGUsCiAgICAgICAgd2hlZWxzOiB3aGVlbHMsCiAgICAgICAgb3B0aW9uczogZGF0YSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9WRUhJQ0xFX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUG9zaXRpb24gPSBmdW5jdGlvbiBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFZlaGljbGVRdWF0ZXJuaW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXRWZWhpY2xlID0gZnVuY3Rpb24gcmVzZXRWZWhpY2xlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVWZWhpY2xlVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlVmVoaWNsZVVwZGF0ZShfcmVmLCBkdCkgewogICAgICB2YXIgdmVoaWNsZSA9IF9yZWYudmVoaWNsZSwKICAgICAgICAgIHdoZWVscyA9IF9yZWYud2hlZWxzLAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1ZFSElDTEVfU1RBVEUgOiBfcmVmJHN0YXRlLAogICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLAogICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnM7CiAgICAgIHZhciBicmVha2luZ0ZvcmNlID0gMDsKICAgICAgdmFyIGVuZ2luZUZvcmNlID0gMDsKICAgICAgdmFyIF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9IG9wdGlvbnMuc3RlZXJpbmdDbGFtcCwKICAgICAgICAgIHN0ZWVyaW5nQ2xhbXAgPSBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgOiBfb3B0aW9ucyRzdGVlcmluZ0NsYW0sCiAgICAgICAgICBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPSBvcHRpb25zLnN0ZWVyaW5nSW5jcmVtZW50LAogICAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIDogX29wdGlvbnMkc3RlZXJpbmdJbmNyLAogICAgICAgICAgX29wdGlvbnMkbWF4RW5naW5lRm9yID0gb3B0aW9ucy5tYXhFbmdpbmVGb3JjZSwKICAgICAgICAgIG1heEVuZ2luZUZvcmNlID0gX29wdGlvbnMkbWF4RW5naW5lRm9yID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgOiBfb3B0aW9ucyRtYXhFbmdpbmVGb3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPSBvcHRpb25zLm1heEJyZWFraW5nRm9yY2UsCiAgICAgICAgICBtYXhCcmVha2luZ0ZvcmNlID0gX29wdGlvbnMkbWF4QnJlYWtpbmdGID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRSA6IF9vcHRpb25zJG1heEJyZWFraW5nRjsKCiAgICAgIGlmIChzdGF0ZS5hY2NlbGVyYXRpb24pIHsKICAgICAgICBpZiAoc3BlZWQgPCAtMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IG1heEVuZ2luZUZvcmNlOwogICAgICB9CgogICAgICBpZiAoc3RhdGUuYnJha2luZykgewogICAgICAgIGlmIChzcGVlZCA+IDEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSAtbWF4RW5naW5lRm9yY2UgLyAyOwogICAgICB9CgogICAgICBpZiAoc3RhdGUubGVmdCkgewogICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHN0YXRlLnJpZ2h0KSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gLXN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IC1zdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX1JJR0hUKTsKICAgICAgdmFyIHRtLCBwLCBxLCBpOwogICAgICB2YXIgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdmVoaWNsZS51cGRhdGVXaGVlbFRyYW5zZm9ybShpLCB0cnVlKTsKICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTsKICAgICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgdmFyIHdoZWVsVVVJRCA9IHdoZWVsc1tpXTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7CiAgICAgIH0KCiAgICAgIHRtID0gdmVoaWNsZS5nZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0oKTsKICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgdmFyIGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpOwogICAgICB2YXIgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpOwogICAgICB2YXIgZXh0cmFEYXRhID0gewogICAgICAgIGRpcmVjdGlvbjogewogICAgICAgICAgeDogZGlyZWN0aW9uLngoKSwKICAgICAgICAgIHk6IGRpcmVjdGlvbi55KCksCiAgICAgICAgICB6OiBkaXJlY3Rpb24ueigpCiAgICAgICAgfSwKICAgICAgICBzcGVlZDogc3BlZWQKICAgICAgfTsKICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIHAsIHEsIGR0LCBleHRyYURhdGEpOwogICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUodXVpZCwgc3RhdGUpOwogICAgfTsKCiAgICB2YXIgY3JlYXRlR2hvc3RDb2xsaWRlciA9IGZ1bmN0aW9uIGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBwb3NpdGlvbikgewogICAgICB2YXIgZ2hvc3RDb2xsaWRlciA9IG5ldyBBbW1vLmJ0R2hvc3RPYmplY3QoKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihwb3NpdGlvbik7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMSkpOwogICAgICBnaG9zdENvbGxpZGVyLnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZ2hvc3RDb2xsaWRlcjogZ2hvc3RDb2xsaWRlciwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybQogICAgICB9OwogICAgfTsKICAgIHZhciBmb3JFYWNoR2hvc3RDb2xsaXNpb24gPSBmdW5jdGlvbiBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlcikgewogICAgICB2YXIgZm9yRWFjaENhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7fTsKICAgICAgdmFyIGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsaXNpb25zOyBpKyspIHsKICAgICAgICB2YXIgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGZvckVhY2hDYWxsYmFjayhvYmplY3QsIHRyYW5zZm9ybSwgaSk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbikgewogICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBwb3NpdGlvbjsKCiAgICAgIGlmICghZXhwbG9zaW9uUG9zaXRpb24pIHsKICAgICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgZXhwbG9zaW9uUG9zaXRpb24gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjsKICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uSW1wdWxzZSA9IGZ1bmN0aW9uIGdldEV4cGxvc2lvbkltcHVsc2UocG9zaXRpb24sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkgewogICAgICB2YXIgZGlzdGFuY2UgPSBwb3NpdGlvbi5vcF9zdWIoZXhwbG9zaW9uUG9zaXRpb24pOwogICAgICBkaXN0YW5jZS5ub3JtYWxpemUoKTsKICAgICAgdmFyIGltcHVsc2UgPSBkaXN0YW5jZS5vcF9tdWwoc3RyZW5ndGgpOwogICAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7CiAgICAgIHJldHVybiBpbXB1bHNlOwogICAgfTsKICAgIHZhciBjcmVhdGVFeHBsb3Npb24gPSBmdW5jdGlvbiBjcmVhdGVFeHBsb3Npb24oX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbiwKICAgICAgICAgIF9yZWYkcmFkaXVzID0gX3JlZi5yYWRpdXMsCiAgICAgICAgICByYWRpdXMgPSBfcmVmJHJhZGl1cyA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NJWkVTLlNNQUxMIDogX3JlZiRyYWRpdXMsCiAgICAgICAgICBfcmVmJHN0cmVuZ3RoID0gX3JlZi5zdHJlbmd0aCwKICAgICAgICAgIHN0cmVuZ3RoID0gX3JlZiRzdHJlbmd0aCA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NUUkVOR1RIUy5NRURJVU0gOiBfcmVmJHN0cmVuZ3RoOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbik7CgogICAgICAgIHZhciBfY3JlYXRlR2hvc3RDb2xsaWRlciA9IGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBleHBsb3Npb25Qb3NpdGlvbiksCiAgICAgICAgICAgIGdob3N0Q29sbGlkZXIgPSBfY3JlYXRlR2hvc3RDb2xsaWRlci5naG9zdENvbGxpZGVyLAogICAgICAgICAgICB0cmFuc2Zvcm0gPSBfY3JlYXRlR2hvc3RDb2xsaWRlci50cmFuc2Zvcm07CgogICAgICAgIHdvcmxkLmFkZENvbGxpc2lvbk9iamVjdChnaG9zdENvbGxpZGVyKTsKICAgICAgICBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlciwgZnVuY3Rpb24gKG9iamVjdCwgb2JqZWN0VHJhbnNmb3JtKSB7CiAgICAgICAgICB2YXIgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpOwogICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpOwogICAgICAgIH0pOwogICAgICAgIHdvcmxkLmdldER5bmFtaWNzV29ybGQoKS5yZW1vdmVDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgQW1tby5kZXN0cm95KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGhhbmRsZUxvYWRFdmVudCA9IGZ1bmN0aW9uIGhhbmRsZUxvYWRFdmVudChvcHRpb25zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoQW1tbykgewogICAgICAgIHNlbGYuQW1tbyA9IEFtbW87CgogICAgICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIG9ubWVzc2FnZShfcmVmKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTsKCiAgICAgICAgICBzd2l0Y2ggKGRhdGEuZXZlbnQpIHsKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOgogICAgICAgICAgICAgIGFkZEJveChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRToKICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOgogICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDoKICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjoKICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWToKICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5SRVNFVDoKICAgICAgICAgICAgICByZXNldEVsZW1lbnQoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULlBPU0lUSU9OOgogICAgICAgICAgICAgIHNldFBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlFVQVRFUk5JT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkFQUExZLklNUFVMU0U6CiAgICAgICAgICAgICAgYXBwbHlJbXB1c2UoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFOgogICAgICAgICAgICAgIHdvcmxkLnVwZGF0ZUJvZHlTdGF0ZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5ESVNQT1NFOgogICAgICAgICAgICAgIHdvcmxkLmRpc3Bvc2VCb2R5KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FRkZFQ1RTLkVYUExPU0lPTjoKICAgICAgICAgICAgICBjcmVhdGVFeHBsb3Npb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURToKICAgICAgICAgICAgICB3b3JsZC50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB3b3JsZC5pbml0KG9wdGlvbnMpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kUmVhZHlFdmVudCgpOwogICAgICAgIHdvcmxkLnNpbXVsYXRlKCk7CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBsb2FkQW1tbyA9IGZ1bmN0aW9uIGxvYWRBbW1vKG9wdGlvbnMpIHsKICAgICAgdmFyIHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTsKICAgICAgaW1wb3J0U2NyaXB0cyhzY3JpcHRVcmwpOwogICAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpOwogICAgfTsKCiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZjIpIHsKICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhOwoKICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86CiAgICAgICAgICBsb2FkQW1tbyhkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9OwoKfSkoKTsKCg==', null, false);
55400
+ }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczplbGVtZW50OnJlc2V0JywKICAgICAgICBBUFBMWTogewogICAgICAgICAgSU1QVUxTRTogJ3BoeXNpY3M6ZWxlbWVudDphcHBseTppbXB1bHNlJwogICAgICAgIH0KICAgICAgfSwKICAgICAgVkVISUNMRTogewogICAgICAgIFNFVDogewogICAgICAgICAgUE9TSVRJT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnBvc2l0aW9uJywKICAgICAgICAgIFFVQVRFUk5JT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnF1YXRlcm5pb24nCiAgICAgICAgfSwKICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsCiAgICAgICAgU1BFRUQ6ICdwaHlzaWNzOnZlaGljbGU6c3BlZWQnLAogICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nCiAgICAgIH0sCiAgICAgIEVGRkVDVFM6IHsKICAgICAgICBFWFBMT1NJT046ICdwaHlzaWNzOmVmZmVjdHM6ZXhwbG9zaW9uJwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgewogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CgogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkgewogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OwogICAgICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7CiAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgfSk7CiAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBEaXNwYXRjaGVyID0gZnVuY3Rpb24gRGlzcGF0Y2hlcigpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BhdGNoZXIpOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUGh5c2ljc1VwZGF0ZSIsIGZ1bmN0aW9uIChkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuVVBEQVRFLAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUmVhZHlFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kVGVybWluYXRlRXZlbnQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEUKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRCb2R5VXBkYXRlIiwgZnVuY3Rpb24gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZShfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9CiAgICAgICAgfSwgZXh0cmFEYXRhKSwge30sIHsKICAgICAgICAgIGR0OiBkdAogICAgICAgIH0pKTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmREaXNwYXRjaEV2ZW50IiwgZnVuY3Rpb24gKHV1aWQsIGV2ZW50TmFtZSwgZXZlbnREYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5ESVNQQVRDSCwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKICAgICAgICAgIGV2ZW50RGF0YTogZXZlbnREYXRhCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICAgIHZhciBkaXNwYXRjaGVyJDEgPSBuZXcgRGlzcGF0Y2hlcigpOwoKICAgIHZhciBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSBmdW5jdGlvbiBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoX3JlZikgewogICAgICB2YXIgX3JlZiR4ID0gX3JlZi54LAogICAgICAgICAgeCA9IF9yZWYkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeCwKICAgICAgICAgIF9yZWYkeSA9IF9yZWYueSwKICAgICAgICAgIHkgPSBfcmVmJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHksCiAgICAgICAgICBfcmVmJHogPSBfcmVmLnosCiAgICAgICAgICB6ID0gX3JlZiR6ID09PSB2b2lkIDAgPyAwIDogX3JlZiR6OwogICAgICB2YXIgbWF0cml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTsKICAgICAgdmFyIHcgPSAxIC8gKG1hdHJpeFszXSAqIHggKyBtYXRyaXhbN10gKiB5ICsgbWF0cml4WzExXSAqIHogKyBtYXRyaXhbMTVdKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAobWF0cml4WzBdICogeCArIG1hdHJpeFs0XSAqIHkgKyBtYXRyaXhbOF0gKiB6ICsgbWF0cml4WzEyXSkgKiB3LAogICAgICAgIHk6IChtYXRyaXhbMV0gKiB4ICsgbWF0cml4WzVdICogeSArIG1hdHJpeFs5XSAqIHogKyBtYXRyaXhbMTNdKSAqIHcsCiAgICAgICAgejogKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbNl0gKiB5ICsgbWF0cml4WzEwXSAqIHogKyBtYXRyaXhbMTRdKSAqIHcKICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZVJpZ2lkQm9keSA9IGZ1bmN0aW9uIGNyZWF0ZVJpZ2lkQm9keShzaGFwZSwgb3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgX29wdGlvbnMkcmVzdGl0dXRpb24gPSBvcHRpb25zLnJlc3RpdHV0aW9uLAogICAgICAgICAgcmVzdGl0dXRpb24gPSBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9PT0gdm9pZCAwID8gLjkgOiBfb3B0aW9ucyRyZXN0aXR1dGlvbiwKICAgICAgICAgIF9vcHRpb25zJGRhbXBpbmcgPSBvcHRpb25zLmRhbXBpbmcsCiAgICAgICAgICBkYW1waW5nID0gX29wdGlvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gewogICAgICAgIGxpbmVhcjogMC4yLAogICAgICAgIGFuZ3VsYXI6IDAuMgogICAgICB9IDogX29wdGlvbnMkZGFtcGluZzsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIHNoYXBlLmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgcmJJbmZvID0gbmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBzaGFwZSwgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pOwoKICAgICAgaWYgKG1hc3MgPiAwKSB7CiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7CiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7CiAgICAgICAgYm9keS5zZXREYW1waW5nKGRhbXBpbmcubGluZWFyLCBkYW1waW5nLmFuZ3VsYXIpOwogICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgfSAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2UKCgogICAgICBib2R5LnV1aWQgPSB1dWlkOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgIHJldHVybiBib2R5OwogICAgfTsKICAgIHZhciBhZGRNb2RlbCA9IGZ1bmN0aW9uIGFkZE1vZGVsKG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICB2ZXJ0aWNlcyA9IG9wdGlvbnMudmVydGljZXMsCiAgICAgICAgICBtYXRyaWNlcyA9IG9wdGlvbnMubWF0cmljZXMsCiAgICAgICAgICBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIF9vcHRpb25zJG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBtYXNzID0gX29wdGlvbnMkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJG1hc3MsCiAgICAgICAgICBfb3B0aW9ucyRmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9vcHRpb25zJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX29wdGlvbnMkZnJpY3Rpb247CiAgICAgIHZhciBzY2FsZSA9IERFRkFVTFRfU0NBTEU7CiAgICAgIHZhciBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRjID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb21wb25lbnRzID0gdmVydGljZXNbaV07CiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsOwogICAgICAgIHZhciBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTsKCiAgICAgICAgaWYgKGluZGV4KSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluZGV4Lmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgICAgIHZhciBhaSA9IGluZGV4W2pdICogMzsKICAgICAgICAgICAgdmFyIGJpID0gaW5kZXhbaiArIDFdICogMzsKICAgICAgICAgICAgdmFyIGNpID0gaW5kZXhbaiArIDJdICogMzsKICAgICAgICAgICAgdmFyIHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2FpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2FpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1thaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tiaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tiaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYmkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbY2ldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2NpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBjb21wb25lbnRzLmxlbmd0aDsgX2ogKz0gOSkgewogICAgICAgICAgICB2YXIgX3ZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgMF0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDNdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA0XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgNV0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyA2XSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgN10sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDhdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICBidGEuc2V0VmFsdWUoX3ZhLngsIF92YS55LCBfdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZShfdmIueCwgX3ZiLnksIF92Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKF92Yy54LCBfdmMueSwgX3ZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsb2NhbFNjYWxlID0gbmV3IEFtbW8uYnRWZWN0b3IzKHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopOwogICAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7CiAgICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTsKICAgICAgdmFyIGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTsKICAgICAgY29sbGlzaW9uU2hhcGUucmVzb3VyY2VzID0gW3RyaU1lc2hdOwogICAgICBBbW1vLmRlc3Ryb3koYnRhKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yik7CiAgICAgIEFtbW8uZGVzdHJveShidGMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5NRVNILAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkQm94ID0gZnVuY3Rpb24gYWRkQm94KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb247CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogMC41LCBoZWlnaHQgKiAwLjUsIGxlbmd0aCAqIDAuNSkpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5CT1gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRTcGhlcmUgPSBmdW5jdGlvbiBhZGRTcGhlcmUoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHJhZGl1cyA9IGRhdGEucmFkaXVzLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MyID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MyID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzczIsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbjIgPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbjIgPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjI7CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuU1BIRVJFLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0TGluZWFyVmVsb2NpdHkgPSBmdW5jdGlvbiBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgX2RhdGEkdmVsb2NpdHkgPSBkYXRhLnZlbG9jaXR5LAogICAgICAgICAgdmVsb2NpdHkgPSBfZGF0YSR2ZWxvY2l0eSA9PT0gdm9pZCAwID8gREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgOiBfZGF0YSR2ZWxvY2l0eTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTsKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFBvc2l0aW9uID0gZnVuY3Rpb24gc2V0UG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDIgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50Mi5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIHJlc2V0RWxlbWVudCA9IGZ1bmN0aW9uIHJlc2V0RWxlbWVudChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDMgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50My5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIGFwcGx5SW1wdXNlID0gZnVuY3Rpb24gYXBwbHlJbXB1c2UoX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkaW1wdWxzZSA9IF9yZWYuaW1wdWxzZSwKICAgICAgICAgIGltcHVsc2UgPSBfcmVmJGltcHVsc2UgPT09IHZvaWQgMCA/IERFRkFVTFRfSU1QVUxTRSA6IF9yZWYkaW1wdWxzZTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50NC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGltcHVsc2VWZWN0b3IgPSBuZXcgQW1tby5idFZlY3RvcjMoaW1wdWxzZS54LCBpbXB1bHNlLnksIGltcHVsc2Uueik7CiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpOwogICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVFbGVtZW50VXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlRWxlbWVudFVwZGF0ZShfcmVmMiwgZHQpIHsKICAgICAgdmFyIGJvZHkgPSBfcmVmMi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50OwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uOwogICAgICAgICAgdmFyIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbjsKICAgICAgICAgIHN0YXRlLnF1YXRlcm5pb247CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHJlcXVlc3ROZXh0RnJhbWUgPSBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZWxmLndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZWxmLm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZWxmLm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2VsZi5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbiAoY2FsbGJhY2ssIGVsZW1lbnQpIHsKICAgICAgc2VsZi5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gMTIwKTsKICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdE5leHRGcmFtZShfdGhpcy5zaW11bGF0ZS5iaW5kKF90aGlzKSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiY2FsY3VsYXRlQ29sbGlzaW9ucyIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBhbW1vRGlzcGF0Y2hlciA9IF90aGlzLmR5bmFtaWNzV29ybGQuZ2V0RGlzcGF0Y2hlcigpOwoKICAgICAgICAgIHZhciBudW1NYW5pZm9sZHMgPSBhbW1vRGlzcGF0Y2hlci5nZXROdW1NYW5pZm9sZHMoKTsKCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU1hbmlmb2xkczsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjb250YWN0TWFuaWZvbGQgPSBhbW1vRGlzcGF0Y2hlci5nZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbChpKTsKICAgICAgICAgICAgdmFyIHJiMCA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTAoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciByYjEgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkxKCksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgICAgICB2YXIgbnVtQ29udGFjdHMgPSBjb250YWN0TWFuaWZvbGQuZ2V0TnVtQ29udGFjdHMoKTsgLy8gdGhpcyBpdGVyYXRpb24gZG9lc24ndCBoYXZlIHV1aWRzCgogICAgICAgICAgICBpZiAoIXJiMC51dWlkIHx8ICFyYjEudXVpZCkgY29udGludWU7CiAgICAgICAgICAgIHZhciBjb250YWN0cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Db250YWN0czsgaisrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludCA9IGNvbnRhY3RNYW5pZm9sZC5nZXRDb250YWN0UG9pbnQoaik7CiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gY29udGFjdFBvaW50LmdldERpc3RhbmNlKCk7CiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gMC4wKSBjb250aW51ZTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkwID0gcmIwLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHZlbG9jaXR5MSA9IHJiMS5nZXRMaW5lYXJWZWxvY2l0eSgpOwogICAgICAgICAgICAgIHZhciB3b3JsZFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSgpOwogICAgICAgICAgICAgIHZhciB3b3JsZFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQigpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEEoKTsKICAgICAgICAgICAgICB2YXIgbG9jYWxQb3MxID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRCKCk7CiAgICAgICAgICAgICAgY29udGFjdHMucHVzaCh7CiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGlzdGFuY2UsCiAgICAgICAgICAgICAgICBlbGVtZW50czogW3sKICAgICAgICAgICAgICAgICAgdXVpZDogcmIwLnV1aWQsCiAgICAgICAgICAgICAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdmVsb2NpdHkwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB2ZWxvY2l0eTAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHZlbG9jaXR5MC56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiB3b3JsZFBvczAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHdvcmxkUG9zMC55KCksCiAgICAgICAgICAgICAgICAgICAgejogd29ybGRQb3MwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBsb2NhbFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IGxvY2FsUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogbG9jYWxQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiBsb2NhbFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgdXVpZDogcmIxLnV1aWQsCiAgICAgICAgICAgICAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdmVsb2NpdHkxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB2ZWxvY2l0eTEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHZlbG9jaXR5MS56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiB3b3JsZFBvczEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHdvcmxkUG9zMS55KCksCiAgICAgICAgICAgICAgICAgICAgejogd29ybGRQb3MxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBsb2NhbFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IGxvY2FsUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogbG9jYWxQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiBsb2NhbFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRGlzcGF0Y2hFdmVudChyYjAudXVpZCwgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5DT0xMSVNJT04sIHsKICAgICAgICAgICAgICBjb250YWN0czogY29udGFjdHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRGlzcGF0Y2hFdmVudChyYjEudXVpZCwgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5DT0xMSVNJT04sIHsKICAgICAgICAgICAgICBjb250YWN0czogY29udGFjdHMKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkRWxlbWVudCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICBfdGhpcy5lbGVtZW50c1tkYXRhLnV1aWRdID0gZGF0YTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJ1cGRhdGVCb2R5U3RhdGUiLCBmdW5jdGlvbiAoX3JlZikgewogICAgICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICAgICAgc3RhdGUgPSBfcmVmLnN0YXRlOwoKICAgICAgICAgIGlmIChfdGhpcy5oYXNFbGVtZW50KHV1aWQpKSB7CiAgICAgICAgICAgIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlKSwgc3RhdGUpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInRlcm1pbmF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5keW5hbWljc1dvcmxkKTsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5zb2x2ZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmRpc3BhdGNoZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRUZXJtaW5hdGVFdmVudCgpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307CiAgICAgICAgdGhpcy5pbml0aWFsaXNlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuc29sdmVyID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gbnVsbDsKICAgICAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhXb3JsZCwgW3sKICAgICAgICBrZXk6ICJkaXNwb3NlQm9keSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2VCb2R5KF9yZWYyKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTsKICAgICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5yZW1vdmVSaWdpZEJvZHkoZWxlbWVudC5ib2R5KTsKICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh1dWlkKTsKICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRWxlbWVudERpc3Bvc2VkKHsKICAgICAgICAgICAgdXVpZDogdXVpZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gV29ybGQ7CiAgICB9KCk7CiAgICB2YXIgd29ybGQgPSBuZXcgV29ybGQoKTsKCiAgICB2YXIgREVGQVVMVF9ST0xMX0lORkxVRU5DRSA9IDAuMjsKICAgIHZhciBERUZBVUxUX0ZSSUNUSU9OID0gMTAwMDsKICAgIHZhciBERUZBVUxUX01BU1MgPSA4MDA7CiAgICB2YXIgYWRkVmVoaWNsZSA9IGZ1bmN0aW9uIGFkZFZlaGljbGUoZGF0YSkgewogICAgICB2YXIgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aGVlbHMgPSBkYXRhLndoZWVscywKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVNTIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIHdpZHRoID0gX2RhdGEkd2lkdGggPT09IHZvaWQgMCA/IDEuOCA6IF9kYXRhJHdpZHRoLAogICAgICAgICAgX2RhdGEkaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBoZWlnaHQgPSBfZGF0YSRoZWlnaHQgPT09IHZvaWQgMCA/IC42IDogX2RhdGEkaGVpZ2h0LAogICAgICAgICAgX2RhdGEkbGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBsZW5ndGggPSBfZGF0YSRsZW5ndGggPT09IHZvaWQgMCA/IDQgOiBfZGF0YSRsZW5ndGgsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyBERUZBVUxUX0ZSSUNUSU9OIDogX2RhdGEkZnJpY3Rpb24sCiAgICAgICAgICBfZGF0YSRyb2xsSW5mbHVlbmNlID0gZGF0YS5yb2xsSW5mbHVlbmNlLAogICAgICAgICAgcm9sbEluZmx1ZW5jZSA9IF9kYXRhJHJvbGxJbmZsdWVuY2UgPT09IHZvaWQgMCA/IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UgOiBfZGF0YSRyb2xsSW5mbHVlbmNlLAogICAgICAgICAgX2RhdGEkd2hlZWxzT3B0aW9ucyA9IGRhdGEud2hlZWxzT3B0aW9ucywKICAgICAgICAgIHdoZWVsc09wdGlvbnMgPSBfZGF0YSR3aGVlbHNPcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHdoZWVsc09wdGlvbnMsCiAgICAgICAgICBfZGF0YSRzdXNwZW5zaW9ucyA9IGRhdGEuc3VzcGVuc2lvbnMsCiAgICAgICAgICBzdXNwZW5zaW9ucyA9IF9kYXRhJHN1c3BlbnNpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHN1c3BlbnNpb25zOwogICAgICB2YXIgX3doZWVsc09wdGlvbnMkYmFjayA9IHdoZWVsc09wdGlvbnMuYmFjaywKICAgICAgICAgIGJhY2sgPSBfd2hlZWxzT3B0aW9ucyRiYWNrID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGJhY2ssCiAgICAgICAgICBfd2hlZWxzT3B0aW9ucyRmcm9udCA9IHdoZWVsc09wdGlvbnMuZnJvbnQsCiAgICAgICAgICBmcm9udCA9IF93aGVlbHNPcHRpb25zJGZyb250ID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGZyb250OwogICAgICB2YXIgX2JhY2skYXhpc1Bvc2l0aW9uID0gYmFjay5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25CYWNrID0gX2JhY2skYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAtMSA6IF9iYWNrJGF4aXNQb3NpdGlvbiwKICAgICAgICAgIF9iYWNrJHJhZGl1cyA9IGJhY2sucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNCYWNrID0gX2JhY2skcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9iYWNrJHJhZGl1cywKICAgICAgICAgIF9iYWNrJGhhbGZUcmFjayA9IGJhY2suaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tCYWNrID0gX2JhY2skaGFsZlRyYWNrID09PSB2b2lkIDAgPyAxIDogX2JhY2skaGFsZlRyYWNrLAogICAgICAgICAgX2JhY2skYXhpc0hlaWdodCA9IGJhY2suYXhpc0hlaWdodCwKICAgICAgICAgIHdoZWVsQXhpc0hlaWdodEJhY2sgPSBfYmFjayRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9iYWNrJGF4aXNIZWlnaHQ7CiAgICAgIHZhciBfZnJvbnQkYXhpc1Bvc2l0aW9uID0gZnJvbnQuYXhpc1Bvc2l0aW9uLAogICAgICAgICAgYXhpc1Bvc2l0aW9uRnJvbnQgPSBfZnJvbnQkYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAxLjcgOiBfZnJvbnQkYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2Zyb250JHJhZGl1cyA9IGZyb250LnJhZGl1cywKICAgICAgICAgIHdoZWVsUmFkaXVzRnJvbnQgPSBfZnJvbnQkcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9mcm9udCRyYWRpdXMsCiAgICAgICAgICBfZnJvbnQkaGFsZlRyYWNrID0gZnJvbnQuaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tGcm9udCA9IF9mcm9udCRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfZnJvbnQkaGFsZlRyYWNrLAogICAgICAgICAgX2Zyb250JGF4aXNIZWlnaHQgPSBmcm9udC5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0RnJvbnQgPSBfZnJvbnQkYXhpc0hlaWdodCA9PT0gdm9pZCAwID8gLjMgOiBfZnJvbnQkYXhpc0hlaWdodDsKICAgICAgdmFyIF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9IHN1c3BlbnNpb25zLnN0aWZmbmVzcywKICAgICAgICAgIHN0aWZmbmVzcyA9IF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9PT0gdm9pZCAwID8gMjAuMCA6IF9zdXNwZW5zaW9ucyRzdGlmZm5lcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRkYW1waW5nID0gc3VzcGVuc2lvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfc3VzcGVuc2lvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gMi4zIDogX3N1c3BlbnNpb25zJGRhbXBpbmcsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPSBzdXNwZW5zaW9ucy5jb21wcmVzc2lvbiwKICAgICAgICAgIGNvbXByZXNzaW9uID0gX3N1c3BlbnNpb25zJGNvbXByZXNzID09PSB2b2lkIDAgPyA0LjQgOiBfc3VzcGVuc2lvbnMkY29tcHJlc3MsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkcmVzdExlbmcgPSBzdXNwZW5zaW9ucy5yZXN0TGVuZ3RoLAogICAgICAgICAgcmVzdExlbmd0aCA9IF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9PT0gdm9pZCAwID8gMC42IDogX3N1c3BlbnNpb25zJHJlc3RMZW5nOyAvLyBDaGFzc2lzCgogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIC41LCBoZWlnaHQgKiAuNSwgbGVuZ3RoICogLjUpKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgY2hhc3NpcyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgZ2VvbWV0cnksIGxvY2FsSW5lcnRpYSkpOwogICAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShjaGFzc2lzKTsgLy8gUmF5Y2FzdCBWZWhpY2xlCgogICAgICB2YXIgdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7CiAgICAgIHZhciByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7CiAgICAgIHZhciB2ZWhpY2xlID0gbmV3IEFtbW8uYnRSYXljYXN0VmVoaWNsZSh0dW5pbmcsIGNoYXNzaXMsIHJheUNhc3Rlcik7CiAgICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTsKICAgICAgd29ybGQuYWRkQWN0aW9uKHZlaGljbGUpOwogICAgICB2YXIgd2hlZWxEaXJlY3Rpb25DUzAgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgLTEsIDApOwogICAgICB2YXIgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApOwoKICAgICAgdmFyIGFkZFdoZWVsID0gZnVuY3Rpb24gYWRkV2hlZWwoaXNGcm9udCwgcG9zLCByYWRpdXMpIHsKICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChwb3MsIHdoZWVsRGlyZWN0aW9uQ1MwLCB3aGVlbEF4bGVDUywgcmVzdExlbmd0aCwgcmFkaXVzLCB0dW5pbmcsIGlzRnJvbnQpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9zdXNwZW5zaW9uU3RpZmZuZXNzKHN0aWZmbmVzcyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV93aGVlbHNEYW1waW5nQ29tcHJlc3Npb24oY29tcHJlc3Npb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9mcmljdGlvblNsaXAoZnJpY3Rpb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpOwogICAgICB9OwoKICAgICAgYWRkV2hlZWwodHJ1ZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKC13aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIHZlaGljbGUudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHR5cGU6IFRZUEVTLlZFSElDTEUsCiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLAogICAgICAgIHdoZWVsczogd2hlZWxzLAogICAgICAgIG9wdGlvbnM6IGRhdGEsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfVkVISUNMRV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0VmVoaWNsZVBvc2l0aW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUXVhdGVybmlvbiA9IGZ1bmN0aW9uIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0VmVoaWNsZSA9IGZ1bmN0aW9uIHJlc2V0VmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVZlaGljbGVVcGRhdGUoX3JlZiwgZHQpIHsKICAgICAgdmFyIHZlaGljbGUgPSBfcmVmLnZlaGljbGUsCiAgICAgICAgICB3aGVlbHMgPSBfcmVmLndoZWVscywKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9WRUhJQ0xFX1NUQVRFIDogX3JlZiRzdGF0ZSwKICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zOwogICAgICB2YXIgYnJlYWtpbmdGb3JjZSA9IDA7CiAgICAgIHZhciBlbmdpbmVGb3JjZSA9IDA7CiAgICAgIHZhciBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPSBvcHRpb25zLnN0ZWVyaW5nQ2xhbXAsCiAgICAgICAgICBzdGVlcmluZ0NsYW1wID0gX29wdGlvbnMkc3RlZXJpbmdDbGFtID09PSB2b2lkIDAgPyBERUZBVUxUX1NURUVSSU5HX0NMQU1QIDogX29wdGlvbnMkc3RlZXJpbmdDbGFtLAogICAgICAgICAgX29wdGlvbnMkc3RlZXJpbmdJbmNyID0gb3B0aW9ucy5zdGVlcmluZ0luY3JlbWVudCwKICAgICAgICAgIHN0ZWVyaW5nSW5jcmVtZW50ID0gX29wdGlvbnMkc3RlZXJpbmdJbmNyID09PSB2b2lkIDAgPyBERUZBVUxUX1NURUVSSU5HX0lOQ1JFTUVOVCA6IF9vcHRpb25zJHN0ZWVyaW5nSW5jciwKICAgICAgICAgIF9vcHRpb25zJG1heEVuZ2luZUZvciA9IG9wdGlvbnMubWF4RW5naW5lRm9yY2UsCiAgICAgICAgICBtYXhFbmdpbmVGb3JjZSA9IF9vcHRpb25zJG1heEVuZ2luZUZvciA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFIDogX29wdGlvbnMkbWF4RW5naW5lRm9yLAogICAgICAgICAgX29wdGlvbnMkbWF4QnJlYWtpbmdGID0gb3B0aW9ucy5tYXhCcmVha2luZ0ZvcmNlLAogICAgICAgICAgbWF4QnJlYWtpbmdGb3JjZSA9IF9vcHRpb25zJG1heEJyZWFraW5nRiA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgOiBfb3B0aW9ucyRtYXhCcmVha2luZ0Y7CgogICAgICBpZiAoc3RhdGUuYWNjZWxlcmF0aW9uKSB7CiAgICAgICAgaWYgKHNwZWVkIDwgLTEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSBtYXhFbmdpbmVGb3JjZTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmJyYWtpbmcpIHsKICAgICAgICBpZiAoc3BlZWQgPiAxKSBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtlbHNlIGVuZ2luZUZvcmNlID0gLW1heEVuZ2luZUZvcmNlIC8gMjsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmxlZnQpIHsKICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nIDwgc3RlZXJpbmdDbGFtcCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGF0ZS5yaWdodCkgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IC1zdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCAtc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyArPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IHN0ZWVyaW5nSW5jcmVtZW50KSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7ZWxzZSB7CiAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX0xFRlQpOwogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlIC8gMiwgRlJPTlRfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZhciB0bSwgcCwgcSwgaTsKICAgICAgdmFyIG4gPSB2ZWhpY2xlLmdldE51bVdoZWVscygpOwoKICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHZlaGljbGUudXBkYXRlV2hlZWxUcmFuc2Zvcm0oaSwgdHJ1ZSk7CiAgICAgICAgdG0gPSB2ZWhpY2xlLmdldFdoZWVsVHJhbnNmb3JtV1MoaSk7CiAgICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpOwogICAgICAgIHZhciB3aGVlbFVVSUQgPSB3aGVlbHNbaV07CiAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHdoZWVsVVVJRCwgcCwgcSwgZHQpOwogICAgICB9CgogICAgICB0bSA9IHZlaGljbGUuZ2V0Q2hhc3Npc1dvcmxkVHJhbnNmb3JtKCk7CiAgICAgIHAgPSB0bS5nZXRPcmlnaW4oKTsKICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgIHZhciBkaXJlY3Rpb24gPSB2ZWhpY2xlLmdldEZvcndhcmRWZWN0b3IoKTsKICAgICAgdmFyIHNwZWVkID0gdmVoaWNsZS5nZXRDdXJyZW50U3BlZWRLbUhvdXIoKTsKICAgICAgdmFyIGV4dHJhRGF0YSA9IHsKICAgICAgICBkaXJlY3Rpb246IHsKICAgICAgICAgIHg6IGRpcmVjdGlvbi54KCksCiAgICAgICAgICB5OiBkaXJlY3Rpb24ueSgpLAogICAgICAgICAgejogZGlyZWN0aW9uLnooKQogICAgICAgIH0sCiAgICAgICAgc3BlZWQ6IHNwZWVkCiAgICAgIH07CiAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBwLCBxLCBkdCwgZXh0cmFEYXRhKTsKICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTsKICAgIH07CgogICAgdmFyIGNyZWF0ZUdob3N0Q29sbGlkZXIgPSBmdW5jdGlvbiBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgcG9zaXRpb24pIHsKICAgICAgdmFyIGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBnaG9zdENvbGxpZGVyLnNldENvbGxpc2lvblNoYXBlKG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKSk7CiAgICAgIGdob3N0Q29sbGlkZXIuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4ocG9zaXRpb24pOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICByZXR1cm4gewogICAgICAgIGdob3N0Q29sbGlkZXI6IGdob3N0Q29sbGlkZXIsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0KICAgICAgfTsKICAgIH07CiAgICB2YXIgZm9yRWFjaEdob3N0Q29sbGlzaW9uID0gZnVuY3Rpb24gZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIpIHsKICAgICAgdmFyIGZvckVhY2hDYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307CiAgICAgIHZhciBjb2xsaXNpb25zID0gZ2hvc3RDb2xsaWRlci5nZXROdW1PdmVybGFwcGluZ09iamVjdHMoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9uczsgaSsrKSB7CiAgICAgICAgdmFyIG9iamVjdCA9IEFtbW8uY2FzdE9iamVjdChnaG9zdENvbGxpZGVyLmdldE92ZXJsYXBwaW5nT2JqZWN0KGkpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBvYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvblBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pIHsKICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247CgogICAgICBpZiAoIWV4cGxvc2lvblBvc2l0aW9uKSB7CiAgICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICB9CgogICAgICByZXR1cm4gZXhwbG9zaW9uUG9zaXRpb247CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvbkltcHVsc2UgPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25JbXB1bHNlKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpIHsKICAgICAgdmFyIGRpc3RhbmNlID0gcG9zaXRpb24ub3Bfc3ViKGV4cGxvc2lvblBvc2l0aW9uKTsKICAgICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7CiAgICAgIHZhciBpbXB1bHNlID0gZGlzdGFuY2Uub3BfbXVsKHN0cmVuZ3RoKTsKICAgICAgaW1wdWxzZS5zZXRZKGltcHVsc2UueSgpICsgc3RyZW5ndGgpOwogICAgICByZXR1cm4gaW1wdWxzZTsKICAgIH07CiAgICB2YXIgY3JlYXRlRXhwbG9zaW9uID0gZnVuY3Rpb24gY3JlYXRlRXhwbG9zaW9uKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sCiAgICAgICAgICBfcmVmJHJhZGl1cyA9IF9yZWYucmFkaXVzLAogICAgICAgICAgcmFkaXVzID0gX3JlZiRyYWRpdXMgPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TSVpFUy5TTUFMTCA6IF9yZWYkcmFkaXVzLAogICAgICAgICAgX3JlZiRzdHJlbmd0aCA9IF9yZWYuc3RyZW5ndGgsCiAgICAgICAgICBzdHJlbmd0aCA9IF9yZWYkc3RyZW5ndGggPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TVFJFTkdUSFMuTUVESVVNIDogX3JlZiRzdHJlbmd0aDsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pOwoKICAgICAgICB2YXIgX2NyZWF0ZUdob3N0Q29sbGlkZXIgPSBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgZXhwbG9zaW9uUG9zaXRpb24pLAogICAgICAgICAgICBnaG9zdENvbGxpZGVyID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIuZ2hvc3RDb2xsaWRlciwKICAgICAgICAgICAgdHJhbnNmb3JtID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIudHJhbnNmb3JtOwoKICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIGZ1bmN0aW9uIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgewogICAgICAgICAgdmFyIG9yaWdpbiA9IG9iamVjdFRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICAgIG9iamVjdC5hY3RpdmF0ZSh0cnVlKTsKICAgICAgICAgIG9iamVjdC5hcHBseUNlbnRyYWxJbXB1bHNlKGdldEV4cGxvc2lvbkltcHVsc2Uob3JpZ2luLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpKTsKICAgICAgICB9KTsKICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveShnaG9zdENvbGxpZGVyKTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBoYW5kbGVMb2FkRXZlbnQgPSBmdW5jdGlvbiBoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykgewogICAgICByZXR1cm4gZnVuY3Rpb24gKEFtbW8pIHsKICAgICAgICBzZWxmLkFtbW8gPSBBbW1vOwoKICAgICAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZikgewogICAgICAgICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7CgogICAgICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELkJPWDoKICAgICAgICAgICAgICBhZGRCb3goZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5TUEhFUkU6CiAgICAgICAgICAgICAgYWRkU3BoZXJlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuVkVISUNMRToKICAgICAgICAgICAgICBhZGRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuTU9ERUw6CiAgICAgICAgICAgICAgYWRkTW9kZWwoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5QTEFZRVI6CiAgICAgICAgICAgICAgYWRkUGxheWVyKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5MSU5FQVJfVkVMT0NJVFk6CiAgICAgICAgICAgICAgc2V0TGluZWFyVmVsb2NpdHkoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRFbGVtZW50KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRQb3NpdGlvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUE9TSVRJT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5RVUFURVJOSU9OOgogICAgICAgICAgICAgIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlJFU0VUOgogICAgICAgICAgICAgIHJlc2V0VmVoaWNsZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5BUFBMWS5JTVBVTFNFOgogICAgICAgICAgICAgIGFwcGx5SW1wdXNlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURToKICAgICAgICAgICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuRElTUE9TRToKICAgICAgICAgICAgICB3b3JsZC5kaXNwb3NlQm9keShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUZGRUNUUy5FWFBMT1NJT046CiAgICAgICAgICAgICAgY3JlYXRlRXhwbG9zaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEU6CiAgICAgICAgICAgICAgd29ybGQudGVybWluYXRlKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgd29ybGQuaW5pdChvcHRpb25zKTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFJlYWR5RXZlbnQoKTsKICAgICAgICB3b3JsZC5zaW11bGF0ZSgpOwogICAgICB9OwogICAgfTsKCiAgICB2YXIgbG9hZEFtbW8gPSBmdW5jdGlvbiBsb2FkQW1tbyhvcHRpb25zKSB7CiAgICAgIHZhciBzY3JpcHRVcmwgPSBvcHRpb25zLmhvc3QgKyAnLycgKyAob3B0aW9ucy5wYXRoIHx8IExJQlJBUllfTkFNRSk7CiAgICAgIGltcG9ydFNjcmlwdHMoc2NyaXB0VXJsKTsKICAgICAgQW1tbygpLnRoZW4oaGFuZGxlTG9hZEV2ZW50KG9wdGlvbnMpKTsKICAgIH07CgogICAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKF9yZWYyKSB7CiAgICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTsKCiAgICAgIHN3aXRjaCAoZGF0YS5ldmVudCkgewogICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuTE9BRC5BTU1POgogICAgICAgICAgbG9hZEFtbW8oZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfTsKCn0pKCk7Cgo=', null, false);
55360
55401
  /* eslint-enable */var PHYSICS_EVENTS = {
55361
55402
  DISPATCH: 'physics:dispatch',
55362
55403
  TERMINATE: 'physics:terminate',
@@ -56240,52 +56281,7 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
56240
56281
 
56241
56282
  return Physics;
56242
56283
  }(EventDispatcher);
56243
- var Physics$1 = new Physics();var ENTITY_TYPES = {
56244
- SCENE: 'SCENE',
56245
- CAMERA: 'CAMERA',
56246
- MESH: 'MESH',
56247
- LABEL: 'LABEL',
56248
- LIGHT: {
56249
- DEFAULT: 'LIGHT.DEFAULT',
56250
- AMBIENT: 'LIGHT.AMBIENT',
56251
- SUN: 'LIGHT.SUN',
56252
- HEMISPHERE: 'LIGHT.HEMISPHERE',
56253
- POINT: 'LIGHT.POINT',
56254
- SPOT: 'LIGHT.SPOT'
56255
- },
56256
- AUDIO: {
56257
- DEFAULT: 'AUDIO.DEFAULT',
56258
- DIRECTIONAL: 'AUDIO.DIRECTIONAL',
56259
- AMBIENT: 'AUDIO.AMBIENT'
56260
- },
56261
- MODEL: 'MODEL',
56262
- SPRITE: 'SPRITE',
56263
- PARTICLE: 'PARTICLE',
56264
- EFFECT: {
56265
- PARTICLE: 'EFFECT.PARTICLE',
56266
- SCENERY: 'EFFECT.SCENERY'
56267
- },
56268
- HELPER: {
56269
- GRID: 'HELPER.GRID',
56270
- AXES: 'HELPER.AXES'
56271
- },
56272
- UNKNOWN: 'UNKNOWN'
56273
- };
56274
- var FLAT_ENTITY_TYPES = [ENTITY_TYPES.SCENE, ENTITY_TYPES.CAMERA, ENTITY_TYPES.MESH, ENTITY_TYPES.LABEL, ENTITY_TYPES.LIGHT.DEFAULT, ENTITY_TYPES.LIGHT.AMBIENT, ENTITY_TYPES.LIGHT.SUN, ENTITY_TYPES.LIGHT.HEMISPHERE, ENTITY_TYPES.LIGHT.POINT, ENTITY_TYPES.LIGHT.SPOT, ENTITY_TYPES.AUDIO.DEFAULT, ENTITY_TYPES.AUDIO.AMBIENT, ENTITY_TYPES.AUDIO.DIRECTIONAL, ENTITY_TYPES.AUDIO.BACKGROUND, ENTITY_TYPES.MODEL, ENTITY_TYPES.SPRITE, ENTITY_TYPES.PARTICLE, ENTITY_TYPES.EFFECT.PARTICLE, ENTITY_TYPES.EFFECT.SCENERY, ENTITY_TYPES.HELPER.GRID, ENTITY_TYPES.HELPER.AXES, ENTITY_TYPES.UNKNOWN];
56275
- var ENTITY_EVENTS = {
56276
- DISPOSE: 'DISPOSE',
56277
- STATE_MACHINE: {
56278
- CHANGE: 'STATE_MACHINE_CHANGE'
56279
- },
56280
- ANIMATION: {
56281
- LOOP: 'LOOP',
56282
- FINISHED: 'FINISHED'
56283
- },
56284
- AUDIO: {
56285
- ENDED: 'ended'
56286
- }
56287
- };
56288
- var DEFAULT_TAG = 'all';var Scene = /*#__PURE__*/function () {
56284
+ var Physics$1 = new Physics();var Scene = /*#__PURE__*/function () {
56289
56285
  function Scene() {
56290
56286
  var _this = this;
56291
56287
 
@@ -56626,11 +56622,11 @@ var DEFAULT_TAG = 'all';var Scene = /*#__PURE__*/function () {
56626
56622
 
56627
56623
  return Scene;
56628
56624
  }();
56629
- var Scene$1 = new Scene();var MOUSE_DOWN = 'mouseDown';
56630
- var MOUSE_UP = 'mouseUp';
56631
- var MOUSE_MOVE = 'mouseMove';
56632
- var ELEMENT_CLICK = 'elementClick';
56633
- var ELEMENT_DESELECT = 'elementDeselect';
56625
+ var Scene$1 = new Scene();var MOUSE_DOWN = "mouseDown";
56626
+ var MOUSE_UP = "mouseUp";
56627
+ var MOUSE_MOVE = "mouseMove";
56628
+ var ELEMENT_CLICK = "elementClick";
56629
+ var ELEMENT_DESELECT = "elementDeselect";
56634
56630
 
56635
56631
  var Mouse = /*#__PURE__*/function (_EventDispatcher) {
56636
56632
  _inherits(Mouse, _EventDispatcher);
@@ -56699,7 +56695,7 @@ var Mouse = /*#__PURE__*/function (_EventDispatcher) {
56699
56695
 
56700
56696
  _defineProperty$1(_assertThisInitialized(_this), "getIntersections", function () {
56701
56697
  var recursive = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
56702
- var tag = arguments.length > 1 ? arguments[1] : undefined;
56698
+ var tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_TAG;
56703
56699
 
56704
56700
  if (_this.hasRaycaster()) {
56705
56701
  _this.raycaster.setFromCamera(_this.mouse, Scene$1.getCameraBody());
@@ -56711,6 +56707,7 @@ var Mouse = /*#__PURE__*/function (_EventDispatcher) {
56711
56707
 
56712
56708
  _defineProperty$1(_assertThisInitialized(_this), "onMouseDown", function (event) {
56713
56709
  if (!_this.enabled) return;
56710
+ console.log("on mouse down");
56714
56711
  event.preventDefault();
56715
56712
 
56716
56713
  var mouseEvent = _this.parseMouseEvent(event);
@@ -56722,6 +56719,7 @@ var Mouse = /*#__PURE__*/function (_EventDispatcher) {
56722
56719
 
56723
56720
  var elements = _this.getIntersections();
56724
56721
 
56722
+ console.log("clicked elements", elements);
56725
56723
  _this.elementClickEvent.elements = elements;
56726
56724
 
56727
56725
  if (!elements.length) {
@@ -56770,9 +56768,9 @@ var Mouse = /*#__PURE__*/function (_EventDispatcher) {
56770
56768
  value: function enable() {
56771
56769
  this.enabled = true;
56772
56770
  this.createRayCaster();
56773
- Scene$1.getDOMElement().addEventListener('mousemove', this.onMouseMove);
56774
- Scene$1.getDOMElement().addEventListener('mousedown', this.onMouseDown);
56775
- document.addEventListener('mouseup', this.onMouseUp);
56771
+ Scene$1.getDOMElement().addEventListener("mousemove", this.onMouseMove);
56772
+ Scene$1.getDOMElement().addEventListener("mousedown", this.onMouseDown);
56773
+ document.addEventListener("mouseup", this.onMouseUp);
56776
56774
  }
56777
56775
  }, {
56778
56776
  key: "enableMouseMoveIntersection",
@@ -56784,9 +56782,9 @@ var Mouse = /*#__PURE__*/function (_EventDispatcher) {
56784
56782
  value: function disable() {
56785
56783
  this.enabled = false;
56786
56784
  this.mouseMoveIntersectionEnabled = false;
56787
- document.removeEventListener('mouseup', this.onMouseUp);
56788
- Scene$1.getDOMElement().removeEventListener('mousemove', this.onMouseMove);
56789
- Scene$1.getDOMElement().removeEventListener('mousedown', this.onMouseDown);
56785
+ document.removeEventListener("mouseup", this.onMouseUp);
56786
+ Scene$1.getDOMElement().removeEventListener("mousemove", this.onMouseMove);
56787
+ Scene$1.getDOMElement().removeEventListener("mousedown", this.onMouseDown);
56790
56788
  }
56791
56789
  }, {
56792
56790
  key: "getRelativeMousePosition",
@@ -57751,7 +57749,7 @@ function applyMiddleware() {
57751
57749
 
57752
57750
  var thunk = createThunkMiddleware();
57753
57751
  thunk.withExtraArgument = createThunkMiddleware;var name = "mage-engine";
57754
- var version$1 = "3.21.2";
57752
+ var version$1 = "3.22.1";
57755
57753
  var description = "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.";
57756
57754
  var main = "dist/mage.js";
57757
57755
  var author$1 = {
@@ -58392,6 +58390,9 @@ var Input = /*#__PURE__*/function (_EventDispatcher) {
58392
58390
  });
58393
58391
 
58394
58392
  _this.enabled = false;
58393
+ _this.mouse = new Mouse();
58394
+ _this.keyboard = new Keyboard();
58395
+ _this.gamepad = new Gamepad();
58395
58396
  return _this;
58396
58397
  }
58397
58398
 
@@ -58400,9 +58401,6 @@ var Input = /*#__PURE__*/function (_EventDispatcher) {
58400
58401
  value: function enable() {
58401
58402
  if (!this.enabled) {
58402
58403
  dispatch$8(inputEnabled());
58403
- this.mouse = new Mouse();
58404
- this.keyboard = new Keyboard();
58405
- this.gamepad = new Gamepad();
58406
58404
  this.enableGamepad();
58407
58405
  this.enableKeyboard();
58408
58406
  this.enableMouse();
@@ -59984,7 +59982,28 @@ var prepareModel = function prepareModel(model) {
59984
59982
  setUpLightsAndShadows(mesh);
59985
59983
  });
59986
59984
  return model;
59987
- };var LOOPING = {
59985
+ };var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
59986
+
59987
+ function getAugmentedNamespace(n) {
59988
+ if (n.__esModule) return n;
59989
+ var a = Object.defineProperty({}, '__esModule', {value: true});
59990
+ Object.keys(n).forEach(function (k) {
59991
+ var d = Object.getOwnPropertyDescriptor(n, k);
59992
+ Object.defineProperty(a, k, d.get ? d : {
59993
+ enumerable: true,
59994
+ get: function () {
59995
+ return n[k];
59996
+ }
59997
+ });
59998
+ });
59999
+ return a;
60000
+ }var between$1 = {exports: {}};/* Between.js v0.1.2-fix.2 */
60001
+
60002
+ (function (module, exports) {
60003
+ !function(t,n){module.exports=n();}(commonjsGlobal,function(){function O(t){return (O="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 r(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r);}}function n(t,n,e){return n&&r(t.prototype,n),e&&r(t,e),t}function M(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function I(t){return (I=Object.getPrototypeOf||function(t){return t.__proto__})(t)}function o(t,n){return (o=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function u(t,n,e){return (u="undefined"!=typeof Reflect&&Reflect.construct?Reflect.construct:function(t,n,e){var r=[null];r.push.apply(r,n);var u=new(t.bind.apply(t,r));return e&&o(u,e.prototype),u}).apply(null,arguments)}function _(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var t=function(o){var a={},i=[];(o=o||this).on=function(t,n,e){return (a[t]=a[t]||[]).push([n,e]),o},o.off=function(t,n){t||(a={});for(var e=a[t]||i,r=e.length=n?e.length:0;r--;)n==e[r][0]&&e.splice(r,1);return o},o.emit=function(t){for(var n,e=a[t]||i,r=0<e.length?e.slice(0,e.length):e,u=0;n=r[u++];)n[0].apply(n[1],i.slice.call(arguments,1));return o};};var V=function(t,n,e){return t*(1-e)+n*e},e="undefined"!=typeof window?window:"undefined"!=typeof commonjsGlobal?commonjsGlobal:"undefined"!=typeof self?self:{};function a(t,n){return t(n={exports:{}},n.exports),n.exports}for(var i=a(function(t){var n=t.exports={Linear:{None:function(t){return t}},Quadratic:{In:function(t){return t*t},Out:function(t){return t*(2-t)},InOut:function(t){return (t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},Cubic:{In:function(t){return t*t*t},Out:function(t){return --t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},Quartic:{In:function(t){return t*t*t*t},Out:function(t){return 1- --t*t*t*t},InOut:function(t){return (t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},Quintic:{In:function(t){return t*t*t*t*t},Out:function(t){return --t*t*t*t*t+1},InOut:function(t){return (t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},Sinusoidal:{In:function(t){return 1-Math.cos(t*Math.PI/2)},Out:function(t){return Math.sin(t*Math.PI/2)},InOut:function(t){return .5*(1-Math.cos(Math.PI*t))}},Exponential:{In:function(t){return 0===t?0:Math.pow(1024,t-1)},Out:function(t){return 1===t?1:1-Math.pow(2,-10*t)},InOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))}},Circular:{In:function(t){return 1-Math.sqrt(1-t*t)},Out:function(t){return Math.sqrt(1- --t*t)},InOut:function(t){return (t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},Elastic:{In:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),-e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4))},Out:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),e*Math.pow(2,-10*t)*Math.sin((t-n)*(2*Math.PI)/.4)+1)},InOut:function(t){var n,e=.1;return 0===t?0:1===t?1:(!e||e<1?(e=1,n=.1):n=.4*Math.asin(1/e)/(2*Math.PI),(t*=2)<1?e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*-.5:e*Math.pow(2,-10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/.4)*.5+1)}},Back:{In:function(t){return t*t*(2.70158*t-1.70158)},Out:function(t){return --t*t*(2.70158*t+1.70158)+1},InOut:function(t){var n=2.5949095;return (t*=2)<1?t*t*((n+1)*t-n)*.5:.5*((t-=2)*t*((n+1)*t+n)+2)}},Bounce:{In:function(t){return 1-n.Bounce.Out(1-t)},Out:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},InOut:function(t){return t<.5?.5*n.Bounce.In(2*t):.5*n.Bounce.Out(2*t-1)+.5}}};}),c=(i.Linear,i.Quadratic,i.Cubic,i.Quartic,i.Quintic,i.Sinusoidal,i.Exponential,i.Circular,i.Elastic,i.Back,i.Bounce,a(function(a){(function(){var t,n,e,r,u,o;"undefined"!=typeof performance&&null!==performance&&performance.now?a.exports=function(){return performance.now()}:"undefined"!=typeof process&&null!==process&&process.hrtime?(a.exports=function(){return (t()-u)/1e6},n=process.hrtime,r=(t=function(){var t;return 1e9*(t=n())[0]+t[1]})(),o=1e9*process.uptime(),u=r-o):Date.now?(a.exports=function(){return Date.now()-e},e=Date.now()):(a.exports=function(){return (new Date).getTime()-e},e=(new Date).getTime());}).call(e);})),l="undefined"==typeof window?e:window,f=["moz","webkit"],s="AnimationFrame",p=l["request"+s],h=l["cancel"+s]||l["cancelRequest"+s],m=0;!p&&m<f.length;m++)p=l[f[m]+"Request"+s],h=l[f[m]+"Cancel"+s]||l[f[m]+"CancelRequest"+s];if(!p||!h){var d=0,y=0,v=[];p=function(t){if(0===v.length){var n=c(),e=Math.max(0,1e3/60-(n-d));d=e+n,setTimeout(function(){for(var t=v.slice(0),n=v.length=0;n<t.length;n++)if(!t[n].cancelled)try{t[n].callback(d);}catch(t){setTimeout(function(){throw t},0);}},Math.round(e));}return v.push({handle:++y,callback:t,cancelled:!1}),y},h=function(t){for(var n=0;n<v.length;n++)v[n].handle===t&&(v[n].cancelled=!0);};}var b=function(t){return p.call(l,t)};b.cancel=function(){h.apply(l,arguments);},b.polyfill=function(t){t||(t=l),t.requestAnimationFrame=p,t.cancelAnimationFrame=h;};var w,k,P=[],T=Symbol("type"),j=Symbol("start_time"),x=Symbol("completed"),D=Symbol("paused"),g=requestAnimationFrame||b,A=Date.now();!function t(){g(t),w=Date.now(),k=w-A;for(var n=0;n<P.length;n++)P[n][x]||P[n](k,Date.now()-P[n][j]);A=w;}();var E=function(t){function g(e,t){var n,r,u,o;!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,g),u=this,o=I(g).call(this),M(_(_(r=!o||"object"!=typeof o&&"function"!=typeof o?_(u):o)),"update",function(){var e=_(_(r))._updateValue;return function(t,n){r[x]||r[D]||(0===r.localTime&&r.emit("start",r.value,_(_(r))),e(r.ease(r.loopFunction.progress(Math.min(1,(n||r.localTime)/r.duration)))),r.emit("update",r.value,_(_(r)),t),r.localTime>=r.duration&&r.loopFunction.complete(function(){r[x]=!0,r.emit("complete",r.value,_(_(r)));}),r.localTime+=t);}});var a=r.plugin=Object.values(g._plugins).reduce(function(t,n){return t||n&&n.test&&n.test(e)&&n},!1),i=a&&a.name||("object"===O(e)?Array.isArray(e)?"array":"object":"number");if(a){var c=a.initialize(e,t);e=c.startValue,t=c.destValue,r.data=c.data;}switch(Object.assign(_(_(r)),(M(n={duration:1e3,localTime:0,startValue:e,destValue:t,loopMode:"once",loopFunction:g.DEFAULT_LOOP,ease:function(t){return t},value:"array"===i?[].concat(e):"object"===i?Object.assign({},e):e},x,!1),M(n,T,i),M(n,j,Date.now()),M(n,D,!1),n)),r[T]){case"number":r._updateValue=function(t){r.value=V(r.startValue,r.destValue,t);};break;case"array":var l=r.value.length,f=_(_(r)),s=f.startValue,p=f.destValue,h=f.value;r._updateValue=function(t){for(var n=0;n<l;n++)h[n]=V(s[n],p[n],t);};break;case"object":var m=Object.keys(r.startValue),d=m.length,y=_(_(r)),v=y.startValue,b=y.destValue,w=y.value;r._updateValue=function(t){for(var n=0;n<d;n++){var e=m[n];w[e]=V(v[e],b[e],t);}};break;default:r.plugin?r._updateValue=function(t){r.value=r.plugin.interpolate(r.startValue,r.destValue,t,r.data);}:(console.warn("Between: startValue type was unrecognized."),r._updateValue=function(){return null});}return P.push(r.update()),r}return n(g,null,[{key:"between",value:function(){for(var t=arguments.length,n=new Array(t),e=0;e<t;e++)n[e]=arguments[e];return u(g,n)}}]),n(g,[{key:"pause",value:function(){return this[D]=!0,this.emit("pause",this.value,this,k),this}},{key:"play",value:function(){return this[D]=!1,this.emit("play",this.value,this,k),this}},{key:"easing",value:function(t){return this.ease=t,this}},{key:"time",value:function(t){return this.duration=t,this}},{key:"loop",value:function(){for(var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"once",n="__loop_".concat(t),e=arguments.length,r=new Array(1<e?e-1:0),u=1;u<e;u++)r[u-1]=arguments[u];return this.loopFunction=n in this?Object.assign({},g.DEFAULT_LOOP,this[n].apply(this,r)):g.DEFAULT_LOOP,this}},{key:"__loop_repeat",value:function(t){var n=this,e=t;return this.times=0,{complete:function(t){n.localTime=0,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;}}}},{key:"__loop_bounce",value:function(t){var n=this,e=t,r=1;return this.times=0,{complete:function(t){n.localTime=0,r=-r,Number.isInteger(e)&&++n.times===e?t():Number.isInteger(e)||++n.times;},progress:function(t){return 0<r?t:1-t}}}},{key:"isPaused",get:function(){return this[D]}}]),function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");o(t.prototype,n&&n.prototype),n&&o(t,n);}(g,t),g}(t);return M(E,"DEFAULT_LOOP",{complete:function(t){return t()},progress:function(t){return t}}),E.Easing=i,E._plugins={},E});
60004
+ }(between$1));
60005
+
60006
+ var between = between$1.exports;var LOOPING = {
59988
60007
  BOUNCE: 'bounce',
59989
60008
  REPEAT: 'repeat',
59990
60009
  NONE: false
@@ -60034,15 +60053,15 @@ var tweenTo = function tweenTo(origin, target) {
60034
60053
  function Entity() {
60035
60054
  var _this;
60036
60055
 
60037
- var _options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
60056
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
60038
60057
 
60039
60058
  _classCallCheck(this, Entity);
60040
60059
 
60041
- var _options$serializable = _options.serializable,
60060
+ var _options$serializable = options.serializable,
60042
60061
  serializable = _options$serializable === void 0 ? true : _options$serializable,
60043
- _options$tag = _options.tag,
60062
+ _options$tag = options.tag,
60044
60063
  tag = _options$tag === void 0 ? "" : _options$tag,
60045
- _options$tags = _options.tags,
60064
+ _options$tags = options.tags,
60046
60065
  tags = _options$tags === void 0 ? [] : _options$tags;
60047
60066
  _this = _super.call(this);
60048
60067
 
@@ -60072,18 +60091,21 @@ var tweenTo = function tweenTo(origin, target) {
60072
60091
  });
60073
60092
 
60074
60093
  _defineProperty$1(_assertThisInitialized(_this), "hasScripts", function () {
60075
- return _this.scripts.length > 0;
60094
+ return _this.allScripts().length > 0;
60076
60095
  });
60077
60096
 
60078
- _defineProperty$1(_assertThisInitialized(_this), "parseScripts", function (list, options, enabled) {
60079
- return list.map(function (script, i) {
60080
- return {
60081
- script: script,
60082
- name: script.getName(),
60083
- enabled: enabled,
60084
- options: options[i]
60085
- };
60086
- });
60097
+ _defineProperty$1(_assertThisInitialized(_this), "allScripts", function () {
60098
+ return [].concat(_toConsumableArray(_this.dynamicScripts), _toConsumableArray(_this.staticScripts));
60099
+ });
60100
+
60101
+ _defineProperty$1(_assertThisInitialized(_this), "updateScriptsIndexes", function () {
60102
+ var update = function update(s, i) {
60103
+ return s.index = i;
60104
+ };
60105
+
60106
+ _this.dynamicScripts.forEach(update);
60107
+
60108
+ _this.staticScripts.forEach(update);
60087
60109
  });
60088
60110
 
60089
60111
  _defineProperty$1(_assertThisInitialized(_this), "isMesh", function () {
@@ -60125,12 +60147,13 @@ var tweenTo = function tweenTo(origin, target) {
60125
60147
  }
60126
60148
  });
60127
60149
 
60128
- _this.options = _objectSpread2$1(_objectSpread2$1({}, _options), {}, {
60150
+ _this.options = _objectSpread2$1(_objectSpread2$1({}, options), {}, {
60129
60151
  serializable: serializable,
60130
60152
  tag: tag,
60131
60153
  tags: tags
60132
60154
  });
60133
- _this.scripts = [];
60155
+ _this.dynamicScripts = [];
60156
+ _this.staticScripts = [];
60134
60157
  _this.tags = [];
60135
60158
  _this.children = [];
60136
60159
  _this.isMage = true;
@@ -60148,6 +60171,12 @@ var tweenTo = function tweenTo(origin, target) {
60148
60171
  value: function isSerializable() {
60149
60172
  return !!this.serializable;
60150
60173
  }
60174
+ }, {
60175
+ key: "setSerializable",
60176
+ value: function setSerializable() {
60177
+ var serializable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
60178
+ this.serializable = serializable;
60179
+ }
60151
60180
  }, {
60152
60181
  key: "isDisposed",
60153
60182
  value: function isDisposed() {
@@ -60156,7 +60185,8 @@ var tweenTo = function tweenTo(origin, target) {
60156
60185
  }, {
60157
60186
  key: "reset",
60158
60187
  value: function reset() {
60159
- this.scripts = [];
60188
+ this.dynamicScripts = [];
60189
+ this.staticScripts = [];
60160
60190
  this.children = [];
60161
60191
  this.isMage = true;
60162
60192
  this.parent = false;
@@ -60363,20 +60393,18 @@ var tweenTo = function tweenTo(origin, target) {
60363
60393
  key: "disposeScripts",
60364
60394
  value: function disposeScripts() {
60365
60395
  if (this.hasScripts()) {
60366
- var length = this.scripts.length;
60396
+ var length = this.allScripts().length;
60367
60397
 
60368
60398
  for (var i = 0; i < length; i++) {
60369
- var _this$scripts$i = this.scripts[i],
60370
- script = _this$scripts$i.script,
60371
- enabled = _this$scripts$i.enabled;
60399
+ var _this$allScripts$i = this.allScripts()[i],
60400
+ script = _this$allScripts$i.script,
60401
+ enabled = _this$allScripts$i.enabled;
60372
60402
 
60373
60403
  if (enabled) {
60374
60404
  script.onDispose();
60375
60405
 
60376
60406
  script.__setStartedFlag(false);
60377
60407
  }
60378
-
60379
- delete this.scripts[i];
60380
60408
  }
60381
60409
  }
60382
60410
  }
@@ -60386,7 +60414,7 @@ var tweenTo = function tweenTo(origin, target) {
60386
60414
  var _this4 = this;
60387
60415
 
60388
60416
  if (this.hasScripts()) {
60389
- this.scripts.forEach(function (_ref4) {
60417
+ this.allScripts().forEach(function (_ref4) {
60390
60418
  var script = _ref4.script,
60391
60419
  enabled = _ref4.enabled,
60392
60420
  options = _ref4.options;
@@ -60403,7 +60431,7 @@ var tweenTo = function tweenTo(origin, target) {
60403
60431
  key: "update",
60404
60432
  value: function update(dt) {
60405
60433
  if (this.hasScripts()) {
60406
- this.scripts.forEach(function (_ref5) {
60434
+ this.dynamicScripts.forEach(function (_ref5) {
60407
60435
  var script = _ref5.script,
60408
60436
  enabled = _ref5.enabled;
60409
60437
 
@@ -60417,7 +60445,7 @@ var tweenTo = function tweenTo(origin, target) {
60417
60445
  key: "onPhysicsUpdate",
60418
60446
  value: function onPhysicsUpdate(dt) {
60419
60447
  if (this.hasScripts()) {
60420
- this.scripts.forEach(function (_ref6) {
60448
+ this.dynamicScripts.forEach(function (_ref6) {
60421
60449
  var script = _ref6.script,
60422
60450
  enabled = _ref6.enabled;
60423
60451
 
@@ -60502,33 +60530,22 @@ var tweenTo = function tweenTo(origin, target) {
60502
60530
  }, {
60503
60531
  key: "getScript",
60504
60532
  value: function getScript(name) {
60505
- var script = this.scripts.filter(function (script) {
60506
- return script.name === name;
60507
- })[0].script;
60508
-
60509
- if (script) {
60510
- return script;
60511
- } else {
60533
+ if (!this.hasScript(name)) {
60512
60534
  console.warn(SCRIPT_NOT_FOUND);
60513
60535
  return false;
60514
60536
  }
60537
+
60538
+ var script = this.allScripts().filter(function (script) {
60539
+ return script.name === name;
60540
+ })[0].script;
60541
+ return script;
60515
60542
  }
60516
60543
  }, {
60517
- key: "addScripts",
60518
- value: function addScripts() {
60519
- var _this6 = this;
60520
-
60521
- var scripts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
60522
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
60523
- var enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
60524
- var parsedScripts = this.parseScripts(scripts, options, enabled);
60525
- this.scripts = [].concat(_toConsumableArray(this.scripts), [parsedScripts]);
60526
-
60527
- if (enabled) {
60528
- parsedScripts.forEach(function (parsed) {
60529
- return parsed.start(_this6, parsed.options);
60530
- });
60531
- }
60544
+ key: "hasScript",
60545
+ value: function hasScript(name) {
60546
+ return this.allScripts().filter(function (script) {
60547
+ return script.name === name;
60548
+ }).length;
60532
60549
  }
60533
60550
  }, {
60534
60551
  key: "addScript",
@@ -60539,12 +60556,22 @@ var tweenTo = function tweenTo(origin, target) {
60539
60556
  enabled = _options$enabled === void 0 ? true : _options$enabled;
60540
60557
 
60541
60558
  if (script) {
60542
- this.scripts.push({
60559
+ var payload = {
60543
60560
  script: script,
60544
60561
  name: name,
60545
60562
  enabled: enabled,
60546
60563
  options: options
60547
- });
60564
+ };
60565
+
60566
+ if (script.__isStatic()) {
60567
+ this.staticScripts.push(_objectSpread2$1(_objectSpread2$1({}, payload), {}, {
60568
+ index: this.staticScripts.length
60569
+ }));
60570
+ } else {
60571
+ this.dynamicScripts.push(_objectSpread2$1(_objectSpread2$1({}, payload), {}, {
60572
+ index: this.dynamicScripts.length
60573
+ }));
60574
+ }
60548
60575
 
60549
60576
  if (enabled) {
60550
60577
  script.start(this, options);
@@ -60558,14 +60585,24 @@ var tweenTo = function tweenTo(origin, target) {
60558
60585
  }, {
60559
60586
  key: "removeScript",
60560
60587
  value: function removeScript(name) {
60561
- var index = this.scripts.findIndex(function (script) {
60588
+ var all = this.allScripts();
60589
+ var allIndex = all.findIndex(function (script) {
60562
60590
  return script.name === name;
60563
60591
  });
60564
- var script = this.scripts[index].script;
60592
+ var _all$allIndex = all[allIndex],
60593
+ script = _all$allIndex.script,
60594
+ index = _all$allIndex.index;
60565
60595
 
60566
60596
  if (script) {
60567
60597
  script.onDispose();
60568
- this.scripts.splice(index, 1);
60598
+
60599
+ if (script.__isStatic()) {
60600
+ this.staticScripts.splice(index, 1);
60601
+ } else {
60602
+ this.dynamicScripts.splice(index, 1);
60603
+ }
60604
+
60605
+ this.updateScriptsIndexes();
60569
60606
  } else {
60570
60607
  console.log(SCRIPT_NOT_FOUND);
60571
60608
  }
@@ -60697,7 +60734,7 @@ var tweenTo = function tweenTo(origin, target) {
60697
60734
  }, {
60698
60735
  key: "scaleTo",
60699
60736
  value: function scaleTo() {
60700
- var _this7 = this;
60737
+ var _this6 = this;
60701
60738
 
60702
60739
  var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getScale();
60703
60740
  var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
@@ -60715,7 +60752,7 @@ var tweenTo = function tweenTo(origin, target) {
60715
60752
  }, scale);
60716
60753
 
60717
60754
  var onUpdate = function onUpdate(value) {
60718
- return !_this7.isDisposed() && _this7.setScale(value);
60755
+ return !_this6.isDisposed() && _this6.setScale(value);
60719
60756
  };
60720
60757
 
60721
60758
  return tweenTo({
@@ -60730,7 +60767,7 @@ var tweenTo = function tweenTo(origin, target) {
60730
60767
  }, {
60731
60768
  key: "rotateTo",
60732
60769
  value: function rotateTo() {
60733
- var _this8 = this;
60770
+ var _this7 = this;
60734
60771
 
60735
60772
  var rotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getRotation();
60736
60773
  var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
@@ -60748,7 +60785,7 @@ var tweenTo = function tweenTo(origin, target) {
60748
60785
  }, rotation);
60749
60786
 
60750
60787
  var onUpdate = function onUpdate(value) {
60751
- return !_this8.isDisposed() && _this8.setRotation(value);
60788
+ return !_this7.isDisposed() && _this7.setRotation(value);
60752
60789
  };
60753
60790
 
60754
60791
  return tweenTo({
@@ -60763,7 +60800,7 @@ var tweenTo = function tweenTo(origin, target) {
60763
60800
  }, {
60764
60801
  key: "goTo",
60765
60802
  value: function goTo() {
60766
- var _this9 = this;
60803
+ var _this8 = this;
60767
60804
 
60768
60805
  var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getPosition();
60769
60806
  var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
@@ -60781,7 +60818,7 @@ var tweenTo = function tweenTo(origin, target) {
60781
60818
  }, position);
60782
60819
 
60783
60820
  var onUpdate = function onUpdate(value) {
60784
- return !_this9.isDisposed() && _this9.setPosition(value);
60821
+ return !_this8.isDisposed() && _this8.setPosition(value);
60785
60822
  };
60786
60823
 
60787
60824
  return tweenTo({
@@ -60862,16 +60899,19 @@ var tweenTo = function tweenTo(origin, target) {
60862
60899
  }, {
60863
60900
  key: "mapScriptsToJSON",
60864
60901
  value: function mapScriptsToJSON() {
60865
- this.scripts.reduce(function (acc, _ref8) {
60902
+ this.allScripts().reduce(function (acc, _ref8) {
60866
60903
  var name = _ref8.name,
60867
60904
  _ref8$options = _ref8.options,
60868
- options = _ref8$options === void 0 ? {} : _ref8$options;
60905
+ options = _ref8$options === void 0 ? {} : _ref8$options,
60906
+ script = _ref8.script;
60869
60907
  acc.names.push(name);
60870
60908
  acc.options.push(options);
60909
+ acc.static.push(script.__isStatic());
60871
60910
  return acc;
60872
60911
  }, {
60873
60912
  names: [],
60874
- options: []
60913
+ options: [],
60914
+ static: []
60875
60915
  });
60876
60916
  }
60877
60917
  }, {
@@ -61027,7 +61067,7 @@ var isTextureMapAllowedForMaterial = function isTextureMapAllowedForMaterial(mat
61027
61067
  };var _excluded$8 = ["position", "quaternion"],
61028
61068
  _excluded2 = ["applyPhysicsUpdate"],
61029
61069
  _excluded3 = ["dt", "event"];
61030
- var COLLIDER_TAG = 'collider';
61070
+ var COLLIDER_TAG = "collider";
61031
61071
  var DEFAULT_COLLIDER_OFFSET = {
61032
61072
  x: 0,
61033
61073
  y: 0,
@@ -61853,14 +61893,63 @@ var Element$1 = /*#__PURE__*/function (_Entity) {
61853
61893
  }]);
61854
61894
 
61855
61895
  return Camera;
61856
- }(Entity);var Grid = /*#__PURE__*/function (_Element) {
61896
+ }(Entity);var Color = /*#__PURE__*/function () {
61897
+ _createClass(Color, null, [{
61898
+ key: "randomColor",
61899
+ value: function randomColor() {
61900
+ var asNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
61901
+ var letters = '0123456789ABCDEF'.split('');
61902
+ var color = '';
61903
+
61904
+ for (var i = 0; i < 6; i++) {
61905
+ color += letters[Math.floor(Math.random() * 16)];
61906
+ }
61907
+
61908
+ return asNumber ? Number("0x".concat(color)) : "#".concat(color);
61909
+ }
61910
+ }, {
61911
+ key: "componentToHex",
61912
+ value: function componentToHex(c) {
61913
+ var hex = c.toString(16);
61914
+ return hex.length == 1 ? "0" + hex : hex;
61915
+ }
61916
+ }, {
61917
+ key: "gbToHex",
61918
+ value: function gbToHex(r, g, b) {
61919
+ return "0x" + Color.componentToHex(r) + Color.componentToHex(g) + Color.componentToHex(b);
61920
+ }
61921
+ }, {
61922
+ key: "getIntValueFromHex",
61923
+ value: function getIntValueFromHex(hex) {
61924
+ return parseInt(hex, 16);
61925
+ }
61926
+ }]);
61927
+
61928
+ function Color(color) {
61929
+ _classCallCheck(this, Color);
61930
+
61931
+ this.color = new Color$1(color);
61932
+ }
61933
+
61934
+ _createClass(Color, [{
61935
+ key: "getColor",
61936
+ value: function getColor() {
61937
+ return this.color;
61938
+ }
61939
+ }]);
61940
+
61941
+ return Color;
61942
+ }();var Grid = /*#__PURE__*/function (_Element) {
61857
61943
  _inherits(Grid, _Element);
61858
61944
 
61859
61945
  var _super = _createSuper(Grid);
61860
61946
 
61861
- function Grid(size, division, color1, color2) {
61947
+ function Grid(size, division) {
61862
61948
  var _this;
61863
61949
 
61950
+ var color1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Color.randomColor(true);
61951
+ var color2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Color.randomColor(true);
61952
+
61864
61953
  _classCallCheck(this, Grid);
61865
61954
 
61866
61955
  var options = {
@@ -61868,7 +61957,7 @@ var Element$1 = /*#__PURE__*/function (_Entity) {
61868
61957
  division: division,
61869
61958
  color1: color1,
61870
61959
  color2: color2,
61871
- name: generateRandomName('GridHelper')
61960
+ name: generateRandomName("GridHelper")
61872
61961
  };
61873
61962
  _this = _super.call(this, options);
61874
61963
  var body = new GridHelper(size, division, color1, color2);
@@ -61986,7 +62075,7 @@ var Axes = /*#__PURE__*/function (_Element) {
61986
62075
  var _this;
61987
62076
 
61988
62077
  var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
61989
- var color = arguments.length > 1 ? arguments[1] : undefined;
62078
+ var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Color.randomColor(true);
61990
62079
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
61991
62080
 
61992
62081
  _classCallCheck(this, Cube);
@@ -62018,7 +62107,7 @@ var Axes = /*#__PURE__*/function (_Element) {
62018
62107
  var _this;
62019
62108
 
62020
62109
  var radius = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
62021
- var color = arguments.length > 1 ? arguments[1] : undefined;
62110
+ var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Color.randomColor(true);
62022
62111
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
62023
62112
 
62024
62113
  _classCallCheck(this, Sphere);
@@ -62052,8 +62141,8 @@ var Axes = /*#__PURE__*/function (_Element) {
62052
62141
 
62053
62142
  var radiusTop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
62054
62143
  var radiusBottom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
62055
- var height = arguments.length > 2 ? arguments[2] : undefined;
62056
- var color = arguments.length > 3 ? arguments[3] : undefined;
62144
+ var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
62145
+ var color = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Color.randomColor(true);
62057
62146
  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
62058
62147
 
62059
62148
  _classCallCheck(this, Cylinder);
@@ -62224,24 +62313,23 @@ var Plane = /*#__PURE__*/function (_Element) {
62224
62313
  function Plane(height, width) {
62225
62314
  var _this;
62226
62315
 
62227
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
62316
+ var color = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Color.randomColor(true);
62317
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
62228
62318
 
62229
62319
  _classCallCheck(this, Plane);
62230
62320
 
62231
62321
  _this = _super.call(this, options);
62232
- var _options$color = options.color,
62233
- color = _options$color === void 0 ? 0xfffffff : _options$color,
62234
- _options$transparent = options.transparent,
62322
+ var _options$transparent = options.transparent,
62235
62323
  transparent = _options$transparent === void 0 ? false : _options$transparent,
62236
62324
  _options$opacity = options.opacity,
62237
62325
  opacity = _options$opacity === void 0 ? 1 : _options$opacity;
62238
- material = new MeshBasicMaterial({
62326
+ var material = new MeshBasicMaterial({
62239
62327
  color: color,
62240
62328
  side: DoubleSide,
62241
62329
  transparent: transparent,
62242
62330
  opacity: opacity
62243
62331
  });
62244
- geometry = new PlaneGeometry(width, height);
62332
+ var geometry = new PlaneGeometry(width, height);
62245
62333
 
62246
62334
  _this.setBody({
62247
62335
  geometry: geometry,
@@ -62283,7 +62371,7 @@ var Plane = /*#__PURE__*/function (_Element) {
62283
62371
  var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
62284
62372
  var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
62285
62373
  var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
62286
- var color = arguments.length > 3 ? arguments[3] : undefined;
62374
+ var color = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Color.randomColor(true);
62287
62375
  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
62288
62376
 
62289
62377
  _classCallCheck(this, Box);
@@ -62363,6 +62451,24 @@ var Sprite = /*#__PURE__*/function (_Element) {
62363
62451
  var rotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getRotation();
62364
62452
  this.body.material.rotation = rotation;
62365
62453
  }
62454
+ }, {
62455
+ key: "setSizeAttenuation",
62456
+ value: function setSizeAttenuation() {
62457
+ var attenuation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
62458
+ this.body.material.sizeAttenuation = attenuation;
62459
+ }
62460
+ }, {
62461
+ key: "setDepthTest",
62462
+ value: function setDepthTest() {
62463
+ var depthTest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
62464
+ this.body.material.depthTest = depthTest;
62465
+ }
62466
+ }, {
62467
+ key: "setDepthWrite",
62468
+ value: function setDepthWrite() {
62469
+ var depthWrite = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
62470
+ this.body.material.depthWrite = depthWrite;
62471
+ }
62366
62472
  }]);
62367
62473
 
62368
62474
  return Sprite;
@@ -82784,9 +82890,7 @@ var MeshLoader = /*#__PURE__*/function (_Loader) {
82784
82890
 
82785
82891
  return MeshLoader;
82786
82892
  }(Loader);
82787
- var MeshLoader$1 = new MeshLoader();var LAMP_COLOR = 0Xf1c40f;
82788
-
82789
- var Light = /*#__PURE__*/function (_Entity) {
82893
+ var MeshLoader$1 = new MeshLoader();var Light = /*#__PURE__*/function (_Entity) {
82790
82894
  _inherits(Light, _Entity);
82791
82895
 
82792
82896
  var _super = _createSuper(Light);
@@ -82805,36 +82909,53 @@ var Light = /*#__PURE__*/function (_Entity) {
82805
82909
  });
82806
82910
 
82807
82911
  _defineProperty$1(_assertThisInitialized(_this), "addHolder", function () {
82808
- var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'lightholder';
82809
- var body = Models$1.getModel(name);
82810
-
82811
- if (body) {
82812
- _this.holder = body;
82813
-
82814
- _this.holder.setMaterialFromName(MATERIALS.BASIC, {
82815
- wireframe: true,
82816
- color: LAMP_COLOR
82817
- });
82818
-
82819
- _this.holder.serializable = false;
82912
+ var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "lightholder";
82913
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.05;
82914
+ var holderSprite = new Sprite(size, size, name, {
82915
+ name: name
82916
+ });
82820
82917
 
82821
- _this.holder.setPosition({
82822
- x: _this.body.position.x,
82823
- y: _this.body.position.y,
82824
- z: _this.body.position.z
82825
- });
82918
+ if (holderSprite) {
82919
+ holderSprite.setSizeAttenuation(false);
82920
+ holderSprite.setDepthTest(false);
82921
+ holderSprite.setDepthWrite(false);
82922
+ holderSprite.setSerializable(false);
82923
+ holderSprite.setPosition(_this.getPosition());
82924
+ holderSprite.addTags([TAGS.LIGHTS.HELPER, TAGS.LIGHTS.HOLDER, name]);
82925
+ _this.holder = holderSprite;
82926
+ return true;
82826
82927
  } else {
82827
82928
  console.warn(LIGHT_HOLDER_MODEL_NOT_FOUND);
82929
+ return false;
82930
+ }
82931
+ });
82932
+
82933
+ _defineProperty$1(_assertThisInitialized(_this), "addTargetHolder", function () {
82934
+ var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "targetholder";
82935
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.05;
82936
+ var targetSprite = new Sprite(size, size, name, {
82937
+ name: name
82938
+ });
82939
+
82940
+ if (targetSprite) {
82941
+ targetSprite.setSizeAttenuation(false);
82942
+ targetSprite.setDepthTest(false);
82943
+ targetSprite.setDepthWrite(false);
82944
+ targetSprite.setSerializable(false);
82945
+ targetSprite.setPosition(_this.getTargetPosition());
82946
+ targetSprite.addTags([TAGS.LIGHTS.HELPER, TAGS.LIGHTS.TARGET, name]);
82947
+ targetSprite.getBody().add(_this.getBody().target);
82948
+ _this.targetHolder = targetSprite;
82828
82949
  }
82829
82950
  });
82830
82951
 
82831
82952
  _this.color = color;
82832
82953
  _this.intensity = intensity;
82833
- _this.name = _name || generateRandomName('Light');
82954
+ _this.name = _name || generateRandomName("Light");
82834
82955
  _this.isLightOn = false;
82835
82956
  _this.body = undefined; // helper body for this light
82836
82957
 
82837
- _this.helper = undefined; // holder body representing the light
82958
+ _this.isUsingHelper = undefined; // holder body representing the light
82838
82959
 
82839
82960
  _this.holder = undefined; // target body for the light (only used by directional light)
82840
82961
 
@@ -82854,15 +82975,20 @@ var Light = /*#__PURE__*/function (_Entity) {
82854
82975
  }
82855
82976
  }
82856
82977
  }, {
82857
- key: "hasHelper",
82858
- value: function hasHelper() {
82859
- return !!this.helper;
82978
+ key: "usingHelper",
82979
+ value: function usingHelper() {
82980
+ return !!this.isUsingHelper;
82860
82981
  }
82861
82982
  }, {
82862
82983
  key: "hasHolder",
82863
82984
  value: function hasHolder() {
82864
82985
  return !!this.holder;
82865
82986
  }
82987
+ }, {
82988
+ key: "hasTarget",
82989
+ value: function hasTarget() {
82990
+ return false;
82991
+ }
82866
82992
  }, {
82867
82993
  key: "getPosition",
82868
82994
  value: function getPosition() {
@@ -83012,7 +83138,7 @@ var SunLight = /*#__PURE__*/function (_Light) {
83012
83138
  _options$intensity = options.intensity,
83013
83139
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$4 : _options$intensity,
83014
83140
  _options$name = options.name,
83015
- name = _options$name === void 0 ? generateRandomName('SunLight') : _options$name;
83141
+ name = _options$name === void 0 ? generateRandomName("SunLight") : _options$name;
83016
83142
  _this = _super.call(this, {
83017
83143
  color: color,
83018
83144
  intensity: intensity,
@@ -83104,19 +83230,9 @@ var SunLight = /*#__PURE__*/function (_Light) {
83104
83230
  }
83105
83231
  }
83106
83232
  }, {
83107
- key: "getTargetMesh",
83108
- value: function getTargetMesh(initialPosition) {
83109
- var geometry = new SphereGeometry(3, 6, 6);
83110
- var material = new MeshBasicMaterial({
83111
- color: 0xeeeeee,
83112
- wireframe: true
83113
- });
83114
- var target = new Element$1({
83115
- geometry: geometry,
83116
- material: material
83117
- });
83118
- target.position(initialPosition);
83119
- return target;
83233
+ key: "hasTarget",
83234
+ value: function hasTarget() {
83235
+ return true;
83120
83236
  }
83121
83237
  }, {
83122
83238
  key: "setTarget",
@@ -83132,20 +83248,32 @@ var SunLight = /*#__PURE__*/function (_Light) {
83132
83248
  return this.target;
83133
83249
  }
83134
83250
  }, {
83135
- key: "addHelper",
83136
- value: function addHelper() {
83137
- this.helper = new DirectionalLightHelper(this.body, 5);
83138
- this.shadowHelper = new CameraHelper(this.body.shadow.camera);
83251
+ key: "addHelpers",
83252
+ value: function addHelpers() {
83253
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
83254
+ _ref2$holderName = _ref2.holderName,
83255
+ holderName = _ref2$holderName === void 0 ? "sunlightHelper" : _ref2$holderName,
83256
+ _ref2$holderSize = _ref2.holderSize,
83257
+ holderSize = _ref2$holderSize === void 0 ? 0.05 : _ref2$holderSize,
83258
+ _ref2$targetHolderNam = _ref2.targetHolderName,
83259
+ targetHolderName = _ref2$targetHolderNam === void 0 ? "targetholder" : _ref2$targetHolderNam,
83260
+ _ref2$targetHolderSiz = _ref2.targetHolderSize,
83261
+ targetHolderSize = _ref2$targetHolderSiz === void 0 ? 0.05 : _ref2$targetHolderSiz;
83262
+
83263
+ this.helper = new DirectionalLightHelper(this.getBody(), 5);
83264
+ this.shadowHelper = new CameraHelper(this.getBody().shadow.camera);
83139
83265
  Scene$1.add(this.helper, null, false);
83140
83266
  Scene$1.add(this.shadowHelper, null, false);
83141
- this.addHolder();
83267
+ this.addHolder(holderName, holderSize);
83268
+ this.addTargetHolder(targetHolderName, targetHolderSize);
83269
+ this.isUsingHelper = true;
83142
83270
  }
83143
83271
  }, {
83144
83272
  key: "update",
83145
83273
  value: function update(dt) {
83146
83274
  _get(_getPrototypeOf(SunLight.prototype), "update", this).call(this, dt);
83147
83275
 
83148
- if (this.hasHelper()) {
83276
+ if (this.usingHelper()) {
83149
83277
  this.helper.update();
83150
83278
  this.shadowHelper.update();
83151
83279
  }
@@ -83184,7 +83312,7 @@ var AmbientLight = /*#__PURE__*/function (_Light) {
83184
83312
  _options$intensity = options.intensity,
83185
83313
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$3 : _options$intensity,
83186
83314
  _options$name = options.name,
83187
- name = _options$name === void 0 ? generateRandomName('AmbientLight') : _options$name;
83315
+ name = _options$name === void 0 ? generateRandomName("AmbientLight") : _options$name;
83188
83316
  _this = _super.call(this, {
83189
83317
  color: color,
83190
83318
  intensity: intensity,
@@ -83236,17 +83364,23 @@ var AmbientLight = /*#__PURE__*/function (_Light) {
83236
83364
  this.addToScene();
83237
83365
  }
83238
83366
  }, {
83239
- key: "addHelper",
83240
- value: function addHelper() {
83241
- this.helper = true;
83242
- this.addHolder('ambientlightholder');
83367
+ key: "addHelpers",
83368
+ value: function addHelpers() {
83369
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
83370
+ _ref2$holderName = _ref2.holderName,
83371
+ holderName = _ref2$holderName === void 0 ? "ambientlightholder" : _ref2$holderName,
83372
+ _ref2$holderSize = _ref2.holderSize,
83373
+ holderSize = _ref2$holderSize === void 0 ? 0.05 : _ref2$holderSize;
83374
+
83375
+ this.addHolder(holderName, holderSize);
83376
+ this.isUsingHelper = true;
83243
83377
  }
83244
83378
  }, {
83245
83379
  key: "update",
83246
83380
  value: function update(dt) {
83247
83381
  _get(_getPrototypeOf(AmbientLight.prototype), "update", this).call(this, dt);
83248
83382
 
83249
- if (this.hasHelper()) {
83383
+ if (this.usingHelper()) {
83250
83384
  this.setPosition(this.holder.getPosition(), {
83251
83385
  updateHolder: false
83252
83386
  });
@@ -83287,7 +83421,7 @@ var PointLight = /*#__PURE__*/function (_Light) {
83287
83421
  _options$intensity = options.intensity,
83288
83422
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$2 : _options$intensity,
83289
83423
  _options$name = options.name,
83290
- name = _options$name === void 0 ? generateRandomName('PointLight') : _options$name,
83424
+ name = _options$name === void 0 ? generateRandomName("PointLight") : _options$name,
83291
83425
  distance = options.distance,
83292
83426
  decay = options.decay;
83293
83427
  _this = _super.call(this, {
@@ -83375,20 +83509,27 @@ var PointLight = /*#__PURE__*/function (_Light) {
83375
83509
  }
83376
83510
  }
83377
83511
  }, {
83378
- key: "addHelper",
83379
- value: function addHelper() {
83380
- this.helper = new PointLightHelper(this.body, 2, GREEN$2);
83381
- this.shadowHelper = new CameraHelper(this.body.shadow.camera);
83512
+ key: "addHelpers",
83513
+ value: function addHelpers() {
83514
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
83515
+ _ref2$holderName = _ref2.holderName,
83516
+ holderName = _ref2$holderName === void 0 ? "pointlightholder" : _ref2$holderName,
83517
+ _ref2$holderSize = _ref2.holderSize,
83518
+ holderSize = _ref2$holderSize === void 0 ? 0.05 : _ref2$holderSize;
83519
+
83520
+ this.helper = new PointLightHelper(this.getBody(), 2, GREEN$2);
83521
+ this.shadowHelper = new CameraHelper(this.getBody().shadow.camera);
83382
83522
  Scene$1.add(this.helper, null, false);
83383
83523
  Scene$1.add(this.shadowHelper, null, false);
83384
- this.addHolder();
83524
+ this.addHolder(holderName, holderSize);
83525
+ this.isUsingHelper = true;
83385
83526
  }
83386
83527
  }, {
83387
83528
  key: "update",
83388
83529
  value: function update(dt) {
83389
83530
  _get(_getPrototypeOf(PointLight.prototype), "update", this).call(this, dt);
83390
83531
 
83391
- if (this.hasHelper()) {
83532
+ if (this.usingHelper()) {
83392
83533
  this.helper.update();
83393
83534
  this.shadowHelper.update();
83394
83535
  }
@@ -83440,7 +83581,7 @@ var PointLight = /*#__PURE__*/function (_Light) {
83440
83581
  }
83441
83582
 
83442
83583
  if (light && useHelper) {
83443
- light.addHelper();
83584
+ light.addHelpers();
83444
83585
  }
83445
83586
  };
83446
83587
  });
@@ -88105,17 +88246,17 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88105
88246
  if (planeIntersect) {
88106
88247
  var space = _this.space;
88107
88248
 
88108
- if (_this.mode === 'scale') {
88109
- space = 'local';
88110
- } else if (_this.axis === 'E' || _this.axis === 'XYZE' || _this.axis === 'XYZ') {
88111
- space = 'world';
88249
+ if (_this.mode === "scale") {
88250
+ space = "local";
88251
+ } else if (_this.axis === "E" || _this.axis === "XYZE" || _this.axis === "XYZ") {
88252
+ space = "world";
88112
88253
  }
88113
88254
 
88114
- if (space === 'local' && _this.mode === 'rotate') {
88255
+ if (space === "local" && _this.mode === "rotate") {
88115
88256
  var snap = _this.rotationSnap;
88116
- if (_this.axis === 'X' && snap) _this.object.rotation.x = Math.round(_this.object.rotation.x / snap) * snap;
88117
- if (_this.axis === 'Y' && snap) _this.object.rotation.y = Math.round(_this.object.rotation.y / snap) * snap;
88118
- if (_this.axis === 'Z' && snap) _this.object.rotation.z = Math.round(_this.object.rotation.z / snap) * snap;
88257
+ if (_this.axis === "X" && snap) _this.object.rotation.x = Math.round(_this.object.rotation.x / snap) * snap;
88258
+ if (_this.axis === "Y" && snap) _this.object.rotation.y = Math.round(_this.object.rotation.y / snap) * snap;
88259
+ if (_this.axis === "Z" && snap) _this.object.rotation.z = Math.round(_this.object.rotation.z / snap) * snap;
88119
88260
  }
88120
88261
 
88121
88262
  _this.object.updateMatrixWorld();
@@ -88132,7 +88273,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88132
88273
 
88133
88274
  _this.pointStart.copy(planeIntersect.point).sub(_this.worldPositionStart);
88134
88275
 
88135
- if (space === 'local') {
88276
+ if (space === "local") {
88136
88277
  _this.pointStart.applyQuaternion(_this.worldQuaternionStart.clone().invert());
88137
88278
  }
88138
88279
  }
@@ -88150,10 +88291,10 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88150
88291
  var object = _this.object;
88151
88292
  var space = _this.space;
88152
88293
 
88153
- if (mode === 'scale') {
88154
- space = 'local';
88155
- } else if (axis === 'E' || axis === 'XYZE' || axis === 'XYZ') {
88156
- space = 'world';
88294
+ if (mode === "scale") {
88295
+ space = "local";
88296
+ } else if (axis === "E" || axis === "XYZE" || axis === "XYZ") {
88297
+ space = "world";
88157
88298
  }
88158
88299
 
88159
88300
  if (object === undefined || axis === null || _this.dragging === false || pointer.button !== undefined && pointer.button !== 0) return;
@@ -88165,23 +88306,23 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88165
88306
 
88166
88307
  _this.pointEnd.copy(planeIntersect.point).sub(_this.worldPositionStart);
88167
88308
 
88168
- if (space === 'local') _this.pointEnd.applyQuaternion(_this.worldQuaternionStart.clone().invert());
88309
+ if (space === "local") _this.pointEnd.applyQuaternion(_this.worldQuaternionStart.clone().invert());
88169
88310
 
88170
- if (mode === 'translate') {
88171
- if (axis.search('X') === -1) {
88311
+ if (mode === "translate") {
88312
+ if (axis.search("X") === -1) {
88172
88313
  _this.pointEnd.x = _this.pointStart.x;
88173
88314
  }
88174
88315
 
88175
- if (axis.search('Y') === -1) {
88316
+ if (axis.search("Y") === -1) {
88176
88317
  _this.pointEnd.y = _this.pointStart.y;
88177
88318
  }
88178
88319
 
88179
- if (axis.search('Z') === -1) {
88320
+ if (axis.search("Z") === -1) {
88180
88321
  _this.pointEnd.z = _this.pointStart.z;
88181
88322
  } // Apply translate
88182
88323
 
88183
88324
 
88184
- if (space === 'local') {
88325
+ if (space === "local") {
88185
88326
  object.position.copy(_this.pointEnd).sub(_this.pointStart).applyQuaternion(_this._quaternionStart);
88186
88327
  } else {
88187
88328
  object.position.copy(_this.pointEnd).sub(_this.pointStart);
@@ -88190,38 +88331,38 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88190
88331
  object.position.add(_this._positionStart); // Apply translation snap
88191
88332
 
88192
88333
  if (_this.translationSnap) {
88193
- if (space === 'local') {
88334
+ if (space === "local") {
88194
88335
  object.position.applyQuaternion(_this._tempQuaternion.copy(_this._quaternionStart).invert());
88195
88336
 
88196
- if (axis.search('X') !== -1) {
88337
+ if (axis.search("X") !== -1) {
88197
88338
  object.position.x = Math.round(object.position.x / _this.translationSnap) * _this.translationSnap;
88198
88339
  }
88199
88340
 
88200
- if (axis.search('Y') !== -1) {
88341
+ if (axis.search("Y") !== -1) {
88201
88342
  object.position.y = Math.round(object.position.y / _this.translationSnap) * _this.translationSnap;
88202
88343
  }
88203
88344
 
88204
- if (axis.search('Z') !== -1) {
88345
+ if (axis.search("Z") !== -1) {
88205
88346
  object.position.z = Math.round(object.position.z / _this.translationSnap) * _this.translationSnap;
88206
88347
  }
88207
88348
 
88208
88349
  object.position.applyQuaternion(_this._quaternionStart);
88209
88350
  }
88210
88351
 
88211
- if (space === 'world') {
88352
+ if (space === "world") {
88212
88353
  if (object.parent) {
88213
88354
  object.position.add(_this._tempVector.setFromMatrixPosition(object.parent.matrixWorld));
88214
88355
  }
88215
88356
 
88216
- if (axis.search('X') !== -1) {
88357
+ if (axis.search("X") !== -1) {
88217
88358
  object.position.x = Math.round(object.position.x / _this.translationSnap) * _this.translationSnap;
88218
88359
  }
88219
88360
 
88220
- if (axis.search('Y') !== -1) {
88361
+ if (axis.search("Y") !== -1) {
88221
88362
  object.position.y = Math.round(object.position.y / _this.translationSnap) * _this.translationSnap;
88222
88363
  }
88223
88364
 
88224
- if (axis.search('Z') !== -1) {
88365
+ if (axis.search("Z") !== -1) {
88225
88366
  object.position.z = Math.round(object.position.z / _this.translationSnap) * _this.translationSnap;
88226
88367
  }
88227
88368
 
@@ -88230,8 +88371,8 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88230
88371
  }
88231
88372
  }
88232
88373
  }
88233
- } else if (mode === 'scale') {
88234
- if (axis.search('XYZ') !== -1) {
88374
+ } else if (mode === "scale") {
88375
+ if (axis.search("XYZ") !== -1) {
88235
88376
  var d = _this.pointEnd.length() / _this.pointStart.length();
88236
88377
 
88237
88378
  if (_this.pointEnd.dot(_this.pointStart) < 0) d *= -1;
@@ -88240,40 +88381,40 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88240
88381
  } else {
88241
88382
  _this._tempVector.copy(_this.pointEnd).divide(_this.pointStart);
88242
88383
 
88243
- if (axis.search('X') === -1) {
88384
+ if (axis.search("X") === -1) {
88244
88385
  _this._tempVector.x = 1;
88245
88386
  }
88246
88387
 
88247
- if (axis.search('Y') === -1) {
88388
+ if (axis.search("Y") === -1) {
88248
88389
  _this._tempVector.y = 1;
88249
88390
  }
88250
88391
 
88251
- if (axis.search('Z') === -1) {
88392
+ if (axis.search("Z") === -1) {
88252
88393
  _this._tempVector.z = 1;
88253
88394
  }
88254
88395
  } // Apply scale
88255
88396
 
88256
88397
 
88257
88398
  object.scale.copy(_this._scaleStart).multiply(_this._tempVector);
88258
- } else if (mode === 'rotate') {
88399
+ } else if (mode === "rotate") {
88259
88400
  var ROTATION_SPEED = 20 / _this.worldPosition.distanceTo(_this._tempVector.setFromMatrixPosition(_this.camera.matrixWorld));
88260
88401
 
88261
88402
  var quaternion = _this.space === "local" ? _this.worldQuaternion : _this._identityQuaternion;
88262
88403
  var unit = _unit[axis];
88263
88404
 
88264
- if (axis === 'E') {
88405
+ if (axis === "E") {
88265
88406
  _this._tempVector.copy(_this.pointEnd).cross(_this.pointStart);
88266
88407
 
88267
88408
  _this.rotationAxis.copy(_this.eye);
88268
88409
 
88269
88410
  _this.rotationAngle = _this.pointEnd.angleTo(_this.pointStart) * (_this._tempVector.dot(_this.eye) < 0 ? 1 : -1);
88270
- } else if (axis === 'XYZE') {
88411
+ } else if (axis === "XYZE") {
88271
88412
  _this._tempVector.copy(_this.pointEnd).sub(_this.pointStart).cross(_this.eye).normalize();
88272
88413
 
88273
88414
  _this.rotationAxis.copy(_this._tempVector);
88274
88415
 
88275
88416
  _this.rotationAngle = _this.pointEnd.sub(_this.pointStart).dot(_this._tempVector.cross(_this.eye)) * ROTATION_SPEED;
88276
- } else if (axis === 'X' || axis === 'Y' || axis === 'Z') {
88417
+ } else if (axis === "X" || axis === "Y" || axis === "Z") {
88277
88418
  _this._alignVector.copy(unit).applyQuaternion(quaternion);
88278
88419
 
88279
88420
  _this.rotationAxis.copy(unit);
@@ -88281,7 +88422,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88281
88422
  _this._tempVector = unit.clone();
88282
88423
  _this._tempVector2 = _this.pointEnd.clone().sub(_this.pointStart);
88283
88424
 
88284
- if (space === 'local') {
88425
+ if (space === "local") {
88285
88426
  _this._tempVector.applyQuaternion(quaternion);
88286
88427
 
88287
88428
  _this._tempVector2.applyQuaternion(_this.worldQuaternionStart);
@@ -88293,7 +88434,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88293
88434
 
88294
88435
  if (_this.rotationSnap) _this.rotationAngle = Math.round(_this.rotationAngle / _this.rotationSnap) * _this.rotationSnap; // Apply rotate
88295
88436
 
88296
- if (space === 'local') {
88437
+ if (space === "local") {
88297
88438
  object.quaternion.copy(_this._quaternionStart);
88298
88439
  object.quaternion.multiply(_this._tempQuaternion.setFromAxisAngle(_this.rotationAxis, _this.rotationAngle));
88299
88440
  } else {
@@ -88313,10 +88454,10 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88313
88454
  var object = _this.object;
88314
88455
  var space = _this.space;
88315
88456
 
88316
- if (mode === 'scale') {
88317
- space = 'local';
88318
- } else if (axis === 'E' || axis === 'XYZE' || axis === 'XYZ') {
88319
- space = 'world';
88457
+ if (mode === "scale") {
88458
+ space = "local";
88459
+ } else if (axis === "E" || axis === "XYZE" || axis === "XYZ") {
88460
+ space = "world";
88320
88461
  }
88321
88462
 
88322
88463
  if (object === undefined || axis === null || _this.dragging === false || pointer.button !== undefined && pointer.button !== 0) return;
@@ -88328,23 +88469,23 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88328
88469
 
88329
88470
  _this.pointEnd.copy(planeIntersect.point).sub(_this.worldPositionStart);
88330
88471
 
88331
- if (space === 'local') _this.pointEnd.applyQuaternion(_this.worldQuaternionStart.clone().invert());
88472
+ if (space === "local") _this.pointEnd.applyQuaternion(_this.worldQuaternionStart.clone().invert());
88332
88473
 
88333
- if (mode === 'translate') {
88334
- if (axis.search('X') === -1) {
88474
+ if (mode === "translate") {
88475
+ if (axis.search("X") === -1) {
88335
88476
  _this.pointEnd.x = _this.pointStart.x;
88336
88477
  }
88337
88478
 
88338
- if (axis.search('Y') === -1) {
88479
+ if (axis.search("Y") === -1) {
88339
88480
  _this.pointEnd.y = _this.pointStart.y;
88340
88481
  }
88341
88482
 
88342
- if (axis.search('Z') === -1) {
88483
+ if (axis.search("Z") === -1) {
88343
88484
  _this.pointEnd.z = _this.pointStart.z;
88344
88485
  } // Apply translate
88345
88486
 
88346
88487
 
88347
- if (space === 'local') {
88488
+ if (space === "local") {
88348
88489
  object.position.copy(_this.pointEnd).sub(_this.pointStart).applyQuaternion(_this._quaternionStart);
88349
88490
  } else {
88350
88491
  object.position.copy(_this.pointEnd).sub(_this.pointStart);
@@ -88353,38 +88494,38 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88353
88494
  object.position.add(_this._positionStart); // Apply translation snap
88354
88495
 
88355
88496
  if (_this.translationSnap) {
88356
- if (space === 'local') {
88497
+ if (space === "local") {
88357
88498
  object.position.applyQuaternion(_this._tempQuaternion.copy(_this._quaternionStart).invert());
88358
88499
 
88359
- if (axis.search('X') !== -1) {
88500
+ if (axis.search("X") !== -1) {
88360
88501
  object.position.x = Math.round(object.position.x / _this.translationSnap) * _this.translationSnap;
88361
88502
  }
88362
88503
 
88363
- if (axis.search('Y') !== -1) {
88504
+ if (axis.search("Y") !== -1) {
88364
88505
  object.position.y = Math.round(object.position.y / _this.translationSnap) * _this.translationSnap;
88365
88506
  }
88366
88507
 
88367
- if (axis.search('Z') !== -1) {
88508
+ if (axis.search("Z") !== -1) {
88368
88509
  object.position.z = Math.round(object.position.z / _this.translationSnap) * _this.translationSnap;
88369
88510
  }
88370
88511
 
88371
88512
  object.position.applyQuaternion(_this._quaternionStart);
88372
88513
  }
88373
88514
 
88374
- if (space === 'world') {
88515
+ if (space === "world") {
88375
88516
  if (object.parent) {
88376
88517
  object.position.add(_this._tempVector.setFromMatrixPosition(object.parent.matrixWorld));
88377
88518
  }
88378
88519
 
88379
- if (axis.search('X') !== -1) {
88520
+ if (axis.search("X") !== -1) {
88380
88521
  object.position.x = Math.round(object.position.x / _this.translationSnap) * _this.translationSnap;
88381
88522
  }
88382
88523
 
88383
- if (axis.search('Y') !== -1) {
88524
+ if (axis.search("Y") !== -1) {
88384
88525
  object.position.y = Math.round(object.position.y / _this.translationSnap) * _this.translationSnap;
88385
88526
  }
88386
88527
 
88387
- if (axis.search('Z') !== -1) {
88528
+ if (axis.search("Z") !== -1) {
88388
88529
  object.position.z = Math.round(object.position.z / _this.translationSnap) * _this.translationSnap;
88389
88530
  }
88390
88531
 
@@ -88393,8 +88534,8 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88393
88534
  }
88394
88535
  }
88395
88536
  }
88396
- } else if (mode === 'scale') {
88397
- if (axis.search('XYZ') !== -1) {
88537
+ } else if (mode === "scale") {
88538
+ if (axis.search("XYZ") !== -1) {
88398
88539
  var d = _this.pointEnd.length() / _this.pointStart.length();
88399
88540
 
88400
88541
  if (_this.pointEnd.dot(_this.pointStart) < 0) d *= -1;
@@ -88403,40 +88544,40 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88403
88544
  } else {
88404
88545
  _this._tempVector.copy(_this.pointEnd).divide(_this.pointStart);
88405
88546
 
88406
- if (axis.search('X') === -1) {
88547
+ if (axis.search("X") === -1) {
88407
88548
  _this._tempVector.x = 1;
88408
88549
  }
88409
88550
 
88410
- if (axis.search('Y') === -1) {
88551
+ if (axis.search("Y") === -1) {
88411
88552
  _this._tempVector.y = 1;
88412
88553
  }
88413
88554
 
88414
- if (axis.search('Z') === -1) {
88555
+ if (axis.search("Z") === -1) {
88415
88556
  _this._tempVector.z = 1;
88416
88557
  }
88417
88558
  } // Apply scale
88418
88559
 
88419
88560
 
88420
88561
  object.scale.copy(_this._scaleStart).multiply(_this._tempVector);
88421
- } else if (mode === 'rotate') {
88562
+ } else if (mode === "rotate") {
88422
88563
  var ROTATION_SPEED = 20 / _this.worldPosition.distanceTo(_this._tempVector.setFromMatrixPosition(_this.camera.matrixWorld));
88423
88564
 
88424
88565
  var quaternion = _this.space === "local" ? _this.worldQuaternion : _this._identityQuaternion;
88425
88566
  var unit = _this._unit[axis];
88426
88567
 
88427
- if (axis === 'E') {
88568
+ if (axis === "E") {
88428
88569
  _this._tempVector.copy(_this.pointEnd).cross(_this.pointStart);
88429
88570
 
88430
88571
  _this.rotationAxis.copy(_this.eye);
88431
88572
 
88432
88573
  _this.rotationAngle = _this.pointEnd.angleTo(_this.pointStart) * (_this._tempVector.dot(_this.eye) < 0 ? 1 : -1);
88433
- } else if (axis === 'XYZE') {
88574
+ } else if (axis === "XYZE") {
88434
88575
  _this._tempVector.copy(_this.pointEnd).sub(_this.pointStart).cross(_this.eye).normalize();
88435
88576
 
88436
88577
  _this.rotationAxis.copy(_this._tempVector);
88437
88578
 
88438
88579
  _this.rotationAngle = _this.pointEnd.sub(_this.pointStart).dot(_this._tempVector.cross(_this.eye)) * ROTATION_SPEED;
88439
- } else if (axis === 'X' || axis === 'Y' || axis === 'Z') {
88580
+ } else if (axis === "X" || axis === "Y" || axis === "Z") {
88440
88581
  _this._alignVector.copy(unit).applyQuaternion(quaternion);
88441
88582
 
88442
88583
  _this.rotationAxis.copy(unit);
@@ -88444,7 +88585,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88444
88585
  _this._tempVector = unit.clone();
88445
88586
  _this._tempVector2 = _this.pointEnd.clone().sub(_this.pointStart);
88446
88587
 
88447
- if (space === 'local') {
88588
+ if (space === "local") {
88448
88589
  _this._tempVector.applyQuaternion(quaternion);
88449
88590
 
88450
88591
  _this._tempVector2.applyQuaternion(_this.worldQuaternionStart);
@@ -88456,7 +88597,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88456
88597
 
88457
88598
  if (_this.rotationSnap) _this.rotationAngle = Math.round(_this.rotationAngle / _this.this.rotationSnap) * _this.this.rotationSnap; // Apply rotate
88458
88599
 
88459
- if (space === 'local') {
88600
+ if (space === "local") {
88460
88601
  object.quaternion.copy(_this._quaternionStart);
88461
88602
  object.quaternion.multiply(_this._tempQuaternion.setFromAxisAngle(_this.rotationAxis, _this.rotationAngle));
88462
88603
  } else {
@@ -88558,35 +88699,35 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88558
88699
  _this._enabled = true;
88559
88700
  _this._axis = null;
88560
88701
 
88561
- _this.setAndDispatch('axis', null);
88702
+ _this.setAndDispatch("axis", null);
88562
88703
 
88563
- _this._mode = 'translate';
88704
+ _this._mode = "translate";
88564
88705
 
88565
- _this.setAndDispatch('mode', 'translate');
88706
+ _this.setAndDispatch("mode", "translate");
88566
88707
 
88567
88708
  _this._translationSnap = null;
88568
88709
  _this._rotationSnap = null;
88569
- _this._space = 'world';
88710
+ _this._space = "world";
88570
88711
 
88571
- _this.setAndDispatch('space', 'world');
88712
+ _this.setAndDispatch("space", "world");
88572
88713
 
88573
88714
  _this._size = 1;
88574
88715
 
88575
- _this.setAndDispatch('size', 1);
88716
+ _this.setAndDispatch("size", 1);
88576
88717
 
88577
88718
  _this._dragging = false;
88578
88719
 
88579
- _this.setAndDispatch('dragging', false);
88720
+ _this.setAndDispatch("dragging", false);
88580
88721
 
88581
88722
  _this._showX = true;
88582
88723
  _this._showY = true;
88583
88724
  _this._showZ = true;
88584
88725
 
88585
- _this.setAndDispatch('showX', true);
88726
+ _this.setAndDispatch("showX", true);
88586
88727
 
88587
- _this.setAndDispatch('showY', true);
88728
+ _this.setAndDispatch("showY", true);
88588
88729
 
88589
- _this.setAndDispatch('showZ', true);
88730
+ _this.setAndDispatch("showZ", true);
88590
88731
 
88591
88732
  _this.ray = new Raycaster();
88592
88733
  _this._tempVector = new Vector3$1();
@@ -88603,16 +88744,16 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88603
88744
  _this._pointEnd = new Vector3$1();
88604
88745
  _this._rotationAxis = new Vector3$1();
88605
88746
 
88606
- _this.setAndDispatch('rotationAxis', new Vector3$1());
88747
+ _this.setAndDispatch("rotationAxis", new Vector3$1());
88607
88748
 
88608
88749
  _this._rotationAngle = 0;
88609
88750
  _this._cameraPosition = new Vector3$1();
88610
88751
 
88611
- _this.setAndDispatch('cameraPosition', new Vector3$1());
88752
+ _this.setAndDispatch("cameraPosition", new Vector3$1());
88612
88753
 
88613
88754
  _this._cameraQuaternion = new Quaternion();
88614
88755
 
88615
- _this.setAndDispatch('cameraQuaternion', new Quaternion());
88756
+ _this.setAndDispatch("cameraQuaternion", new Quaternion());
88616
88757
 
88617
88758
  _this.cameraScale = new Vector3$1();
88618
88759
  _this.parentPosition = new Vector3$1();
@@ -88620,25 +88761,25 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88620
88761
  _this.parentScale = new Vector3$1();
88621
88762
  _this._worldPositionStart = new Vector3$1();
88622
88763
 
88623
- _this.setAndDispatch('worldPositionStart', new Vector3$1());
88764
+ _this.setAndDispatch("worldPositionStart", new Vector3$1());
88624
88765
 
88625
88766
  _this._worldQuaternionStart = new Quaternion();
88626
88767
 
88627
- _this.setAndDispatch('worldQuaternionStart', new Quaternion());
88768
+ _this.setAndDispatch("worldQuaternionStart", new Quaternion());
88628
88769
 
88629
88770
  _this.worldScaleStart = new Vector3$1();
88630
88771
  _this._worldPosition = new Vector3$1();
88631
88772
 
88632
- _this.setAndDispatch('worldPosition', new Vector3$1());
88773
+ _this.setAndDispatch("worldPosition", new Vector3$1());
88633
88774
 
88634
88775
  _this._worldQuaternion = new Quaternion();
88635
88776
 
88636
- _this.setAndDispatch('worldQuaternion', new Quaternion());
88777
+ _this.setAndDispatch("worldQuaternion", new Quaternion());
88637
88778
 
88638
88779
  _this.worldScale = new Vector3$1();
88639
88780
  _this._eye = new Vector3$1();
88640
88781
 
88641
- _this.setAndDispatch('eye', new Vector3$1());
88782
+ _this.setAndDispatch("eye", new Vector3$1());
88642
88783
 
88643
88784
  _this._positionStart = new Vector3$1();
88644
88785
  _this._quaternionStart = new Quaternion();
@@ -88677,7 +88818,7 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88677
88818
  }, {
88678
88819
  key: "enabled",
88679
88820
  value: function enabled(value) {
88680
- this.setAndDispatch('enabled', value);
88821
+ this.setAndDispatch("enabled", value);
88681
88822
  }
88682
88823
  }, {
88683
88824
  key: "init",
@@ -88784,222 +88925,222 @@ var Particles$1 = new Particles();var Orbit = /*#__PURE__*/function (_EventDispa
88784
88925
  }, {
88785
88926
  key: "camera",
88786
88927
  set: function set(value) {
88787
- this.setAndDispatch('camera', value);
88928
+ this.setAndDispatch("camera", value);
88788
88929
  },
88789
88930
  get: function get() {
88790
- return this.getPrivateField('camera');
88931
+ return this.getPrivateField("camera");
88791
88932
  }
88792
88933
  }, {
88793
88934
  key: "object",
88794
88935
  set: function set(value) {
88795
- this.setAndDispatch('object', value);
88936
+ this.setAndDispatch("object", value);
88796
88937
  } // no
88797
88938
  ,
88798
88939
  get: function get() {
88799
- return this.getPrivateField('object');
88940
+ return this.getPrivateField("object");
88800
88941
  }
88801
88942
  }, {
88802
88943
  key: "enabled",
88803
88944
  get: function get() {
88804
- return this.getPrivateField('enabled');
88945
+ return this.getPrivateField("enabled");
88805
88946
  }
88806
88947
  }, {
88807
88948
  key: "axis",
88808
88949
  set: function set(value) {
88809
- this.setAndDispatch('axis', value);
88950
+ this.setAndDispatch("axis", value);
88810
88951
  } // si
88811
88952
  ,
88812
88953
  get: function get() {
88813
- return this.getPrivateField('axis');
88954
+ return this.getPrivateField("axis");
88814
88955
  }
88815
88956
  }, {
88816
88957
  key: "mode",
88817
88958
  set: function set(value) {
88818
- this.setAndDispatch('mode', value);
88959
+ this.setAndDispatch("mode", value);
88819
88960
  } // si
88820
88961
  ,
88821
88962
  get: function get() {
88822
- return this.getPrivateField('mode');
88963
+ return this.getPrivateField("mode");
88823
88964
  }
88824
88965
  }, {
88825
88966
  key: "translationSnap",
88826
88967
  set: function set(value) {
88827
- this.setAndDispatch('translationSnap', value);
88968
+ this.setAndDispatch("translationSnap", value);
88828
88969
  } // no
88829
88970
  ,
88830
88971
  get: function get() {
88831
- return this.getPrivateField('translationSnap');
88972
+ return this.getPrivateField("translationSnap");
88832
88973
  }
88833
88974
  }, {
88834
88975
  key: "rotationSnap",
88835
88976
  set: function set(value) {
88836
- this.setAndDispatch('rotationSnap', value);
88977
+ this.setAndDispatch("rotationSnap", value);
88837
88978
  } // no
88838
88979
  ,
88839
88980
  get: function get() {
88840
- return this.getPrivateField('rotationSnap');
88981
+ return this.getPrivateField("rotationSnap");
88841
88982
  }
88842
88983
  }, {
88843
88984
  key: "space",
88844
88985
  set: function set(value) {
88845
- this.setAndDispatch('space', value);
88986
+ this.setAndDispatch("space", value);
88846
88987
  } // si
88847
88988
  ,
88848
88989
  get: function get() {
88849
- return this.getPrivateField('space');
88990
+ return this.getPrivateField("space");
88850
88991
  }
88851
88992
  }, {
88852
88993
  key: "size",
88853
88994
  set: function set(value) {
88854
- this.setAndDispatch('size', value);
88995
+ this.setAndDispatch("size", value);
88855
88996
  } // si
88856
88997
  ,
88857
88998
  get: function get() {
88858
- return this.getPrivateField('size');
88999
+ return this.getPrivateField("size");
88859
89000
  }
88860
89001
  }, {
88861
89002
  key: "dragging",
88862
89003
  set: function set(value) {
88863
- this.setAndDispatch('dragging', value);
89004
+ this.setAndDispatch("dragging", value);
88864
89005
  } // si
88865
89006
  ,
88866
89007
  get: function get() {
88867
- return this.getPrivateField('dragging');
89008
+ return this.getPrivateField("dragging");
88868
89009
  }
88869
89010
  }, {
88870
89011
  key: "showX",
88871
89012
  set: function set(value) {
88872
- this.setAndDispatch('showX', value);
89013
+ this.setAndDispatch("showX", value);
88873
89014
  } // si
88874
89015
  ,
88875
89016
  get: function get() {
88876
- return this.getPrivateField('showX');
89017
+ return this.getPrivateField("showX");
88877
89018
  }
88878
89019
  }, {
88879
89020
  key: "showY",
88880
89021
  set: function set(value) {
88881
- this.setAndDispatch('showY', value);
89022
+ this.setAndDispatch("showY", value);
88882
89023
  } // si
88883
89024
  ,
88884
89025
  get: function get() {
88885
- return this.getPrivateField('showY');
89026
+ return this.getPrivateField("showY");
88886
89027
  }
88887
89028
  }, {
88888
89029
  key: "showZ",
88889
89030
  set: function set(value) {
88890
- this.setAndDispatch('showZ', value);
89031
+ this.setAndDispatch("showZ", value);
88891
89032
  } // si
88892
89033
  ,
88893
89034
  get: function get() {
88894
- return this.getPrivateField('showZ');
89035
+ return this.getPrivateField("showZ");
88895
89036
  }
88896
89037
  }, {
88897
89038
  key: "parentQuaternion",
88898
89039
  set: function set(value) {
88899
- this.setAndDispatch('parentQuaternion', value);
89040
+ this.setAndDispatch("parentQuaternion", value);
88900
89041
  } // no
88901
89042
  ,
88902
89043
  get: function get() {
88903
- return this.getPrivateField('parentQuaternion');
89044
+ return this.getPrivateField("parentQuaternion");
88904
89045
  }
88905
89046
  }, {
88906
89047
  key: "worldPosition",
88907
89048
  set: function set(value) {
88908
- this.setAndDispatch('worldPosition', value);
89049
+ this.setAndDispatch("worldPosition", value);
88909
89050
  } // si
88910
89051
  ,
88911
89052
  get: function get() {
88912
- return this.getPrivateField('worldPosition');
89053
+ return this.getPrivateField("worldPosition");
88913
89054
  }
88914
89055
  }, {
88915
89056
  key: "worldPositionStart",
88916
89057
  set: function set(value) {
88917
- this.setAndDispatch('worldPositionStart', value);
89058
+ this.setAndDispatch("worldPositionStart", value);
88918
89059
  } // si
88919
89060
  ,
88920
89061
  get: function get() {
88921
- return this.getPrivateField('worldPositionStart');
89062
+ return this.getPrivateField("worldPositionStart");
88922
89063
  }
88923
89064
  }, {
88924
89065
  key: "worldQuaternion",
88925
89066
  set: function set(value) {
88926
- this.setAndDispatch('worldQuaternion', value);
89067
+ this.setAndDispatch("worldQuaternion", value);
88927
89068
  } // si
88928
89069
  ,
88929
89070
  get: function get() {
88930
- return this.getPrivateField('worldQuaternion');
89071
+ return this.getPrivateField("worldQuaternion");
88931
89072
  }
88932
89073
  }, {
88933
89074
  key: "worldQuaternionStart",
88934
89075
  set: function set(value) {
88935
- this.setAndDispatch('worldQuaternionStart', value);
89076
+ this.setAndDispatch("worldQuaternionStart", value);
88936
89077
  } // si
88937
89078
  ,
88938
89079
  get: function get() {
88939
- return this.getPrivateField('worldQuaternionStart');
89080
+ return this.getPrivateField("worldQuaternionStart");
88940
89081
  }
88941
89082
  }, {
88942
89083
  key: "cameraPosition",
88943
89084
  set: function set(value) {
88944
- this.setAndDispatch('cameraPosition', value);
89085
+ this.setAndDispatch("cameraPosition", value);
88945
89086
  } // si
88946
89087
  ,
88947
89088
  get: function get() {
88948
- return this.getPrivateField('cameraPosition');
89089
+ return this.getPrivateField("cameraPosition");
88949
89090
  }
88950
89091
  }, {
88951
89092
  key: "cameraQuaternion",
88952
89093
  set: function set(value) {
88953
- this.setAndDispatch('cameraQuaternion', value);
89094
+ this.setAndDispatch("cameraQuaternion", value);
88954
89095
  } // si
88955
89096
  ,
88956
89097
  get: function get() {
88957
- return this.getPrivateField('cameraQuaternion');
89098
+ return this.getPrivateField("cameraQuaternion");
88958
89099
  }
88959
89100
  }, {
88960
89101
  key: "pointStart",
88961
89102
  set: function set(value) {
88962
- this.setAndDispatch('pointStart', value);
89103
+ this.setAndDispatch("pointStart", value);
88963
89104
  } // no
88964
89105
  ,
88965
89106
  get: function get() {
88966
- return this.getPrivateField('pointStart');
89107
+ return this.getPrivateField("pointStart");
88967
89108
  }
88968
89109
  }, {
88969
89110
  key: "pointEnd",
88970
89111
  set: function set(value) {
88971
- this.setAndDispatch('pointEnd', value);
89112
+ this.setAndDispatch("pointEnd", value);
88972
89113
  } // no
88973
89114
  ,
88974
89115
  get: function get() {
88975
- return this.getPrivateField('pointEnd');
89116
+ return this.getPrivateField("pointEnd");
88976
89117
  }
88977
89118
  }, {
88978
89119
  key: "rotationAxis",
88979
89120
  set: function set(value) {
88980
- this.setAndDispatch('rotationAxis', value);
89121
+ this.setAndDispatch("rotationAxis", value);
88981
89122
  } // no
88982
89123
  ,
88983
89124
  get: function get() {
88984
- return this.getPrivateField('rotationAxis');
89125
+ return this.getPrivateField("rotationAxis");
88985
89126
  }
88986
89127
  }, {
88987
89128
  key: "rotationAngle",
88988
89129
  set: function set(value) {
88989
- this.setAndDispatch('rotationAngle', value);
89130
+ this.setAndDispatch("rotationAngle", value);
88990
89131
  } // no
88991
89132
  ,
88992
89133
  get: function get() {
88993
- return this.getPrivateField('rotationAngle');
89134
+ return this.getPrivateField("rotationAngle");
88994
89135
  }
88995
89136
  }, {
88996
89137
  key: "eye",
88997
89138
  set: function set(value) {
88998
- this.setAndDispatch('eye', value);
89139
+ this.setAndDispatch("eye", value);
88999
89140
  } // si
89000
89141
  ,
89001
89142
  get: function get() {
89002
- return this.getPrivateField('eye');
89143
+ return this.getPrivateField("eye");
89003
89144
  }
89004
89145
  }]);
89005
89146
 
@@ -89726,15 +89867,15 @@ var FirstPersonControl = /*#__PURE__*/function (_EventDispatcher) {
89726
89867
 
89727
89868
  return FlyControl;
89728
89869
  }(EventDispatcher);var CONTROLS = {
89729
- ORBIT: 'orbit',
89730
- TRANSFORM: 'transform',
89731
- FPS: 'fps',
89732
- FLY: 'fly'
89870
+ ORBIT: "orbit",
89871
+ TRANSFORM: "transform",
89872
+ FPS: "fps",
89873
+ FLY: "fly"
89733
89874
  };
89734
89875
  var AVAILABLE_CONTROLS = Object.keys(CONTROLS);
89735
89876
  var EVENTS = {
89736
- CHANGE: 'change',
89737
- DRAGGING_CHANGE: 'dragging-changed'
89877
+ CHANGE: "change",
89878
+ DRAGGING_CHANGE: "dragging-changed"
89738
89879
  };
89739
89880
  var Controls = /*#__PURE__*/function () {
89740
89881
  function Controls() {
@@ -89792,7 +89933,13 @@ var Controls = /*#__PURE__*/function () {
89792
89933
  }
89793
89934
  }, {
89794
89935
  key: "setOrbitControl",
89795
- value: function setOrbitControl() {
89936
+ value: function setOrbitControl(options) {
89937
+ console.warn(DEPRECATIONS.SET_ORBIT_CONTROL);
89938
+ return this.setOrbitControls(options);
89939
+ }
89940
+ }, {
89941
+ key: "setOrbitControls",
89942
+ value: function setOrbitControls() {
89796
89943
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
89797
89944
  _ref$target = _ref.target,
89798
89945
  target = _ref$target === void 0 ? new Vector3$1() : _ref$target;
@@ -89805,12 +89952,18 @@ var Controls = /*#__PURE__*/function () {
89805
89952
  }
89806
89953
  }, {
89807
89954
  key: "setTransformControl",
89808
- value: function setTransformControl() {
89955
+ value: function setTransformControl(options) {
89956
+ console.warn(DEPRECATIONS.SET_TRANSFORM_CONTROL);
89957
+ return this.setTransformControls(options);
89958
+ }
89959
+ }, {
89960
+ key: "setTransformControls",
89961
+ value: function setTransformControls() {
89809
89962
  var _this4 = this;
89810
89963
 
89811
89964
  this.controls[CONTROLS.TRANSFORM] = new TransformControls(Scene$1.getCameraBody(), Scene$1.getDOMElement());
89812
89965
  this.controls[CONTROLS.TRANSFORM].init();
89813
- this.controls[CONTROLS.TRANSFORM].addEventListener(EVENTS.CHANGE, Scene$1.render);
89966
+ this.controls[CONTROLS.TRANSFORM].addEventListener(EVENTS.CHANGE, Scene$1.render.bind(Scene$1));
89814
89967
  this.controls[CONTROLS.TRANSFORM].addEventListener(EVENTS.DRAGGING_CHANGE, function (event) {
89815
89968
  if (_this4.controls[CONTROLS.ORBIT]) {
89816
89969
  _this4.controls[CONTROLS.ORBIT].enabled = !event.value;
@@ -89821,13 +89974,25 @@ var Controls = /*#__PURE__*/function () {
89821
89974
  }, {
89822
89975
  key: "setFirstPersonControl",
89823
89976
  value: function setFirstPersonControl(options) {
89977
+ console.warn(DEPRECATIONS.SET_FIRST_PERSON_CONTROL);
89978
+ return this.setFirstPersonControls(options);
89979
+ }
89980
+ }, {
89981
+ key: "setFirstPersonControls",
89982
+ value: function setFirstPersonControls(options) {
89824
89983
  this.controls[CONTROLS.FPS] = new FirstPersonControl(Scene$1.getCamera(), Scene$1.getDOMElement(), options);
89825
89984
  this.controls[CONTROLS.FPS].init();
89826
89985
  return this.controls[CONTROLS.FPS];
89827
89986
  }
89828
89987
  }, {
89829
89988
  key: "setFlyControl",
89830
- value: function setFlyControl() {
89989
+ value: function setFlyControl(options) {
89990
+ console.warn(DEPRECATIONS.SET_FLY_CONTROL);
89991
+ return this.setFlyControls(options);
89992
+ }
89993
+ }, {
89994
+ key: "setFlyControls",
89995
+ value: function setFlyControls() {
89831
89996
  this.controls[CONTROLS.FLY] = new FlyControl(Scene$1.getCameraBody(), Scene$1.getDOMElement());
89832
89997
  this.controls[CONTROLS.FLY].init();
89833
89998
  return this.controls[CONTROLS.FLY];
@@ -90621,53 +90786,7 @@ var Label = /*#__PURE__*/function (_Element) {
90621
90786
  }]);
90622
90787
 
90623
90788
  return Label;
90624
- }(Element$1);var Color = /*#__PURE__*/function () {
90625
- _createClass(Color, null, [{
90626
- key: "randomColor",
90627
- value: function randomColor() {
90628
- var asNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
90629
- var letters = '0123456789ABCDEF'.split('');
90630
- var color = '';
90631
-
90632
- for (var i = 0; i < 6; i++) {
90633
- color += letters[Math.floor(Math.random() * 16)];
90634
- }
90635
-
90636
- return asNumber ? Number("0x".concat(color)) : "#".concat(color);
90637
- }
90638
- }, {
90639
- key: "componentToHex",
90640
- value: function componentToHex(c) {
90641
- var hex = c.toString(16);
90642
- return hex.length == 1 ? "0" + hex : hex;
90643
- }
90644
- }, {
90645
- key: "gbToHex",
90646
- value: function gbToHex(r, g, b) {
90647
- return "0x" + Color.componentToHex(r) + Color.componentToHex(g) + Color.componentToHex(b);
90648
- }
90649
- }, {
90650
- key: "getIntValueFromHex",
90651
- value: function getIntValueFromHex(hex) {
90652
- return parseInt(hex, 16);
90653
- }
90654
- }]);
90655
-
90656
- function Color(color) {
90657
- _classCallCheck(this, Color);
90658
-
90659
- this.color = new Color$1(color);
90660
- }
90661
-
90662
- _createClass(Color, [{
90663
- key: "getColor",
90664
- value: function getColor() {
90665
- return this.color;
90666
- }
90667
- }]);
90668
-
90669
- return Color;
90670
- }();var DEFAULT_RADIUS = 5;
90789
+ }(Element$1);var DEFAULT_RADIUS = 5;
90671
90790
  var DEFAULT_HEIGHT = 5;
90672
90791
  var DEFAULT_RADIAL_SEGMENTS = 8;
90673
90792
  var DEFAULT_HEIGHT_SEGMENTS = 1;
@@ -91250,8 +91369,8 @@ var DEFAULT_MAP_SIZE = 2048;
91250
91369
  var DEFAULT_BIAS = -0.0001;
91251
91370
  var WHITE = 0xffffff;
91252
91371
  var GREEN$1 = 0x2ecc71;
91253
- var DEFAULT_SPOTLIGHT_ANGLE = .32;
91254
- var DEFAULT_SPOTLIGHT_PENUMBRA = .5;
91372
+ var DEFAULT_SPOTLIGHT_ANGLE = 0.32;
91373
+ var DEFAULT_SPOTLIGHT_PENUMBRA = 0.5;
91255
91374
  var DEFAULT_SPOTLIGHT_DECAY = 2;
91256
91375
 
91257
91376
  var SpotLight = /*#__PURE__*/function (_Light) {
@@ -91271,7 +91390,7 @@ var SpotLight = /*#__PURE__*/function (_Light) {
91271
91390
  _options$intensity = options.intensity,
91272
91391
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY$1 : _options$intensity,
91273
91392
  _options$name = options.name,
91274
- name = _options$name === void 0 ? generateRandomName('SpotLight') : _options$name,
91393
+ name = _options$name === void 0 ? generateRandomName("SpotLight") : _options$name,
91275
91394
  _options$distance = options.distance,
91276
91395
  distance = _options$distance === void 0 ? DEFAULT_FAR : _options$distance,
91277
91396
  _options$angle = options.angle,
@@ -91304,19 +91423,9 @@ var SpotLight = /*#__PURE__*/function (_Light) {
91304
91423
  }
91305
91424
 
91306
91425
  _createClass(SpotLight, [{
91307
- key: "getTargetMesh",
91308
- value: function getTargetMesh(initialPosition) {
91309
- var geometry = new SphereGeometry(3, 6, 6);
91310
- var material = new MeshBasicMaterial({
91311
- color: 0xeeeeee,
91312
- wireframe: true
91313
- });
91314
- var target = new Element$1({
91315
- geometry: geometry,
91316
- material: material
91317
- });
91318
- target.position(initialPosition);
91319
- return target;
91426
+ key: "hasTarget",
91427
+ value: function hasTarget() {
91428
+ return true;
91320
91429
  }
91321
91430
  }, {
91322
91431
  key: "setLight",
@@ -91405,13 +91514,25 @@ var SpotLight = /*#__PURE__*/function (_Light) {
91405
91514
  return this.target;
91406
91515
  }
91407
91516
  }, {
91408
- key: "addHelper",
91409
- value: function addHelper() {
91410
- this.helper = new SpotLightHelper(this.body, GREEN$1);
91411
- this.shadowHelper = new CameraHelper(this.body.shadow.camera);
91517
+ key: "addHelpers",
91518
+ value: function addHelpers() {
91519
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
91520
+ _ref2$holderName = _ref2.holderName,
91521
+ holderName = _ref2$holderName === void 0 ? "spotlightholder" : _ref2$holderName,
91522
+ _ref2$holderSize = _ref2.holderSize,
91523
+ holderSize = _ref2$holderSize === void 0 ? 0.05 : _ref2$holderSize,
91524
+ _ref2$targetHolderNam = _ref2.targetHolderName,
91525
+ targetHolderName = _ref2$targetHolderNam === void 0 ? "targetholder" : _ref2$targetHolderNam,
91526
+ _ref2$targetHolderSiz = _ref2.targetHolderSize,
91527
+ targetHolderSize = _ref2$targetHolderSiz === void 0 ? 0.05 : _ref2$targetHolderSiz;
91528
+
91529
+ this.helper = new SpotLightHelper(this.getBody(), GREEN$1);
91530
+ this.shadowHelper = new CameraHelper(this.getBody().shadow.camera);
91412
91531
  Scene$1.add(this.helper, null, false);
91413
91532
  Scene$1.add(this.shadowHelper, null, false);
91414
- this.addHolder();
91533
+ this.addHolder(holderName, holderSize);
91534
+ this.addTargetHolder(targetHolderName, targetHolderSize);
91535
+ this.isUsingHelper = true;
91415
91536
  }
91416
91537
  }, {
91417
91538
  key: "hasTarget",
@@ -91423,7 +91544,7 @@ var SpotLight = /*#__PURE__*/function (_Light) {
91423
91544
  value: function update(dt) {
91424
91545
  _get(_getPrototypeOf(SpotLight.prototype), "update", this).call(this, dt);
91425
91546
 
91426
- if (this.hasHelper()) {
91547
+ if (this.usingHelper()) {
91427
91548
  this.helper.update();
91428
91549
  this.shadowHelper.update();
91429
91550
  }
@@ -91462,7 +91583,7 @@ var HemisphereLight = /*#__PURE__*/function (_Light) {
91462
91583
  _options$intensity = options.intensity,
91463
91584
  intensity = _options$intensity === void 0 ? DEFAULT_INTENSITY : _options$intensity,
91464
91585
  _options$name = options.name,
91465
- name = _options$name === void 0 ? generateRandomName('HemisphereLight') : _options$name;
91586
+ name = _options$name === void 0 ? generateRandomName("HemisphereLight") : _options$name;
91466
91587
  _this = _super.call(this, {
91467
91588
  color: color,
91468
91589
  intensity: intensity,
@@ -91513,11 +91634,30 @@ var HemisphereLight = /*#__PURE__*/function (_Light) {
91513
91634
  }
91514
91635
  }
91515
91636
  }, {
91516
- key: "addHelper",
91517
- value: function addHelper() {
91518
- this.helper = new HemisphereLightHelper(this.body, 2, GREEN);
91637
+ key: "addHelpers",
91638
+ value: function addHelpers() {
91639
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
91640
+ _ref2$holderName = _ref2.holderName,
91641
+ holderName = _ref2$holderName === void 0 ? "hemispherelightholder" : _ref2$holderName,
91642
+ _ref2$holderSize = _ref2.holderSize,
91643
+ holderSize = _ref2$holderSize === void 0 ? 0.05 : _ref2$holderSize;
91644
+
91645
+ this.helper = new HemisphereLightHelper(this.getBody(), 2, GREEN);
91646
+ this.addHolder(holderName, holderSize);
91647
+ this.isUsingHelper = true;
91519
91648
  Scene$1.add(this.helper, null, false);
91520
91649
  }
91650
+ }, {
91651
+ key: "update",
91652
+ value: function update(dt) {
91653
+ _get(_getPrototypeOf(HemisphereLight.prototype), "update", this).call(this, dt);
91654
+
91655
+ if (this.usingHelper()) {
91656
+ this.setPosition(this.holder.getPosition(), {
91657
+ updateHolder: false
91658
+ });
91659
+ }
91660
+ }
91521
91661
  }]);
91522
91662
 
91523
91663
  return HemisphereLight;