From 81933ba55bac65df35cdaba5345408077856cf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 12 Mar 2024 01:04:41 +0100 Subject: [PATCH 01/14] pts forward, test --- .../converter.ex | 4 ++-- .../converter_test.exs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index a4644ab..651ccd8 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -122,7 +122,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do end @impl true - def handle_buffer(:input, %Buffer{payload: payload}, _ctx, state) do + def handle_buffer(:input, %Buffer{payload: payload, pts: pts}, _ctx, state) do conversion_result = convert!(state.native, RawAudio.frame_size(state.input_stream_format), payload, state.queue) @@ -131,7 +131,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[], %{state | queue: queue}} {converted, queue} -> - {[buffer: {:output, %Buffer{payload: converted}}], %{state | queue: queue}} + {[buffer: {:output, %Buffer{payload: converted, pts: pts}}], %{state | queue: queue}} end end diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 2f70fa0..686058e 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -178,5 +178,23 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do assert actions == [buffer: {:output, %Membrane.Buffer{payload: result}}] assert new_state == %{state | queue: <<0::2*8>>} end + + test "timestamps forward test", %{state: initial_state} do + state = %{ + initial_state + | queue: <<250, 250, 0>>, + native: :mock_handle, + input_stream_format: @s16le_format + } + + payload = <<0::7*8>> + pts = 1000 + buffer = %Membrane.Buffer{payload: payload, pts: pts} + result = <<250, 0, 0, 0>> + mock(@native, [convert: 2], {:ok, result}) + + assert {[buffer: {:output, %Membrane.Buffer{pts: ^pts}}], _state} = + @module.handle_buffer(:input, buffer, nil, state) + end end end From 0ac7da560593781ed85c96f8bf76964031594122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 12 Mar 2024 02:11:12 +0100 Subject: [PATCH 02/14] end of stream pts --- lib/membrane_ffmpeg_swresample_plugin/converter.ex | 7 ++++++- test/membrane_ffmpeg_swresample_plugin/converter_test.exs | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index 651ccd8..76d3745 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -123,6 +123,11 @@ defmodule Membrane.FFmpeg.SWResample.Converter do @impl true def handle_buffer(:input, %Buffer{payload: payload, pts: pts}, _ctx, state) do + state = + state |> Map.merge(%{ + current_pts: pts, + }) + conversion_result = convert!(state.native, RawAudio.frame_size(state.input_stream_format), payload, state.queue) @@ -154,7 +159,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[end_of_stream: :output], %{state | queue: <<>>}} converted -> - {[buffer: {:output, %Buffer{payload: converted}}, end_of_stream: :output], + {[buffer: {:output, %Buffer{payload: converted, pts: state.current_pts}}, end_of_stream: :output], %{state | queue: <<>>}} end end diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 686058e..5038d9c 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -27,7 +27,8 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do output_stream_format: @u8_format, frames_per_buffer: 2048, native: nil, - queue: <<>> + queue: <<>>, + current_pts: nil } } end From 58039a7c36e57c9fc14dbdf6e4f79f14fa685818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 12 Mar 2024 02:11:34 +0100 Subject: [PATCH 03/14] format --- lib/membrane_ffmpeg_swresample_plugin/converter.ex | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index 76d3745..db1b0e1 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -124,8 +124,9 @@ defmodule Membrane.FFmpeg.SWResample.Converter do @impl true def handle_buffer(:input, %Buffer{payload: payload, pts: pts}, _ctx, state) do state = - state |> Map.merge(%{ - current_pts: pts, + state + |> Map.merge(%{ + current_pts: pts }) conversion_result = @@ -159,8 +160,10 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[end_of_stream: :output], %{state | queue: <<>>}} converted -> - {[buffer: {:output, %Buffer{payload: converted, pts: state.current_pts}}, end_of_stream: :output], - %{state | queue: <<>>}} + {[ + buffer: {:output, %Buffer{payload: converted, pts: state.current_pts}}, + end_of_stream: :output + ], %{state | queue: <<>>}} end end From c39aa6354d20e30051fa7785dd9ffa8970034647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 12 Mar 2024 15:43:19 +0100 Subject: [PATCH 04/14] refactor --- lib/membrane_ffmpeg_swresample_plugin/converter.ex | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index db1b0e1..5d223cf 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -125,9 +125,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do def handle_buffer(:input, %Buffer{payload: payload, pts: pts}, _ctx, state) do state = state - |> Map.merge(%{ - current_pts: pts - }) + |> Map.put(:current_pts, pts) conversion_result = convert!(state.native, RawAudio.frame_size(state.input_stream_format), payload, state.queue) From bffb6fbbfad5fac931209aeb562442049d494cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 19 Mar 2024 23:19:12 +0100 Subject: [PATCH 05/14] almost there --- .../converter.ex | 24 ++++--- test/fixtures/input_s16le_stereo_16khz.raw | 1 + .../converter_test.exs | 31 +++++---- .../pts_forward_test.exs | 63 +++++++++++++++++++ 4 files changed, 95 insertions(+), 24 deletions(-) create mode 100644 test/fixtures/input_s16le_stereo_16khz.raw create mode 100644 test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index 5d223cf..a1d3d2a 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -64,7 +64,8 @@ defmodule Membrane.FFmpeg.SWResample.Converter do |> Map.merge(%{ native: nil, queue: <<>>, - input_stream_format_provided?: options.input_stream_format != nil + input_stream_format_provided?: options.input_stream_format != nil, + pts_queue: [] }) {[], state} @@ -122,11 +123,11 @@ defmodule Membrane.FFmpeg.SWResample.Converter do end @impl true - def handle_buffer(:input, %Buffer{payload: payload, pts: pts}, _ctx, state) do - state = - state - |> Map.put(:current_pts, pts) - + def handle_buffer(:input, %Buffer{payload: payload, pts: input_pts}, _ctx, state) do + state = Map.update!(state, :pts_queue, fn pts_queue -> + pts_queue ++ [{input_pts, RawAudio.frame_size(state.output_stream_format)}] + end) + # IO.inspect(state.pts_queue, label: "pts_queue") conversion_result = convert!(state.native, RawAudio.frame_size(state.input_stream_format), payload, state.queue) @@ -135,7 +136,14 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[], %{state | queue: queue}} {converted, queue} -> - {[buffer: {:output, %Buffer{payload: converted, pts: pts}}], %{state | queue: queue}} + {[{popped_pts, popped_size}], _rest} = Enum.split(state.pts_queue, 1) + state = Map.update!(state, :pts_queue, fn pts_queue -> + {_popped, rest} = Enum.split(pts_queue, 1) + rest + end) + # IO.inspect("converted: #{RawAudio.frame_size(state.output_stream_format )} #{byte_size(converted)}") + IO.inspect(popped_pts, label: "popped_pts") + {[buffer: {:output, %Buffer{payload: converted, pts: popped_pts}}], %{state | queue: queue}} end end @@ -159,7 +167,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do converted -> {[ - buffer: {:output, %Buffer{payload: converted, pts: state.current_pts}}, + buffer: {:output, %Buffer{payload: converted}}, end_of_stream: :output ], %{state | queue: <<>>}} end diff --git a/test/fixtures/input_s16le_stereo_16khz.raw b/test/fixtures/input_s16le_stereo_16khz.raw new file mode 100644 index 0000000..3a92414 --- /dev/null +++ b/test/fixtures/input_s16le_stereo_16khz.raw @@ -0,0 +1 @@ +¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥¥¥„¥„¥ \ No newline at end of file diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 5038d9c..17f8191 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -180,22 +180,21 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do assert new_state == %{state | queue: <<0::2*8>>} end - test "timestamps forward test", %{state: initial_state} do - state = %{ - initial_state - | queue: <<250, 250, 0>>, - native: :mock_handle, - input_stream_format: @s16le_format - } + # test "timestamps forward test", %{state: initial_state} do + # state = %{ + # initial_state + # | queue: <<250, 250, 0>>, + # native: :mock_handle, + # input_stream_format: @s16le_format + # } + # payload = <<0::7*8>> + # pts = 1000 + # buffer = %Membrane.Buffer{payload: payload, pts: pts} + # result = <<250, 0, 0, 0>> + # mock(@native, [convert: 2], {:ok, result}) + # assert {[buffer: {:output, %Membrane.Buffer{pts: ^pts}}], _state} = + # @module.handle_buffer(:input, buffer, nil, state) + # end - payload = <<0::7*8>> - pts = 1000 - buffer = %Membrane.Buffer{payload: payload, pts: pts} - result = <<250, 0, 0, 0>> - mock(@native, [convert: 2], {:ok, result}) - - assert {[buffer: {:output, %Membrane.Buffer{pts: ^pts}}], _state} = - @module.handle_buffer(:input, buffer, nil, state) - end end end diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs new file mode 100644 index 0000000..fc7f63a --- /dev/null +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -0,0 +1,63 @@ +defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do + use ExUnit.Case + + import Membrane.ChildrenSpec + import Membrane.Testing.Assertions + + alias Membrane.FFmpeg.SWResample.Converter + alias Membrane.{RawAudio, Testing} + + test "pts forward test" do + input_stream_format = %RawAudio{sample_format: :s16le, sample_rate: 16_000, channels: 2} + output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 16_000, channels: 2} + + # frames = 16_000 + # total_time = RawAudio.frames_to_time(frames, input_stream_format) + # IO.inspect(total_time, label: "total_time") + + fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_s16le_stereo_16khz.raw")) # 32 frames * 2048 bytes + + spec = [ + child(:source, %Membrane.Testing.Source{output: buffers_from_file(fixture_path)}) + |> child(:resampler, %Converter{ + input_stream_format: input_stream_format, + output_stream_format: output_stream_format + }) + |> child(:sink, Membrane.Testing.Sink) + ] + + pipeline = Testing.Pipeline.start_link_supervised!(spec: spec) + assert_start_of_stream(pipeline, :sink) + + Enum.each(0..31, fn index -> + assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) + assert out_pts == index * 31250000 + end) + + assert_end_of_stream(pipeline, :sink) + Testing.Pipeline.terminate(pipeline) + end + + defp buffers_from_file(path) do + binary = File.read!(path) + split_binary(binary) + |> Enum.with_index() + |> Enum.map(fn {payload, index} -> + %Membrane.Buffer{ + payload: payload, + pts: index * 31250000 + } + end) + end + + @spec split_binary(binary(), list(binary())) :: list(binary()) + def split_binary(binary, acc \\ []) + + def split_binary(<>, acc) do + split_binary(rest, acc ++ [binary]) + end + + def split_binary(rest, acc) when byte_size(rest) <= 2048 do + Enum.concat(acc, [rest]) + end +end From e0285c7b219b331187d5477541418e1483a2fc3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Wed, 20 Mar 2024 14:57:15 +0100 Subject: [PATCH 06/14] one test fixed --- lib/membrane_ffmpeg_swresample_plugin/converter.ex | 2 +- test/membrane_ffmpeg_swresample_plugin/converter_test.exs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index a1d3d2a..2c710d4 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -136,7 +136,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[], %{state | queue: queue}} {converted, queue} -> - {[{popped_pts, popped_size}], _rest} = Enum.split(state.pts_queue, 1) + {[{popped_pts, _popped_size}], _rest} = Enum.split(state.pts_queue, 1) state = Map.update!(state, :pts_queue, fn pts_queue -> {_popped, rest} = Enum.split(pts_queue, 1) rest diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 17f8191..6e996d3 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -28,7 +28,8 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do frames_per_buffer: 2048, native: nil, queue: <<>>, - current_pts: nil + current_pts: nil, + pts_queue: [] } } end From 3ccd0bf72523b8eff9438780497588497ed6b025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Wed, 20 Mar 2024 20:24:05 +0100 Subject: [PATCH 07/14] might be good --- .../converter.ex | 46 ++++++++++++++----- .../converter_test.exs | 1 - .../pts_forward_test.exs | 16 +++---- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index 2c710d4..92e8d62 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -65,7 +65,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do native: nil, queue: <<>>, input_stream_format_provided?: options.input_stream_format != nil, - pts_queue: [] + pts_queue: [], }) {[], state} @@ -124,10 +124,14 @@ defmodule Membrane.FFmpeg.SWResample.Converter do @impl true def handle_buffer(:input, %Buffer{payload: payload, pts: input_pts}, _ctx, state) do + ratio = RawAudio.frame_size(state.output_stream_format)/RawAudio.frame_size(state.input_stream_format) + + expected_output_frames_count = byte_size(payload)/RawAudio.frame_size(state.input_stream_format) * ratio + state = Map.update!(state, :pts_queue, fn pts_queue -> - pts_queue ++ [{input_pts, RawAudio.frame_size(state.output_stream_format)}] + pts_queue ++ [{input_pts, expected_output_frames_count}] end) - # IO.inspect(state.pts_queue, label: "pts_queue") + conversion_result = convert!(state.native, RawAudio.frame_size(state.input_stream_format), payload, state.queue) @@ -136,14 +140,30 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[], %{state | queue: queue}} {converted, queue} -> - {[{popped_pts, _popped_size}], _rest} = Enum.split(state.pts_queue, 1) - state = Map.update!(state, :pts_queue, fn pts_queue -> - {_popped, rest} = Enum.split(pts_queue, 1) - rest + converted_frames_count = byte_size(converted)/RawAudio.frame_size(state.output_stream_format) + + {[{_out_pts, expected_frames}], _rest} = Enum.split(state.pts_queue, 1) + + {state, out_pts} = update_pts_queue(state, converted_frames_count) + + IO.puts("expected_output_frames_count: #{expected_frames} converted_frames_count: #{converted_frames_count} out_pts: #{out_pts}") + + {[buffer: {:output, %Buffer{payload: converted, pts: out_pts}}], %{state | queue: queue}} + end + end + + defp update_pts_queue(state, converted_frames_count) do + {[{out_pts, expected_frames}], rest} = Enum.split(state.pts_queue, 1) + cond do + converted_frames_count < expected_frames -> + state = Map.update!(state, :pts_queue, fn _pts_queue -> + [{out_pts, expected_frames - converted_frames_count}] ++ rest end) - # IO.inspect("converted: #{RawAudio.frame_size(state.output_stream_format )} #{byte_size(converted)}") - IO.inspect(popped_pts, label: "popped_pts") - {[buffer: {:output, %Buffer{payload: converted, pts: popped_pts}}], %{state | queue: queue}} + {state, out_pts} + + converted_frames_count >= expected_frames -> + {%{state | pts_queue: rest}, out_pts} + end end @@ -153,6 +173,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do end def handle_end_of_stream(:input, _ctx, state) do + dropped_bytes = byte_size(state.queue) if dropped_bytes > 0 do @@ -166,8 +187,11 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[end_of_stream: :output], %{state | queue: <<>>}} converted -> + converted_frames_count = byte_size(converted)/RawAudio.frame_size(state.output_stream_format) + {state, out_pts} = update_pts_queue(state, converted_frames_count) + IO.puts("end_of_stream out_pts: #{out_pts}") {[ - buffer: {:output, %Buffer{payload: converted}}, + buffer: {:output, %Buffer{payload: converted, pts: out_pts}}, end_of_stream: :output ], %{state | queue: <<>>}} end diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 6e996d3..859e780 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -28,7 +28,6 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do frames_per_buffer: 2048, native: nil, queue: <<>>, - current_pts: nil, pts_queue: [] } } diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index fc7f63a..c66cc7f 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -9,13 +9,11 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do test "pts forward test" do input_stream_format = %RawAudio{sample_format: :s16le, sample_rate: 16_000, channels: 2} - output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 16_000, channels: 2} - - # frames = 16_000 - # total_time = RawAudio.frames_to_time(frames, input_stream_format) - # IO.inspect(total_time, label: "total_time") + # input_stream_format = %RawAudio{sample_format: :u8, sample_rate: 8_000, channels: 1} + output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 32_000, channels: 2} fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_s16le_stereo_16khz.raw")) # 32 frames * 2048 bytes + # fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_u8_mono_8khz.raw")) spec = [ child(:source, %Membrane.Testing.Source{output: buffers_from_file(fixture_path)}) @@ -29,10 +27,10 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do pipeline = Testing.Pipeline.start_link_supervised!(spec: spec) assert_start_of_stream(pipeline, :sink) - Enum.each(0..31, fn index -> - assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) - assert out_pts == index * 31250000 - end) + # Enum.each(0..31, fn index -> + # assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) + # assert out_pts == index * 31250000 + # end) assert_end_of_stream(pipeline, :sink) Testing.Pipeline.terminate(pipeline) From f3de578f4e8556653757bfb086905ce81ebef4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Thu, 21 Mar 2024 19:05:33 +0100 Subject: [PATCH 08/14] cleanup, tests adjusted --- .../converter.ex | 64 +++++++++---------- .../converter_test.exs | 10 ++- .../pts_forward_test.exs | 6 +- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index 92e8d62..fbf52b3 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -65,7 +65,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do native: nil, queue: <<>>, input_stream_format_provided?: options.input_stream_format != nil, - pts_queue: [], + pts_queue: [] }) {[], state} @@ -124,56 +124,37 @@ defmodule Membrane.FFmpeg.SWResample.Converter do @impl true def handle_buffer(:input, %Buffer{payload: payload, pts: input_pts}, _ctx, state) do - ratio = RawAudio.frame_size(state.output_stream_format)/RawAudio.frame_size(state.input_stream_format) + input_frame_size = RawAudio.frame_size(state.input_stream_format) + output_frame_size = RawAudio.frame_size(state.output_stream_format) + ratio = output_frame_size / input_frame_size - expected_output_frames_count = byte_size(payload)/RawAudio.frame_size(state.input_stream_format) * ratio + expected_output_frames_count = byte_size(payload) / input_frame_size * ratio - state = Map.update!(state, :pts_queue, fn pts_queue -> - pts_queue ++ [{input_pts, expected_output_frames_count}] - end) + state = + Map.update!(state, :pts_queue, fn pts_queue -> + pts_queue ++ [{input_pts, expected_output_frames_count}] + end) conversion_result = - convert!(state.native, RawAudio.frame_size(state.input_stream_format), payload, state.queue) + convert!(state.native, input_frame_size, payload, state.queue) case conversion_result do {<<>>, queue} -> {[], %{state | queue: queue}} {converted, queue} -> - converted_frames_count = byte_size(converted)/RawAudio.frame_size(state.output_stream_format) - - {[{_out_pts, expected_frames}], _rest} = Enum.split(state.pts_queue, 1) - - {state, out_pts} = update_pts_queue(state, converted_frames_count) - - IO.puts("expected_output_frames_count: #{expected_frames} converted_frames_count: #{converted_frames_count} out_pts: #{out_pts}") + {state, out_pts} = update_pts_queue(state, byte_size(converted) / output_frame_size) {[buffer: {:output, %Buffer{payload: converted, pts: out_pts}}], %{state | queue: queue}} end end - defp update_pts_queue(state, converted_frames_count) do - {[{out_pts, expected_frames}], rest} = Enum.split(state.pts_queue, 1) - cond do - converted_frames_count < expected_frames -> - state = Map.update!(state, :pts_queue, fn _pts_queue -> - [{out_pts, expected_frames - converted_frames_count}] ++ rest - end) - {state, out_pts} - - converted_frames_count >= expected_frames -> - {%{state | pts_queue: rest}, out_pts} - - end - end - @impl true def handle_end_of_stream(:input, _ctx, %{native: nil} = state) do {[end_of_stream: :output], state} end def handle_end_of_stream(:input, _ctx, state) do - dropped_bytes = byte_size(state.queue) if dropped_bytes > 0 do @@ -187,9 +168,11 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {[end_of_stream: :output], %{state | queue: <<>>}} converted -> - converted_frames_count = byte_size(converted)/RawAudio.frame_size(state.output_stream_format) + converted_frames_count = + byte_size(converted) / RawAudio.frame_size(state.output_stream_format) + {state, out_pts} = update_pts_queue(state, converted_frames_count) - IO.puts("end_of_stream out_pts: #{out_pts}") + {[ buffer: {:output, %Buffer{payload: converted, pts: out_pts}}, end_of_stream: :output @@ -250,4 +233,21 @@ defmodule Membrane.FFmpeg.SWResample.Converter do {:error, reason} -> raise "Error while flushing converter: #{inspect(reason)}" end end + + defp update_pts_queue(state, converted_frames_count) do + {[{out_pts, expected_frames}], rest} = Enum.split(state.pts_queue, 1) + + cond do + converted_frames_count < expected_frames -> + state = + Map.update!(state, :pts_queue, fn _pts_queue -> + [{out_pts, expected_frames - converted_frames_count}] ++ rest + end) + + {state, out_pts} + + converted_frames_count >= expected_frames -> + {%{state | pts_queue: rest}, out_pts} + end + end end diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 859e780..3e1beef 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -157,7 +157,14 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do assert {[], new_state} = @module.handle_buffer(:input, buffer, nil, state) - assert new_state == %{state | queue: payload} + # this is necesary to ignore state.pts_queue in the assertion + assert new_state.frames_per_buffer == state.frames_per_buffer + assert new_state.input_stream_format == state.input_stream_format + assert new_state.input_stream_format_provided? == state.input_stream_format_provided? + assert new_state.native == state.native + assert new_state.output_stream_format == state.output_stream_format + assert new_state.queue == payload + refute_called(@native, :convert) end @@ -195,6 +202,5 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do # assert {[buffer: {:output, %Membrane.Buffer{pts: ^pts}}], _state} = # @module.handle_buffer(:input, buffer, nil, state) # end - end end diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index c66cc7f..9fabbf7 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -12,7 +12,8 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do # input_stream_format = %RawAudio{sample_format: :u8, sample_rate: 8_000, channels: 1} output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 32_000, channels: 2} - fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_s16le_stereo_16khz.raw")) # 32 frames * 2048 bytes + # 32 frames * 2048 bytes + fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_s16le_stereo_16khz.raw")) # fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_u8_mono_8khz.raw")) spec = [ @@ -38,12 +39,13 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do defp buffers_from_file(path) do binary = File.read!(path) + split_binary(binary) |> Enum.with_index() |> Enum.map(fn {payload, index} -> %Membrane.Buffer{ payload: payload, - pts: index * 31250000 + pts: index * 31_250_000 } end) end From cd2486d43eee3c7bbfe28406f3192f8821367719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Mon, 25 Mar 2024 19:35:11 +0100 Subject: [PATCH 09/14] pts test update --- .../pts_forward_test.exs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index 9fabbf7..28cf414 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -9,12 +9,10 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do test "pts forward test" do input_stream_format = %RawAudio{sample_format: :s16le, sample_rate: 16_000, channels: 2} - # input_stream_format = %RawAudio{sample_format: :u8, sample_rate: 8_000, channels: 1} output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 32_000, channels: 2} # 32 frames * 2048 bytes fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_s16le_stereo_16khz.raw")) - # fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_u8_mono_8khz.raw")) spec = [ child(:source, %Membrane.Testing.Source{output: buffers_from_file(fixture_path)}) @@ -27,11 +25,12 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do pipeline = Testing.Pipeline.start_link_supervised!(spec: spec) assert_start_of_stream(pipeline, :sink) - - # Enum.each(0..31, fn index -> - # assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) - # assert out_pts == index * 31250000 - # end) + assert_sink_buffer(pipeline, :sink, _buffer) + Enum.each(0..30, fn index -> + assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) + assert out_pts == index * 31250000 + end) + assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: 937500000}) assert_end_of_stream(pipeline, :sink) Testing.Pipeline.terminate(pipeline) @@ -54,10 +53,10 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do def split_binary(binary, acc \\ []) def split_binary(<>, acc) do - split_binary(rest, acc ++ [binary]) + split_binary(rest, [binary] ++ acc) end def split_binary(rest, acc) when byte_size(rest) <= 2048 do - Enum.concat(acc, [rest]) + Enum.reverse(acc) ++ [rest] end end From 7e7c7bbd92ebe2cd6d593e1cf60d3d37ed40c7be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Mon, 25 Mar 2024 19:44:00 +0100 Subject: [PATCH 10/14] little refactor --- .../converter.ex | 18 +++++-------- .../converter_test.exs | 25 +------------------ .../pts_forward_test.exs | 6 +++-- 3 files changed, 11 insertions(+), 38 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index fbf52b3..c0febe1 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -128,7 +128,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do output_frame_size = RawAudio.frame_size(state.output_stream_format) ratio = output_frame_size / input_frame_size - expected_output_frames_count = byte_size(payload) / input_frame_size * ratio + expected_output_frames_count = (byte_size(payload) / input_frame_size * ratio) |> trunc() state = Map.update!(state, :pts_queue, fn pts_queue -> @@ -237,17 +237,11 @@ defmodule Membrane.FFmpeg.SWResample.Converter do defp update_pts_queue(state, converted_frames_count) do {[{out_pts, expected_frames}], rest} = Enum.split(state.pts_queue, 1) - cond do - converted_frames_count < expected_frames -> - state = - Map.update!(state, :pts_queue, fn _pts_queue -> - [{out_pts, expected_frames - converted_frames_count}] ++ rest - end) - - {state, out_pts} - - converted_frames_count >= expected_frames -> - {%{state | pts_queue: rest}, out_pts} + if converted_frames_count < expected_frames do + {%{state | pts_queue: [{out_pts, expected_frames - converted_frames_count}] ++ rest}, + out_pts} + else + {%{state | pts_queue: rest}, out_pts} end end end diff --git a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs index 3e1beef..a99d66f 100644 --- a/test/membrane_ffmpeg_swresample_plugin/converter_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/converter_test.exs @@ -157,14 +157,7 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do assert {[], new_state} = @module.handle_buffer(:input, buffer, nil, state) - # this is necesary to ignore state.pts_queue in the assertion - assert new_state.frames_per_buffer == state.frames_per_buffer - assert new_state.input_stream_format == state.input_stream_format - assert new_state.input_stream_format_provided? == state.input_stream_format_provided? - assert new_state.native == state.native - assert new_state.output_stream_format == state.output_stream_format - assert new_state.queue == payload - + assert %{new_state | pts_queue: nil} == %{state | queue: payload, pts_queue: nil} refute_called(@native, :convert) end @@ -186,21 +179,5 @@ defmodule Membrane.FFmpeg.SWResample.ConverterTest do assert actions == [buffer: {:output, %Membrane.Buffer{payload: result}}] assert new_state == %{state | queue: <<0::2*8>>} end - - # test "timestamps forward test", %{state: initial_state} do - # state = %{ - # initial_state - # | queue: <<250, 250, 0>>, - # native: :mock_handle, - # input_stream_format: @s16le_format - # } - # payload = <<0::7*8>> - # pts = 1000 - # buffer = %Membrane.Buffer{payload: payload, pts: pts} - # result = <<250, 0, 0, 0>> - # mock(@native, [convert: 2], {:ok, result}) - # assert {[buffer: {:output, %Membrane.Buffer{pts: ^pts}}], _state} = - # @module.handle_buffer(:input, buffer, nil, state) - # end end end diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index 28cf414..d3705a5 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -26,11 +26,13 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do pipeline = Testing.Pipeline.start_link_supervised!(spec: spec) assert_start_of_stream(pipeline, :sink) assert_sink_buffer(pipeline, :sink, _buffer) + Enum.each(0..30, fn index -> assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) - assert out_pts == index * 31250000 + assert out_pts == index * 31_250_000 end) - assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: 937500000}) + + assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: 937_500_000}) assert_end_of_stream(pipeline, :sink) Testing.Pipeline.terminate(pipeline) From d78762ea2f3ebb252d3873e4ba47af397bf5c59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 26 Mar 2024 17:46:32 +0100 Subject: [PATCH 11/14] refactor --- lib/membrane_ffmpeg_swresample_plugin/converter.ex | 2 +- test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index c0febe1..c01761c 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -128,7 +128,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do output_frame_size = RawAudio.frame_size(state.output_stream_format) ratio = output_frame_size / input_frame_size - expected_output_frames_count = (byte_size(payload) / input_frame_size * ratio) |> trunc() + expected_output_frames_count = (byte_size(payload) / input_frame_size * ratio) |> round() state = Map.update!(state, :pts_queue, fn pts_queue -> diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index d3705a5..56a9b8c 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -12,7 +12,7 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 32_000, channels: 2} # 32 frames * 2048 bytes - fixture_path = Path.expand(Path.join(__DIR__, "/../fixtures/input_s16le_stereo_16khz.raw")) + fixture_path = "test/fixtures/input_s16le_stereo_16khz.raw" spec = [ child(:source, %Membrane.Testing.Source{output: buffers_from_file(fixture_path)}) @@ -27,9 +27,11 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do assert_start_of_stream(pipeline, :sink) assert_sink_buffer(pipeline, :sink, _buffer) + pts_multiplier = 31_250_000 + Enum.each(0..30, fn index -> assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) - assert out_pts == index * 31_250_000 + assert out_pts == index * pts_multiplier end) assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: 937_500_000}) From 1473e39ea449147afd4db718ca5ea66292b6a975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 2 Apr 2024 14:29:13 +0200 Subject: [PATCH 12/14] cosmetic refactor --- .../pts_forward_test.exs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index 56a9b8c..02d1973 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -7,6 +7,8 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do alias Membrane.FFmpeg.SWResample.Converter alias Membrane.{RawAudio, Testing} + @pts_multiplier 31_250_000 + test "pts forward test" do input_stream_format = %RawAudio{sample_format: :s16le, sample_rate: 16_000, channels: 2} output_stream_format = %RawAudio{sample_format: :s32le, sample_rate: 32_000, channels: 2} @@ -27,14 +29,13 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do assert_start_of_stream(pipeline, :sink) assert_sink_buffer(pipeline, :sink, _buffer) - pts_multiplier = 31_250_000 - Enum.each(0..30, fn index -> assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: out_pts}) - assert out_pts == index * pts_multiplier + assert out_pts == index * @pts_multiplier end) - assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: 937_500_000}) + assert_sink_buffer(pipeline, :sink, %Membrane.Buffer{pts: last_out_pts}) + assert last_out_pts == 30 * @pts_multiplier assert_end_of_stream(pipeline, :sink) Testing.Pipeline.terminate(pipeline) @@ -48,7 +49,7 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do |> Enum.map(fn {payload, index} -> %Membrane.Buffer{ payload: payload, - pts: index * 31_250_000 + pts: index * @pts_multiplier } end) end From 9ebe0200e3ea3dec11259c41cd5bf0c7b3c8870f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 2 Apr 2024 14:36:56 +0200 Subject: [PATCH 13/14] version bump --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b6993e7..1971b23 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ It is a part of [Membrane Multimedia Framework](https://membrane.stream). Add the following line to your `deps` in `mix.exs`. Run `mix deps.get`. ```elixir -{:membrane_ffmpeg_swresample_plugin, "~> 0.19.2"} +{:membrane_ffmpeg_swresample_plugin, "~> 0.20.0"} ``` The precompiled builds of the [ffmpeg](https://www.ffmpeg.org) will be pulled and linked automatically. However, should there be any problems, consider installing it manually. diff --git a/mix.exs b/mix.exs index 25898f1..e931584 100644 --- a/mix.exs +++ b/mix.exs @@ -2,7 +2,7 @@ defmodule Membrane.FFmpeg.SWResample.Mixfile do use Mix.Project @github_url "https://github.com/membraneframework/membrane_ffmpeg_swresample_plugin" - @version "0.19.2" + @version "0.20.0" def project do [ From 17519411fa23cfdf0d4e39137c20cd625979062b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Chali=C5=84ski?= Date: Tue, 2 Apr 2024 20:45:03 +0200 Subject: [PATCH 14/14] refactor --- lib/membrane_ffmpeg_swresample_plugin/converter.ex | 6 +++--- test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/membrane_ffmpeg_swresample_plugin/converter.ex b/lib/membrane_ffmpeg_swresample_plugin/converter.ex index c01761c..8b213a9 100644 --- a/lib/membrane_ffmpeg_swresample_plugin/converter.ex +++ b/lib/membrane_ffmpeg_swresample_plugin/converter.ex @@ -126,9 +126,9 @@ defmodule Membrane.FFmpeg.SWResample.Converter do def handle_buffer(:input, %Buffer{payload: payload, pts: input_pts}, _ctx, state) do input_frame_size = RawAudio.frame_size(state.input_stream_format) output_frame_size = RawAudio.frame_size(state.output_stream_format) - ratio = output_frame_size / input_frame_size - expected_output_frames_count = (byte_size(payload) / input_frame_size * ratio) |> round() + expected_output_frames_count = + (byte_size(payload) * output_frame_size / (input_frame_size * input_frame_size)) |> round() state = Map.update!(state, :pts_queue, fn pts_queue -> @@ -235,7 +235,7 @@ defmodule Membrane.FFmpeg.SWResample.Converter do end defp update_pts_queue(state, converted_frames_count) do - {[{out_pts, expected_frames}], rest} = Enum.split(state.pts_queue, 1) + [{out_pts, expected_frames} | rest] = state.pts_queue if converted_frames_count < expected_frames do {%{state | pts_queue: [{out_pts, expected_frames - converted_frames_count}] ++ rest}, diff --git a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs index 02d1973..72c3e3a 100644 --- a/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs +++ b/test/membrane_ffmpeg_swresample_plugin/pts_forward_test.exs @@ -26,7 +26,6 @@ defmodule Membrane.FFmpeg.SWResample.PtsForwardTest do ] pipeline = Testing.Pipeline.start_link_supervised!(spec: spec) - assert_start_of_stream(pipeline, :sink) assert_sink_buffer(pipeline, :sink, _buffer) Enum.each(0..30, fn index ->