@lumen5/lottie-web 5.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc.json +3 -0
- package/.eslintrc.json +46 -0
- package/.gitattributes +1 -0
- package/.github/FUNDING.yml +1 -0
- package/.github/ISSUE_TEMPLATE.md +22 -0
- package/.github/workflows/publish.yml +26 -0
- package/.github/workflows/testAnimations.yml +29 -0
- package/.github/workflows/updateScreenshots.yml +34 -0
- package/CHANGELOG.md +601 -0
- package/History.md +1230 -0
- package/LICENSE.md +21 -0
- package/README.md +351 -0
- package/bower.json +31 -0
- package/build/old_parser/bodymovin_parser.jsx +3023 -0
- package/build/old_parser/helperProject.aep +0 -0
- package/build/player/cjs/lottie.min.js +18229 -0
- package/build/player/cjs/lottie_canvas.min.js +16465 -0
- package/build/player/cjs/lottie_html.min.js +16312 -0
- package/build/player/cjs/lottie_light.min.js +11584 -0
- package/build/player/cjs/lottie_light_canvas.min.js +13518 -0
- package/build/player/cjs/lottie_light_html.min.js +12843 -0
- package/build/player/cjs/lottie_svg.min.js +15053 -0
- package/build/player/esm/lottie.min.js +18225 -0
- package/build/player/esm/lottie_canvas.min.js +16461 -0
- package/build/player/esm/lottie_html.min.js +16308 -0
- package/build/player/esm/lottie_light.min.js +11580 -0
- package/build/player/esm/lottie_light_canvas.min.js +13514 -0
- package/build/player/esm/lottie_light_html.min.js +12839 -0
- package/build/player/esm/lottie_svg.min.js +15049 -0
- package/build/player/lottie.d.ts +5 -0
- package/build/player/lottie.js +17151 -0
- package/build/player/lottie.min.js +1 -0
- package/build/player/lottie_canvas.js +15506 -0
- package/build/player/lottie_canvas.min.js +1 -0
- package/build/player/lottie_canvas_worker.js +18196 -0
- package/build/player/lottie_canvas_worker.min.js +15 -0
- package/build/player/lottie_html.d.ts +5 -0
- package/build/player/lottie_html.js +15354 -0
- package/build/player/lottie_html.min.js +1 -0
- package/build/player/lottie_light.d.ts +5 -0
- package/build/player/lottie_light.js +10854 -0
- package/build/player/lottie_light.min.js +1 -0
- package/build/player/lottie_light_canvas.d.ts +5 -0
- package/build/player/lottie_light_canvas.js +12666 -0
- package/build/player/lottie_light_canvas.min.js +1 -0
- package/build/player/lottie_light_html.d.ts +5 -0
- package/build/player/lottie_light_html.js +12029 -0
- package/build/player/lottie_light_html.min.js +1 -0
- package/build/player/lottie_svg.d.ts +5 -0
- package/build/player/lottie_svg.js +14179 -0
- package/build/player/lottie_svg.min.js +1 -0
- package/build/player/lottie_worker.js +18196 -0
- package/build/player/lottie_worker.min.js +15 -0
- package/docs/json/animation.json +101 -0
- package/docs/json/effects/angle.json +40 -0
- package/docs/json/effects/checkBox.json +40 -0
- package/docs/json/effects/color.json +40 -0
- package/docs/json/effects/customValue.json +4 -0
- package/docs/json/effects/dropDown.json +40 -0
- package/docs/json/effects/fill.json +55 -0
- package/docs/json/effects/group.json +41 -0
- package/docs/json/effects/index.json +51 -0
- package/docs/json/effects/layer.json +33 -0
- package/docs/json/effects/noValue.json +1 -0
- package/docs/json/effects/point.json +43 -0
- package/docs/json/effects/proLevels.json +130 -0
- package/docs/json/effects/slider.json +40 -0
- package/docs/json/effects/stroke.json +64 -0
- package/docs/json/effects/tint.json +43 -0
- package/docs/json/effects/tritone.json +46 -0
- package/docs/json/helpers/blendMode.json +71 -0
- package/docs/json/helpers/boolean.json +14 -0
- package/docs/json/helpers/composite.json +15 -0
- package/docs/json/helpers/lineCap.json +19 -0
- package/docs/json/helpers/lineJoin.json +19 -0
- package/docs/json/helpers/mask.json +80 -0
- package/docs/json/helpers/textBased.json +23 -0
- package/docs/json/helpers/textGrouping.json +23 -0
- package/docs/json/helpers/textShape.json +31 -0
- package/docs/json/helpers/transform.json +146 -0
- package/docs/json/layers/image.json +113 -0
- package/docs/json/layers/null.json +87 -0
- package/docs/json/layers/preComp.json +118 -0
- package/docs/json/layers/shape.json +157 -0
- package/docs/json/layers/solid.json +120 -0
- package/docs/json/layers/text.json +523 -0
- package/docs/json/properties/doubleKeyframe.json +50 -0
- package/docs/json/properties/multiDimensional.json +21 -0
- package/docs/json/properties/multiDimensionalKeyframed.json +35 -0
- package/docs/json/properties/offsetKeyframe.json +53 -0
- package/docs/json/properties/shape.json +27 -0
- package/docs/json/properties/shapeKeyframed.json +35 -0
- package/docs/json/properties/shapeProp.json +50 -0
- package/docs/json/properties/shapePropKeyframe.json +54 -0
- package/docs/json/properties/value.json +21 -0
- package/docs/json/properties/valueKeyframe.json +33 -0
- package/docs/json/properties/valueKeyframed.json +25 -0
- package/docs/json/shapes/ellipse.json +54 -0
- package/docs/json/shapes/fill.json +48 -0
- package/docs/json/shapes/gFill.json +107 -0
- package/docs/json/shapes/gStroke.json +137 -0
- package/docs/json/shapes/group.json +89 -0
- package/docs/json/shapes/merge.json +27 -0
- package/docs/json/shapes/rect.json +66 -0
- package/docs/json/shapes/repeater.json +63 -0
- package/docs/json/shapes/round.json +35 -0
- package/docs/json/shapes/shape.json +40 -0
- package/docs/json/shapes/star.json +133 -0
- package/docs/json/shapes/stroke.json +78 -0
- package/docs/json/shapes/transform.json +102 -0
- package/docs/json/shapes/trim.json +61 -0
- package/docs/json/sources/chars.json +61 -0
- package/docs/json/sources/image.json +31 -0
- package/docs/json/sources/precomp.json +39 -0
- package/index.d.ts +197 -0
- package/package.json +54 -0
- package/player/index.html +115 -0
- package/player/js/3rd_party/BezierEaser.js +158 -0
- package/player/js/3rd_party/howler.js +5 -0
- package/player/js/3rd_party/seedrandom.js +237 -0
- package/player/js/3rd_party/transformation-matrix.js +449 -0
- package/player/js/EffectsManager.js +83 -0
- package/player/js/animation/AnimationItem.js +809 -0
- package/player/js/animation/AnimationItemWorkerOverride.js +157 -0
- package/player/js/animation/AnimationManager.js +248 -0
- package/player/js/animation/AnimationManagerWorkerOverride.js +201 -0
- package/player/js/effects/EffectsManagerPlaceholder.js +5 -0
- package/player/js/effects/SliderEffect.js +37 -0
- package/player/js/effects/TransformEffect.js +44 -0
- package/player/js/elements/AudioElement.js +102 -0
- package/player/js/elements/BaseElement.js +78 -0
- package/player/js/elements/BaseTextElement.js +4 -0
- package/player/js/elements/CompElement.js +107 -0
- package/player/js/elements/FootageElement.js +47 -0
- package/player/js/elements/ImageElement.js +42 -0
- package/player/js/elements/NullElement.js +39 -0
- package/player/js/elements/ShapeElement.js +76 -0
- package/player/js/elements/SolidElement.js +23 -0
- package/player/js/elements/TextElement.js +94 -0
- package/player/js/elements/canvasElements/CVBaseElement.js +167 -0
- package/player/js/elements/canvasElements/CVCompBaseElement.js +11 -0
- package/player/js/elements/canvasElements/CVCompElement.js +57 -0
- package/player/js/elements/canvasElements/CVContextData.js +239 -0
- package/player/js/elements/canvasElements/CVEffects.js +57 -0
- package/player/js/elements/canvasElements/CVImageElement.js +58 -0
- package/player/js/elements/canvasElements/CVMaskElement.js +72 -0
- package/player/js/elements/canvasElements/CVShapeElement.js +521 -0
- package/player/js/elements/canvasElements/CVSolidElement.js +30 -0
- package/player/js/elements/canvasElements/CVTextElement.js +244 -0
- package/player/js/elements/canvasElements/effects/CVGaussianBlurEffect.js +29 -0
- package/player/js/elements/canvasElements/effects/CVTransformEffect.js +9 -0
- package/player/js/elements/helpers/FrameElement.js +54 -0
- package/player/js/elements/helpers/HierarchyElement.js +52 -0
- package/player/js/elements/helpers/RenderableDOMElement.js +72 -0
- package/player/js/elements/helpers/RenderableElement.js +87 -0
- package/player/js/elements/helpers/TransformElement.js +140 -0
- package/player/js/elements/helpers/shapes/CVShapeData.js +33 -0
- package/player/js/elements/helpers/shapes/ProcessedElement.js +6 -0
- package/player/js/elements/helpers/shapes/SVGElementsRenderer.js +239 -0
- package/player/js/elements/helpers/shapes/SVGFillStyleData.js +18 -0
- package/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js +100 -0
- package/player/js/elements/helpers/shapes/SVGGradientStrokeStyleData.js +20 -0
- package/player/js/elements/helpers/shapes/SVGNoStyleData.js +15 -0
- package/player/js/elements/helpers/shapes/SVGShapeData.js +28 -0
- package/player/js/elements/helpers/shapes/SVGStrokeStyleData.js +21 -0
- package/player/js/elements/helpers/shapes/SVGStyleData.js +19 -0
- package/player/js/elements/helpers/shapes/SVGTransformData.js +11 -0
- package/player/js/elements/helpers/shapes/ShapeElement.js +5 -0
- package/player/js/elements/helpers/shapes/ShapeGroupData.js +9 -0
- package/player/js/elements/helpers/shapes/ShapeTransformManager.js +61 -0
- package/player/js/elements/htmlElements/HBaseElement.js +88 -0
- package/player/js/elements/htmlElements/HCameraElement.js +170 -0
- package/player/js/elements/htmlElements/HCompElement.js +61 -0
- package/player/js/elements/htmlElements/HEffects.js +3 -0
- package/player/js/elements/htmlElements/HImageElement.js +42 -0
- package/player/js/elements/htmlElements/HShapeElement.js +261 -0
- package/player/js/elements/htmlElements/HSolidElement.js +36 -0
- package/player/js/elements/htmlElements/HTextElement.js +290 -0
- package/player/js/elements/svgElements/SVGBaseElement.js +181 -0
- package/player/js/elements/svgElements/SVGCompElement.js +28 -0
- package/player/js/elements/svgElements/SVGEffects.js +70 -0
- package/player/js/elements/svgElements/SVGEffectsPlaceholder.js +3 -0
- package/player/js/elements/svgElements/SVGShapeElement.js +366 -0
- package/player/js/elements/svgElements/SVGTextElement.js +322 -0
- package/player/js/elements/svgElements/effects/SVGComposableEffect.js +22 -0
- package/player/js/elements/svgElements/effects/SVGDropShadowEffect.js +83 -0
- package/player/js/elements/svgElements/effects/SVGFillFilter.js +22 -0
- package/player/js/elements/svgElements/effects/SVGGaussianBlurEffect.js +44 -0
- package/player/js/elements/svgElements/effects/SVGMatte3Effect.js +101 -0
- package/player/js/elements/svgElements/effects/SVGProLevelsFilter.js +108 -0
- package/player/js/elements/svgElements/effects/SVGStrokeEffect.js +119 -0
- package/player/js/elements/svgElements/effects/SVGTintEffect.js +47 -0
- package/player/js/elements/svgElements/effects/SVGTransformEffect.js +10 -0
- package/player/js/elements/svgElements/effects/SVGTritoneFilter.js +43 -0
- package/player/js/main.js +21 -0
- package/player/js/mask.js +239 -0
- package/player/js/module.js +153 -0
- package/player/js/modules/canvas.js +22 -0
- package/player/js/modules/canvas_light.js +25 -0
- package/player/js/modules/full.js +70 -0
- package/player/js/modules/full_worker.js +0 -0
- package/player/js/modules/html.js +37 -0
- package/player/js/modules/html_light.js +25 -0
- package/player/js/modules/main.js +162 -0
- package/player/js/modules/svg.js +37 -0
- package/player/js/modules/svg_light.js +25 -0
- package/player/js/renderers/BaseRenderer.js +187 -0
- package/player/js/renderers/CanvasRenderer.js +67 -0
- package/player/js/renderers/CanvasRendererBase.js +318 -0
- package/player/js/renderers/CanvasRendererWorkerOverride.js +54 -0
- package/player/js/renderers/HybridRenderer.js +47 -0
- package/player/js/renderers/HybridRendererBase.js +344 -0
- package/player/js/renderers/SVGRenderer.js +82 -0
- package/player/js/renderers/SVGRendererBase.js +255 -0
- package/player/js/renderers/renderersManager.js +29 -0
- package/player/js/utils/BaseEvent.js +42 -0
- package/player/js/utils/DataManager.js +676 -0
- package/player/js/utils/DataManagerWorkerOverrides.js +13 -0
- package/player/js/utils/FontManager.js +443 -0
- package/player/js/utils/FontManagerWorkerOverride.js +16 -0
- package/player/js/utils/PolynomialBezier.js +253 -0
- package/player/js/utils/PropertyFactory.js +489 -0
- package/player/js/utils/SlotManager.js +17 -0
- package/player/js/utils/TransformProperty.js +251 -0
- package/player/js/utils/animationFramePolyFill.js +25 -0
- package/player/js/utils/asset_loader.js +53 -0
- package/player/js/utils/asset_loader_worker_override.js +3 -0
- package/player/js/utils/audio/AudioController.js +85 -0
- package/player/js/utils/audio/AudioElement.js +6 -0
- package/player/js/utils/bez.js +251 -0
- package/player/js/utils/common.js +280 -0
- package/player/js/utils/expressions/CompInterface.js +28 -0
- package/player/js/utils/expressions/EffectInterface.js +111 -0
- package/player/js/utils/expressions/ExpressionManager.js +752 -0
- package/player/js/utils/expressions/ExpressionPropertyDecorator.js +463 -0
- package/player/js/utils/expressions/ExpressionTextPropertyDecorator.js +40 -0
- package/player/js/utils/expressions/ExpressionValue.js +61 -0
- package/player/js/utils/expressions/ExpressionValueFactory.js +102 -0
- package/player/js/utils/expressions/Expressions.js +48 -0
- package/player/js/utils/expressions/FootageInterface.js +60 -0
- package/player/js/utils/expressions/InterfacesProvider.js +21 -0
- package/player/js/utils/expressions/LayerInterface.js +179 -0
- package/player/js/utils/expressions/MaskInterface.js +50 -0
- package/player/js/utils/expressions/ProjectInterface.js +31 -0
- package/player/js/utils/expressions/PropertyGroupFactory.js +13 -0
- package/player/js/utils/expressions/PropertyInterface.js +19 -0
- package/player/js/utils/expressions/ShapeInterface.js +543 -0
- package/player/js/utils/expressions/TextInterface.js +35 -0
- package/player/js/utils/expressions/TextSelectorPropertyDecorator.js +44 -0
- package/player/js/utils/expressions/TransformInterface.js +126 -0
- package/player/js/utils/expressions/expressionHelpers.js +86 -0
- package/player/js/utils/expressions/shapes/ShapePathInterface.js +47 -0
- package/player/js/utils/featureSupport.js +16 -0
- package/player/js/utils/filters.js +32 -0
- package/player/js/utils/functionExtensions.js +27 -0
- package/player/js/utils/getFontProperties.js +42 -0
- package/player/js/utils/helpers/arrays.js +43 -0
- package/player/js/utils/helpers/assetManager.js +96 -0
- package/player/js/utils/helpers/blendModes.js +26 -0
- package/player/js/utils/helpers/bufferManager.js +61 -0
- package/player/js/utils/helpers/dynamicProperties.js +29 -0
- package/player/js/utils/helpers/effectTypes.js +3 -0
- package/player/js/utils/helpers/html_elements.js +6 -0
- package/player/js/utils/helpers/propTypes.js +3 -0
- package/player/js/utils/helpers/shapeEnums.js +16 -0
- package/player/js/utils/helpers/svg_elements.js +8 -0
- package/player/js/utils/imagePreloader.js +213 -0
- package/player/js/utils/imagePreloaderWorkerOverride.js +3 -0
- package/player/js/utils/markers/markerParser.js +47 -0
- package/player/js/utils/pooling/bezier_length_pool.js +20 -0
- package/player/js/utils/pooling/point_pool.js +13 -0
- package/player/js/utils/pooling/pool_factory.js +44 -0
- package/player/js/utils/pooling/pooling.js +15 -0
- package/player/js/utils/pooling/segments_length_pool.js +24 -0
- package/player/js/utils/pooling/shapeCollection_pool.js +48 -0
- package/player/js/utils/pooling/shape_pool.js +44 -0
- package/player/js/utils/shapes/DashProperty.js +63 -0
- package/player/js/utils/shapes/GradientProperty.js +93 -0
- package/player/js/utils/shapes/MouseModifier.js +222 -0
- package/player/js/utils/shapes/OffsetPathModifier.js +306 -0
- package/player/js/utils/shapes/PuckerAndBloatModifier.js +80 -0
- package/player/js/utils/shapes/RepeaterModifier.js +232 -0
- package/player/js/utils/shapes/RoundCornersModifier.js +122 -0
- package/player/js/utils/shapes/ShapeCollection.js +29 -0
- package/player/js/utils/shapes/ShapeModifiers.js +71 -0
- package/player/js/utils/shapes/ShapePath.js +100 -0
- package/player/js/utils/shapes/ShapeProperty.js +546 -0
- package/player/js/utils/shapes/TrimModifier.js +359 -0
- package/player/js/utils/shapes/ZigZagModifier.js +174 -0
- package/player/js/utils/shapes/shapePathBuilder.js +20 -0
- package/player/js/utils/text/LetterProps.js +60 -0
- package/player/js/utils/text/TextAnimatorDataProperty.js +34 -0
- package/player/js/utils/text/TextAnimatorProperty.js +610 -0
- package/player/js/utils/text/TextProperty.js +461 -0
- package/player/js/utils/text/TextSelectorProperty.js +179 -0
- package/player/js/worker_wrapper.js +1029 -0
- package/rollup.config.js +215 -0
- package/tasks/build.js +773 -0
- package/tasks/build_worker.js +164 -0
- package/tasks/watch.js +34 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/*! howler.js v2.2.0 | (c) 2013-2020, James Simpson of GoldFire Studios | MIT License | howlerjs.com */
|
|
3
|
+
!function () { 'use strict'; var e = function () { this.init(); }; e.prototype = { init: function () { var e = this || n; return e._counter = 1e3, e._html5AudioPool = [], e.html5PoolSize = 10, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = 'canplaythrough', e._navigator = typeof window != 'undefined' && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.autoUnlock = !0, e._setup(), e; }, volume: function (e) { var o = this || n; if (e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) { if (o._volume = e, o._muted) return o; o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime); for (var t = 0; t < o._howls.length; t++) if (!o._howls[t]._webAudio) for (var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.volume = u._volume * e); } return o; } return o._volume; }, mute: function (e) { var o = this || n; o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime); for (var t = 0; t < o._howls.length; t++) if (!o._howls[t]._webAudio) for (var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.muted = !!e || u._muted); } return o; }, stop: function () { for (var e = this || n, o = 0; o < e._howls.length; o++)e._howls[o].stop(); return e; }, unload: function () { for (var e = this || n, o = e._howls.length - 1; o >= 0; o--)e._howls[o].unload(); return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e; }, codecs: function (e) { return (this || n)._codecs[e.replace(/^x-/, '')]; }, _setup: function () { var e = this || n; if (e.state = e.ctx ? e.ctx.state || 'suspended' : 'suspended', e._autoSuspend(), !e.usingWebAudio) if (typeof Audio != 'undefined') try { var o = new Audio; void 0 === o.oncanplaythrough && (e._canPlayEvent = 'canplay'); } catch (n) { e.noAudio = !0; } else e.noAudio = !0; try { var o = new Audio; o.muted && (e.noAudio = !0); } catch (e) {} return e.noAudio || e._setupCodecs(), e; }, _setupCodecs: function () { var e = this || n, o = null; try { o = typeof Audio != 'undefined' ? new Audio : null; } catch (n) { return e; } if (!o || typeof o.canPlayType != 'function') return e; var t = o.canPlayType('audio/mpeg;').replace(/^no$/, ''), r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g), a = r && parseInt(r[0].split('/')[1], 10) < 33; return e._codecs = { mp3: !(a || !t && !o.canPlayType('audio/mp3;').replace(/^no$/, '')), mpeg: !!t, opus: !!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ''), ogg: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), oga: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), wav: !!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''), aac: !!o.canPlayType('audio/aac;').replace(/^no$/, ''), caf: !!o.canPlayType('audio/x-caf;').replace(/^no$/, ''), m4a: !!(o.canPlayType('audio/x-m4a;') || o.canPlayType('audio/m4a;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), m4b: !!(o.canPlayType('audio/x-m4b;') || o.canPlayType('audio/m4b;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), mp4: !!(o.canPlayType('audio/x-mp4;') || o.canPlayType('audio/mp4;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), weba: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), webm: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), dolby: !!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ''), flac: !!(o.canPlayType('audio/x-flac;') || o.canPlayType('audio/flac;')).replace(/^no$/, '') }, e; }, _unlockAudio: function () { var e = this || n; if (!e._audioUnlocked && e.ctx) { e._audioUnlocked = !1, e.autoUnlock = !1, e._mobileUnloaded || e.ctx.sampleRate === 44100 || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050); var o = function (n) { for (;e._html5AudioPool.length < e.html5PoolSize;) try { var t = new Audio; t._unlocked = !0, e._releaseHtml5Audio(t); } catch (n) { e.noAudio = !0; break; } for (var r = 0; r < e._howls.length; r++) if (!e._howls[r]._webAudio) for (var a = e._howls[r]._getSoundIds(), u = 0; u < a.length; u++) { var i = e._howls[r]._soundById(a[u]); i && i._node && !i._node._unlocked && (i._node._unlocked = !0, i._node.load()); }e._autoResume(); var d = e.ctx.createBufferSource(); d.buffer = e._scratchBuffer, d.connect(e.ctx.destination), void 0 === d.start ? d.noteOn(0) : d.start(0), typeof e.ctx.resume == 'function' && e.ctx.resume(), d.onended = function () { d.disconnect(0), e._audioUnlocked = !0, document.removeEventListener('touchstart', o, !0), document.removeEventListener('touchend', o, !0), document.removeEventListener('click', o, !0); for (var n = 0; n < e._howls.length; n++)e._howls[n]._emit('unlock'); }; }; return document.addEventListener('touchstart', o, !0), document.addEventListener('touchend', o, !0), document.addEventListener('click', o, !0), e; } }, _obtainHtml5Audio: function () { var e = this || n; if (e._html5AudioPool.length) return e._html5AudioPool.pop(); var o = (new Audio).play(); return o && typeof Promise != 'undefined' && (o instanceof Promise || typeof o.then == 'function') && o.catch(function () { console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.'); }), new Audio; }, _releaseHtml5Audio: function (e) { var o = this || n; return e._unlocked && o._html5AudioPool.push(e), o; }, _autoSuspend: function () { var e = this; if (e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) { for (var o = 0; o < e._howls.length; o++) if (e._howls[o]._webAudio) for (var t = 0; t < e._howls[o]._sounds.length; t++) if (!e._howls[o]._sounds[t]._paused) return e; return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function () { if (e.autoSuspend) { e._suspendTimer = null, e.state = 'suspending'; var n = function () { e.state = 'suspended', e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume()); }; e.ctx.suspend().then(n, n); } }, 3e4), e; } }, _autoResume: function () { var e = this; if (e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio) return e.state === 'running' && e.ctx.state !== 'interrupted' && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : e.state === 'suspended' || e.state === 'running' && e.ctx.state === 'interrupted' ? (e.ctx.resume().then(function () { e.state = 'running'; for (var n = 0; n < e._howls.length; n++)e._howls[n]._emit('resume'); }), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : e.state === 'suspending' && (e._resumeAfterSuspend = !0), e; } }; var n = new e, o = function (e) { var n = this; if (!e.src || e.src.length === 0) return void console.error('An array of source files must be passed with any new Howl.'); n.init(e); }; o.prototype = { init: function (e) { var o = this; return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = typeof e.format != 'string' ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = typeof e.preload != 'boolean' && e.preload !== 'metadata' || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = typeof e.src != 'string' ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhr = { method: e.xhr && e.xhr.method ? e.xhr.method : 'GET', headers: e.xhr && e.xhr.headers ? e.xhr.headers : null, withCredentials: !(!e.xhr || !e.xhr.withCredentials) && e.xhr.withCredentials }, o._duration = 0, o._state = 'unloaded', o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{ fn: e.onend }] : [], o._onfade = e.onfade ? [{ fn: e.onfade }] : [], o._onload = e.onload ? [{ fn: e.onload }] : [], o._onloaderror = e.onloaderror ? [{ fn: e.onloaderror }] : [], o._onplayerror = e.onplayerror ? [{ fn: e.onplayerror }] : [], o._onpause = e.onpause ? [{ fn: e.onpause }] : [], o._onplay = e.onplay ? [{ fn: e.onplay }] : [], o._onstop = e.onstop ? [{ fn: e.onstop }] : [], o._onmute = e.onmute ? [{ fn: e.onmute }] : [], o._onvolume = e.onvolume ? [{ fn: e.onvolume }] : [], o._onrate = e.onrate ? [{ fn: e.onrate }] : [], o._onseek = e.onseek ? [{ fn: e.onseek }] : [], o._onunlock = e.onunlock ? [{ fn: e.onunlock }] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.autoUnlock && n._unlockAudio(), n._howls.push(o), o._autoplay && o._queue.push({ event: 'play', action: function () { o.play(); } }), o._preload && o._preload !== 'none' && o.load(), o; }, load: function () { var e = this, o = null; if (n.noAudio) return void e._emit('loaderror', null, 'No audio support.'); typeof e._src == 'string' && (e._src = [e._src]); for (var r = 0; r < e._src.length; r++) { var u, i; if (e._format && e._format[r])u = e._format[r]; else { if (typeof (i = e._src[r]) != 'string') { e._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.'); continue; }u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split('?', 1)[0])), u && (u = u[1].toLowerCase()); } if (u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) { o = e._src[r]; break; } } return o ? (e._src = o, e._state = 'loading', window.location.protocol === 'https:' && o.slice(0, 5) === 'http:' && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit('loaderror', null, 'No codec support for selected audio sources.'); }, play: function (e, o) { var t = this, r = null; if (typeof e == 'number')r = e, e = null; else { if (typeof e == 'string' && t._state === 'loaded' && !t._sprite[e]) return null; if (void 0 === e && (e = '__default', !t._playLock)) { for (var a = 0, u = 0; u < t._sounds.length; u++)t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id); a === 1 ? e = null : r = null; } } var i = r ? t._soundById(r) : t._inactiveSound(); if (!i) return null; if (r && !e && (e = i._sprite || '__default'), t._state !== 'loaded') { i._sprite = e, i._ended = !1; var d = i._id; return t._queue.push({ event: 'play', action: function () { t.play(d); } }), d; } if (r && !i._paused) return o || t._loadQueue('play'), i._id; t._webAudio && n._autoResume(); var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3), s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _), l = 1e3 * s / Math.abs(i._rate), c = t._sprite[e][0] / 1e3, f = (t._sprite[e][0] + t._sprite[e][1]) / 1e3; i._sprite = e, i._ended = !1; var p = function () { i._paused = !1, i._seek = _, i._start = c, i._stop = f, i._loop = !(!i._loop && !t._sprite[e][2]); }; if (_ >= f) return void t._ended(i); var m = i._node; if (t._webAudio) { var v = function () { t._playLock = !1, p(), t._refreshBuffer(i); var e = i._muted || t._muted ? 0 : i._volume; m.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === m.bufferSource.start ? i._loop ? m.bufferSource.noteGrainOn(0, _, 86400) : m.bufferSource.noteGrainOn(0, _, s) : i._loop ? m.bufferSource.start(0, _, 86400) : m.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function () { t._emit('play', i._id), t._loadQueue(); }, 0); }; n.state === 'running' && n.ctx.state !== 'interrupted' ? v() : (t._playLock = !0, t.once('resume', v), t._clearTimer(i._id)); } else { var h = function () { m.currentTime = _, m.muted = i._muted || t._muted || n._muted || m.muted, m.volume = i._volume * n.volume(), m.playbackRate = i._rate; try { var r = m.play(); if (r && typeof Promise != 'undefined' && (r instanceof Promise || typeof r.then == 'function') ? (t._playLock = !0, p(), r.then(function () { t._playLock = !1, m._unlocked = !0, o || (t._emit('play', i._id), t._loadQueue()); }).catch(function () { t._playLock = !1, t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'), i._ended = !0, i._paused = !0; })) : o || (t._playLock = !1, p(), t._emit('play', i._id), t._loadQueue()), m.playbackRate = i._rate, m.paused) return void t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'); e !== '__default' || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function () { t._ended(i), m.removeEventListener('ended', t._endTimers[i._id], !1); }, m.addEventListener('ended', t._endTimers[i._id], !1)); } catch (e) { t._emit('playerror', i._id, e); } }; m.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA' && (m.src = t._src, m.load()); var y = window && window.ejecta || !m.readyState && n._navigator.isCocoonJS; if (m.readyState >= 3 || y)h(); else { t._playLock = !0; var g = function () { h(), m.removeEventListener(n._canPlayEvent, g, !1); }; m.addEventListener(n._canPlayEvent, g, !1), t._clearTimer(i._id); } } return i._id; }, pause: function (e) { var n = this; if (n._state !== 'loaded' || n._playLock) return n._queue.push({ event: 'pause', action: function () { n.pause(e); } }), n; for (var o = n._getSoundIds(e), t = 0; t < o.length; t++) { n._clearTimer(o[t]); var r = n._soundById(o[t]); if (r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node)) if (n._webAudio) { if (!r._node.bufferSource) continue; void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node); } else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause(); arguments[1] || n._emit('pause', r ? r._id : null); } return n; }, stop: function (e, n) { var o = this; if (o._state !== 'loaded' || o._playLock) return o._queue.push({ event: 'stop', action: function () { o.stop(e); } }), o; for (var t = o._getSoundIds(e), r = 0; r < t.length; r++) { o._clearTimer(t[r]); var a = o._soundById(t[r]); a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause(), a._node.duration === 1 / 0 && o._clearSound(a._node))), n || o._emit('stop', a._id)); } return o; }, mute: function (e, o) { var t = this; if (t._state !== 'loaded' || t._playLock) return t._queue.push({ event: 'mute', action: function () { t.mute(e, o); } }), t; if (void 0 === o) { if (typeof e != 'boolean') return t._muted; t._muted = e; } for (var r = t._getSoundIds(o), a = 0; a < r.length; a++) { var u = t._soundById(r[a]); u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit('mute', u._id)); } return t; }, volume: function () { var e, o, t = this, r = arguments; if (r.length === 0) return t._volume; if (r.length === 1 || r.length === 2 && void 0 === r[1]) { t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]); } else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var a; if (!(void 0 !== e && e >= 0 && e <= 1)) return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0; if (t._state !== 'loaded' || t._playLock) return t._queue.push({ event: 'volume', action: function () { t.volume.apply(t, r); } }), t; void 0 === o && (t._volume = e), o = t._getSoundIds(o); for (var u = 0; u < o.length; u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit('volume', a._id)); return t; }, fade: function (e, o, t, r) { var a = this; if (a._state !== 'loaded' || a._playLock) return a._queue.push({ event: 'fade', action: function () { a.fade(e, o, t, r); } }), a; e = Math.min(Math.max(0, parseFloat(e)), 1), o = Math.min(Math.max(0, parseFloat(o)), 1), t = parseFloat(t), a.volume(e, r); for (var u = a._getSoundIds(r), i = 0; i < u.length; i++) { var d = a._soundById(u[i]); if (d) { if (r || a._stopFade(u[i]), a._webAudio && !d._muted) { var _ = n.ctx.currentTime, s = _ + t / 1e3; d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s); }a._startFadeInterval(d, e, o, t, u[i], void 0 === r); } } return a; }, _startFadeInterval: function (e, n, o, t, r, a) { var u = this, i = n, d = o - n, _ = Math.abs(d / .01), s = Math.max(4, _ > 0 ? t / _ : t), l = Date.now(); e._fadeTo = o, e._interval = setInterval(function () { var r = (Date.now() - l) / t; l = Date.now(), i += d * r, i = d < 0 ? Math.max(o, i) : Math.min(o, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit('fade', e._id)); }, s); }, _stopFade: function (e) { var o = this, t = o._soundById(e); return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit('fade', e)), o; }, loop: function () { var e, n, o, t = this, r = arguments; if (r.length === 0) return t._loop; if (r.length === 1) { if (typeof r[0] != 'boolean') return !!(o = t._soundById(parseInt(r[0], 10))) && o._loop; e = r[0], t._loop = e; } else r.length === 2 && (e = r[0], n = parseInt(r[1], 10)); for (var a = t._getSoundIds(n), u = 0; u < a.length; u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop))); return t; }, rate: function () { var e, o, t = this, r = arguments; if (r.length === 0)o = t._sounds[0]._id; else if (r.length === 1) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]); } else r.length === 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var i; if (typeof e != 'number') return i = t._soundById(o), i ? i._rate : t._rate; if (t._state !== 'loaded' || t._playLock) return t._queue.push({ event: 'rate', action: function () { t.rate.apply(t, r); } }), t; void 0 === o && (t._rate = e), o = t._getSoundIds(o); for (var d = 0; d < o.length; d++) if (i = t._soundById(o[d])) { t.playing(o[d]) && (i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart), i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e); var _ = t.seek(o[d]), s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _, l = 1e3 * s / Math.abs(i._rate); !t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit('rate', i._id); } return t; }, seek: function () { var e, o, t = this, r = arguments; if (r.length === 0)o = t._sounds[0]._id; else if (r.length === 1) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0])); } else r.length === 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); if (void 0 === o) return t; if (t._state !== 'loaded' || t._playLock) return t._queue.push({ event: 'seek', action: function () { t.seek.apply(t, r); } }), t; var i = t._soundById(o); if (i) { if (!(typeof e == 'number' && e >= 0)) { if (t._webAudio) { var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0, _ = i._rateSeek ? i._rateSeek - i._seek : 0; return i._seek + (_ + d * Math.abs(i._rate)); } return i._node.currentTime; } var s = t.playing(o); s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), t._webAudio || !i._node || isNaN(i._node.duration) || (i._node.currentTime = e); var l = function () { t._emit('seek', o), s && t.play(o, !0); }; if (s && !t._webAudio) { var c = function () { t._playLock ? setTimeout(c, 0) : l(); }; setTimeout(c, 0); } else l(); } return t; }, playing: function (e) { var n = this; if (typeof e == 'number') { var o = n._soundById(e); return !!o && !o._paused; } for (var t = 0; t < n._sounds.length; t++) if (!n._sounds[t]._paused) return !0; return !1; }, duration: function (e) { var n = this, o = n._duration, t = n._soundById(e); return t && (o = n._sprite[t._sprite][1] / 1e3), o; }, state: function () { return this._state; }, unload: function () { for (var e = this, o = e._sounds, t = 0; t < o.length; t++)o[t]._paused || e.stop(o[t]._id), e._webAudio || (e._clearSound(o[t]._node), o[t]._node.removeEventListener('error', o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1), n._releaseHtml5Audio(o[t]._node)), delete o[t]._node, e._clearTimer(o[t]._id); var a = n._howls.indexOf(e); a >= 0 && n._howls.splice(a, 1); var u = !0; for (t = 0; t < n._howls.length; t++) if (n._howls[t]._src === e._src || e._src.indexOf(n._howls[t]._src) >= 0) { u = !1; break; } return r && u && delete r[e._src], n.noAudio = !1, e._state = 'unloaded', e._sounds = [], e = null, null; }, on: function (e, n, o, t) { var r = this, a = r['_on' + e]; return typeof n == 'function' && a.push(t ? { id: o, fn: n, once: t } : { id: o, fn: n }), r; }, off: function (e, n, o) { var t = this, r = t['_on' + e], a = 0; if (typeof n == 'number' && (o = n, n = null), n || o) for (a = 0; a < r.length; a++) { var u = o === r[a].id; if (n === r[a].fn && u || !n && u) { r.splice(a, 1); break; } } else if (e)t['_on' + e] = []; else { var i = Object.keys(t); for (a = 0; a < i.length; a++)i[a].indexOf('_on') === 0 && Array.isArray(t[i[a]]) && (t[i[a]] = []); } return t; }, once: function (e, n, o) { var t = this; return t.on(e, n, o, 1), t; }, _emit: function (e, n, o) { for (var t = this, r = t['_on' + e], a = r.length - 1; a >= 0; a--)r[a].id && r[a].id !== n && e !== 'load' || (setTimeout(function (e) { e.call(this, n, o); }.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id)); return t._loadQueue(e), t; }, _loadQueue: function (e) { var n = this; if (n._queue.length > 0) { var o = n._queue[0]; o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action(); } return n; }, _ended: function (e) { var o = this, t = e._sprite; if (!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop) return setTimeout(o._ended.bind(o, e), 100), o; var r = !(!e._loop && !o._sprite[t][2]); if (o._emit('end', e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) { o._emit('play', e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime; var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate); o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a); } return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o; }, _clearTimer: function (e) { var n = this; if (n._endTimers[e]) { if (typeof n._endTimers[e] != 'function')clearTimeout(n._endTimers[e]); else { var o = n._soundById(e); o && o._node && o._node.removeEventListener('ended', n._endTimers[e], !1); } delete n._endTimers[e]; } return n; }, _soundById: function (e) { for (var n = this, o = 0; o < n._sounds.length; o++) if (e === n._sounds[o]._id) return n._sounds[o]; return null; }, _inactiveSound: function () { var e = this; e._drain(); for (var n = 0; n < e._sounds.length; n++) if (e._sounds[n]._ended) return e._sounds[n].reset(); return new t(e); }, _drain: function () { var e = this, n = e._pool, o = 0, t = 0; if (!(e._sounds.length < n)) { for (t = 0; t < e._sounds.length; t++)e._sounds[t]._ended && o++; for (t = e._sounds.length - 1; t >= 0; t--) { if (o <= n) return; e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--); } } }, _getSoundIds: function (e) { var n = this; if (void 0 === e) { for (var o = [], t = 0; t < n._sounds.length; t++)o.push(n._sounds[t]._id); return o; } return [e]; }, _refreshBuffer: function (e) { var o = this; return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o; }, _cleanBuffer: function (e) { var o = this, t = n._navigator && n._navigator.vendor.indexOf('Apple') >= 0; if (n._scratchBuffer && e.bufferSource && (e.bufferSource.onended = null, e.bufferSource.disconnect(0), t)) try { e.bufferSource.buffer = n._scratchBuffer; } catch (e) {} return e.bufferSource = null, o; }, _clearSound: function (e) { /MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (e.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA'); } }; var t = function (e) { this._parent = e, this.init(); }; t.prototype = { init: function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, o._sounds.push(e), e.create(), e; }, create: function () { var e = this, o = e._parent, t = n._muted || e._muted || e._parent._muted ? 0 : e._volume; return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : n.noAudio || (e._node = n._obtainHtml5Audio(), e._errorFn = e._errorListener.bind(e), e._node.addEventListener('error', e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = !0 === o._preload ? 'auto' : o._preload, e._node.volume = t * n.volume(), e._node.load()), e; }, reset: function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, e; }, _errorListener: function () { var e = this; e._parent._emit('loaderror', e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener('error', e._errorFn, !1); }, _loadListener: function () { var e = this, o = e._parent; o._duration = Math.ceil(10 * e._node.duration) / 10, Object.keys(o._sprite).length === 0 && (o._sprite = { __default: [0, 1e3 * o._duration] }), o._state !== 'loaded' && (o._state = 'loaded', o._emit('load'), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1); } }; var r = {}, a = function (e) { var n = e._src; if (r[n]) return e._duration = r[n].duration, void d(e); if (/^data:[^;]+;base64,/.test(n)) { for (var o = atob(n.split(',')[1]), t = new Uint8Array(o.length), a = 0; a < o.length; ++a)t[a] = o.charCodeAt(a); i(t.buffer, e); } else { var _ = new XMLHttpRequest; _.open(e._xhr.method, n, !0), _.withCredentials = e._xhr.withCredentials, _.responseType = 'arraybuffer', e._xhr.headers && Object.keys(e._xhr.headers).forEach(function (n) { _.setRequestHeader(n, e._xhr.headers[n]); }), _.onload = function () { var n = (_.status + '')[0]; if (n !== '0' && n !== '2' && n !== '3') return void e._emit('loaderror', null, 'Failed loading audio file with status: ' + _.status + '.'); i(_.response, e); }, _.onerror = function () { e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load()); }, u(_); } }, u = function (e) { try { e.send(); } catch (n) { e.onerror(); } }, i = function (e, o) { var t = function () { o._emit('loaderror', null, 'Decoding audio data failed.'); }, a = function (e) { e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : t(); }; typeof Promise != 'undefined' && n.ctx.decodeAudioData.length === 1 ? n.ctx.decodeAudioData(e).then(a).catch(t) : n.ctx.decodeAudioData(e, a, t); }, d = function (e, n) { n && !e._duration && (e._duration = n.duration), Object.keys(e._sprite).length === 0 && (e._sprite = { __default: [0, 1e3 * e._duration] }), e._state !== 'loaded' && (e._state = 'loaded', e._emit('load'), e._loadQueue()); }, _ = function () { if (n.usingWebAudio) { try { typeof AudioContext != 'undefined' ? n.ctx = new AudioContext : typeof webkitAudioContext != 'undefined' ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1; } catch (e) { n.usingWebAudio = !1; }n.ctx || (n.usingWebAudio = !1); var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform), o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/), t = o ? parseInt(o[1], 10) : null; if (e && t && t < 9) { var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase()); n._navigator && !r && (n.usingWebAudio = !1); }n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : n._volume, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup(); } }; typeof define == 'function' && define.amd && define([], function () { return { Howler: n, Howl: o }; }), typeof exports != 'undefined' && (exports.Howler = n, exports.Howl = o), typeof global != 'undefined' ? (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t) : typeof window != 'undefined' && (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t); }();
|
|
4
|
+
/*! Spatial Plugin */
|
|
5
|
+
!function () { 'use strict'; HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function (e) { var n = this; if (!n.ctx || !n.ctx.listener) return n; for (var t = n._howls.length - 1; t >= 0; t--)n._howls[t].stereo(e); return n; }, HowlerGlobal.prototype.pos = function (e, n, t) { var r = this; return r.ctx && r.ctx.listener ? (n = typeof n != 'number' ? r._pos[1] : n, t = typeof t != 'number' ? r._pos[2] : t, typeof e != 'number' ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r; }, HowlerGlobal.prototype.orientation = function (e, n, t, r, o, i) { var a = this; if (!a.ctx || !a.ctx.listener) return a; var s = a._orientation; return n = typeof n != 'number' ? s[1] : n, t = typeof t != 'number' ? s[2] : t, r = typeof r != 'number' ? s[3] : r, o = typeof o != 'number' ? s[4] : o, i = typeof i != 'number' ? s[5] : i, typeof e != 'number' ? s : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(r, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(o, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(i, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a); }, Howl.prototype.init = function (e) { return function (n) { var t = this; return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = { coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360, coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360, coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : 0, distanceModel: void 0 !== n.distanceModel ? n.distanceModel : 'inverse', maxDistance: void 0 !== n.maxDistance ? n.maxDistance : 1e4, panningModel: void 0 !== n.panningModel ? n.panningModel : 'HRTF', refDistance: void 0 !== n.refDistance ? n.refDistance : 1, rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : 1 }, t._onstereo = n.onstereo ? [{ fn: n.onstereo }] : [], t._onpos = n.onpos ? [{ fn: n.onpos }] : [], t._onorientation = n.onorientation ? [{ fn: n.onorientation }] : [], e.call(this, n); }; }(Howl.prototype.init), Howl.prototype.stereo = function (n, t) { var r = this; if (!r._webAudio) return r; if (r._state !== 'loaded') return r._queue.push({ event: 'stereo', action: function () { r.stereo(n, t); } }), r; var o = void 0 === Howler.ctx.createStereoPanner ? 'spatial' : 'stereo'; if (void 0 === t) { if (typeof n != 'number') return r._stereo; r._stereo = n, r._pos = [n, 0, 0]; } for (var i = r._getSoundIds(t), a = 0; a < i.length; a++) { var s = r._soundById(i[a]); if (s) { if (typeof n != 'number') return s._stereo; s._stereo = n, s._pos = [n, 0, 0], s._node && (s._pannerAttr.panningModel = 'equalpower', s._panner && s._panner.pan || e(s, o), o === 'spatial' ? void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : s._panner.setPosition(n, 0, 0) : s._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit('stereo', s._id); } } return r; }, Howl.prototype.pos = function (n, t, r, o) { var i = this; if (!i._webAudio) return i; if (i._state !== 'loaded') return i._queue.push({ event: 'pos', action: function () { i.pos(n, t, r, o); } }), i; if (t = typeof t != 'number' ? 0 : t, r = typeof r != 'number' ? -.5 : r, void 0 === o) { if (typeof n != 'number') return i._pos; i._pos = [n, t, r]; } for (var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if (p) { if (typeof n != 'number') return p._pos; p._pos = [n, t, r], p._node && (p._panner && !p._panner.pan || e(p, 'spatial'), void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setPosition(n, t, r)), i._emit('pos', p._id); } } return i; }, Howl.prototype.orientation = function (n, t, r, o) { var i = this; if (!i._webAudio) return i; if (i._state !== 'loaded') return i._queue.push({ event: 'orientation', action: function () { i.orientation(n, t, r, o); } }), i; if (t = typeof t != 'number' ? i._orientation[1] : t, r = typeof r != 'number' ? i._orientation[2] : r, void 0 === o) { if (typeof n != 'number') return i._orientation; i._orientation = [n, t, r]; } for (var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if (p) { if (typeof n != 'number') return p._orientation; p._orientation = [n, t, r], p._node && (p._panner || (p._pos || (p._pos = i._pos || [0, 0, -.5]), e(p, 'spatial')), void 0 !== p._panner.orientationX ? (p._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setOrientation(n, t, r)), i._emit('orientation', p._id); } } return i; }, Howl.prototype.pannerAttr = function () { var n, t, r, o = this, i = arguments; if (!o._webAudio) return o; if (i.length === 0) return o._pannerAttr; if (i.length === 1) { if (typeof i[0] != 'object') return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr; n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = { coneInnerAngle: n.coneInnerAngle, coneOuterAngle: n.coneOuterAngle, coneOuterGain: n.coneOuterGain, distanceModel: n.distanceModel, maxDistance: n.maxDistance, refDistance: n.refDistance, rolloffFactor: n.rolloffFactor, panningModel: n.panningModel }), o._pannerAttr = { coneInnerAngle: void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle, coneOuterAngle: void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle, coneOuterGain: void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain, distanceModel: void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel, maxDistance: void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance, refDistance: void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance, rolloffFactor: void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor, panningModel: void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel }); } else i.length === 2 && (n = i[0], t = parseInt(i[1], 10)); for (var a = o._getSoundIds(t), s = 0; s < a.length; s++) if (r = o._soundById(a[s])) { var p = r._pannerAttr; p = { coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : p.coneInnerAngle, coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : p.coneOuterAngle, coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : p.coneOuterGain, distanceModel: void 0 !== n.distanceModel ? n.distanceModel : p.distanceModel, maxDistance: void 0 !== n.maxDistance ? n.maxDistance : p.maxDistance, refDistance: void 0 !== n.refDistance ? n.refDistance : p.refDistance, rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : p.rolloffFactor, panningModel: void 0 !== n.panningModel ? n.panningModel : p.panningModel }; var c = r._panner; c ? (c.coneInnerAngle = p.coneInnerAngle, c.coneOuterAngle = p.coneOuterAngle, c.coneOuterGain = p.coneOuterGain, c.distanceModel = p.distanceModel, c.maxDistance = p.maxDistance, c.refDistance = p.refDistance, c.rolloffFactor = p.rolloffFactor, c.panningModel = p.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, 'spatial')); } return o; }, Sound.prototype.init = function (e) { return function () { var n = this, t = n._parent; n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id); }; }(Sound.prototype.init), Sound.prototype.reset = function (e) { return function () { var n = this, t = n._parent; return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this); }; }(Sound.prototype.reset); var e = function (e, n) { n = n || 'spatial', n === 'spatial' ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0); }; }();
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/*
|
|
3
|
+
Copyright 2014 David Bau.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
+
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
function seedRandom(pool, math) {
|
|
27
|
+
//
|
|
28
|
+
// The following constants are related to IEEE 754 limits.
|
|
29
|
+
//
|
|
30
|
+
var global = this,
|
|
31
|
+
width = 256, // each RC4 output is 0 <= x < 256
|
|
32
|
+
chunks = 6, // at least six RC4 outputs for each double
|
|
33
|
+
digits = 52, // there are 52 significant digits in a double
|
|
34
|
+
rngname = 'random', // rngname: name for Math.random and Math.seedrandom
|
|
35
|
+
startdenom = math.pow(width, chunks),
|
|
36
|
+
significance = math.pow(2, digits),
|
|
37
|
+
overflow = significance * 2,
|
|
38
|
+
mask = width - 1,
|
|
39
|
+
nodecrypto; // node.js crypto module, initialized at the bottom.
|
|
40
|
+
|
|
41
|
+
//
|
|
42
|
+
// seedrandom()
|
|
43
|
+
// This is the seedrandom function described above.
|
|
44
|
+
//
|
|
45
|
+
function seedrandom(seed, options, callback) {
|
|
46
|
+
var key = [];
|
|
47
|
+
options = (options === true) ? { entropy: true } : (options || {});
|
|
48
|
+
|
|
49
|
+
// Flatten the seed string or build one from local entropy if needed.
|
|
50
|
+
var shortseed = mixkey(flatten(
|
|
51
|
+
options.entropy ? [seed, tostring(pool)] :
|
|
52
|
+
(seed === null) ? autoseed() : seed, 3), key);
|
|
53
|
+
|
|
54
|
+
// Use the seed to initialize an ARC4 generator.
|
|
55
|
+
var arc4 = new ARC4(key);
|
|
56
|
+
|
|
57
|
+
// This function returns a random double in [0, 1) that contains
|
|
58
|
+
// randomness in every bit of the mantissa of the IEEE 754 value.
|
|
59
|
+
var prng = function() {
|
|
60
|
+
var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48
|
|
61
|
+
d = startdenom, // and denominator d = 2 ^ 48.
|
|
62
|
+
x = 0; // and no 'extra last byte'.
|
|
63
|
+
while (n < significance) { // Fill up all significant digits by
|
|
64
|
+
n = (n + x) * width; // shifting numerator and
|
|
65
|
+
d *= width; // denominator and generating a
|
|
66
|
+
x = arc4.g(1); // new least-significant-byte.
|
|
67
|
+
}
|
|
68
|
+
while (n >= overflow) { // To avoid rounding up, before adding
|
|
69
|
+
n /= 2; // last byte, shift everything
|
|
70
|
+
d /= 2; // right using integer math until
|
|
71
|
+
x >>>= 1; // we have exactly the desired bits.
|
|
72
|
+
}
|
|
73
|
+
return (n + x) / d; // Form the number within [0, 1).
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
prng.int32 = function() { return arc4.g(4) | 0; };
|
|
77
|
+
prng.quick = function() { return arc4.g(4) / 0x100000000; };
|
|
78
|
+
prng.double = prng;
|
|
79
|
+
|
|
80
|
+
// Mix the randomness into accumulated entropy.
|
|
81
|
+
mixkey(tostring(arc4.S), pool);
|
|
82
|
+
|
|
83
|
+
// Calling convention: what to return as a function of prng, seed, is_math.
|
|
84
|
+
return (options.pass || callback ||
|
|
85
|
+
function(prng, seed, is_math_call, state) {
|
|
86
|
+
if (state) {
|
|
87
|
+
// Load the arc4 state from the given state if it has an S array.
|
|
88
|
+
if (state.S) { copy(state, arc4); }
|
|
89
|
+
// Only provide the .state method if requested via options.state.
|
|
90
|
+
prng.state = function() { return copy(arc4, {}); };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// If called as a method of Math (Math.seedrandom()), mutate
|
|
94
|
+
// Math.random because that is how seedrandom.js has worked since v1.0.
|
|
95
|
+
if (is_math_call) { math[rngname] = prng; return seed; }
|
|
96
|
+
|
|
97
|
+
// Otherwise, it is a newer calling convention, so return the
|
|
98
|
+
// prng directly.
|
|
99
|
+
else return prng;
|
|
100
|
+
})(
|
|
101
|
+
prng,
|
|
102
|
+
shortseed,
|
|
103
|
+
'global' in options ? options.global : (this == math),
|
|
104
|
+
options.state);
|
|
105
|
+
}
|
|
106
|
+
math['seed' + rngname] = seedrandom;
|
|
107
|
+
|
|
108
|
+
//
|
|
109
|
+
// ARC4
|
|
110
|
+
//
|
|
111
|
+
// An ARC4 implementation. The constructor takes a key in the form of
|
|
112
|
+
// an array of at most (width) integers that should be 0 <= x < (width).
|
|
113
|
+
//
|
|
114
|
+
// The g(count) method returns a pseudorandom integer that concatenates
|
|
115
|
+
// the next (count) outputs from ARC4. Its return value is a number x
|
|
116
|
+
// that is in the range 0 <= x < (width ^ count).
|
|
117
|
+
//
|
|
118
|
+
function ARC4(key) {
|
|
119
|
+
var t, keylen = key.length,
|
|
120
|
+
me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];
|
|
121
|
+
|
|
122
|
+
// The empty key [] is treated as [0].
|
|
123
|
+
if (!keylen) { key = [keylen++]; }
|
|
124
|
+
|
|
125
|
+
// Set up S using the standard key scheduling algorithm.
|
|
126
|
+
while (i < width) {
|
|
127
|
+
s[i] = i++;
|
|
128
|
+
}
|
|
129
|
+
for (i = 0; i < width; i++) {
|
|
130
|
+
s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];
|
|
131
|
+
s[j] = t;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The "g" method returns the next (count) outputs as one number.
|
|
135
|
+
me.g = function(count) {
|
|
136
|
+
// Using instance members instead of closure state nearly doubles speed.
|
|
137
|
+
var t, r = 0,
|
|
138
|
+
i = me.i, j = me.j, s = me.S;
|
|
139
|
+
while (count--) {
|
|
140
|
+
t = s[i = mask & (i + 1)];
|
|
141
|
+
r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];
|
|
142
|
+
}
|
|
143
|
+
me.i = i; me.j = j;
|
|
144
|
+
return r;
|
|
145
|
+
// For robust unpredictability, the function call below automatically
|
|
146
|
+
// discards an initial batch of values. This is called RC4-drop[256].
|
|
147
|
+
// See http://google.com/search?q=rsa+fluhrer+response&btnI
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
//
|
|
152
|
+
// copy()
|
|
153
|
+
// Copies internal state of ARC4 to or from a plain object.
|
|
154
|
+
//
|
|
155
|
+
function copy(f, t) {
|
|
156
|
+
t.i = f.i;
|
|
157
|
+
t.j = f.j;
|
|
158
|
+
t.S = f.S.slice();
|
|
159
|
+
return t;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
//
|
|
163
|
+
// flatten()
|
|
164
|
+
// Converts an object tree to nested arrays of strings.
|
|
165
|
+
//
|
|
166
|
+
function flatten(obj, depth) {
|
|
167
|
+
var result = [], typ = (typeof obj), prop;
|
|
168
|
+
if (depth && typ == 'object') {
|
|
169
|
+
for (prop in obj) {
|
|
170
|
+
try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return (result.length ? result : typ == 'string' ? obj : obj + '\0');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
//
|
|
177
|
+
// mixkey()
|
|
178
|
+
// Mixes a string seed into a key that is an array of integers, and
|
|
179
|
+
// returns a shortened string seed that is equivalent to the result key.
|
|
180
|
+
//
|
|
181
|
+
function mixkey(seed, key) {
|
|
182
|
+
var stringseed = seed + '', smear, j = 0;
|
|
183
|
+
while (j < stringseed.length) {
|
|
184
|
+
key[mask & j] =
|
|
185
|
+
mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));
|
|
186
|
+
}
|
|
187
|
+
return tostring(key);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
//
|
|
191
|
+
// autoseed()
|
|
192
|
+
// Returns an object for autoseeding, using window.crypto and Node crypto
|
|
193
|
+
// module if available.
|
|
194
|
+
//
|
|
195
|
+
function autoseed() {
|
|
196
|
+
try {
|
|
197
|
+
if (nodecrypto) { return tostring(nodecrypto.randomBytes(width)); }
|
|
198
|
+
var out = new Uint8Array(width);
|
|
199
|
+
(global.crypto || global.msCrypto).getRandomValues(out);
|
|
200
|
+
return tostring(out);
|
|
201
|
+
} catch (e) {
|
|
202
|
+
var browser = global.navigator,
|
|
203
|
+
plugins = browser && browser.plugins;
|
|
204
|
+
return [+new Date(), global, plugins, global.screen, tostring(pool)];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
//
|
|
209
|
+
// tostring()
|
|
210
|
+
// Converts an array of charcodes to a string
|
|
211
|
+
//
|
|
212
|
+
function tostring(a) {
|
|
213
|
+
return String.fromCharCode.apply(0, a);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
//
|
|
217
|
+
// When seedrandom.js is loaded, we immediately mix a few bits
|
|
218
|
+
// from the built-in RNG into the entropy pool. Because we do
|
|
219
|
+
// not want to interfere with deterministic PRNG state later,
|
|
220
|
+
// seedrandom will not call math.random on its own again after
|
|
221
|
+
// initialization.
|
|
222
|
+
//
|
|
223
|
+
mixkey(math.random(), pool);
|
|
224
|
+
|
|
225
|
+
//
|
|
226
|
+
// Nodejs and AMD support: export the implementation as a module using
|
|
227
|
+
// either convention.
|
|
228
|
+
//
|
|
229
|
+
|
|
230
|
+
// End anonymous scope, and pass initial values.
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
function initialize(BMMath) {
|
|
234
|
+
seedRandom([], BMMath);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export default initialize;
|