<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" FileVersion="2">
  <OnLoaded>
    <ZExpression Comment="Instructions">
      <Expression>
<![CDATA[/*
============
Instructions
============

This is an expanded version of the ShaderToy template. This should simplify
creating new effects with ShaderToy.

--------------
Initialization
--------------

Most code has been moved to the "Initialization" ZLibrary. This is so that
all parameters are loaded both at the start as well as on update.

A new parameter has also been added, USE_BEAT, this will allow you to time the
speed with the beat instead of the run time. While it is possible to interpolate
between the two values, it's not recommended. To completely disable this
feature, set USE_BEAT to -1.
*/]]>
      </Expression>
    </ZExpression>
    <ZLibrary Comment="Common">
      <Source>
<![CDATA[float minFloat(float a, float b) {
  if (a < b) {
    return a;
  }
  return b;
}

float maxFloat(float a, float b) {
  if (b < a) {
    return a;
  }
  return b;
}

float clampFloat(float a, float minA, float maxA) {
  return minFloat(1.0, maxFloat(0.0, a));
}]]>
      </Source>
    </ZLibrary>
    <ZLibrary Comment="HSV Library">
      <Source>
<![CDATA[void ZgeVizGetFileNames(string path, string pattern, string[] list) { }

vec3 hsv(float h, float s, float v)
{
  s = clamp(s/100, 0, 1);
  v = clamp(v/100, 0, 1);

  if(!s)return vector3(v, v, v);

  h = h < 0 ? frac(1-abs(frac(h/360)))*6 : frac(h/360)*6;

  float c, f, p, q, t;

  c = floor(h);
  f = h-c;

  p = v*(1-s);
  q = v*(1-s*f);
  t = v*(1-s*(1-f));

  switch(c)
  {
    case 0: return vector3(v, t, p);
    case 1: return vector3(q, v, p);
    case 2: return vector3(p, v, t);
    case 3: return vector3(p, q, v);
    case 4: return vector3(t, p, v);
    case 5: return vector3(v, p, q);
  }
}]]>
      </Source>
    </ZLibrary>
    <ZLibrary Comment="Array Functions">
      <Source>
<![CDATA[inline float interpolateValueLinear(float[] dataArray, float index) {
  int idx = floor(index);
  if (index == idx || ceil(index) >= dataArray.SizeDim1) {
    return dataArray[idx];
  }
  float mu = index - idx;
  return dataArray[idx] * (1 - mu) + dataArray[idx + 1] * mu;
}

inline float interpolateValueNearest(float[] dataArray, float index, float edge) {
  int idx = floor(index);
  float mu = index - idx;
  if (mu < edge || ceil(index) >= dataArray.SizeDim1) {
    return dataArray[idx];
  }
  return dataArray[idx + 1];
}

inline float interpolateValueCosine(float[] dataArray, float index) {
  int idx = floor(index);
  if (index == idx || ceil(index) >= dataArray.SizeDim1) {
    return dataArray[idx];
  }
  float mu = (1.0 - cos((index - idx) * PI)) / 2.0;
  return dataArray[idx] * (1 - mu) + dataArray[idx + 1] * mu;
}

inline float interpolateValueCubic(float[] dataArray, float index) {
  int idx = floor(index);
  if (index == idx || ceil(index) >= dataArray.SizeDim1) {
    return dataArray[idx];
  }
  float mu = index - idx;
  float mu2 = mu * mu;

  float y0 = 0;
  float y1 = dataArray[idx];
  float y2 = dataArray[idx + 1];
  float y3 = 0;

  if (idx > 0) {
    y0 = dataArray[idx - 1];
  } else {
    y0 = 2 * y1 - y2;
  }

  if (idx + 2 < dataArray.SizeDim1) {
    y3 = dataArray[idx + 2];
  } else {
    y3 = 2 * y2 - y1;
  }

  float a0 = y3 - y2 - y0 + y1;
  float a1 = y0 - y1 - a0;
  float a2 = y2 - y0;
  float a3 = y1;

  return (a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3);
}

float interpolateValue(float[] dataArray, float index, int interpolationMethod) {
  switch (interpolationMethod) {
    case 0:
      return interpolateValueLinear(dataArray, index);
    case 1:
      return interpolateValueNearest(dataArray, index, 1.0);
    case 2:
      return interpolateValueNearest(dataArray, index, 0.5);
    case 3:
      return interpolateValueCosine(dataArray, index);
    case 4:
      return interpolateValueCubic(dataArray, index);
    case 5:
      return 0;
  }
  return interpolateValueLinear(dataArray, index);
}

void resampleArray(float[] oldArray, float[] newArray, int interpolationMethod) {
  float oldSize = oldArray.SizeDim1;
  float newSize = newArray.SizeDim1;
  float increment = (oldSize - 1.0) / (newSize - 1.0);

  for (int idx = 0; idx < newSize; idx++) {
    float index = idx * increment;
    newArray[idx] = interpolateValue(oldArray, index, interpolationMethod);
  }
}]]>
      </Source>
    </ZLibrary>
    <ZLibrary Comment="Parameter simplifier">
      <Source>
<![CDATA[vec3 getColorRGB(int hueIdx, int saturationIdx, int lightnessIdx) {
  return hsv(Parameters[hueIdx]*360,Parameters[saturationIdx]*100,(1-Parameters[lightnessIdx])*100);
}

vec4 getColorRGBA(int hueIdx, int saturationIdx, int lightnessIdx, int alphaIdx) {
  vec3 c = getColorRGB(hueIdx, saturationIdx, lightnessIdx);
  return vector4(c.x,c.y,c.z,1.0-Parameters[alphaIdx]);
}

vec4 getColorFromIdx(int alphaIdx) {
  return getColorRGBA(alphaIdx + 1, alphaIdx + 2, alphaIdx + 3, alphaIdx);
}

float setNormalToRange(float value, float minValue, float maxValue) {
  return value * (maxValue - minValue) + minValue;
}

float getMix(float value1, float value2, float interpolation) {
  return value1 * (1.0 * interpolation) + value2 * interpolation;
}

float getSpeed(int speedIdx, float speedMultiplier) {
  return setNormalToRange(Parameters[speedIdx], -speedMultiplier, speedMultiplier);
}

float getSpeedValue(float speedValue, float beatsPosValue, int useBeatIdx) {
  float useBeat = 0.0;
  if (useBeatIdx >= 0) {
    useBeat = Parameters[useBeatIdx];
  }
  return getMix(speedValue, beatsPosValue, useBeat);
}]]>
      </Source>
    </ZLibrary>
    <ZLibrary Comment="Initialization">
      <Source>
<![CDATA[const int
  ALPHA = 0,
  SPEC_BAND_ALPHA = 4,
  AUDIO_LEFT_ALPHA = 8,
  AUDIO_RIGHT_ALPHA = 12; // Set to -1 to disable

const float SPEED_MULTIPLIER = 2.0; // Multiplier for the iTime speed
const float SPEED_BEAT_MULTIPLIER = 1.0;

// You can add your own values in the below function
void setCustomValues() {
  int maxResolution = maxFloat(app.ViewportWidth,app.ViewportHeight);
  uAudioLeft.SizeDim1 = maxResolution;
  uAudioRight.SizeDim1 = maxResolution;
  uSpecBand.SizeDim1 = maxResolution;

  resampleArray(AudioArrayLeft, uAudioLeft, 4);
  resampleArray(AudioArrayRight, uAudioRight, 4);
  resampleArray(SpecBandArray, uSpecBand, 4);

  for (int idx = 0; idx < maxResolution; idx++) {
    uAudioLeft[idx] = clampFloat(abs(uAudioLeft[idx]), 0.0, 1.0);
    uAudioRight[idx] = clampFloat(abs(uAudioRight[idx]), 0.0, 1.0);
    uSpecBand[idx] = clampFloat(abs(uSpecBand[idx]), 0.0, 1.0);
  }
}

// Don't change this function unless you know what you're doing
void setShaderToyValues() {
  //Most used ShaderToy uniform variables
  uResolution=vector2(app.ViewportWidth,app.ViewportHeight);
  uViewport=vector2(app.ViewportX,app.ViewportY);
  uMouse=vector4(0.0,0.0,0.0,0.0);
}

void setAudioChannels() {
  AudioArrayLeft.SizeDim1 = AudioArray.SizeDim1 / 2;
  AudioArrayRight.SizeDim1 = AudioArray.SizeDim1 / 2;

  for (int idx = 0; idx < AudioArray.SizeDim1; idx += 2) {
    int realIdx = idx / 2;
    AudioArrayLeft[realIdx] = AudioArray[idx];
    AudioArrayRight[realIdx] = AudioArray[idx + 1];
  }
}

void setValues() {
  // Set ShaderToy values
  setShadertoyValues();

  setAudioChannels();

  // Set base color
  uColor = getColorFromIdx(ALPHA);
  uSpecBandColor = getColorFromIdx(SPEC_BAND_ALPHA);
  uAudioLeftColor = getColorFromIdx(AUDIO_LEFT_ALPHA);
  uAudioRightColor = getColorFromIdx(AUDIO_RIGHT_ALPHA);

  // Set custom values
  setCustomValues();
}]]>
      </Source>
    </ZLibrary>
    <ZExpression Expression="setValues();"/>
  </OnLoaded>
  <OnUpdate>
    <ZExpression Expression="setValues();"/>
  </OnUpdate>
  <OnRender>
    <UseMaterial Material="mCanvas"/>
    <RenderSprite/>
  </OnRender>
  <Content>
    <Shader Name="CircolShader">
      <VertexShaderSource>
<![CDATA[#version 120

void main(){
  vec4 vertex = gl_Vertex;
  vertex.xy *= 2.0;
  gl_Position = vertex;
}]]>
      </VertexShaderSource>
      <FragmentShaderSource>
<![CDATA[#version 120

uniform vec2 iResolution,iViewport;
uniform float iTime;
uniform vec4 iColor;
uniform vec4 iMouse;
//uniform sampler2D tex1; //ZGE material texture uniforn
//#define iChannel0 tex1  //Define shadertoy variable to elimnate code editing.
uniform sampler2D iAudioLeft;
uniform sampler2D iAudioRight;
uniform sampler2D iSpecBand;
uniform vec4 iSpecBandColor;
uniform vec4 iAudioLeftColor;
uniform vec4 iAudioRightColor;

//uniform float iAppTime;
//uniform float iAccumulatedTime;
//uniform float iBeatTime;
//uniform float iAccumulatedBeatTime;

vec2 getRatio() {
  if (iResolution.x > iResolution.y) {
    return vec2(iResolution.y / iResolution.x, 1.0);
  }
  return vec2(1.0, iResolution.x / iResolution.y);
}

float clampAngle(float angle) {
    float pi = acos(0.0) * 2.0;
    float newAngle = mod(angle, 2.0 * pi);
    if (newAngle > pi) {
      newAngle-= 2.0 * pi;
    }
    return newAngle;
}

vec4 getColor(in vec4 col, in float val, in float mult) {
  vec4 ret = col;
  float tVal = val * mult;
  ret.rgb*= tVal;
  ret.rgb+= iColor.rgb * (1.0 - tVal) * mult * col.a;
  ret.a = tVal * (1.0 - col.a) + col.a * mult;
  return ret;
}

//copy-paste ShaderToy code here.
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = (fragCoord/iResolution - 0.5) * 2.0 / getRatio();

    float dist = distance(uv, vec2(0.0));
    float angle = atan(uv.y, uv.x);
    float pi = acos(0.0) * 2.0;

    // Time varying pixel color
    //vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));

    vec4 col = vec4(0.0);

    if (dist < 1.0) {
      float valAudioLeft = texture2D(iAudioLeft, vec2(dist, 0.0)).r;
      float valAudioRight = texture2D(iAudioRight, vec2(dist, 0.0)).r;
      float valSpecBand = texture2D(iSpecBand, vec2(dist, 0.0)).r;

      float multSpecBand = (cos(clampAngle(angle - 0.5 * pi) * 1.5)) / 2.0 + 0.5;
      float multAudioRight = (cos(clampAngle(angle - 0.5 * pi + pi * 2.0 / 3.0) * 1.5)) / 2.0 + 0.5;
      float multAudioLeft = (cos(clampAngle(angle - 0.5 * pi + pi * 4.0 / 3.0) * 1.5)) / 2.0 + 0.5;

      if (angle < -pi / 6.0 && angle > -pi * 5.0 / 6.0) {
        multSpecBand = 0.0;
      }
      if (angle > 0.5 * pi || angle < -pi * 5.0 / 6.0) {
        multAudioRight = 0.0;
      }
      if (angle < 0.5 * pi && angle > -pi / 6.0) {
        multAudioLeft = 0.0;
      }

      valAudioLeft*= multAudioLeft;
      valAudioRight*= multAudioRight;

      vec4 colSpecBand = getColor(iSpecBandColor, valSpecBand, multSpecBand);
      vec4 colAudioLeft = getColor(iAudioLeftColor, valAudioLeft, multAudioLeft);
      vec4 colAudioRight = getColor(iAudioRightColor, valAudioRight, multAudioRight);
      col = colSpecBand + colAudioLeft + colAudioRight;
      col.a*= iColor.a;
    }

    // Output to screen
    fragColor = col;
}
//copy-paste ShaderToy code here.

void main(){
    //ZGE does not use mainImage( out vec4 fragColor, in vec2 fragCoord )
    //Rededefined fragCoord as gl_FragCoord.xy-iViewport(dynamic window)
    mainImage(gl_FragColor,gl_FragCoord.xy-iViewport);
}]]>
      </FragmentShaderSource>
      <UniformVariables>
        <ShaderVariable VariableName="iResolution" VariableRef="uResolution"/>
        <ShaderVariable VariableName="iViewport" VariableRef="uViewport"/>
        <ShaderVariable VariableName="iTime" VariableRef="uTime"/>
        <ShaderVariable VariableName="iColor" VariableRef="uColor"/>
        <ShaderVariable VariableName="iMouse" VariableRef="uMouse"/>
        <ShaderVariable VariableName="iAppTime" VariableRef="uAppTime"/>
        <ShaderVariable VariableName="iAccumulatedTime" VariableRef="uAccumulatedTime"/>
        <ShaderVariable VariableName="iBeatTime" VariableRef="uBeatTime"/>
        <ShaderVariable VariableName="iAccumulatedBeatTime" VariableRef="uAccumulatedBeatTime"/>
        <ShaderVariable VariableName="iAudioLeft" ValueArrayRef="uAudioLeft"/>
        <ShaderVariable VariableName="iAudioRight" ValueArrayRef="uAudioRight"/>
        <ShaderVariable VariableName="iSpecBand" ValueArrayRef="SpecBandArray"/>
        <ShaderVariable VariableName="iSpecBandColor" VariableRef="uSpecBandColor"/>
        <ShaderVariable VariableName="iAudioLeftColor" VariableRef="uAudioLeftColor"/>
        <ShaderVariable VariableName="iAudioRightColor" VariableRef="uAudioRightColor"/>
      </UniformVariables>
    </Shader>
    <Group Comment="Default ShaderToy Uniform Variable Inputs">
      <Children>
        <Variable Name="uResolution" Type="6"/>
        <Variable Name="uTime"/>
        <Variable Name="uTimeDelta"/>
        <Variable Name="uFrame" Type="1"/>
        <Variable Name="uFrameRate"/>
        <Variable Name="uMouse" Type="8"/>
        <Variable Name="uDate" Type="8"/>
      </Children>
    </Group>
    <Group Comment="FL Studio Variables">
      <Children>
        <Array Name="Parameters" SizeDim1="16" Persistent="255">
          <Values>
<![CDATA[789C636040060DF620ECB36C951D840D1343A56FADD1B287F101FC740903]]>
          </Values>
        </Array>
        <Constant Name="ParamHelpConst" Type="2">
          <StringValue>
<![CDATA[Alpha
Hue
Saturation
Lightness
Spec. Band Alpha
Spec. Band Hue
Spec. Band Saturation
Spec. Band Lightness
Audio Left Alpha
Audio Left Hue
Audio Left Saturation
Audio Left Lightness
Audio Right Alpha
Audio Right Hue
Audio Right Saturation
Audio Right Lightness]]>
          </StringValue>
        </Constant>
        <Constant Name="AuthorInfo" Type="2">
          <StringValue>
<![CDATA[GaryCXJk
https://area91.garycxjk.com/]]>
          </StringValue>
        </Constant>
        <Variable Name="SongPositionInBeats"/>
        <Array Name="AudioArray" SizeDim1="4410"/>
        <Array Name="SpecBandArray" SizeDim1="512"/>
      </Children>
    </Group>
    <Group Comment="Unique Uniform Variable Inputs">
      <Children>
        <Variable Name="uViewport" Type="6"/>
        <Variable Name="uColor" Type="8"/>
        <Variable Name="uAppTime"/>
        <Variable Name="uAccumulatedTime"/>
        <Variable Name="uBeatTime"/>
        <Variable Name="uAccumulatedBeatTime"/>
        <Array Name="uAudioLeft" SizeDim1="1920">
          <Values>
<![CDATA[789CED5A69701CC77506357222A30A958D944395549CD6CA8976C10530BB38048B8024600192A800E40A0701110549839D0676C4DD99D1CC2C0EA954E57F6162D9DE5CB69C388E64C93615CBCEE6564E33B7E238C926F9A39FFCE95F29FC8AF533DFEBEE39F62048D02AC555E1163F74F7EBD7AF5FBF7EFDFA18F6F589DF137D7D9F7CC29E4EE787F534E376D9312D7B773A6DF9CED0E4E4F82786F269F6C4E303FD5397675CB76A958DC0726C76C1A8F1E934286956345C224DA72F9F0371DEB402C76346CC9B6667AD2ABFC43D5F7015D210C6D8D4457BD1314C6E8A12CA97E70F5C8FFBC4C48A4EADC6ED603ABD60FB81572F93183FAD38C11BB392620F6D16E766566736470607FAA713BF81FE64F3CEBA81FED58AE533FC336CC60F5CC386326C4FAAC99C1D1654385BA940456FD5396401AFB95523E0C34C34F32B4EBD6A32DF02D5DA391CE82F7B1CA3B57799CDF719DFD9E1E5C067FB565089650C53A7436D3F52D10A2CA36ABD286CD55D3FD0BFE4F801C3AC7056317CB6CDB9CD6ACE1E740D1CA163BA5D449A5D5EB4B63DC33B54AA92B6C4690403FD46B5CA5CC3C33C051828333CCEAA6216D8B603558D4048F403C30B183ADBE7E0470A83D45D93464F0ACD88314662845A46157D08DD0C13E2726C6D65FED9D9F999D51C245A64099254AD3AFBECD0A90BD5AD1AA7DE06FA7D974301612BEA7D1B866416668E1B66380F5EDD160D86D97A05CEC4AC8086E53AF0816D1421CEB2A18AEBD0140DF46FF3609F74A1A6C1BEC3F68C6A9DFB39347BC467B613308F97858B415558C98179318F184CF59099966F0899507BA07F07CAD43D9E633E0FA231517F4379D86270646B2BF6CA9136B794A4CBDDB4707A622F3FBF72892962C2C9579CBA57E64907DF732C935DDEE597AC17CFF18056152D433F032727CF738DA00245A3020C6287E5CD2D56B5FC20CB5E622FD31CEEF1F228ABF87B991DCC7FC0D04E66FC30B3971DE87F8974F1D9342B578D9A9BF147F2BA9E63F897CF9EA1AABDA86AAFBD8A2AAD9DCC437ED6E3309F8D6555465418CDECE518FD0B792A105061534C674FB01DCF2867F243C6B69F11D9CAC8E8849ECD660727D8632C41199C508DA59E65289C636E8EBD004F5335658845ADE3652A52D11DEA67A8ACAA5D94F606D1972F6B5F88CA833B9212C414FCD9C986FAFA70D2722553CE52E125395365C3E74C7F8C758F34805E529EE2CA7771BD20ECD1CE55E8E2720557D0C635DA8BEB0565DB886BAC8B2B10C66AE71AEFA53D89935C709897DBFC3CF24CE5E3CA776FEEE0339E671CB2B375BB2B92773BB965572D9BABD94DACEA4BB48617516578D269E1D2084986909D8BF84D7E90955383B6CC320F225F907567A46F325964D3D3C4930D2753992192BB29B8B64233844E57AB43AA143044ED457D775BF3608B0DB24C1E4CB57A969D6EAF43394FF5B53A9A8B4579ECD02F60E0DC0F6E31F6B0C0CD5D7E6B3B1C331A32112AA692926E32C6D83ABDAAC5306F6B8445C747E50FC6E466701A8235CA8E9FC9244C93C57C9516B25936C20AC3FA8731EDC5FAB655FEC1B049A78B845505D481410D29AE39D451A127580FF320F4F01D555BE8AC0D5D27E2185502A32181E771A647A3113DB68B180A45BCCC7815B12EC95980CE87344D878570C049C9A7C130158B1B5EB15EE473562D1F7737DA43E342CFEE46C3EE0AD45D3ED99D1C9B410A816D48B1E810A5F8140319EF5017CDF1C7481AD620D3A9764932F52A84241C35839E06C3F92AA017088EB2055985DC683674CFDE7E79CB3824BC316A84B0BFC4838A632AE3C99D949CF2661CD1CE1AEE154AFF9B6C090935127E1F6DBCB7101206D74E2938CF0CEB1DBBF31D8BD287C73BB6F05B885201B1F7D09201F7043691A73F3A48424B834EBD82239A4EA76A266713141CF62321C74DA99C7DB4A77502C70B2545EB26E19990A9B842E9BDB82C1BB72A3A4150400E050F89294100CE844286E249EA92267BA052189A7039CDC491523F2332531117154F9F8E7C30E1D24C444E2C90482D359961A732F24F772F95D8A6F1DAE832E20774D42A45D7327537B5B877FCA5826E02BB3C283A55C75B3E372B8C53A9F305532D629F6E4042D38854B5762B818D6BCD42B495284FA42B45A482BF29E56C0DE2E09E4B90DB446E0DD2DD01E7EC0443B283AD2C31C4BECBCB63497D674EAAB0A41855B762C4EA0B2BD0BD216989506887C0B6D127CF00F2F43C96290F1FE4CAC387C08B39B866726061B75B1DE115D7CB0B8E5733AAABCEB261EFAAF02A2FAE6160AD59F6A5B6B27120CAED33209AD0F923ACA663886A49879130DFDE3F86BD641D247BCD4737412A15725DE71398A347CF7971F419D6C53A69633DAD2475D67429B242EF016256C5CB80B0B9B2129597EAD5C0826773AFBDFB2E13261D4E09DACAB1A10E21B92EA9BD154AEC7AB245DB5CD0A3855F727C4524E5EB3E9F0535F631C9A9C8147BD40992CE1B31337B7C3A71A289B913A38999BBCFDE6A22931A76E8A65A8B617E7FB1A6E3E1E9B82853C6B54F380FF1CC2C96CECF900172543ABF368F7C5EE4576656D7966756172E5EA0F392202D2E9C3BBF7A617E65059451C9549A9F9F43694C94A2479969367E868D8CB0151EC8071AFAAB5E73683AA50A721284886797D61657174A8B0BF3CBD41B66839AC78E20F60A7A42B256E9AD4A98B49718EABD5D567E589E5221EE69A78EDD5E3C8BD1CB97C79C7DB5527C98433D78D1B3D88EBA1DABDD19DE5CACFB815313B3E6678447BCAC84CE39F623012B57C8CDE5FB5AD89AD5ED2A22937864BB6243EC7E850ECE4EFD118F33D3B1ECDD587EF43099EC82C106E2C5116E6226DE3FEBB60573D4A0BA6791457D62AD2F73DFA9D6C5F3AF0C7E858CE1BAC3972CBEEF3A5EB06E99412597A49CE7143C65D4AC87C49E6D37DADA3DAD9A2C39D06B3A0CB45841B904DACF3718E14CDDB49C22CC64E3301E8E4F10C57EBCC87782E44921AE89A9F1452FAE5DA631DC6EC3E30E1D3DDAC9AAD3F0C7280650438F1BD505333C8340B63A7BB40F6653B16DB5E9145FB4BA0671F306F1DDEBE50EA3767A8B5870B1A348DF1667FCD0C582D8C5C287B4AEB951154ADC369D8FCBB40F8B59173B72FBE63C9341DCC82502462E8E143919613A648A0767A15D1C8CE5D3F374BCEB88159DEB8A0FC9E712D14605E5DEED3A028272DD19D7A53882A925C79EE3D5C0A0B2AA2C97EBB53A1D19CD5E4CD83345B75DCCA4876A905971EC5D84794B1C546CAAF1B1F7D743966C2884085250588591F4682C79547DFB36D8A96FAE577BF417F5A04CD331256511E1DA5DA63DEA9D78934A7C458AB3D3E984DF9E498FC82F50236D9FA0A62EDA6BE21BC71D8A4A3486A865FAB6E085A2D67CBE844A44CE2A0B33D3E95AD1B0F70C5FC9009B6CB4E27A56C063C1095153450727273B081BC8E5A53EC6454BF0D939BE6360174B6CC897B008F981E4E8DE9C1F0EBF7AE50B7AB4D26B866567B2E1E1788CBE8C05E212B45B7D568A93DF004476F8E0900D4E47A1122CA12FD04B7AC8DD3E933D755295673D6397CE18B7AB71B43BF1728159F1AE94B3C20DE44CCCA40EB26AF18D8C241A8F314B0498336D224115FB4E1BB7BC3C7B85398651E4E9E870F9DC3CACA6A61944FA70A4F64D9B5A3E6CF21D7AE8B354D4D3454B5A0C73B2C20FA365B4CBD2118657AD9A0DB1F21B20372DFACC381C2B182B62C5215C1D3F3A86AC42D0995E55ED0BBA174BB8966FD13CC1468C65C73D1C720D3F487E4D959F33B9471F14236F5BA81938B533A71E48A3EFC009C46CD0795A4EAD24399EC9C2CF532296C8733F765093B9D601AF423E782CB29ACF323B1E628C4EA6CC67651321AB4E9FAF22812309AF51414A885E95BB8677283EAA29E16A5F2206797174AAE23C3F8E5D137F07E9D958F8D7E9FA1E96C6C169E2CAE8B9426E2CFA96A496956CAABCA5309749CC218EEA7BD9A42E17EB815B17875BBFEC716EAB278AD04CF435CEA9CA33D06DD8BD7B9D33E5C4A6C3E56752F8FC1DCD8C14B5CC115B85679B896AC3A7F070362CC33C43D122CD9887B651B3CA6CDFB24D675F498A35881A52D73795D2BD69DC249CA8EA35E9CA97C2936D541345D8B08A85191971132E938EAA96F9CE743A71308EC2FB6DC80B47D0292DA29F4016B95FA71C413B810C61E84E21927802292276764A91C4134851B1AB534E483E89A4F650D725B1A3FA0492C3D0D72932A2DF99963713DB8BE5243D44918604E34423EF0552745C3792584837592A3896899EC2E239CFA9BBF13B813A8F24E290921369C4166C44B6E487E162C5AA9A1EB793C389B8E500928B8CAD1EBA204DB48FBFB341B7857A718853F7F16C67E92D26EC347F1BBCCB98A4E3D9D42A9122278FE79D23693D58A7463ACC363522A6E226F3727691AD0434D1D13CDC6A06E4877CA945FC209566E1ED95668095E86CE607A28BC2F8783A21408C85CECEC9C3DCA3939F284E8C4EE8BA3E99D7271E9D1D1F2B168B3AFD0A85F9A25E383B9708E6725491909824544B528AF45063E0EE9C50F73CAFBA821E5AAFD0A1DD8AF8DF32427C52C5197AB61DE83F4F77C795E83578A07F317C0A06593E0FE1A8CFC4E5F0C9728597AF6C3B0703FD5DEAB7F712D343958F19C64C3DA838DE82BDE3C44338CE577ADCCBDAF993539A8C08F1948E8DE5F59BB7C1B8CBB3866D76078B13F92222C20B75FE010586781FBDADB0A0B6B9DB5A7A3DF79B2EA6E3B6904EE6DEA1FB1891BD1B24E72419BE192691DB7459F2C95712F31A170AC9C2A828DCF922D6471F9DD5272627F48982FEE8C4A43E57D02775AC67548EEB638FCE9C7C319FD095962CBF7C4711ADFD31ADCD54057DFC76968D78543BA6E14947A26E93F47F544DB62A2F09B71A51F4D220950B5F19D86C95DB26ED566A1FEEF562709B9A8A48A51E22A64692FF3118043ED3D7D7872BAEB7E6BADCA3425C9AADEFEC449445673F512F4A51FD0A0FD6C51D80062D28E742CA22225A3B4F44A1E79C62DDF31D21964A0B65C756FAD8BB9813DFAD1A87684877685FB499B7EBB55EF455CFB07D5A6F4B08EFB87C100D813478AA6E0531698EFB81E71C4A3D48A78AB31F15620DD150F665CE61669C5D5977D629D77D35B695432CB6DA12C7CE50F6FBC27A8FEFC2E8B6198904E75C11E932AF72C3E7220F5AB16A6136967939485A4A9567CCE7EB7E82347F40F2D51866397795DED272AA6F59507A9FEB28CBEE569D15710D152D446ED59135AA0D8C732570DCD81EFBBB55904B9E539E314D7A509334EC9967E14FB35650335C697D508BF43FAAB970B48340D17034E39DB425E30A87769EEA979E7967F9AE652382598EA928B07C547EDE3984161730ED7CCF8FCA189A308C2CA1AA18EA2215210D67C48C930A17B79F97C695E3DCB3CA9CF885EDAAA889EB8B15C7F179895E0ECED2334520EDDB4EE85BD9375C727E44DDBE2BDCB37975B4306C56AB7D0EE6B91EA8024E885E4877B9BD1B32E1BA5CAB89DCAE6929DADDDFDDDFF7FF9B38D5D7370E8C01A34001C803FA29593F8C740818014E0383400ED050F708D29F0732C0C78187819F0318F0B3C043C0C780349005DE429BA78055E04780EBC025E0DBC03AF01D80012DE01EEA1C6D7E12C94F001F017E1CF831A5F7FDC08F020F285E4DB2F715EEE939CC53F79CD2EE55D953BD59FEBFFC4E257EF7889F86DFBDF77EE4FF5AB10FF4F75F708EB7AF5C1538E9AFF4D0F7EEEF7B52E55FFF9FFB937549DFB1699D7C48DFA7358CE74D8C8570F7FBF4DDEFD377BF4FDFFD3E7DF7FBF487FD7D7A436BFDE28656BABAA1A580773FB5A5B5901E11904FFDD286D6009AC083AF6C694F02AD5F4619487D6A43D3810A6825A44DA0053450EEFBA94DB407CF2B1B9AFB0AD1D0C74F6F6A4DA4EFA05EFF34CA4003B88172EA3368FFC3CF68AFDDF78CF62470F433E0FD2CE4815E42EA02EF7F1A7D23BD9EDED4F406E8400B3802CE7F063AFC0AF21FDFD41A481B8FA03D52FD57D136B3A99590B680D4AFA10CA47E1D65A4474003F9E73EBBA51D21D57F03B24E6F6AEF0025E45DA009E89F437FC055F03590B6A8FCF90D8D0D639CC8EBC83781ABFAA6967A1565E03DE2A53C74D6BF8036C8BB486F7C6E4B6B52193822FC2664012ED004CFAB1FDBD4D838C601F44D60AC1F7D466BC126EEB575ADF45BD01DB8065BB8485F9B44FDE7210F791DB6FA24F2258C29F3D8A6768DF25FDCD0EE3B031D91BE4FE5DF86CEAFC2FE481B539B9A8BBC8B7C0AF537BEB6AEB5D0C7D15BEBDA75E0BD2750FF3BD0EF4BC06BE0791D7A022E7004A4BE8C32E002A92F408759F40359AD3737B44994DF2D620EC0D7F80AEC8BF28D39D8741EF6F92AC68972097417F90670E377D7B526E07E1D3A7C0D34A0F506C6740DB28126A0BF051AA0BFBDAEF501D701FDEBF0CB45C845EA024D20F536F14037E008687C0363FEC6BA760368A1CF16CAAD2F62BE91BADF449B12DA530AB480D437D7B5D475F07F0BF25FBAAC5580E6EF81DE845CA00194DE040D69F3F7D10790FA03D05FC3982805527F08D940096802A93F421EC8A460D307303780765F5FDF55F8F28D8730D70C730E9FDD803F3580071FDFD4AE0FC09E7F02397F0CA0ADFBA7900D348123E0FDD7B734F665CCDF3B2803A93F431FC011D000527F0E7D81EBE0F92ED044FE88687F0159C0E42FAC69D7800717D7B4AB400BB4D25FA20E68022DE0B98B6BDA736FC05FFE0ABE8DB48134F5D79001B84083F0D49AF6DA9BB027F24748DD6FA1FE3AE66505728123945328BBC01190FA1BD40325A0013481A335F44FF4BF050DB86F7D4D73FF0E754853481BC011D0024A7F8F3845FD206D02EF7C05F1E31F504765A437507691BEF14338CB7E157A21FFDE26E493EC7F447BC848FD13F4011A401368013EF8379E45BFEF6E687DCFAD690DA4D790B690968C35AD89F47DA48D7F063FF0DEF69A56FA36FA2FA30DD206D0045A26CAA84FFD0BDA01DFE568FB25E8847C1368013AFAD3BF833640136801FABFA20CB8C01190FA37E48106D00452FF0E1EC0059AC011506AA10CB480D47FA09E80BE750B748A3788793AD66F136B52475CD0E1FF0DAC8926E0C2A75DAC8114FCB701B8F0B516D0C07C95687CA433E825A27FF469EDB9EFAD6A470F3CADA5FEF3BFDBEE0F777F777F777F1FECEF7F01D532BA57]]>
          </Values>
        </Array>
        <Array Name="uAudioRight" SizeDim1="1920"/>
        <Array Name="uSpecBand" SizeDim1="1920"/>
        <Variable Name="uSpecBandColor" Type="8"/>
        <Variable Name="uAudioLeftColor" Type="8"/>
        <Variable Name="uAudioRightColor" Type="8"/>
      </Children>
    </Group>
    <Group Comment="Misc Variables">
      <Children>
        <Array Name="AudioArrayLeft" SizeDim1="2205"/>
        <Array Name="AudioArrayRight" SizeDim1="2205"/>
      </Children>
    </Group>
    <Group Comment="Materials and Textures">
      <Children>
        <Material Name="mCanvas" Blend="1" Shader="CircolShader"/>
      </Children>
    </Group>
  </Content>
</ZApplication>
