phaser4-rex-plugins
Version:
583 lines (503 loc) • 205 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@eshaz/web-worker')) :
typeof define === 'function' && define.amd ? define(['exports', '@eshaz/web-worker'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["ogg-opus-decoder"] = {}, global.Worker));
})(this, (function (exports, NodeWorker) { 'use strict';
function WASMAudioDecoderCommon(decoderInstance) {
// setup static methods
const uint8Array = Uint8Array;
const float32Array = Float32Array;
if (!WASMAudioDecoderCommon.modules) {
Object.defineProperties(WASMAudioDecoderCommon, {
modules: {
value: new WeakMap(),
},
setModule: {
value(Ref, module) {
WASMAudioDecoderCommon.modules.set(Ref, Promise.resolve(module));
},
},
getModule: {
value(Ref, wasmString) {
let module = WASMAudioDecoderCommon.modules.get(Ref);
if (!module) {
if (!wasmString) {
wasmString = Ref.wasm;
module = WASMAudioDecoderCommon.inflateDynEncodeString(
wasmString
).then((data) => WebAssembly.compile(data));
} else {
module = WebAssembly.compile(
WASMAudioDecoderCommon.decodeDynString(wasmString)
);
}
WASMAudioDecoderCommon.modules.set(Ref, module);
}
return module;
},
},
concatFloat32: {
value(buffers, length) {
let ret = new float32Array(length),
i = 0,
offset = 0;
while (i < buffers.length) {
ret.set(buffers[i], offset);
offset += buffers[i++].length;
}
return ret;
},
},
getDecodedAudio: {
value: (errors, channelData, samplesDecoded, sampleRate, bitDepth) => ({
errors,
channelData,
samplesDecoded,
sampleRate,
bitDepth,
}),
},
getDecodedAudioMultiChannel: {
value(
errors,
input,
channelsDecoded,
samplesDecoded,
sampleRate,
bitDepth
) {
let channelData = [],
i,
j;
for (i = 0; i < channelsDecoded; i++) {
const channel = [];
for (j = 0; j < input.length; ) channel.push(input[j++][i] || []);
channelData.push(
WASMAudioDecoderCommon.concatFloat32(channel, samplesDecoded)
);
}
return WASMAudioDecoderCommon.getDecodedAudio(
errors,
channelData,
samplesDecoded,
sampleRate,
bitDepth
);
},
},
/*
******************
* Compression Code
******************
*/
decodeDynString: {
value(source) {
const output = new uint8Array(source.length);
const offset = parseInt(source.substring(11, 13), 16);
const offsetReverse = 256 - offset;
let escaped = false,
byteIndex = 0,
byte,
i = 13;
while (i < source.length) {
byte = source.charCodeAt(i++);
if (byte === 61 && !escaped) {
escaped = true;
continue;
}
if (escaped) {
escaped = false;
byte -= 64;
}
output[byteIndex++] =
byte < offset && byte > 0 ? byte + offsetReverse : byte - offset;
}
return output.subarray(0, byteIndex);
},
},
inflateDynEncodeString: {
value(source) {
source = WASMAudioDecoderCommon.decodeDynString(source);
return new Promise((resolve) => {
// prettier-ignore
const puffString = String.raw`dynEncode0014u*ttt$#U¤¤U¤¤3yzzss|yusvuyÚ&4<054<,5T44^T44<(6U~J(44< ~A544U~6J0444545 444J0444J,4U4U
Ò7U454U4Z4U4U^/6545T4T44BU~64CU~O4U54U~5 U5T4B4Z!4U~5U5U5T4U~6U4ZTU5U5T44~4O4U2ZTU5T44Z!4B6T44U~64B6U~O44U~4O4U~54U~5 44~C4~54U~5 44~5454U4B6Ub!444~UO4U~5 U54U4ZTU#44U$464<4~B6^4<444~U~B4U~54U544~544~U5 µUä#UJUè#5TT4U0ZTTUX5U5T4T4Uà#~4OU4U $~C4~54U~5 T44$6U\!TTT4UaT4<6T4<64<Z!44~4N4<U~5 4UZ!4U±_TU#44UU6UÔ~B$544$6U\!4U6U¤#~B44Uä#~B$~64<6_TU#444U~B~6~54<Y!44<_!T4Y!4<64~444~AN44<U~6J4U5 44J4U[!U#44UO4U~54U~5 U54 7U6844J44J 4UJ4UJ04VK(44<J44<J$4U´~54U~5 4U¤~5!TTT4U$5"U5TTTTTTT4U$"4VK,U54<(6U~64<$6_!4< 64~6A54A544U~6#J(U54A4U[!44J(44#~A4U6UUU
[!4464~64_!4<64~54<6T4<4]TU5 T4Y!44~44~AN4U~54U~54U5 44J(44J UÄA!U5U#UôJU"UÔJU#UÔ"JU#U´"JT4U´ZTU5T4UôZTU5T4UDZTU5T4U$[T44~UO4U~5 UÔUô4U~U´$.U5T4UP[T4U~4~UO4U~5 U#<U#<4U~U2$.UÄUN 44 ~UO4U~5 44!~UO4U~5 4U~4~UO4U~5 44J44J(U5 44U¤~J@44Uä~J<44UD~J844U~J44U$54U$5U54U$54U1^4U1^!4U~54U~5U54U~6U4U^/65T4T4U$54U~4BU~4O4U54U~5 UU'464U'_/54UU~5T4T4U~4BU~UO4U54U~5 U54Uä~4U¤~4U~U'$!44~5U5T44\T44U<~$6U\!4U#aT4U~4U~4O4U~5 U5U5U5TTT4U$"4YTU5 4U4~C5U5 U5U5444$4~64~\TU5 4U~4U~5T4Y!44O4U~54U~54U5 4CYTU5 4Uä~4U¤~4U~4$6TU54U\!44Bæ4Bä~[!4U~4UD~4U~4U~4$6TU54U\!44B4B~[!44U<~4U4~$5 4U"U#$544"Y!454U^!44<J44<(J454U~84UN!#%'+/37?GOWgw·×÷Uä;U9$%& !"#`;
WASMAudioDecoderCommon.getModule(WASMAudioDecoderCommon, puffString)
.then((wasm) => WebAssembly.instantiate(wasm, {}))
.then(({ exports }) => {
// required for minifiers that mangle the __heap_base property
const instanceExports = new Map(Object.entries(exports));
const puff = instanceExports.get("puff");
const memory = instanceExports.get("memory")["buffer"];
const dataArray = new uint8Array(memory);
const heapView = new DataView(memory);
let heapPos = instanceExports.get("__heap_base");
// source length
const sourceLength = source.length;
const sourceLengthPtr = heapPos;
heapPos += 4;
heapView.setInt32(sourceLengthPtr, sourceLength, true);
// source data
const sourcePtr = heapPos;
heapPos += sourceLength;
dataArray.set(source, sourcePtr);
// destination length
const destLengthPtr = heapPos;
heapPos += 4;
heapView.setInt32(
destLengthPtr,
dataArray.byteLength - heapPos,
true
);
// destination data fills in the rest of the heap
puff(heapPos, destLengthPtr, sourcePtr, sourceLengthPtr);
resolve(
dataArray.slice(
heapPos,
heapPos + heapView.getInt32(destLengthPtr, true)
)
);
});
});
},
},
});
}
Object.defineProperty(this, "wasm", {
enumerable: true,
get: () => this._wasm,
});
this.getOutputChannels = (outputData, channelsDecoded, samplesDecoded) => {
let output = [],
i = 0;
while (i < channelsDecoded)
output.push(
outputData.slice(
i * samplesDecoded,
i++ * samplesDecoded + samplesDecoded
)
);
return output;
};
this.allocateTypedArray = (len, TypedArray, setPointer = true) => {
const ptr = this._wasm._malloc(TypedArray.BYTES_PER_ELEMENT * len);
if (setPointer) this._pointers.add(ptr);
return {
ptr: ptr,
len: len,
buf: new TypedArray(this._wasm.HEAP, ptr, len),
};
};
this.free = () => {
this._pointers.forEach((ptr) => {
this._wasm._free(ptr);
});
this._pointers.clear();
};
this.codeToString = (ptr) => {
const characters = [],
heap = new Uint8Array(this._wasm.HEAP);
for (let character = heap[ptr]; character !== 0; character = heap[++ptr])
characters.push(character);
return String.fromCharCode.apply(null, characters);
};
this.addError = (errors, message, frameLength) => {
errors.push({
message: message,
frameLength: frameLength,
frameNumber: decoderInstance._frameNumber,
inputBytes: decoderInstance._inputBytes,
outputSamples: decoderInstance._outputSamples,
});
};
this.instantiate = () => {
const _module = decoderInstance._module;
const _EmscriptenWASM = decoderInstance._EmscriptenWASM;
const _inputSize = decoderInstance._inputSize;
const _outputChannels = decoderInstance._outputChannels;
const _outputChannelSize = decoderInstance._outputChannelSize;
if (_module) WASMAudioDecoderCommon.setModule(_EmscriptenWASM, _module);
this._wasm = new _EmscriptenWASM(WASMAudioDecoderCommon).instantiate();
this._pointers = new Set();
return this._wasm.ready.then(() => {
if (_inputSize)
decoderInstance._input = this.allocateTypedArray(
_inputSize,
uint8Array
);
// output buffer
if (_outputChannelSize)
decoderInstance._output = this.allocateTypedArray(
_outputChannels * _outputChannelSize,
float32Array
);
decoderInstance._inputBytes = 0;
decoderInstance._outputSamples = 0;
decoderInstance._frameNumber = 0;
return this;
});
};
}
const getWorker = () => globalThis.Worker || NodeWorker;
class WASMAudioDecoderWorker extends getWorker() {
constructor(options, name, Decoder, EmscriptenWASM) {
if (!WASMAudioDecoderCommon.modules) new WASMAudioDecoderCommon();
let source = WASMAudioDecoderCommon.modules.get(Decoder);
if (!source) {
const webworkerSourceCode =
"'use strict';" +
// dependencies need to be manually resolved when stringifying this function
`(${((_Decoder, _WASMAudioDecoderCommon, _EmscriptenWASM) => {
// We're in a Web Worker
// setup Promise that will be resolved once the WebAssembly Module is received
let decoder,
moduleResolve,
modulePromise = new Promise((resolve) => {
moduleResolve = resolve;
});
self.onmessage = ({ data: { id, command, data } }) => {
let messagePromise = modulePromise,
messagePayload = { id },
transferList;
if (command === "init") {
Object.defineProperties(_Decoder, {
WASMAudioDecoderCommon: { value: _WASMAudioDecoderCommon },
EmscriptenWASM: { value: _EmscriptenWASM },
module: { value: data.module },
isWebWorker: { value: true },
});
decoder = new _Decoder(data.options);
moduleResolve();
} else if (command === "free") {
decoder.free();
} else if (command === "ready") {
messagePromise = messagePromise.then(() => decoder.ready);
} else if (command === "reset") {
messagePromise = messagePromise.then(() => decoder.reset());
} else {
// "decode":
// "decodeFrame":
// "decodeFrames":
Object.assign(
messagePayload,
decoder[command](
// detach buffers
Array.isArray(data)
? data.map((data) => new Uint8Array(data))
: new Uint8Array(data)
)
);
// The "transferList" parameter transfers ownership of channel data to main thread,
// which avoids copying memory.
transferList = messagePayload.channelData.map(
(channel) => channel.buffer
);
}
messagePromise.then(() =>
self.postMessage(messagePayload, transferList)
);
};
}).toString()})(${Decoder}, ${WASMAudioDecoderCommon}, ${EmscriptenWASM})`;
const type = "text/javascript";
try {
// browser
source = URL.createObjectURL(new Blob([webworkerSourceCode], { type }));
} catch {
// nodejs
source = `data:${type};base64,${Buffer.from(
webworkerSourceCode
).toString("base64")}`;
}
WASMAudioDecoderCommon.modules.set(Decoder, source);
}
super(source, { name });
this._id = Number.MIN_SAFE_INTEGER;
this._enqueuedOperations = new Map();
this.onmessage = ({ data }) => {
const { id, ...rest } = data;
this._enqueuedOperations.get(id)(rest);
this._enqueuedOperations.delete(id);
};
new EmscriptenWASM(WASMAudioDecoderCommon).getModule().then((module) => {
this._postToDecoder("init", { module, options });
});
}
async _postToDecoder(command, data) {
return new Promise((resolve) => {
this.postMessage({
command,
id: this._id,
data,
});
this._enqueuedOperations.set(this._id++, resolve);
});
}
get ready() {
return this._postToDecoder("ready");
}
async free() {
await this._postToDecoder("free").finally(() => {
this.terminate();
});
}
async reset() {
await this._postToDecoder("reset");
}
}
/* **************************************************
* This file is auto-generated during the build process.
* Any edits to this file will be overwritten.
****************************************************/
function EmscriptenWASM(WASMAudioDecoderCommon) {
function ready() {}
function abort(what) {
throw what;
}
for (var base64ReverseLookup = new Uint8Array(123), i = 25; i >= 0; --i) {
base64ReverseLookup[48 + i] = 52 + i;
base64ReverseLookup[65 + i] = i;
base64ReverseLookup[97 + i] = 26 + i;
}
base64ReverseLookup[43] = 62;
base64ReverseLookup[47] = 63;
if (!EmscriptenWASM.wasm) Object.defineProperty(EmscriptenWASM, "wasm", {get: () => String.raw`dynEncode0095 %j©Ö¥Õ= [ücò¬qrØÍTÑ®]µ+¡]ÚÿKM&ìÃÅFJ´õ1_§= ¾A-T¸½Ê"ÖþkÝä8
Äå¼?ÙqV2;CÚxC:ëañjk©(4'êÅ<i)+ñ¸+ÉFÞA+yDÉàXÕ¨Í.3(bÝdþ=M»×
ï5Âõ5UÅÜ%Í=}8}y+-ε¥}£çÙ5-'ÑN¦Ù¾âX¥83sS%6Ôþ¦²¦XàQvh_7ï!ÈÍ ÈÍHͤrMMM8M!%SWÈN "Q+У±ÏÿxB.IíøÿÿL[ØNèÛ£ÿ)ø{}Ìk Í=Mu¯ýiòñAþ×Réª=}ëïÕ+þ»SPHæ,P¢åz2Z
Q= )U¨¼ÆÒZÛN<q=}bè0æ,<Ã8ÓäÛØ3!1¼ü ehÖ883#¯2 g}A<HÛ¬ÒòÉOw~f¢äÌ GÐàjùj^Ä@iÁD R¨pÁ?4é(|-~yLJêçò3PÞ¸QýÙl!¯
tê Xïx°vó²´\F:prhÉhr8ý¹X½k>CB%²2CÚ£Ñû{lȬyÝï#=M®QaQa!ø....®CiI\£±âêì2Ïé?O;~À£Ã½´Ýân3Ù»öôáq±Í»»*Ù{@ï5/Ã[Ó&éè½RmÙ$W}±ó?áÏ<"ø¸ýÑÌIu"«\Þ=}LÍ¥ÅèU=M1÷Æ#¼âöóKÜ¿@ÐEÄ#í=}XÒòv÷5^
¯RGÑo³fûAâBâuOðËÜOso±ª®tþ#ñHR¾í¦Êó@ÐÆ=MQÙ0ï0ñ°§¬+rêTðdeôNØK<0êäR%åÍô#µfÐ9©Û8]¬¨/Ë ´1oË2mu>%Ý>HX$¾
𩼠atè¡eËR«/ÃSÌ(=}ZË1qåè6»3@¥
t Ų£wsűÛXö+°~ÅâXÅ¢ÑÀ385¿Põþ9õixÅ¥êm¯¿zÄx÷_VðC¦ÝPêp=M@#)Lï£DëÂ= óíy°¦?Y·mÎÜø(}µø%ÌËðÖÔkN"èb{Iã$ÞÍtN9NóýkÙPý/´¤ûÂòÿl»XÖ ÷g/óTànn3-©i9×ÁI.´öu¢ G¼X¹ö7¦t×]é¯à= yâ6§Dû×ZDæÌLës©ØäƧØ+pªE9¡t©ò=}}}Û8Ä&ÅÛlÂaÍ¿SÈ cx#-º\P>~ËU¡®©Ä oÙ¥_\0¥ðùßüpTÔ}äX»qNYÀÐ=M0ý@Þ.âátv&÷¿Lg¯I-ÒüFðÄø¶¤¢/:2{Hdh:f$´mD.©qk׿rkí?Ò(ÍóçoGV«¾Sa[±=}+' {¤¸»)&õf³)&Ue¡]àGÀ%W=MIèÚ=}ÎmÇ= ýÝ-ye)Gö^*;½]- óÿ§³Ú¾U1)V@Dcj§íV¹)= 5ÓÙPVÐÅc=ME1fÃêf¢á´Õñù¨La[ÈOÿ+o{Ðè0ßeX¥Á×Þe-G<¨[.>ÆtXç·qçkû<o
´!aiä§ëëÓÚ$üÇ
|ðè'=}ç@Nª9Ô¶Óí·^ÃT¾nzL¼@ä¶«´çx(ÛÓsÝ2oÅÒoÝôI@Òði= ¨pläݺ&&8×c'²»0Þ= .ýLû3q¥Øü 9Ý*¨f×(ôfX©¡ùÒ¼Ç*»z"Q6À3Ö¤s£órÆÑªdÒ4?W¢,p= ª*
ö7{ÉR{ûþ)¶{lKÂ}à;gYáêkK§Ë<\¥[ÉÜ÷0QÕô×Fõ6\ä¾Ê¬vûìw ^e+ÞeyÊmÅdJÃBl}Æt E+F (ãUw»=MÅ!é8~SÊzS= ¾µ¦v<úÕO("}©=}0t¤<ZBÛzÖvå!á&¸ 7~¶»@ÙªÈéôúÄä\¡mèMÙøym!Éé³ïÝ'Ë¡,*)õLäàRóV£Êßøýåjá_«Kj3kkçHÙV´Ë 0F<ßç$Ò$?µÌyÕ9-ïÄÁ¥þ.Çÿu¤;eGtÛ ©h$ñyN£¾}wEî ÎoÏ+-=MÅ=M9BÌ^ÄÉ^4r éjr °ù62-0bpb¿pF¾n)»¼¬a¡sLÍÊFd!!Îݺ'ã;»¼qþ(=}JþHS¼~#Ö+ó³üÌÖùê¹XÞ|¾<K9÷ÉIuÇöGÞrÔ)YfPcskY;-YtË5= V,P¥1ß©Òî*»¾±F¶÷ÚîÿVè'©v[ª\Ç-uy²± ìMËÙ£@¤ælP'ñÈ«ºô诿ú7¸(t¶×»Qgf Ö=}çç¹iøõ6tgðJ®jWE®pD´I2ÎÆØÛ±Tÿÿ~øè ´W;hùʲ5^/¯osÓE»gÜ &ØzôzGe¶Í¸îsáɰo¼"ãÛØ§¯MÞ´/¯N{½0Å»})r¿öX[i¡j,ÿrÒ¦Àö²Î1á"º0AGf!48ÅÏeÚçWêbÞGÁ5ýìmü0°-ôñ¸^|ÓÂtw°ûj¦O7
ÓvYt¬¾àcÔ©OàÂÍ3ÅÛZÁN}î¾ùjùztsÉÖNnPkìN¥ú£hÕ^Òxܨ*Tß@4!¶J´ém¥.m%ÍÓlC_¢ßÙ#_b°{$QèíÆq©>ä&¿§ªòéµ%$¦DÕÿP·ÀÌ9»ìkþ¹É= 'Wå"ãS°-XÚõýqV¦E×UzXMxâÝí£tIk_m¢×T£L8q¨TÆ= )ÿ·'Eê×½X{sÁi»3P6Ku«Fù[·À_r?ß*8ó·å¨õY^Ùø¨^fÅeáôÊÂ>ÌÕÞD¼õíÁ6C×åÈÕW&T³bUrâu.¡!gTÏÞC¨Ô\Í~a×»n«ÙñßÖ¤½ôuqgñ ù7}r"IutòÝ F"A-Õå+º×9ʬjÜøõW"ÎQ5\T×ríÜ=}B4+_jX>Ù¡Ê}Uù[øÞÓ£
ÍæàIå_{!¢qÚõ@ü2®>(Úg{ôÜ/^T5TXµ10 ¢ù³õçRÝSâg±ÉéõßPí=M¶"°A'?ì»;!=Mær!³·%søsÃÏ«+±SéìÀ°©ßv±%¥Ie¿å×
ÅZÌèþ©=}Hg;þ*6A+s'0Dùü\ûwÎ.0LP"'àý¯ÐØÙýÝDH¨pt./¯öO> *áÂ4Çr0ºLxþï-SëÍù·
w>LâR´elâ¼7ââ^7¹ew'ê¦ÎÒ¼¢åÆX Ð5ÕRQÅÖ.OUïa!aÉ
¡1ÏX«¢ìc ÒÅÂ@ Á×HOJ#Hc¯R= Í˦ÇFN×ÙÑ0o Ùq[MjAoÿQÔô»R²Ky¥áñeNRJ^!ÍÉäæÌe6Òs|sP3@Eú;þë4õ"
éfÄóà~À,ÀA=}JƯöL;Ä
ìçÆT#|jQCvò$µ;çûvSÜëfÅëó?=}lôä"¤éÒÁèî¸5x¶©ÑCúÙµE"Ýãï$]D7ÅըŻ5hP³c?¤ì9Õ¦ìÙf?sR¬~ÒËÒºEgÑù¹¶X½ÎÓ±ÑϪn³y!= 8Â(ñ<[µ{$.q^o[Å:|À|0»¬oÅÃs]þí£EÞrXËté) ¶K9-ñT[rCÕ}vN{Ð5¬m)&ëÄö0±RfyuAÛ ãR= Rä¡rwìòá0ËT¯Ie
=}Ï\H¦üØaòUÝÖ
W9Efüb!¿·(ئ» óx®uL«G ²Ä k;Ã6¨1<½Ý[[ê[¢"qR_öÀRØZS/|2bgM#Ò ÀÑ}÷¦¥ ß
MëÓx¸cÎD0ò¡±)~<âã¶æV4&&ø¨×R~Úëô=}{<¥~9}VÄj¨Wã- Ó©Ðì®<È/UmE,?ÈP3#IJ޽ùÜÚ#íÜ<¸¥&ØçAgs"Q »#9Ä-Ón!=M! \ FpÈâdÓIZ¡ÚöD}n¸,ÈâIü³ÕÀQÀÃËÜtrû ×Ñâ´ÊÃV$Îà!KF#»¬ë¯b4KNYb³bU
ñ *56PÃEaËF-m:XÁüLÊ>ìrrÓÂ-ÜeG· rL¶¹É¥P°kW8Nª0Ý·¸ÃáavÇÀyS{|H= Ödq¼¸!ø¨³U'18²^p¨¡<#H[³E)e±+Ô¶òÍ= 5ëº!¾éAÏ*ôaEî§8RAϬAyβÕïs®¿é7û{²Õµ#È=}·¥B<öMÑQ¦åÃÇ9= zÒQzón"¹Cc§e±|צ-VáéT®[NWk@\ÛÆ%&³Ína»2b/EX,an8±ñ®«Of Ãò,=M¿Îud×Ía
y£¢^ªUÿÿL¬é½QC¤ø4üc¨s"â¯K¼ÑW4:Þ÷Ä\bÔôcBC+1Æ·O9´H{kHÂòÄõUïØpiBÎ]¶ð
÷³Á$yö/EoNô÷ãë u<4%áåcÒø§Î[,l¨Î×áÖ~Ç7+Ö^ûk§PÜ'Ãi©QDÌ8´T½¾bPñðÔ©¢&² ·ÓSyU\!=}+= = &úGoæ\S:b¬Qû-\G¯_í<Ì&^㦠®ÆÁÃe¯ö³b;ËxÀªW.^EE;Cr³MyGù|70É8ñ8{ ²ÎºíËÒ0ÊZ -±myAVsc{M)6¿8ë+îÊ^ñôÛÇѪ/ÑXYa±sNÁØ¿Ëc¼!¹Á\Cx_h8Ïq¢ãÚÊnäÔãý»o´CõªÕ{´PoÅå¶ïá7ØpbÄgcBÄ NéçÃRrp1 Ü9°E®uåk¡ûŪ2¶2yýªj>wPOtËÌX¡zÙÁº¶{«+'PÌÈ)«»¥æ¦¯¦ÐØ
@£5\¦^= Öùònf¼Ü]$Ì%´dѳr%ya«Zôô*Úå¥~5Üv65P6NÊÔD^ÑBÌ^0 »× þ*ª«Åd1~E+PûÁNo&¶#:P+Íp¡Dß}[¹AÞPÈõuça¹(:î ¼¶3Æo_=MàïE04u]O¡³Û=M]i¥²û×Ñ´z]^Èb´1VÑ9ÄpùgqÏh_®Þ»Gqy,¦ZSyßèuA/¡ÛÉWGäSDÜ6=}Fõ4SvÖèøºøiþ(b¨ÍàMí¥ö©·÷?I9ZF×T£*j×ä´Ö÷Ô"^£án= ó·|Ýñ±9ÖP¡ [ç/kÉÃÝnÅhHþùøC ·û5üÃ=}´S}Ã|®áÝèÌ?^hôipnn«Ts0xøÓ½GÖX°ÁÜ èë²ãg<bBÄû]/ΤjV¦ØÓÉ÷|ñÅ6¤ù0ô=}Ý/´J»c1h8ëW¯ß¡Qi'®ocdýC.¶öi¡BùÆ´ù3±gÛp¸ex&shg|ÌZ9ø[^ú\c¹jT¡î¡þkQuX¡*öÿÓ ±
, Çmî%·>]HBͰ¿Jxö5{T1â>(éÇèSº±nzké©«= 'ÅxÛa¶XtAN3Iô*HuøÅ
l1×±Ýî©EvÆýJ=}Ï,ÕîömÙ|ð£í"»*ÚFé¿oeõö$Q&ÛS¬@j±~$Îàgi#ä³jªuÆB®Áj<WT=MÃO3ýÐf,»Ë^?·>£ÞɲW¾h´Ã=}Ó= ¢ïüÔ+~ÅM\é_ zan= 0±Th¡´Û>æÔâi_õF£°/D¡ªE58z¡ý´gñeMut°JÜC £Q6)e¨=}¡q³^
óYcïi¯ÆÇM¹ìDÎ= ?hLZ5 Ý£Êhî{WÐ/=}Å®å3ùâ(XÇDö½,¦îkÈ)GÜø©_Ltc=MÁKUm\ÓH#;ù9äèGÄgø@ÆaB2õvÇ [4RÕ¦¸â¶fúØüd:d\ÌzK»,w¯¾2wZÒkº~
Ó¹ÈËz0xºAêXrZ*µÌ#äö¶ÉÛ$ËÜÕõ| áív£$ËzÞzGé-½06°|&gåüÿrïᱬ}pV«/L>·¡SêÑËmÆõRt3mJ ±ð¾Ó^6ùhî2DÆâÊÎFpù^°bAöAý m&óa|ÇkEÈþ9J°é|»ç1À\ðOTÒ-o¨eÛ0tþà p-3= 'ÇaBÞ¿!â^»GhODWñÁï8§<Øif¡{ü>
/
ªçRèúÖvÔÁNä[ïÜa/D]¦hþbíãMzÓA¸@;%çåÃz:éóß¶PÈ'L;õðß= çY8H®t*ÌXò^ùaPîá&.»pQZʾ?+PÐit¬»ùY6yÊÎméìÏ\:÷éñXØIúë¸oþ«GH®äjVò¶@,i#6£HÃÎåùy
H Yù2/.ob÷×m¾+çÒ|ÒB±¼
îØnËr (ôbgà¾
ù¨Oãzérò§¨NrêÝ@öóklùÍÑ'¿Ù÷[u((ê4|¼æÅ@°ÅBz«%dÍËâ6
Òª´´w9ñ@¾RíUa¾/°üÊFé)âÉÊ$_Ïj½®EµKØIº5dú(¿fL c%ËUÔ×d ±Ãñ\ é§CáM}phÕ$×ë½vßxÑ"GÐâyqþ^ÒTÅ91®Î²Xørdn0UÖÓàvb 0§/YnÎL}µç×=}ËÛzá?³ð7|Ë)pØói-íL9cv ÓõÛ¦@L\w&søñ c7Ï 0k\ª¿>±~ñëò£©«}Þ{}ÜíÚäy[¿Þ±¨âBàd4Ì¥På&l¤øÕ賓ؽ:Ê\0^upqpxX}mWRbfêË4|[IåÞ^ænË4ÑPü*ÞÀ* (çá?¾ä»fÓÌ.
é1Äw§.ÝóÔA\Vá¾¶ýe»ãZx¾¡4òßcôj$ Àrè¶= fûÛ6ÝÚ[ª\ô#ÌPÑ^¥c(%^ÀêE´d0dÎXd¼0ð^=MCÞ¼eõ[˺\ÆY½4öÄEÐàm²eþÛH(F¨Ç;lb¥ÞPªÄà6Î$¦~Â};
8øÕ-ÅÃv÷á=Mõïr/ÅÊbQª>/ä½LÐÆî¤ìÇËÍdè¦WÕzL .ð¾X¡{ä\ó(=}Ï
Y0åé=}dSÉ
âk,*¾|ðÍ-6åé«r|=}"î]ÐÒÿãeæ8E¡ö½XµLüâ6qY;±l'\=}0ï\iϼ >pÓÓ[Íø~Lñw®K7»&6oÂÙ¢rÎÐó *@½TrÞpìì<Ãα·ôË®í_&´6K>
/9ÙSʹ»çÖ<-Ö$k´ûbÄd¤Örß»×â*¿ÁÈ:¿Y±|®LdÈE>NªiFÆdåÉä×ükÚ¨.,6ñoU8m/(uTÐÐB@ý«dÁ§0 ùÔ÷Ã|q´Å¹CWÞ×üäó\b~C@Ü_P¿RVw5ëûç}ªÚw?&;/«þ¯74NbYKWjõ|U±¡uú=}ëQ».otä ¹îÞÝþ áªeÿS@æ:m }½lÞuÆ6IäNÃñËæîë2ÁÎwt
<
-Eh0Êúoc~hôP=MtÜ{õþN¼À¶¬)êF1T$n>(GêßVã_ê\?(:('I@+CÉüµ=}êûêÝiíôG®ÊãWÔ;AhèG·«^?xܳKÚî= Í8+lisjúÖÖ8V'ûD«Òµÿ
³ä7cÙHPY$ÊT²ê$ѪÞN}ô#{ÄÏÏCÖÓ|é¬Ríi÷Pã[9çÞR¡gÿO3vØ3S¿Q /ÍL7åÁ¹- o¾ÞyI!= ê³£Ke=M÷×
yCrËQ³lc=M
?Sò:ËBlûRáþ~ËcSó0Gsy:oH3c.òþ<çTjç:D]ÞïpL¶ÕÈ**ºÎ~£#<W$wÑýÐ @;½éQUä×ïC-ãaâu<-*©ñ\2uÁʽüãóE*= z,ýÂ_LÂÉ-³,JGsËÎõí¨(FÜ»ü¤á_{.¢Ë\Az4ª@45èx@ <J.AÏæe¸¬5²äPn"î<fh2~I0Ûlä,;¯òÔòt.cOþ ÎD¯u øF-8Ûõ¾õ°¤-yÈ',Û-gdÀóôf¬ûâQ3»bU.hÀsaÀÁà$Ô/Êøn±È<m±Æ$FîÊäE®0¼n!aþËJbeÑb;ÉdE®-üny{±0iÑd»Ë÷¨.ànðw4¶ÔÀÛÔzÚHöˤ0ºËüâ[{þ(Rß=}3= ÈHBÔjwV~d}»óì,|,5[×òç=}!XJf
Xí[ON|PÎ rq§dbefvr'â{3{e
Î4.
F.ý9O0Ølb:±ÿ[£f2ÄÎ÷rq~£òc.i^ñLSgÈâó·bílÑnBÖ#DkN¼OÎ |:cÒkb6Ð4=
éÌÃkÎücÝ1ð2
ÐKÄðn|Ð,ÄËð¨eÔ+ Âf9BReMD[Ä1L¦«GÓôumÊ#ªË6è)G×tV }#ßÃUó¶Ø £¡®Ç±rS6ð¨0#2%ØzàÑZX˼»P\Z¡ª"=}@)#^Þc3iÿ\Ù?k²÷GYpGÜîÆî®©Ö¶Ä³tæ^G±àI¦û=MÀ\¬¬%qXª´|Z/âÖ fq{SÞë'ÅÄܪa´+â¶÷+é[øPÙ«=MĬ= 2ô)S#4 SñáÌ«
AòdNãàíå9?TRJÑ£Ø$*9ãàoÅ;yôK ,Ïãùm¬957ê±å×ÂiV >Z"ôKEFÿWѾ®Ðnrí|®fOê©¥0+p'afÆÑFiØb±íq'jNU$?uZ¹r>+ûdq3²ùíðFäI^뿪®ä)»!:×Õà«zT¯Rzfnëáa.09M|½ >%ìÐ= µs2å?"5>rVÔ
Çô #î0 }q,ü1
,\jª³¡0HkGƾ7ï lÈiÒð'f̬qzͼAéè{Zù?Lμ0Ðcû¹jCkÕt(sü/¹V?9x¢ íw|»úÈ&Õ¸Q̪sËs£QqÌÉúïù¡!3ôÜ¥Ýi=MOHi¦
GxÄiIG(D9±ñ'ÓBSPµ>
p
<õº31E
Käg¨u'h/9äý'óh¹R7ÞM»þ8Þ9»~
âg0/9´j¹RVû5>Ólé4ÿ?$ÊjÜ/9
tüÝî¦âgW¹òGmùc/1bh;??É]HÉ}ZØ¢U.7\ÉÉSÀ¢z/mîaÕªèI0Ðjb6¼@pÐ.pàËÊ@D}ONçÐ/Oº÷rq8r±Oçû,wejºòó{ej©Übþ9|üÉÒìác|Å^ÿÐz1W4uÇrñ>\PÎ
CàdÀr±OÏl:|J£rñ5¼OÎ tÁÒ</3h¡%hÃ12¸C?J<ÊÜ4k±bÕä#ÓbÆbf;'çfÎ#OYjEPGëÐ/u÷= ªáÿß=M3¼N,TÃîøkBTU~Z,ðÃ0,c7ÛÑËÒÓ) )Ó,ëÔúÔuy?CÑQóAì?OôLOðrò|Òù¡GùU-饯üc(ØêÈÐ'úË÷x^üf3±n±»|"c{òp= y1m1Ò{dPòê"n}OsR|3Ó|ñÙݵõîÈJ óûçA¢|M@ÑK{éPDÏäosRʵz|º?Y¥ïíYÿÆkê*»ù_(ö
ùÓd"tDüËá;.3ÆÚ¾è½2~ÿÓ=M /ñ¢1"j/ÀÆë +pGÏ[ÊxÔ´DóDK3oS\Ö>/lɶQü= ì«Ó2×èÍÊÔ®ÍB¢QçqèÈ8Zb¼âÄW3*¨QñÇ ªu1îÞÉmÄs+w÷®fxÝÂÉÄ.*~¨ÔWTC3È·Uä³}ï´?÷¿0¯¼SàORëuôV1
RÃqÅ«óÖ Ôµ´
áÀß.}Mv@uì#]'Ì.ÇçùqÒï5À(9Çë8á#gn6Ⱥ¤è!w;1 NÅj Ëù±oP"H÷ÃëÐØdEë¿wM¨9µluW.7¦ÿhÓûXäü5 w=}>Ü*Qf¾ð9ÛÝ*ös÷ÄÃÃãuÂÄ#4rëâ-p%©~÷<EäAÄÅ)¦H:CAtÈ]Ò#¡Á1¤Mÿú{M;Äò%®å:x¬ü²à½'å1ügjéã¡âB>:ê¸)1Øå<BKãö£ã'Wj½óÊPì #lÛÆ16[<Z\g±ô¬\fÿ,ÞHÅ]£·-¶¢ãRj6Og·ÓH³EWc½Tv'+$ùÜ-= ÎcT¾ÛÜ}®¼Õ ú¬_ÅÞôyÃy]ÚÈ
©MmkB¤¿ÿ°é¾ËÇ&Ç1ËÂÁØÙÆg?teÔÒçá}ôw{_
áNIaY#ì×'}B}Ïi©BѧGcZ"