From 2f3980f43b6255bfc4db114633cd27cba7881029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B8=D1=81=D0=B5=D0=BB=D1=91=D0=B2=20=D0=92=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=B8=D1=81=D0=BB=D0=B0=D0=B2?= Date: Wed, 19 Jun 2019 19:54:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constraints/conversion_2_greedy.mzn | 216 ++++++++++- src/inport/ConversionUtil.java | 336 ++++++++++++++---- src/inport/Main.java | 33 +- src/inport/Testing.java | 9 + tests/requiring_optimization/Case_SPB.tipp | 2 +- ...\200\320\260\321\206\320\270\320\271.docx" | Bin 50469 -> 50513 bytes 6 files changed, 522 insertions(+), 74 deletions(-) diff --git a/src/constraints/conversion_2_greedy.mzn b/src/constraints/conversion_2_greedy.mzn index 6b81e80..bec3fdd 100644 --- a/src/constraints/conversion_2_greedy.mzn +++ b/src/constraints/conversion_2_greedy.mzn @@ -221,7 +221,6 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац % Определение is_involved_in_cargo_op. constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) ( is_involved_in_cargo_op[obj, t] = ( - % (exists (op in 1..n_operations where (not is_moving_operation[op]) /\ (main_obj_of_operation[op] = obj)) ( (exists (op in related_cargo_op[obj]) (op_status[op, t])) \/ ((participation_as_resource[obj, t] != 0) /\ (not is_moving_operation[participation_as_resource[obj, t]])) @@ -347,6 +346,206 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац array [1..n_all_storage_sections] of set of 1..n_loading_op : involved_operations; + + array [0..n_all_storage_sections] of int : storage_greedy_upper_limit; + array [0..n_all_storage_sections] of int : storage_greedy_lower_limit; + + 0..n_all_storage_sections : n_sections_of_real_storage_and_bunkers; + array [0..n_sections_of_real_storage_and_bunkers] of 0..n_all_storage_sections : number_of_connected_sections; + + 0..n_all_storage_sections : max_number_of_connected_sections; + + array [0..n_sections_of_real_storage_and_bunkers, 0..max_number_of_connected_sections, 1..(n_intervals + 1)] of var int : nominal_cargo_value; + array [0..n_sections_of_real_storage_and_bunkers, 0..(max_number_of_connected_sections + 1), 1..(n_intervals + 1)] of var int : cargo_overflow_remains; + array [0..n_sections_of_real_storage_and_bunkers, 0..max_number_of_connected_sections, 1..(n_intervals + 1)] of var int : real_cargo_value; + + % Определение real_cargo_value + array [0..n_operations] of 0..n_all_storage_sections : operations_main_stor_no_in_secondary; + array [0..n_operations] of 0..n_all_storage_sections : operations_secondary_stor_no_in_main; + + array [0..n_sections_of_real_storage_and_bunkers, 0..max_number_of_connected_sections] of set of 1..n_operations : connected_op_to_pair_of_sections; + + array [0..n_sections_of_real_storage_and_bunkers, 0..max_number_of_connected_sections, 1..(n_intervals + 1)] of var int : debug_1; + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1) where operations_main_stor_no_in_secondary[op] != 0) ( + op_status[op, t] -> ( + debug_1[operations_secondary_stor[op], operations_main_stor_no_in_secondary[op], t] = + min(storage_greedy_upper_limit[operations_main_stor[op]] - storage_used_volume[operations_main_stor[op], t - 1], + loading_op_delta_of_main_obj[op]) + ) + ); + + constraint forall (section_1 in 1..n_sections_of_real_storage_and_bunkers, + section_2 in 1..number_of_connected_sections[section_1], + t in 1..(n_intervals + 1)) ( + (forall (op in connected_op_to_pair_of_sections[section_1, section_2]) (not op_status[op, t])) + -> + (debug_1[section_1, section_2, t] = 0) + ); + + + + + % Определение nominal_cargo_value + % Операция грузообработки активна -> нужные номинальные значения согласованы с ней. + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1) where operations_main_stor_no_in_secondary[op] != 0) ( + op_status[op, t] -> ( + nominal_cargo_value[operations_secondary_stor[op], operations_main_stor_no_in_secondary[op], t] = + -max( + min(storage_greedy_upper_limit[operations_main_stor[op]] - storage_used_volume[operations_main_stor[op], t - 1], + loading_op_delta_of_main_obj[op]), + storage_greedy_lower_limit[operations_main_stor[op]] - storage_used_volume[operations_main_stor[op], t - 1]) + ) + ); + + % Если нет активной операции, влияющей на эту пару секций, то nominal_cargo_value = 0. + constraint forall (section_1 in 1..n_sections_of_real_storage_and_bunkers, + section_2 in 1..number_of_connected_sections[section_1], + t in 1..(n_intervals + 1)) ( + (forall (op in connected_op_to_pair_of_sections[section_1, section_2]) (not op_status[op, t])) + -> + (nominal_cargo_value[section_1, section_2, t] = 0) + ); + + % Крайние значения. + constraint forall (section_1 in 1..n_sections_of_real_storage_and_bunkers, + section_2 in (number_of_connected_sections[section_1] + 1)..max_number_of_connected_sections, + t in 1..(n_intervals + 1)) ( + nominal_cargo_value[section_1, section_2, t] = 0 + ); + constraint forall (section_1 in 1..n_sections_of_real_storage_and_bunkers, + t in 1..(n_intervals + 1)) ( + nominal_cargo_value[section_1, 0, t] = 0 + ); + constraint forall (section_2 in 0..max_number_of_connected_sections, + t in 1..(n_intervals + 1)) ( + nominal_cargo_value[0, section_2, t] = 0 + ); + + % Определение cargo_overflow_remains. + % Переполнение. + constraint forall (t in 1..(n_intervals + 1), section in 1..n_sections_of_real_storage_and_bunkers) ( + let {var int : delta = sum (i in 1..number_of_connected_sections[section]) (nominal_cargo_value[section, i, t]); + var int : real_delta = min(max(delta, + storage_greedy_lower_limit[section] - storage_used_volume[section, t - 1]), + storage_greedy_upper_limit[section] - storage_used_volume[section, t - 1]); + } in ( + cargo_overflow_remains[section, number_of_connected_sections[section] + 1, t] = (delta - real_delta) + ) + ); + + % Избавляемся от лишнего. + % Если остаток переполнения и номналное значение одного знака, то полностью отменяем это номинальное значение. + constraint forall (t in 1..(n_intervals + 1), + section in 1..n_sections_of_real_storage_and_bunkers, + i in 1..number_of_connected_sections[section]) ( + ((((cargo_overflow_remains[section, i + 1, t] < 0) /\ (nominal_cargo_value[section, i, t] < 0)) + \/ + ((cargo_overflow_remains[section, i + 1, t] > 0) /\ (nominal_cargo_value[section, i, t] > 0)) + ) /\ (abs(cargo_overflow_remains[section, i + 1, t]) >= abs(nominal_cargo_value[section, i, t])) + ) -> ( + cargo_overflow_remains[section, i, t] = + cargo_overflow_remains[section, i + 1, t] - + nominal_cargo_value[section, i, t] + ) + ); + + % Иначе оно полностью перекрыло переполнение. + constraint forall (t in 1..(n_intervals + 1), + section in 1..n_sections_of_real_storage_and_bunkers, + i in 1..number_of_connected_sections[section]) ( + (((cargo_overflow_remains[section, i + 1, t] <= 0) /\ (nominal_cargo_value[section, i, t] >= 0)) + \/ + ((cargo_overflow_remains[section, i + 1, t] >= 0) /\ (nominal_cargo_value[section, i, t] <= 0)) + \/ + (abs(cargo_overflow_remains[section, i + 1, t]) < abs(nominal_cargo_value[section, i, t])) + ) -> ( + cargo_overflow_remains[section, i, t] = 0 + ) + ); + + % Крайние значения. + constraint forall (t in 1..(n_intervals + 1), section in 1..n_sections_of_real_storage_and_bunkers) ( + cargo_overflow_remains[section, 0, t] = 0 + ); + constraint forall (t in 1..(n_intervals + 1), + section in 1..n_sections_of_real_storage_and_bunkers, + i in (number_of_connected_sections[section] + 2)..max_number_of_connected_sections) ( + cargo_overflow_remains[section, i, t] = 0 + ); + constraint forall (section_2 in 0..(max_number_of_connected_sections + 1), + t in 1..(n_intervals + 1)) ( + cargo_overflow_remains[0, section_2, t] = 0 + ); + + % Определение real_cargo_value + constraint forall (t in 1..(n_intervals + 1), + section in 1..n_sections_of_real_storage_and_bunkers, + i in 1..number_of_connected_sections[section]) ( + real_cargo_value[section, i, t] = nominal_cargo_value[section, i, t] + - cargo_overflow_remains[section, i + 1, t] + + cargo_overflow_remains[section, i, t] + ); + % Крайние значения. + constraint forall (t in 1..(n_intervals + 1), section in 1..n_sections_of_real_storage_and_bunkers) ( + real_cargo_value[section, 0, t] = 0 + ); + constraint forall (t in 1..(n_intervals + 1), + section in 1..n_sections_of_real_storage_and_bunkers, + i in (number_of_connected_sections[section] + 1)..max_number_of_connected_sections) ( + real_cargo_value[section, i, t] = 0 + ); + constraint forall (section_2 in 0..max_number_of_connected_sections, + t in 1..(n_intervals + 1)) ( + real_cargo_value[0, section_2, t] = 0 + ); + + array [0..n_all_storage_sections] of set of 1..n_all_storage_sections : all_used_positions_in_real_cargo_value; + array [1..n_all_storage_sections, 1..n_all_storage_sections] of 0..max_number_of_connected_sections : positions_of_connected_sections; + + + constraint forall (storage in 1..n_sections_of_real_storage_and_bunkers, t in 1..(n_intervals + 1)) ( + storage_used_volume[storage, t] = ( + storage_used_volume[storage, t - 1] + + cargo_flows[storage, t] + + (sum (i in 1..number_of_connected_sections[storage]) (real_cargo_value[storage, i, t])) + + (sum (i in all_used_positions_in_real_cargo_value[storage]) (-real_cargo_value[i, positions_of_connected_sections[storage, i], t])) + ) + ); + constraint forall (storage in (n_sections_of_real_storage_and_bunkers + 1)..n_all_storage_sections, t in 1..(n_intervals + 1)) ( + storage_used_volume[storage, t] = ( + storage_used_volume[storage, t - 1] + + cargo_flows[storage, t] + + (sum (i in all_used_positions_in_real_cargo_value[storage]) (-real_cargo_value[i, positions_of_connected_sections[storage, i], t])) + ) + ); + +/* + constraint forall (storage in 1..n_sections_of_real_storage_and_bunkers, t in 1..(n_intervals + 1)) ( + debug_storage_used_volume[storage, t] = ( + debug_storage_used_volume[storage, t - 1] + + cargo_flows[storage, t] + + (sum (i in 1..number_of_connected_sections[storage]) (real_cargo_value[storage, i, t])) + + (sum (i in all_used_positions_in_real_cargo_value[storage]) (-real_cargo_value[i, positions_of_connected_sections[storage, i], t])) + ) + ); + + constraint forall (storage in (n_sections_of_real_storage_and_bunkers + 1)..n_all_storage_sections, t in 1..(n_intervals + 1)) ( + debug_storage_used_volume[storage, t] = ( + debug_storage_used_volume[storage, t - 1] + + cargo_flows[storage, t] + + (sum (i in all_used_positions_in_real_cargo_value[storage]) (-real_cargo_value[i, positions_of_connected_sections[storage, i], t])) + ) + ); +*/ + + array [0..n_all_storage_sections, 0..(n_intervals + 1)] of var int : debug_storage_used_volume; + constraint forall (t in 0..(n_intervals + 1)) (debug_storage_used_volume[0, t] = 0); % Фиктивный объект. + + constraint forall (storage in 1..n_all_storage_sections) ( % Initial values. + debug_storage_used_volume[storage, 0] = initial_storage_vol[storage] + ); + +/* constraint forall (storage in 1..n_all_storage_sections, t in 1..(n_intervals + 1)) ( storage_used_volume[storage, t] = ( storage_used_volume[storage, t - 1] + @@ -357,7 +556,7 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ) ) ); - +*/ % Фиксированные операции. int : n_fixed_op; array [1..n_fixed_op] of 1..n_operations : fixed_op; @@ -376,7 +575,7 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ) ) ); - +/* % Оптимизация - сдвиг в начало. % Возможно ли начать операцию в данный интервал (если предположить, что операция длится 1 интервал). array [0..n_operations, 1..n_intervals] of var bool : is_op_possible; @@ -454,7 +653,7 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац constraint forall (op in 1..n_operations, t in 2..n_intervals) ( (op_start[op, t] /\ (not is_fixed[op, t])) -> not is_op_possible[op, t - 1] ); - +*/ % Критерий оптимизации array [1..(n_intervals + 1)] of var bool : is_not_terminated; % В конце всё остановится. @@ -487,6 +686,15 @@ output [show(sum(is_not_terminated)), "\n", "current_moored_obj = ", show(current_moored_obj), "\n\n", + "nominal_cargo_value {", show(max_number_of_connected_sections + 1), " ", show(n_intervals + 1), "} = ", show(nominal_cargo_value), "\n\n", + "cargo_overflow_remains {", show(max_number_of_connected_sections + 2), " ", show(n_intervals + 1), "} = ", show(cargo_overflow_remains), "\n\n", + "real_cargo_value {", show(max_number_of_connected_sections + 1), " ", show(n_intervals + 1), "} = ", show(real_cargo_value), "\n\n", + + "debug_1 {", show(max_number_of_connected_sections + 1), " ", show(n_intervals + 1), "} = ", show(debug_1), "\n\n", + + + "debug_storage_used_volume = ", show(debug_storage_used_volume), "\n\n", + /* "is_op_possible {", show(n_intervals), "} = ", show(is_op_possible), "\n\n", "debug_1 {", show(n_intervals), "} = ", show(debug_1), "\n\n", diff --git a/src/inport/ConversionUtil.java b/src/inport/ConversionUtil.java index 666b502..4af060a 100644 --- a/src/inport/ConversionUtil.java +++ b/src/inport/ConversionUtil.java @@ -416,6 +416,19 @@ public class ConversionUtil { } private final Map sectionNById; + private int sectionIdToN(Storage storage, Cargo cargo) { + return sectionNById.get(new StorageSectionId( + true, + storageNById.get(storage.getId()), + cargoNById.get(cargo.getId()))); + } + private int sectionIdToN(TransportShip transportShip, Cargo cargo) { + return sectionNById.get(new StorageSectionId( + false, + mObjToN(transportShip), + cargoNById.get(cargo.getId()))); + } + private final Map storageNById; private final Map cargoNById; @@ -432,6 +445,12 @@ public class ConversionUtil { return movingObjects; } + private final int nSectionsOfRealStorageAndBunkers; + + private final ArrayList initialStorageVol; + private final ArrayList finalStorageVol; + private final ArrayList maxStorageVol; + Task(TaskCase task, String fileName) { this.fileName = fileName; this.task = task; @@ -471,22 +490,28 @@ public class ConversionUtil { storageNById = new TreeMap<>(); sectionNById = new TreeMap<>(); - for (int i = 0; i < storages.size(); i++) { + for (int i = 0; i < storages.size(); i++) { // Сначала реальные хранилища. storageNById.put(storages.get(i).getId(), i); + for (Pair p : storages.get(i).getStorageSections()) { + sectionNById.put(new StorageSectionId(true, i, cargoNById.get(p.getKey().getId())), nextStorageNo++); + } } - for (MovingObject obj : movingObjects) { - if (obj instanceof TransportShip) { + for (MovingObject obj : movingObjects) { // Затем бункеровщики. + if (obj instanceof Bunker) { for (Pair p : ((TransportShip) obj).getStorageSections()) { sectionNById.put(new StorageSectionId(false, mObjToN(obj), cargoNById.get(p.getKey().getId())), nextStorageNo++); } } } - for (int i = 0; i < storages.size(); i++) { - storageNById.put(storages.get(i).getId(), i); - for (Pair p : storages.get(i).getStorageSections()) { - sectionNById.put(new StorageSectionId(true, i, cargoNById.get(p.getKey().getId())), nextStorageNo++); + nSectionsOfRealStorageAndBunkers = sectionNById.size(); + + for (MovingObject obj : movingObjects) { // Дальше - все остальные. + if ((obj instanceof TransportShip) && (!(obj instanceof Bunker))) { + for (Pair p : ((TransportShip) obj).getStorageSections()) { + sectionNById.put(new StorageSectionId(false, mObjToN(obj), cargoNById.get(p.getKey().getId())), nextStorageNo++); + } } } @@ -524,6 +549,48 @@ public class ConversionUtil { initMovingObjectLocationDefinition(); } + { + initialStorageVol = integerArray(sectionNById.size(), 0); + finalStorageVol = integerArray(sectionNById.size(), -1); + + BiConsumer, StorageState> f = (ArrayList a, StorageState st) -> { + int val = (int)st.getCargoState(); + int sectionN; + + if (st.getStorage() instanceof Storage) { + sectionN = sectionIdToN((Storage) st.getStorage(), st.getCargo()); + } else { + assert st.getStorage() instanceof TransportShip; + sectionN = sectionIdToN((TransportShip) st.getStorage(), st.getCargo()); + } + a.set(sectionN, val); + }; + + for (StorageState st : task.getStorageInitialState()) { + f.accept(initialStorageVol, st); + } + for (StorageState st : task.getStorageEndState()) { + f.accept(finalStorageVol, st); + } + } + { // maxStorageVol + maxStorageVol = integerArray(sectionNById.size(), 0); + + for (MovingObject obj : movingObjects) { + if (obj instanceof TransportShip) { + for (Pair p : ((TransportShip) obj).getStorageSections()) { + maxStorageVol.set(sectionIdToN((TransportShip) obj, p.getKey()), + (int)Math.ceil(p.getValue())); + } + } + } + for (Storage storage : storages) { + for (Pair p : storage.getStorageSections()) { + maxStorageVol.set(sectionIdToN(storage, p.getKey()), + (int)Math.ceil(p.getValue())); + } + } + } } private ArrayList getNumbersOfResourcesTypes(OperationTemplate t) { @@ -736,26 +803,6 @@ public class ConversionUtil { /* Ограничения на вместимость. */ private void maxStorageVolume() throws IOException { - ArrayList maxStorageVol = integerArray(sectionNById.size(), 0); - - for (MovingObject obj : movingObjects) { - if (obj instanceof TransportShip) { - for (Pair p : ((TransportShip) obj).getStorageSections()) { - maxStorageVol.set(sectionNById.get(new StorageSectionId(false, - mObjToN(obj), - cargoNById.get(p.getKey().getId()))), - (int)Math.ceil(p.getValue())); - } - } - } - for (Storage storage : storages) { - for (Pair p : storage.getStorageSections()) { - maxStorageVol.set(sectionNById.get(new StorageSectionId(true, - storageNById.get(storage.getId()), - cargoNById.get(p.getKey().getId()))), - (int)Math.ceil(p.getValue())); - } - } writeArray(writer, "max_storage_vol", maxStorageVol, Optional.of(0)); writer.write("\n"); @@ -763,38 +810,6 @@ public class ConversionUtil { /* Граничные состояния хранилищ. */ private void boundaryStorageStates() throws IOException { - // TODO выделить отдельно общий код. - ArrayList initialStorageVol = integerArray(sectionNById.size(), 0); - ArrayList finalStorageVol = integerArray(sectionNById.size(), -1); - - BiConsumer, StorageState> f = (ArrayList a, StorageState st) -> { - int cargoN = cargoNById.get(st.getCargo().getId()); - int val = (int)st.getCargoState(); - - boolean isRealStorage; - int localN; - - if (st.getStorage() instanceof Storage) { - Storage storage = (Storage) st.getStorage(); - isRealStorage = true; - localN = storageNById.get(storage.getId()); - } else { - assert st.getStorage() instanceof TransportShip; - isRealStorage = false; - TransportShip ship = (TransportShip) st.getStorage(); - localN = mObjToN(ship); - } - - int sectionN = sectionNById.get(new StorageSectionId(isRealStorage, localN, cargoN)); - a.set(sectionN, val); - }; - - for (StorageState st : task.getStorageInitialState()) { - f.accept(initialStorageVol, st); - } - for (StorageState st : task.getStorageEndState()) { - f.accept(finalStorageVol, st); - } writeArray(writer, "initial_storage_vol", initialStorageVol, Optional.of(0)); writeArray(writer, "final_storage_vol", finalStorageVol, Optional.of(-1)); } @@ -806,9 +821,7 @@ public class ConversionUtil { cargoFlows.add(integerArray(n_intervals + 2, 0)); } for (CargoFlow flow : task.getCargoFlows()) { - int storageN = sectionNById.get(new StorageSectionId(true, - storageNById.get(flow.getStorage().getId()), - cargoNById.get(flow.getCargo().getId()))); + int storageN = sectionIdToN(flow.getStorage(), flow.getCargo()); for (int i = 1; i < n_intervals + 2; i++) { cargoFlows.get(storageN + 1).set(i, (int)flow.getCurrentValue(i - 0.1)); } @@ -847,12 +860,12 @@ public class ConversionUtil { int storageN; if (op.getBunker().isPresent()) { - storageN = sectionNById.get(new StorageSectionId(false, mObjToN(op.getBunker().get()), cargoN)); + storageN = sectionIdToN(op.getBunker().get(), op.getCargo()); } else { - storageN = sectionNById.get(new StorageSectionId(true, storageNById.get(op.getStorage().getId()), cargoN)); + storageN = sectionIdToN(op.getStorage(), op.getCargo()); } - int shipStorageN = sectionNById.get(new StorageSectionId(false, shipN, cargoN)); + int shipStorageN = sectionIdToN(op.getLoader(), op.getCargo()); loadingOpDelta.add(-(int)op.getIntensity()); loading_op_local_direction.add(-(int)op.getIntensity() > 0 ? 1 : -1); @@ -868,7 +881,7 @@ public class ConversionUtil { loading_op_abs_delta.add(Math.abs((int)op.getIntensity())); loading_op_direction.add((int)op.getIntensity() > 0 ? 1 : -1); - operations_main_stor.add(shipN + 1); + operations_main_stor.add(shipStorageN + 1); operations_secondary_stor.add(storageN + 1); operations_cargo_t.add(cargoN + 1); bunker_of_cargo_op.add(op.getBunker().isPresent() ? mObjToN(op.getBunker().get()) + 1 : 0); @@ -1536,6 +1549,183 @@ public class ConversionUtil { } } } + + void dataForGreediness() throws IOException { + ArrayList> connectedSections = arrayOfIntegerArrays(sectionNById.size()); + ArrayList> connectedSectionsSet = arrayOfIntegerSet(sectionNById.size()); + + for (OperationTemplate t : operationTemplates) { + if (t instanceof LoadingTemplate) { + LoadingTemplate op = (LoadingTemplate) t; + int section1 = sectionIdToN(op.getLoader(), op.getCargo()); + + int section2; + if (op.getBunker().isPresent()) { + section2 = sectionIdToN(op.getBunker().get(), op.getCargo()); + } else { + section2 = sectionIdToN(op.getStorage(), op.getCargo()); + } + connectedSectionsSet.get(section2).add(section1); + } + } + ArrayList> positionsOfConnectedSections = arrayOfIntegerArrays(sectionNById.size()); + for (int i = 0; i < sectionNById.size(); i++) { + positionsOfConnectedSections.set(i, integerArray(sectionNById.size(), 0)); + } + + for (int i = 0; i < sectionNById.size(); i++) { + connectedSections.set(i, new ArrayList<>(connectedSectionsSet.get(i))); + for (int j = 0; j < connectedSections.get(i).size(); j++) { + positionsOfConnectedSections.get(connectedSections.get(i).get(j)).set(i, j); + } + } + +// System.out.print("#######\n"); +// for (int i = 0; i < sectionNById.size(); i++) { +// for (Integer val : positionsOfConnectedSections.get(i)) { +// System.out.print(val + " "); +// } +// System.out.print("\n"); +// } +// System.out.print("---\n"); + + ArrayList operationsMainStorNoInSecondary = new ArrayList<>(); + ArrayList operationsSecondaryStorNoInMain = new ArrayList<>(); + + for (OperationTemplate t : operationTemplates) { + if (t instanceof LoadingTemplate) { + LoadingTemplate op = (LoadingTemplate) t; + int section1 = sectionIdToN(op.getLoader(), op.getCargo()); + + int section2; + if (op.getBunker().isPresent()) { + section2 = sectionIdToN(op.getBunker().get(), op.getCargo()); + } else { + section2 = sectionIdToN(op.getStorage(), op.getCargo()); + } + operationsMainStorNoInSecondary.add(positionsOfConnectedSections.get(section1).get(section2)); + operationsSecondaryStorNoInMain.add(positionsOfConnectedSections.get(section2).get(section1)); + } else { + operationsMainStorNoInSecondary.add(-1); + operationsSecondaryStorNoInMain.add(-1); + } + } + + int max_number_of_connected_sections = 0; + ArrayList number_of_connected_sections = new ArrayList<>(); + + for (int i = 0; i < nSectionsOfRealStorageAndBunkers; i++) { + number_of_connected_sections.add(connectedSections.get(i).size()); + max_number_of_connected_sections = Math.max(max_number_of_connected_sections, connectedSections.get(i).size()); + } + + writer.write("n_sections_of_real_storage_and_bunkers = " + nSectionsOfRealStorageAndBunkers + ";\n"); + writer.write("max_number_of_connected_sections = " + max_number_of_connected_sections + ";\n"); + writeArray(writer, "number_of_connected_sections", number_of_connected_sections, Optional.of(0)); + + writeArray(writer, "operations_main_stor_no_in_secondary", operationsMainStorNoInSecondary, (Integer i) -> i + 1, Optional.of(-1)); + writeArray(writer, "operations_secondary_stor_no_in_main", operationsSecondaryStorNoInMain, (Integer i) -> i + 1, Optional.of(-1)); + + ArrayList>> connected_op_to_pair_of_sections = new ArrayList<>(); + for (int i = 0; i <= nSectionsOfRealStorageAndBunkers; i++) { + connected_op_to_pair_of_sections.add(new ArrayList<>()); + for (int j = 0; j <= max_number_of_connected_sections; j++) { + connected_op_to_pair_of_sections.get(i).add(new ArrayList<>()); + } + } + + for (int i = 0; i < operationTemplates.size(); i++) { + if (operationTemplates.get(i) instanceof LoadingTemplate) { + LoadingTemplate op = (LoadingTemplate) operationTemplates.get(i); + int section1 = sectionIdToN(op.getLoader(), op.getCargo()); + + int section2; + if (op.getBunker().isPresent()) { + section2 = sectionIdToN(op.getBunker().get(), op.getCargo()); + } else { + section2 = sectionIdToN(op.getStorage(), op.getCargo()); + } + connected_op_to_pair_of_sections.get(section2 + 1).get(operationsMainStorNoInSecondary.get(i) + 1).add(i + 1); + } + } + locWrite2DArray(writer, "connected_op_to_pair_of_sections", connected_op_to_pair_of_sections, ConversionUtil::arrayToStringAsSet, true); + + { + ArrayList storage_greedy_upper_limit = new ArrayList<>(maxStorageVol); + ArrayList storage_greedy_lower_limit = integerArray(sectionNById.size(), 0); + + for (int i = 0; i < sectionNById.size(); i++) { + if (finalStorageVol.get(i) >= 0) { + if (finalStorageVol.get(i) <= initialStorageVol.get(i)) { + storage_greedy_lower_limit.set(i, finalStorageVol.get(i)); + } else { + storage_greedy_upper_limit.set(i, Math.min(storage_greedy_upper_limit.get(i), finalStorageVol.get(i))); + } + } + } + writeArray(writer, "storage_greedy_upper_limit", storage_greedy_upper_limit, Optional.of(0)); + writeArray(writer, "storage_greedy_lower_limit", storage_greedy_lower_limit, Optional.of(0)); + } + { + ArrayList> all_used_positions_in_real_cargo_value = arrayOfIntegerArrays(sectionNById.size()); + for (int i = 0; i < sectionNById.size(); i++) { + for (int j = 0; j < connectedSections.get(i).size(); j++) { + all_used_positions_in_real_cargo_value.get(connectedSections.get(i).get(j)).add(i + 1); + } + } + locWrite2DArray(writer, "positions_of_connected_sections", positionsOfConnectedSections, (Integer i) -> Integer.toString(i + 1), false); + writeArray(writer, "all_used_positions_in_real_cargo_value", all_used_positions_in_real_cargo_value, ConversionUtil::arrayToStringAsSet, Optional.of(new ArrayList<>())); + } + } + + void portToMiniZinc_2_greedy() throws IOException { + if (!task.isTypified()) { + throw new ParserException("Attempt to convert untyped task as typified."); + } + try { + writer = new FileWriter(fileName, false); + + writer.write("n_intervals = " + n_intervals + ";\n"); + writer.write("n_operations = " + operationTemplates.size() + ";\n"); + + writer.write("n_locations = " + locationNumberById.size() + ";\n"); + writer.write("n_moving_obj = " + movingObjects.size() + ";\n"); + writer.write("\n"); + + movingObjectLocationDefinition(false); + initialLocations(); + finalLocations(); + + defDataForCurMovingOp(); + + weatherWindowsNewFormat(); + conflictingOperationsOnStorageAndOnTypeOnMainObject(); + + requiredLocationsOnOpStart(); + + operationsContinuity(); + typifiedResourcesDefinition(); + + cargoOpUsingObj(); + addOpWithNominallyMooring(); + + writer.write("n_all_storage_sections = " + sectionNById.size() + ";\n"); + writer.write("n_cargo_types = " + cargoes.size() + ";\n"); + + maxStorageVolume(); + boundaryStorageStates(); + cargoFlows(); + cargoOperations(); + + fixedOperations(); + + dataForGreediness(); + } finally { + if (writer != null) { + writer.close(); + } + } + } } static public void portToMiniZinc_0(TaskCase task, String fileName) throws IOException { @@ -1561,6 +1751,15 @@ public class ConversionUtil { } } + static public void portToMiniZincGreedy(TaskCase task, String fileName) { + try { + Task taskData = new Task(task, fileName); + taskData.portToMiniZinc_2_greedy(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + public static void resolveMiniZincResults(TaskCase taskCase, String fileName) { ArrayList operations = null; Integer result = null; @@ -1609,7 +1808,10 @@ public class ConversionUtil { while (line.charAt(nextPos) != '}') { nextPos++; } - arrayFirstDim = Integer.valueOf(line.substring(pos, nextPos).trim()); + String []dimensions = line.substring(pos, nextPos).trim().split(" "); + if (dimensions.length > 0) { + arrayFirstDim = Integer.valueOf(dimensions[0].trim()); + } pos = nextPos + 1; while (line.charAt(pos) != '[') { pos++; diff --git a/src/inport/Main.java b/src/inport/Main.java index 6843a80..d3c30f3 100644 --- a/src/inport/Main.java +++ b/src/inport/Main.java @@ -149,6 +149,10 @@ public class Main { debug(Testing::solveTaskWithPartialCargoOp, DEFAULT_TIME_LIMIT_S); break; } + case "debug greedy" : { + debug(Testing::solveTaskWithGreedyConstraints, DEFAULT_TIME_LIMIT_S); + break; + } case "debug read-write" : { debugReadWrite(); break; @@ -289,6 +293,7 @@ public class Main { } int arrayFirstDim = ((int) task.getPlanningInterval()) + 2; + int arraySecondDim = 0; if (line.charAt(pos) == '{') { pos++; @@ -296,7 +301,14 @@ public class Main { while (line.charAt(nextPos) != '}') { nextPos++; } - arrayFirstDim = Integer.valueOf(line.substring(pos, nextPos).trim()); + String []dimensions = line.substring(pos, nextPos).trim().split(" "); + if (dimensions.length > 0) { + arrayFirstDim = Integer.valueOf(dimensions[0].trim()); + } + if (dimensions.length > 1) { + arraySecondDim = Integer.valueOf(dimensions[1].trim()); + } + pos = nextPos + 1; while (line.charAt(pos) != '[') { pos++; @@ -330,7 +342,7 @@ public class Main { maxLength = Math.max(maxLength, val.length()); } - if ((arrayFirstDim != 0) && (elements.size() % arrayFirstDim == 0)) { + if ((arrayFirstDim != 0) && (elements.size() % arrayFirstDim == 0) && ((arraySecondDim == 0) || (elements.size() % (arrayFirstDim * arraySecondDim) != 0))) { writer.write(name + " :\n"); for (int i = 0; i < elements.size(); i += arrayFirstDim) { writer.write(" "); @@ -344,6 +356,23 @@ public class Main { writer.write("\n"); } writer.write("\n"); + } else if ((arrayFirstDim != 0) && (arraySecondDim != 0) && (elements.size() % (arrayFirstDim * arraySecondDim) == 0)) { + writer.write(name + " :\n"); + for (int i = 0; i < elements.size(); i += arrayFirstDim * arraySecondDim) { + for (int j = 0; j < arrayFirstDim; j++) { + writer.write(" "); + for (int k = 0; k < arraySecondDim; k++) { + String val = elements.get(i + j * arraySecondDim + k); + for (int l = val.length(); l < maxLength; l++) { + writer.write(" "); + } + writer.write(val + " "); + } + writer.write("\n"); + } + writer.write("\n"); + } + writer.write("\n"); } } diff --git a/src/inport/Testing.java b/src/inport/Testing.java index a2a2b4f..f8a72ab 100644 --- a/src/inport/Testing.java +++ b/src/inport/Testing.java @@ -52,6 +52,15 @@ public class Testing { timeLimitS); } + public static String solveTaskWithGreedyConstraints(TaskCase task, int timeLimitS) { + return solveTask( + task, + "conversion_2_greedy.mzn", + ConversionUtil::portToMiniZincGreedy, + ConversionUtil::resolveMiniZincResults, + timeLimitS); + } + public static String solveTask_2_0(TaskCase task, int timeLimitS) { return solveTask( task, diff --git a/tests/requiring_optimization/Case_SPB.tipp b/tests/requiring_optimization/Case_SPB.tipp index aa4456d..f708d31 100644 --- a/tests/requiring_optimization/Case_SPB.tipp +++ b/tests/requiring_optimization/Case_SPB.tipp @@ -292,7 +292,7 @@ Final Storage State 10002; 38; 4500 Task Properties -100.0; 0 +20.0; 0 Solution diff --git "a/\320\237\320\273\320\260\320\275\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\320\276\321\200\321\202\320\276\320\262\321\213\321\205 \320\276\320\277\320\265\321\200\320\260\321\206\320\270\320\271.docx" "b/\320\237\320\273\320\260\320\275\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\320\276\321\200\321\202\320\276\320\262\321\213\321\205 \320\276\320\277\320\265\321\200\320\260\321\206\320\270\320\271.docx" index 13dac3982343770318491436e05bb0b0ee136095..996dc24e16333c2d788863e1f369cd8fd3ee5225 100644 GIT binary patch delta 35530 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 delta 35498 zcmb4}Ra6~Kx31CP7Tn$4A-KB)ch}(VH16&Y+}+*X-5r8kNN|V4_x=CgH~Z?0IjZ}n z$EwxURkP;%)H@deUK9adD+B}Ep_Ru(6bJ%>ES@L>gAJTJZiqKueki+agYMHPXrgP9 zP)jFe+We_ErIkuPRv90gd>w67L53W2rV_?2th~znrrK_87ds-avX=h3#-7;LKTpy2ygQygzoM6|CE!*#>e^6o*6^xksK380f4u8|H2WB@?!HEqJgzE1ox?Tv4$Ru?6aK)}L=fDt)?|JhJ$Flx>&Pe%xuD zQ+v4@PJ2dq-i)U#w;J;Ad3FdnPaw<@-3+vgz+LM(Oz0+py+$u&D4E+R;!a64P04fi z^G9cSoA4b-^~m$Cm1?ip*kMczTp!GNSvVj<_Tcy zdjjMu$Z;L3<~$sz=2yeCGx0A#i!Pz8tC2=B71&&?8g3fb?G;`suUuX<3)jGTCrs+Q ztfqe9+zgR=BwFr@-wm6eBd8{-pH+%QnSL#37d7%Z#Ax86Jv&o=-b`w?V~T8g-aSed z&a3Bg^2$!9znMM8!OvtwKR!C%fcisYbq%O>iJ8MDOV@Q8WIb)VG6UDgI6l19^*0I! zpWj8bI4;7~G$ZE6p2-c;@>n{zL;h3fQ1Q)bqsN`|OMHeExCp=Ni}-oUJLmJ-S15eD zzXj5dsb4$n*f4V+gvkI%Kp~FBO?Y5lsFhj??sDRl=`a`CaZkG{De)ZNusZ&+S&x@`pxgx!fd~z%L zL|SGSuNQG$+e+<`q~SY#U~VcPTC3nbRI31|bnF4A;)-K+yZ(ImJ*hyIER3(bK_y!| z&F(y)=8TK+xZIeazHIskv#P{p2>78nCgU`T8l(5uc)&8|k8#`4>*&E{z{FYbRYGA5 z3yTkJKiFBI-9nQ*F;&+ffA1>w=Bw;+OOv4G*~k%5nkQ z>OP%>%Fb zpSpnTS2B`l9Nc|upp$j&-=ht7*SEYUt#M>X5N6Jpr#8D?91qTKK+w|DrnJ~eH zXFvJ|K}P9)ygjB!LHjE_F`@O$1vfjH0v9ebiwii+kpxv#h}o~8ao&l7|C@7IBA)pwYB_?JbB#UbROdZ)N@MQ*3u4m z!FpdkEU5eiL_?Ntd=U2zMAP7oLt#UXzluklcp{qp&0-&O#0XFXal^_IEEbNfa1)su z_s~X~Xg~Yrkb(&(lS1MR6|l%cIjud`5C<;A_&OA(_}KQjy#V&E?59Q7ilMGXR!^^3 zO<00V`Ih*zrqRV;f?2;2tV%j6Kr4^^3>}W`lS*p2a9gPIMaxI{AEHu0h4;X})+jN| zOue8m&gGTtlBm9>3CLWcMZyL9($tpPTC$53v~1w4yCmUQ3LNlnx^uAh@~RD(lSzpQ zTp;M(v&x-kbOOKFB{VXqRU?vZVWwbfey|aKrm`;g;ihuM>dl`rrkFl?f**n>r92#^ zCg11_LrpwoAxk>#JPg&D$j?`*{4mIHp1&63cQO}9==(1Q3i9P35YOBP@a`blR!BsF zqv+-;f&?B?;sxS;hj_&07hv4<;|r(=Qnj!di-){gdjpP$Gg{a7S91ttvirYV+)}1l z;WritKs||oq~Qr6KovvtiI+4*O>jnoc*Ck z92xgDXB=z%<`%B^WDoTo#tVXn9P1MHl2{sihzTbQ;po@6O#^${G6Z@>pDy+;_Ob|~ zZwixc9ObER;wX#Ec&St~+)&Vct*NA+1X7gG>|_&So_Gbl^2T-->rswu9WJ-Cc=&^` zlYy^@_43gRA{5|%e#Gk@k~YDGy^Bp;VT%_pJxA3g(Tk+Dc4c3I>rXCe8uY*W*j+@T zzuDl5$ker~+c`wurPPdnmFoX9=7%4VtbKcsU6dF!xfcH?D6hbk>2V6;GOaU=v>P_c z3rdX#J7(uNwy;GftwK-3$#t~BUUPy@7ZvC_WiIe0$Chfjiu&*(lC_M*&Vn|O&{eN~ z&=lWqP5_wg_cSR;lTj-LP#rFJl8B0g*W(aSD$+>ZiO@OUKk^|l_ zdLi*L-up_DEYsV~5z_)Oe(j*6l;X99f|Jw3Z%tG$G4+{FZOjJ8v9Fee@4nk(!N5A1mISM;ypoGP8eoJL8P^rl3u$M2it@WjHmiaOLZuX?m6}Que|G07W_DyJbD54QzD2bp85$H!Lva}t zDQZTN?1^b}r<{d&ym(V1J$V)kd|&Gk6}_?Qm|sFsimrj27E~D@zrGzt4;b)szFbI` zyZgy}v9OV1y6&kW=`6_#I$&Vk;fQk?N4w;W3(cX)3tZcv5sEoIuYZ(EYXf$*avqy2Vtm)iRf*>>^E^V2huuJ=~ zCY$~7&}ps?VtcM|`GT%(=$Mm_fB$78#E}nFGsUn(zi+?(L&kB$Z{Ctl%>nktbv_H1 ztCCjONa#eGLy9VPRR?4r??15h)~z7ztdty!1(KG%%PifHM}iZ{Fz@3=Np_7o%8nmH zV#x#--C;}m(Dze)Gq!UHfNLfx>b6@4p(4aQd{Z+j%D!$Bd)N*ZRvORHFz^=tmY&HS zCb=0vraL$qY0=7rv4(#7OBfL&iZc3TICd{Q#wswuODRCi-y1-p*bzc)nCH)k5y_T1 zLyl8kxDu?Q#G2@&W=Jowxr)$E|@nsYbIxsX+=SqnX2FQ zFnkO#y@y{UQ^SV7cd2ixFV$2Hqm8#bfmJnSEL-y_uGs*u#qHMbXPG)G=i0ak8y@E% zJ%xF`o)Wf|&A^-ZD^12*vH=c!{!=>fC~?j95vqNA#t35-XkXrS|b> zTDvBdzPWGdh|fcW8;U^1*w5GV#ErXk&jC+Ai;&in?>4GW$(24fUGpl9pktQ>V;sI| zI1I->(cRs#iO1TYms|{tJ~gd^$EzCvsTC0+6@^T8Rkp3yv)n}uE>=kx zh72H6H@mm2D)nK`Gndh<=Q!Mc0+PJpJJ5Z3Rh0MVDPx{fZOkQ}-pPpf90BHT*x$m5 zYKChz=>cRCh2GBYC;7Hn?{{+CRcvGaTBpv{^p{=fK&j&T=eEx3%{jF6gV4q{2o(eb z@N#+aGrw{PKlUeP6dDAISVKDBl$Wlo?}LCY)#Qjmy0+@FUkb&`Wj<%KaDrn!9sLkJ zu~j+6iciXLRF$)ivO2*)*dh)xlKRz&RE({V1`*v`P*E1A05P{44${Z-pGM z9YnMr+NP;GyRaZl_1Gr1-O}A6X;44Kgjtl^}H&ZeI}5C=OAa*EQF49zrJ03T8${egIp>KG?5V-12E+xo+afX9+Sk+ zj6>PYx^m#@|AvD~2;O733F-<=`*U#nX!f>~ z;n+^I7mX&Daoe`RB|QChh^ea-?%~9P_3SXl zxlw0>a+=+Cpw$tA19(pJN7D*R2}&x-V-(_&)8MbH#_`^BK){f_eU%t*Bn zi#An)_-A!oy6Uu^-}#1EX%X2-sFWqmP*S(Fey^%M+cQX!9JqzflMbTMg`k`0HOK16 zR_HZ=_B6fsCvhs^k!ULvGhNq$D0-sn?*T{sA~G{ z?DgBh_1evn0=q3Hg@}&`%*J$f2r}ujYd;2*kIuNvu1-H@W23;|s;*##f0Z-nIZ-J! zvHoT`jBfdy6g_f^t1!eASe636>4<$7@kJcwRU-2nx$qzP+DnQCvx}k>3XwHAFjNb|EEs_3Q@Qv? zR^RiNUJcgm55sz}-A&~3Lc7tOcs5E`8N1|wq+R;*3R#nAPb#_cG<=k!GfXOy=zfjE{ ze){jGO3Q2I(~4}%;r_)%b}!wr*uuR*5kTsnJvbxH+$e$QEU_J))t_jZs6ZC$<%F}` z9qF9GoHx%A`SOu8QT{<`LBr_mQw_^JxA~5>Y%y~VI9xc0Z2X=r=1pycim4lrzvlB| zAY0cMaUbp`Xy|xE+vTM2GFaz+=Hwc)ew$4IxC{M! zsBMsV%{|ZN@egvSc7NbNA`>HuI@HrFtkarZ{t6;w@b;%tfALzmoAfKC1Mu>rS!MIG zQB%!LPIiP}mcM$D-mOAqFD-9lOREeR#+6BhR+;k}@=<+TKQqkp{z>}tf3~GpiV*Li zn&~mIrtYS>+N>7DzcM($S&7@h@Q;@jyFtcCwR-~Z{3W&1^KUOEGsw~OsdCJ&c=XBc z7q#aWrmn7eH#+AIpd@L**ONx3+uyK!AQHd*625Y9^UpGo*d=e=u=>iviccJgVSC>J z!52UvRwU6E6cbCso!Cxg){_|jO<{+&xmFL)qh&zj+WIcZ`c+j5_@E8!C44l?m4Ju6 zd1JS1=SNSGBC4rK(41FIE1Q zWa8G0qQ;-p^|PP0;&^M%C_A!z;~ydJxKo{d6B^sGd=aK>q(5b_<6ysF|Lr@@Q1~Sc zH%sZG!%f;0DoWrQnELMK?iH(HrLd)gw;=6MIaaogfoB&>c_fx4*n}1B|0AoIVY87} zk^Yv7g%7NJDtj@S;Cv`&BvC%NYy3QQ2)eVLE#R6e9<%_W!1FK;tuy*AWfwkr-%-^9`)tdFS&< zr{7JaCs)f1g(h*H1G=Zbg4o_VENV$G(hZ{~X0b4biwhBHQ~c5MBzhx0GfeFsG!yFV zFF!F=umX{h*?3f(XZY0MlUW9m0<0odHtEp0KZ|)=nz_0sD6_VoskAY2)Z(m;QD0*L z+{OzyBVyxB_T1`75_`9Fw-Tvlcb`LYsoE!oAo;2O7RF4Jp+6^esU@cB^7WT9NC7-( z0n#I6SJ#RU)Q6U-{Me$?f`1GIno+;`;QXzUm zpruAFf({YOX5KS7sJp7Hhp|RDw}(Vb{uTt%H_~`c`KciNOt{4gSo*cu?x{^ zK*$F+@WwYXAJlXe_ySsB{%Lj#V!ce}aYNjJrLH(b)}X`q>ZYK+k#IfqAU#5{eme>A z-*!1CF$%q#bGsfoSIO$C)i$&jjPu$Ub?ut=v!)JJi`L57Yv*}EmXO)MXw^@H0Q85m z=TsQGu7dHqu4JSx_B_ZO1ab;v!wTMb2=XG%SOYR4A*oE`S^SwHHadBdy_UU}*u9pk ze`&h?bX12z)C15~|BmYl*Zxu^JnaopUv#-J3__?OqWgS8p9sI2*obamNTarl3k`-D zV^HIo2NMJ99^QEM2Ie8)k2|_EFhINL+K&uXnfARhZ0q}H2NC~?>atd$IwMd)=Lfd*nOt^m%&Bny;fydcv5%`8vSo_W{k zU}Xr4u!N)$x9_7Ez(j}=Da0yJ2ocX=YR}=v3f1Mylk{@{{2ap2ju93iFCUs`d=+nF zjgth^R_VzRa6gE6;kh8VAbJ8`VJ}$W!~*m|d%%AEx)AA@?FM&!?`svwM*vCX0|~9d z&65PN2eF5SKSr4T{2kYmDxf{~%AKI!18Y!{)$dC~=$ASaGBg+qWTjAhz5A=2*eax2 zQn-Ki3<#j6Cn`PEnx*+k?A%hf4u^gwOne2WP_i)lv*w;wom^h06ILgcU2|diVOXc* zoa%dgNHG7$I(>~P(ST!qrXwz!@CKdiAATW|Y12$Vg<$5Lv@~<*au`!QYC;kg``ix+WKY315a|>SQqGq%Uqp zxn_58YF5?nk?&surcW@3W!}1cX-)}O=`T3$_k*%nkaq0ji%^&*MR2?BrVpczHO!3V z)`HnzHK1cCcQl5nJ%$o82zl_#`W=Xve{q}P@yGdYKk4Ng>-@Ood}c;Xw3Dg~0>Q)i z0E%*OcH~`kZXPoTZ-D5*4j39Q`N zQbexYE=aW>$BmuyV@lp=+Ey94>C~<)yh&XAeF`ezTO}2sxF!lP#UuL21pwgI=UO>4%X7(KiBKFz>q#iiF z_@n8$jeg?{aarL=d}j#UF<|Y9Rvx{VKIEBxa3Kdf_E(;E7dH;s>q}Q!YkjsO0h!A( zF;LKx$}e=%6_YXJaK}-OH_q^H%Db;V$gTAWf7$nybec31*=R+@&K{B7jl#a zWkR${7p(1I5IxDxWzTAY`a@0io`WV~Y`z}%kwBIhxl-mUJ98XE*p(3Uv+$Z7hS+MQ z?J6R!Gfot?_jkQ^43#q>poZ9ih{zdijP8-v5r_DP1z#D)UW+Z%H5De)rF?eef2B_GoXp#yBWpy)Co}&n zHjpuUDYr=X>~Rdd2>pzsNM%csj&1~ZZFU=>canMhcj(or5wqGAx#ZBVYLz7TaY;;-V zCulql9-WqeRj5r{uBD(o^17V^BdTyN{Nh&G%H{UZOqCTcI&z_8fH!-#B>%3!z@32a zI{QPhmPixBnS9(IpV|nD+{&MLjAfABj$~gJd!Oq2;8muclrDAxd$f?L)hgz5kW>C2 z!`^3}vd9xaQ~}1*YVTYXd5XF1`;E+Va41%}`U)%C`op5-EThv{B7ECLCqwoaT6O_c z2-yVk_n-qM0Wi{pWq66Vw5SHsAZ4%*Qcv0PYF@SSs-yb$6zSGY{ZZ1Oz=F(7EaZUL zTCcizPRR((8VIqiEtR4)vDK~b#c7bv$E@oeAPk;w1$^H;Um|><8yKjs?rgakMn>yhcd)V>_@03eRA6 za&3p#jZFONT4wA^5=}Qk*O}(RMb?rLv#6@uyiZof)Mj;4x^i$q(VvLwIp+D9)#wBl z$M+SGWS+I=01?~t>(@M8c3Vb-5C2IFE|(8>O1#9${c2&vHaYQyiR*hO>`nb;%|NI1 ziMpX4NB%bCjXE#YvTahL-Q_ zySQSwiKan~+zY{^WD>Tw%r@$qhQJ*y35*&rI1TId*w(RjTEs(9tBm4jz0xgh>>7rR za#9lsEjs+;3^@$1d?GsD1(O&Ff@A;*99q;&-?r;qV|cVhh&tR|chL7raA_Nv21hqD zz+t##5jS(cHT}xJ?pKnX88AtTVTW8NnN98g-~&o)WG42p`+YdgKiIK=;#>Txb#e|+ zSqVR;E%y{#l~G*D@OgHL$J20lj1((TIvzV8rjM|sJ6IC}pzo=N>6d+u*v|8N#5u)Sd0DIJhmA6tU)(}Vus?d|iCsDKLVP+9N0M{8tBeqBT6eQn z-+t|`L?bJwYelz0l`>!(6S#S)YbQ-8H54A2&`!Y@&;CQ)xD9pifp~JOXx_+lSUydb zs5!^2TfuGQ0*qC|(@C6r57Sl(Rlpk~!88dR+o%`h>Ciy@b-Ao-i$EiuiZ;q;pBtC# zF`H|c-=_6*y;cCY=FfThk0`QX+O*acy-s5hbV4P{>ut0-uva(J`mh3jUfE?fxqgXR zJB`O))PlZ?_LB}0AS@&iLjWWmHm!fP`#~@UtB^cyNX4^DSZLQxbHdWID#8NI3i{>z z=(Z~8R4%VESyi8SoH~#!AxfsO10bMmTA(by@QwSZRW<=ioC1^QYG*yBv1{EPrg@6g zC{?1bzIPAxC+r=&tn$$|La-~emlbC#Ht#8Rm?!1`BUZ(pHB+bbvl1hJ_*fMf^4Q_; zrm`(6{27g2y06&@(-&*V`9ETn*y&TON;60tPl(B+TgO^8rSFme=7`;CP(2rhO+yI3 zm5Z9+OHJoW*#zvmrrYyr-kW^WW%J})6+1m8mekOz#(>g7#MioLt*u2`iZ(td^+h$A ztrPCbHC!`-qL8&66!+}JkG)u%(w?OQx%a!V-<~#IhJ1o-B09IF&E>Ds%iYa-mgNV2 zCWIQtUSr1o7)4vAGf`r{9_K_6ww^3#-d#dEGFIre%5; z#g$EWNo#}Fswq*dJ}#51ii%>a**^^Mn=oG3K58X_DSN!gl?3yO5|jNJ>E{PFV0r?d z7n63V@DfbimOr2@1JB?}qN(hVIyqUXNU_r#A0lZ08G;IvGl>>-TqqXg@KaL>w(WwH zD5fDn**`L)S#C?05P;VD5f`4m?(5$mt@#XlUo z%xwVn!a$i3c9%nkb}I!ZcO$rVpW^GcoM8d2c^k<((8w8vH4%!N>Q z^Pi*H$e_OLub^%&f%^EV`h5HUusVnyoPU~cQ>0&CO^7~1kLRt4|K|lNIXMHmZay?ej$^VIX2piEND0vJ;|vXih&0vq+-VRq%ya?y0QuD*|o{4>o=L z=4lY4`Lb=UGIZ?+eSNGhq|{LCU8i_FB|FSklOEhzpwR}ek>L%oar*nQ;($e=K5jvw z6O>$oPw7n+c1Wy25b)m%Hxr2l!B=aK(Za=mT0xCx7#S~@*&ydBAxbEXVx+4|jw@aV zk^owJ*sUe#zU0;bTJ(R>FNFFhGN>kM{RbHg^ZbJh_IU4)TckVh6rUmK;i13=M?zGOH>(RXg@z`C3g` zvnV{ome~_4n)Fv=xIGz&->&4~Z%Mk|ct3)^cuDcIUCAgAsOZ@9UE{OwP!I!f23i<~ zI1Q*(Q2&RIYk&jv-N2^vO?XJQM4?;QNzfaYp}KenI4u#OcsYEuis6Om zGZA64!KWs^2E8_nVP=nGjLEir(2hI70-G0$#QOCIX}H>#!4I(QD8;V{C?RYh{1c`7 zB|LU@jFiTY@>GJ4{FZmNwyU0?<5tiJ%5AMEpJ+$hI7fF<&pE$mnelX9icE(lTp_%4@8G+?yVBtBM#;Lv?_=W(4`9XI{xYF?~ z4mL-iG74w23^^ew5t6+XH5qYnx461M{L2q}5e>ya+)I{C)4?pN%b+RSJjpN~;>)1c z1;r4)76;0Ax2pCcOIfuIf&kU;NK2T%=pIKEch4dLlqH9eAM$=V@cubWAtXL}5cg6c zBz=*7nDP3IM&7R>dAyJn23~9$h$x2eLfAL~{aAjthTPT@&|+XI;3*=aTy~=j_B}0c zr2X%>*PBVN`NLt4hW4bxuT-4^|5dRBtq6h0S-_g3^F3T_F=MbfS(*l-M1KAs`s54v8ah+F@Ka~uHGv4uYiNu)%`(%ZMF4Pgkz|bK6joaz{Dt500 zC!b%2D(M})!C2EQY?;B#gr@_+s~*@95IWHR#z`<7r6{^Ul1Cp_D6?&5A4xNL2ni@1 z7~K&jT?`U0JRJ1*BglP35FK$)y!!_rkOZ_>=qw-9o}nI1bXI5D9ad*?7r`F#8nHD2 zy)__uFjvx#HjJ}~e;ZB0r`}N3quI0lH@aQ>dR9qiS=re-U$hpfij8g}XSc;zhN;%I zLYel5`aE!vR1PPc>lM9JM;t4$J71N%WA#}+woSube<$u?b$#b%yd0^XQ@{g~-)}`u z+e_EosHbtfmK&n%qA@R~1FNO|_IeeD{ohm6A9#{hV^c4h)xR#Gm^@_HAM4awZOci0 z%-|lw?-dw;lIN<1wMCGitN;vNXa?-uk*jP+)^Z@Re5pVs9DWL0ka_katmfK@)L!>wdP8KB!DDfr{##Q6U~3wr-YpU63@X^>r7-5 z*B&FwREQv~L4urO)!Zp`+OCo*cuk}uGN=*o=`Q)Cg)QX&p@l5S#^JdCrG-=;O!oJ? zw|_vunLRV$i;)@k}4KKu>L5N-Z zK64f_*uT*ZDqNwJX6GJ9Ds)LC!QunK#i$`;?|G&;w?a_Mb9+*Z=9f=rV}^ny6=OzZ0sHy=JDlrx3PL= zGO?b>{10y2DbvtfTcmbv+gtjIa_xf)H};D2riSF}-(KV|Rw6x228dE&~-dK ze`5ZTmJcca9_!F{S9X&EE(AI;2hnnt^;QC@|1GG;IL*f!ox{I(KfGD8C}wwkO8ysT zw@C)V;p(eTW7cXx0L-%{!&5xI*m2hv(nOIPpQZ)A;AZN9eNCHjBghCk2P z4P^79e*NqLW|5r6LdM{)40B*#YKcu01dMii*!50IhFPfqiG10<+V}v&0lj@#H5x-- zkY$P~khcU7dgXALH~h4CI@U0B_+gxmPRH$P2api5apZm6YFsY^k$USHKvS*%~jxt*+^p^vJaV~rD=&G1>R_TiYvR>(} zjD;*(_0l0fLeoL8t_mnx!$`7rEJ3-SH^iy+P4!}j8q5Q5Y zI^=h!i=Y0yqCgiZr`kr3FR3rOT=}Zk-*7eUqMGxIL_QI=6g8}?d+wNd$MEff*f((4BT!_|Y0n@-(>;UGZf*CEi~L&I(!tnCuux@#2X> zXa%eVE<$S2Y?q&xNkBIW#v)q?P5reu3Bp)mUUeS5PkS2HpE5k|2 zv)x}{yTrH9f0?k$zUXmZ&~XGXX86q%VoGrgu&rx@`s2 zEMrKPPIVwAQ0UxbMk3~+yQ&!G<2P>Y5H;tya(^?;TX&}zrWv-= z8{o3n=(M3G81N59HW9?tab<$r#($?*b1=}QL?(N*aC~DtwqZkBTW>vGRq+}Ih@YE7 zoJ`i2?BS~JQ(6B#QkY!)pt(Oi`dN}Q%MlX#xkuP(wMz6TkiW72c2M|&h}k^^L~pH^uc`4x{k@K#kk!%%D$e;)9@F< z*1fAW9)3OZXbmm#&moWdok1X9#wgL(@L~;GcJka1{Hk}1QA)rpHS65&1az)}EXa1W z*paQ7WAIe#4d!<+1H9JDrupwWr#>?2myll?c-)cQta^@O#6ztHjey8_K~Eyq660Ni zuQm{HKQOng`~8kEO1IwWvlLycU|?rPB)d6=;q+w`EkoHiP});>s{m#oS)+%2y(m{n zUGIZpSj`A=c`jD0TyGk(Q)@*8{&?@~m~7HdpLpjH% zcUxX~LfySB@R*gU>D!+T zV4|YMe2o}xXBfqgs~j`t6)tTmV@`Zr+KMW_xEGa-LRv}?ZD1*Ul-D;`Q>^vK$*Hbf zS~{mf7gk$c4`b46TBSSU+kGre^$rhoj`YM5#B?p(y5GL)88=nz#J3axpSt?oO-8rpOw0{ zF;XL8dYj!$_$L5wU^BcMX^)vk&s{tpTE@72O^#=ziuZj_qb53 zVhczCW?uG^v!M&RhUWU0lc{iSPxCV%5Y(I5Sv~6a6q0xijAv?*7)9HE=$sr9wj>U$ zgWOzspJ9@;oIH#*bv-(Dtmy1Y6_OB&=Ct&_FRRGG;Ag~ERLOa+2j#z3fFl`NBO5=MON+ecnYWQzge+S?b=s_6jn zg>1sl_-Gqz>L^Y7;!dEcrokF@RqdgcE7?5I zHymQ))1ap`!>RBWzB?9^ArC7(%3<}Gu6 zP2u#LwyiTVo$+}OAXA`}`NT7{7qAa((fYRn6HXhcpsTVq^#Tocdy0)y>Rl_N6082% z+;vCAN;O_ZU&J;B+O-fCGq#3C4ge^ z$@>k8`>ZzvwmJb?4a1z=oUDqpR}@b8*4JNuCLykjI84Swhk|VhAbq&D4!eQZzDm16 z{(oU%vU_k{u<%e*^{4-mb$i5SPUt_3P|X-32!Q0c6BIPq??NVnP8&phOn^S3_>x&d;jjx7`Ml5PrXL{xp?1YJ8QcxK!!Sg=Ks zZZ7iWD830}RGk>Dw%*>(kuF{Y5r~!kue$}bqOL^ptP_H+TRKHX27fK0%gh|)A5-E# z6zO|i@3bsI&0lw#9~==ZW?3FizrMD%ffi>wHV)-%P-K;awcGSV>#P7PEC#$_)wr-L z$$sa#61^^;)((5!jQf3g%5mH&{)2zbge$LS-W0MCF&@}=zDd-Sk;&~CIYE_W89Ibq zC1$dP`x))mTw5e8u%t>>g1ntSxYkhjC_2>%VxlYARHE1}`{x;bQcETxs$$`gz%QzV zKeS8`!iZ2@{X4>H0hvw1)c?9tbUz7G2hqhRVOq;D!5RJ^eE1uOXJpxzL*jE9@g=J} zG6Z)Q21*Pw{6-VSE$qr;RBUunVLKWXB} zCuHmGVS@x;fce6Fe)L0+>HLTY&TQ*zG9ob9{(Xh{JVcXovOU^jxhhPPvo#XB1EK+~ z46b9+v!c3$fcOH8Pk7a|vS?bQSI2}pEVnK53az!&eA7>j=#L;Rwh*n8Anhz^Zt|x9 zOcWif&cy!Tzy6FgZ0ps)-Vl&|l@Jk!!)W1Fy*(sMsmp%5`Sqsg+?yB$0807tb{<1& z7(L}m81CR6eo}rejBdLl)2-N&BFX%vExDs1P<-u|dC+$p8fbF9w6Ud51Lnj)I*rMsQfC8Z zR2Tfn^Zn?&gR7A6 zX=3oLAn?$9U|;?Lf}sAO$}yn-1%gmhrq(C`iB96V9665S2`{u_SRZ^YldYl#9SFK` zydUhRcPqCaCAZ+J&!4}UzkD1OdfU)_Z1(S0@wSD~g<60G4TcMWiyoW{A@ZP3lHXU! zAf6Xv42ce3gG@npq}`k@A+)y8GrseN$mk#clW{oTu+sIiu7a3w6l6pY7Mu|s0~nA} zg`NM&MEF7Vc3rM|TGQ`qMer8FMHs!07)4A)&K^ZhCJ>0f(RA2E z1~{j3W5?~GC_*yFLV_|;VSXufA~F|ppRA`bXpuM~!-whA_#E5>ZFWSO?@OO{+Rt=- zt=EqWA0NAo;pJoXU;Kg*?&s?X^gz!R$rmF^TiC*0v5ntvr0fvm#kxiH7K)CWypfQ2 zUJIMs2g|Kg7+&9bebyr1j6XC59rA~pjE`yK^z(8K(pkyKyCWD$#FU<&?#1Wh@TR$) zrqg%0S)GPy++T8<2sz0T6TET&$DLfpN?)750&jVqi3B97l)M^qaEE~$;lSma1VV%G zet<&ivs?B^a_JZ5kkKV!Yz@6?FXWi_>K5xaz6;zcRdv)VZg~1B3CI2TMm~A8Xe4^= z{Ce8hs7xQR6t_#7+a$y!cnHu`^{G5_JpiyGFIz{hlH5QPix68TEjU_a{dJbsEwyzQZB*W zZQ9P7wIQATXy@YTcfNHv9lh6H(HgZ9=u@C&DPdCU9nO#&(W%%2+On8t4N_sV0~Sj-z*%V;9I+- ziYgyV({g00X9|iF6G4PH`Oa*XVxfY~S{B)AK`o(lOlfdB)dCFiAFY9%^^Y0jb?BM2 zBfaq!;(}g&XMXz1L{u*D^VqE6LqFkT&^zpsi^a$tG%witC=;p5be|Po)dLtNRIyK* zuDG~Deh0CKfA!CN1YfOz;|mY~0dhfTr&uP!Q>Zs5)a4taG~@BFr?|DR<56vlibzG} z8)2A8gd&eA)Bs+RW6{7`+1A=ywbj9~kdR&29&mX>@V;c(K-y7cP(ERM$i8GS2=)1Y z4;`-l5s~KKs&Wv(W|2fNa`jR22wAv3HSQZM{2Rtm>e2FwIK7LXFDlrZyP3`gR=mJ{ zp+Fg#kFs48xGRc$WzwdJ8s|!7ADd9fe4eClR2>kdXFQp*6tZe&+i=RN(4JJOG;6TH zt$jd`?z%1OS33HVWY*v_>q+$IW-)Ef$=I`gItJpdHzGI-x^h-sAaoWfI&`-YJ$l0~ z6zQaYGuV>V@*tqc==sN(MyOmad00{*mBpK+lxKh$HVP#L*Vkz_FBTVXDn58vzuBGC zhB3f^*^9UqOB~yv?pN(9Ni9~R$$=Ia9me-kz)fY&s#KpDTY~13m|je$&6~uT&F7NpBBwclp!3#z!8vJm9j}MWO-IXYH%J|b z=WmP8_(XXy_n0ZWjDn`Syn<)QOZ2?Ua7@6RCV^ICZFg;V^C-4f;$h80TJDXp_$uF> zUca$J?3l(KsfXO=^ZKIl+ja*pVS{gpd@|3<-DXzXlak#)(43@1UQzr#ZD+iAyco~D z4NUECbAmR|<`$FFhvxMhX*n~I!ruas9rGC^;f1G*_?qT@dg=Nae_1M1=vJK(la2xW zw#fip=0*}(jEkYx&)g^4-{$CkV~}`}S9q$-g1yM0JPYw?F6E`Z2zJ^EV|i)lNwori#K8;nuv!GfRcidVi09U zPmYd8W%AR;VXtWm$6o2GH(z zs4=l^V-HuyQclCgV?PBxxNZ=_a<(9%1;aFWDN8X1)+D2cNMS*+OgX#?25J8Hf2ZXqX~*L^Bt z_eEPvV^J{sHF64w;b~QT4u-|c6n#nO1#Nw&lX~8lbNALJMs^(D$c*jm@cpAR0&vDg z@FJQ&w=VQ(8F7< z9T0TKHR6j}W!yCe!|xrWE{Lo}!h!UJ!XYOp4U7cGAwT{evP=>aH-MfH7!!9OpqfpE zk_fc;1jwz$V~swjxd2izUqAd^Bnfs{F{jKm{inhB1E%Am7kbTc!O=1Z8A*k@!NO3; z(cyW~^mftoTA?Ii#UP5t#m~S_!A`|RKtkeEXrKg-@wy{Q%c$;qKauqVJ50>qZGFbn zBTmAAYw8BJG2dX$G3q)tt8Le-za4TF47$fFbGveW@_@MCk)p3it~MD2HYjZPPM%S4-a@4cPP zbrL;B&+@)0N&^o{?Gs7Zo@4a*k0*IDupbN{T#|qqOG=$)v#Uuetnl?dmJSZSlV-b@ z0mPqvUP}&wb!G;q9Y1r2*PL|rCjr8$atdNNTqd<~@&F^2ixYB9hhJ=8xYG6pmUk}f;$eAJfFaFu|M@UNwNJpcUTv8R6WXwrX>EnAgWS zTB2QBO*z`DnnXo3^DX%r*5 z_T;j578PBxY5`8eJ9!FQWO(aP8<&2?N7I=VT@kWXU>GgYIq_FWcy zCA+|pKWPS?UX}Z{gF#C7m5bsbN3P}S|E(MVh`AGZ1i{C5zgH=y@L8QjqLp-MR^$m8$^b{<2^mJkhB{6&^By$#dG#W) zn90-=cEA9n@QK*&0Tf?7X~kLu{A|7<+xxIM`y9QgEo;Q?y!-$yJ&(6&HOyK&0zxa% z@7(q_y&FBMX^phkp?e4$fgcJct z^o4di0-)WYXUN^5S0#x$Al#w3{~{c$iByM|css!93xx>xQHZWtIsNvtxrgkRsd-=7 z$da~6B*=pDBT#q@NQ_HKtbwBf_k^M%1zoig!Kg@&cTI|3IX z7`Huk#2I}>j~2+ap)~?>ZP52KlD}f)m-?Eb^0`n3|{PI9WBmo4x?2Cbce;k?Mvd9fF<9JxC!9II_3-+ z2_ZD^LBHrwVDYAf!Gx7m(L(M*)r&l@a{F35P?uk&dcpcK+_j<;4X|MSNQ6~RbgA>G z`~I##EPP^EkWHuV`)lL7+S1j^)6b2ID^WybEL41Vt*_SDW5vO|1OgTC6)EVnOHtcR zV+=&uH?Qi8xr-VDzm}kn*I1VrE>tcN0EF*f|5Pu^T&gNEt}Je^#9BWldot9FYpgL} z7qGhSDqo&(x;0W=3+^AKKd8CNDaPckdNhA$8{%d%@Um@N(E z46i$nmUEOgFVb17n+?j%=OGsFV?@KSaDR2H8(955BLGUfau)7GFVe0ARrPn>{+)sv zUvc!X_3c-oy3}Zi!V~M_v2>R0l$!AagFOvX!W}HaHSXiNl>qF0Ggl6MD&%igGX20P zu=1o08slEcN8FF&tE)5dFZ~m{8Np_RC2pR&Ja(9zpcc9j_}5=K6%+r@FOh~yRg&UY zu@14K$?%38o}zC4;nnt>_c%a6843?sj+ate%(}qLD?_`jObA-;O3tSKlXKy=5K(Y3 zPadmE(qvGPvMK<*b6JeA7p%V0|6XjmvIbBWuEsx1b(np<{8ag zyddv343thym3_^^Ug3uOO`4Sg2mNmqg8t2Hdcm|6z0pqjkeZ=EvQS99pi$*W*`N*( z-H6|6{6jT9f>5I+t6^u=y6a20I+C2G0VQX~O!oQoxY;mD#E&B@>SkxnII=?yh{9v{NGqI(FMjAP zjMJT4W`cNP*4osQ6B{<_=MC8@YHMG%aK=(;O zwp+W;&iFiNQ!%rV%X!SWcRL`jJG!sa!*fL!_3)p|W*>M@X{ao()$jd*|7Q>;@X<@> zQla>$sYr4ifbCYyF7}1SiFo$UN15yM+adQf_5pV_7O?Rl>8~R^xg7p0(^Wb92iZwD z!tv4A0G)Y3pZ31VRJ4c>ci=J6-=7%I*7eNAW505I?S5A=8UF<0R;MH)IDQ9Yj<1{3 z6%*!N%@qd+C;N7qxx{RA>w8ppOa;`Bq#0aoKeO0DcTROcwgP+-Bs}Z*Bc|F}=UcI_ zWo@sv1?&)n;I!C^K7xs{$Q~I<)P`iw3UYSiNJ{Ua+n@z5t#RA+A5^BAG$Gd_aMRW) zP1FY_!U==1YK@c9>wlV%|AGgs#$(l@*Qi(;7x#1X6SH%1enb(lRKT_;N(2)Oj;Px8 z9l1+~Sd&27D8|vVQ~YM?MF>u4)DbqADKp#KH!?3`IuY71KGaF`Q@XyPlZt1$@xU+i zEN`RCwCtiEmhLC)B}5+0o1_V)-eh4Fv)d$@SG6Ld24Fj03nO%x@0>68x5Bw~~Zj+?N+ z4#5L(f&CFyek!dUZ@^_9hQm+-!=vTyZi)Rlw#a86?Db`n;D9Mb9-^+FaT^#`3)l>K z3mE8bsq4oF%`-ef3Mcp1D9+1IN{WmqF#(d|@Mt+LX`tu;^aiXo6LPraNYTJKq`!j5 z87yQYskvbvh)5f{hZ^;1JaE4L6xKwUPr?o4!-CcP&OqM`M-R&n zkpco5eusCMIryxmIG|EwPeCQd7@PJ6vm_h~Ll(_2;Hw_`ygBk$J)yba(y1TV+$dMI z{t7QMcIUSMN{TDt8VGsp04z&bx|ILQF|-OlVp2_i!{AUqqrK8R3Ow!@%f;=H1M_= zXA*I#di{ndbG)B?X?}0!@FN;qi4C#B-f^hC3IMLSeEtjyqfSLxDKCSxOvfxZLyBL^ zI3gjEcJQbD+9O~v>CZph(!8Zc(!exGNb8M5CdMcMn~!P~0~2|YVd-)W3s`U~MW$ns zVjz@NiVEp~@3Vmay?4E(y`j!|nA9CnCVAcM`Ns|>-|MCB%~+(28%}CPfH~WEw15vo z5I}_>CFMwZgF+KutyM*Jvwqp3WPR@B>yzlyu4d|fJNA+Z+zBHn5C=~YTpO7vLlSxHomV>P_gUFAm5fw#8_xI@d^ z_58W-T3Tm@gH;IA{6|w;=hlLO@%{vC3*cO9rrU5kNCpLjVXRIbr=uiMhwjR9n^&+( zb(>KEURyuv`jqPliS^&rT9f=8GEvd@0-z#M zah--io!^r$m2WFw*Ken;AwEVV3+&eQP#)Q>38pnTLp>(vpI)4|_FSE@fE%N_fk@L< zpa#%musGOOoiS}7F3x2Fe^Enrr^Um)KSFAUCjgj)Gh>okfxKOsjpyu)Pc+$f$@wVl zCEs~JcF+o(p!e+ebzM=|3S6TB@Q_B!KjD~ML)RCXDg&A=Qq-z#)A1iOT#&R3-;e%6 zn|ZYBO61fA(9QL@dB=5@7%i2gn?uweFLW<7U+`bJDueD#cr@hYk*7d-6``s*b6L6e zHI=sLa!O0~WeIDB~>`*+Z#Ff>6r)Tk?PK`E_Iqn6N7z(AUOB2Pf&z#OCH(eD$5{5OcyO4GDMkGM~iu34lQ?;tKH$&sAii_ zIR$xIUL3N$V+%>r%>>WuZRB~!qZ{a04*iI;d3ns7W8`k+EWODc@~^l@LRN*1LM43` z-Gz;y&bfC7m!q_|YM)3ya=zDmU>4(;TB+>D^N(-7*elH@C6a&o+}k~K65@5xJyeoW zkLSJNlFN&5Xaw95+v$#;Y7%8G78HcV2E!hv zr+-`BrS(@(LFRz=khsB>WVnodUIPCpi#?2@{Q@tQGYj~WvpCg&H>G4A=BqV%{`95c zgO;hp_BuYfcx>)Pmk0lM=AJw9x2@&OM^`-?3bvDjbmhMmY<)w+wyyYF+VOBiY;3ag z@qZ?1V?Q-KW_Sh+1S3NRqTwThH&|pOd5Xg*39H~(x8y`DD73Y5*oX=r0hk$wDBOl;XVbz zdEZ!0qF!FyM2t-JEsL(tD89=#Pg9q%=s`8#a1paj}4@}DkT1%$!WDplr)(; zZEA!t)eY>#otUoFs&kH_Na5qlAgz~Whj`=G0I317TPkp4WPSeV37p12ln_KpiGpC& zmw-A>P+JKh0Us`B4l-+WnSgoA(&YA(pPR=!`)J+`^pSK3Bqm@mhL95581o5W;7hia z>I8Kya)?BINFw3UPfOoMUT1%KI3pul*@lIDyJ(>j*S60lePErrmyh?eiBdP@eg769 zVSWPeS(01@Qfg^P@p97S_MaUMorTN@^1zcw4N7zqFVQ0& zONN6dpDhe35>p;<)wBJEHG^d4xqu@_zgGe9ln3Qi`p{Oz~w$KHiv2NtD&Q!b1keNwV_%xhWCk$ zaS}hW%gDQzMBp&7zOK-4-nMAW-i-kWThA%3C%=WfSsQUlA~Ac8C4SUAQbIqIcP(iH zexQ+i1O#{okj>UHu&?dmy2$x48c=8h2lB|XF^azJ*=Qi}<6vI8b+Z5!ITqM70xs>p z5bBzxP4rMmQoX1KIHs~sx3p};kd~2Qj<&v36&yP!Du2mv+K=iZ7Wbs(>5qK( zuFORozFJi9j&!0>-R%r=w-N_TFhTK1?uEiY@z-lpQY7*A2s`b=r)Tao|3ok~=A3Q{ z%yl#8aTRRM=lovkK@xA`X0)}d7p74h^z!9igN2;b-ADPu60T90#)m!p<)dQmd(gI7 zJTmlB)#Y_3HHVwih<39I7&g_UF^~Jgo|=EJRA#8;xLnW96KiX{8|5J&bk%4MsW%n% zqH8U#)A06CXD(%913P)x{)E2*jL@?T1;xix4=$7##V5zoPbBxp{qBqczB*vC_NAN& zQLR^hK*siHjt9yH;I||1j%h_3ODK?!QA1Dl7r#~F>zLGfs9*A(p`~*QSx|-?++uaH z>h#du+gNrZdh^iE%JMWSqB7Z3lYoV zVVb-i$pc;*iTdx+VeDi}yH?2YSk#}QHyFuv*tLJIB^o$`OuQ#_Bisg$Y;yDvDyXHi z8tp@C3#dt^awsoF@Tc@s_$Xr1b9Z!&v({Vm$||_IkEt8%ZA%*fn%bJp4pS|wsZJaB zoa=^vXy#81T1GGM*HNB1+I!n^2?oM~41Nt^K}2i) zS;V$%o?pxJqetX6Tot0DhWAK$i@=Q=0~Z9HoPnJa6f<)PY!JFy9DKZ_$QSo$+_ZHE zy7n1B+1BL=@Z&lF+d?n%cwTXqq0)`A(haqVz3HzA-z|O{WryI>Et~pTF&n6Xwt7O~ zKjcd~_0uowP-{w97QtVN^jkKIs_0)?+Zat8HWH-R;q`GWNFa8Aoo~OH(zE(1^)zGU zeah{H%~U(=;sh##w|UX`!si55{>BWT?)#?Xa>;u?-8H}=^fwm=1T_0h6PoU z=B2LBa2M1xvGRE8($RQw-IilFjQ(sn_3yXjwZ*RD2`7yU226yK5`7psg|##jSi*XJ zAw#bY9>Qi@n}a^OzHczm^gXuLwupsl+$~na5L2N&-#7LYu#Jp zYMSz)Yxvb#DP5FiI=^~JZkF@QVt0#tetXGbn^upV<=Ee)fg{)JWt^AlI-%dm0kKIh z96p;rb1P6fYm+0GX^iQzGc)h0^{SF4SH)#q0KYO-*P#b(1)}<+%osDiLGk^O*%}3`&R85+1jB7N9yM!Lge2(#n4X77VyPvi;Jk`uiEUKI+fQ7qMVAtNc^Ot`K1LrH-7=xDfpGW~$|9#kcY1w5Yx~sB9~) zTCxHvnm_y%b9)nIq>S^z1Z0r$x9E7D)<8W`G~RdBclzx|Iy+D$;l z%)Bl4+T%3a30c95FzP=*q2_9r)mm?09)tODD$?CPoD;VKKm43l~1`VHFIbeU1YL=(IF!}Z~elQEK3c_crX(omIYUY36dl1IW{=RM(5|U z3Xmi+)XORPxQD;1;T)guFtkgFW?0EgE_DXIqWPxD8{DadmToFKWNnvHTY#brSqk4R zIX^@b(8})?De$o7d2#>9hL$6u*{c(emLo&Q*L+aj*5w&=1A^hZ+(E~DP!%I#px$u; zIg+vO$x+elyG^?kfsmKMJ^r}eevtEkA^-6n{~7X~9-AT*E_*0<3&%JEztZ7v@JNh) zmV-f-bbgjI9W z7v*8}L@OFb5%4Lz66+fNYIkUvKWb~M6Q=7M24alG5>g2Ih9^DSzjHtVSNs<;Y8`?U z4W|k6QQu36Grj$}`ZR9ZI$!u?}U_i)b0dv{j3*sJzzoL78M|86)z|yHVQt9^>r`A z2YN+AaR$#8cK&V%`+{ynm8Yh<2NQ!HZMX{}OwRKap{5kD6H=pOXDs7ij*Ig5fNR6y zK>!d>M+lB8CVYSpUw*4chmF4iYRNQ=@#Oh-xF&`hoa+3PTqN0gBTM3&* zsbO|m2?IFUfjTWk`$g{~5>UZX!>oAP$P9r}ZR(0yAx@V6LTx>kt;3cpDSSx9ru%kq zXM&5IXF6T5>DMA9(WBK3Rl%za#D4hRD)TRQsqn7Nr<>jomDn-UV_9fM zm|)(8Ufbs}V8TD4JXL`?w9NiekFi~e?22;$$N*QPvKZ9|pt_Va{V#{Mz64wjK^8%- zN6Rtyb}89#hOAJ~bEI4jfi5m{5SF*8DVZ^k&MGVV{xuMLPP-MtS9?xQ|CbLs2Ju1D zqyopFJs!gUZ;uCg3F*+SrA%Ui`Qx@rl7c}*!a_JKFk-@gMf-0sEfE9On{NDnf_f48 z1>p9AK_kLLJ7j@AposS0m_bE28;5qqzcU)A!-jhbRf<#vzo~Y=LH!LS5)bzIzwx${ z`zvgO#BFZ7Y=&oLoEw#8{rApJ|G zV+j^Rw~h-y%!WI~FV=l>8sqk`3%%w zgmvJ4d4S|g9TVKOJ2<=EWP9XdWUURei~+vzv!(@$$QyEqH@Gm&0%IwAOO>bUkFO~L z53in4w?xvreh{2q<#2>E3xuG=KZ;lYBmyiZ%84Q%#OH!Y@kqUK&GjskOlyj z4@%ZWU)||sl8Ya?%Xj{#uE|PY`FxD}1a{TDH1>YNgzf(WwXzof1GSwq=O}-Z6`P_` z&lBgn%qDud18sSa)t5l}+)u`-O&Z26J)L@oDeAk!jgDwYY>(YPE2NCyl!@uz#b1rp zWynfCD!S%k7GgY$bF8NU3*UXpK=c`iwXMA-0C)eeaEce;i&}UB`>po)bf(LQfNe9W8gK#76{Z zn%H!B>i1^TJ0?WLmF?2S{01^^*F|`ubH?xrTNXY85gjyq05W%PQSgV%i905jgAIB7 zyAZt=bpuB%&rtb>nof(s~o1z{Nt*Zv4gozJfU}-*ABFW zZOK@J7c~4P0FUy|ccZePch;u7Tv!eDxs%79`Th*O)8q!`BxY-CBKs3NKs(o*BtS#8(!-)VE!_x%J z=b;ZRZeXXqQ|MoMq0mpiH_%%ujy}TVd zKA2;A=SEPC5a6Ic~cosE&@ViSlAQ|!+ar2bC!k5h6bkd0RFW;{fkBnCUOu)50prtU|F-ZXj zDkO)S?6`_iO7%Ctn1gVzY)+6e&PZ50Lzl(lKM{2w8y)qV)t93|{2&MTWhJ z0?t7OowL@7g)+{HCkE7r*-u_i)t++kW~cS)*icBGgOQr`m=pE(rb!5MY&3IPWf2>h zbtNpP9qUjQ%lM2aDg{tB z4#&}Q*|f5ucCC)jpXZ?7om7jZ_po_W+?iMy2R^H>Ir)qgmUrC(bE7P$V}8QS?}Y_t zoYpHi;dYFVLb? zx(%g^?}i(ne7@vz zivis9Rfz&8Q9={rbkXB1&E;3tRpFiWH*fj5xeS9#k~QYaH#NqH$z8r7RTw}OJ#>3w zs+mdgcg;*TYlWVb=^4Nv#$iA&bJRKQx5vbn8C^u9aV)mh(7+<^c_tJ%p z6imz4>Ak9k5=pX4_oInVwQYl5&CelS^TUgP8W6JT2;3Y3ssoKSG_2pmW;oNTC%kN# zszGKQQgdnV8r|Ej{VsaI=9lxfv0wVr@_I%CV;8k7?*~QmiR$unfVu1&;Hor@TVT7h zhiz@DXt6;yzj@^Ggx@l_0QRlW6gJ4KSpraK;zcNwANgt?85kc-8bq(X+F#>vikBxL zxeCFL?=yyt|4$JlE7=&2UwDSs^bD8f;CQKH-@Eq`UU?*&_c=LM-GsX-ix^Gy16O)a z51nY^qwFnC|78jw#AEL8L-MM)dAg5Y+EG29v=Z4W`&Jub1i{6zA1etepUa1_xe~#8 z?Y}wwfIGd&>OOk`MK7g5(Mu_=M9`hVOnu@o-1*x)=pi?XyOeZ2XTI4)T zWb8h@|9?!8gmS#LEbOsJZj?2g5(d#aTf>J3h>;U|4gRLi0y6mU$rdyI&Bb1e!y1W* ztw@qo_vA$aGe_x8z=W@ZV1on=)-iM|1(cCs_SynwPRflh(kdwTtORZxqxxa16r#P% znMpvKxsLz-p;=;{M4DWmO+u*OA=+_~>1d?bX+C3!2>`{J7jMd>r^P}`8G9fH&}->A zl)xKo@G}+LgjjU3SaLOTDB))!UK*&Id&A6@X_w3HzGrP;A9#l)(S?v9q3mrWV!ctt zPQTX#oPi%wt6BC};lL7l5KlfK^@qhW_y@c(>BhSX$2TLbITx3Luskh z2AqqC;%6?okK-^OjkwpCwC}zSpy;7L?Nn2me?HD3V=5}zq~2lwYGu&hJ-=C)^eRVv zqjT@SGQWlQ0nWi~V3Qw;KJ;r`DwYS1#F{e+O2jDYlh-yD_87tToB`5F47iZ%MBKDM zij9%dE$&eQF8ubyJzx0|bDEm3=Ygm^g!o?O`GOREwTnHRQ=kY-jSt|@^vL}tYg|)M z@vl40AO`ST#et(E%-#vBa)u^UZIDSbqmp?3>HTISV*<*q`_FP`ASL4hifEyQm$h;t zlCLZE0r*|sc;M^Pic~5x#c{tgW{Hc4rRP=y-xq_Fx2Pu z(?UIXmooy&jHoe{0|z`4uXC)>aV)+Q^kMY}IfQ4xX%KA2?>7P6qM;mJ9wnT#i~nhs$vvUn=Nu znF*KthX&{R)10*4VpHH?g?8X4vdt?pP!0*dDrE&bVBm!#@4y>)T*nTAq}}>qq!uMV zfPJCko;bsQ`gU)005NDG06`M_!lB7%h^GEDQDama4KABzBpZ;9+w@Pzz4W^j7XkdI zWrF|b>%~GZsRSzl<&);?K>4Hw^omh>LRp#Hn&{6$*M;V@#ys=i#)4H(miR;P1gxVy zTon4fH!69%R55qQC_~9IJq{q;(((`8eV0a~y;OyN7Ii63TEN!HWm{yXiSa_m-2fMm<_A29hC&>2wRRB`I<48n$jI+ z{h%jIl=dJGa&FQEF6$YH^%Z@=gin-CQ@um0A%n~|LV9%vK!Cai`E}jU>xocPwl6CD zsLrs#BJWtX0JzKGf*GHR0P=?O<3wl(6?e?I@=AI0oIcvl z%O&l9fSS$zpwd1=2(nUUIUFoVvhfa+8vvD@El_qwMn<;3CS`^$K)$6)dbO0L;|i9h zPpwx65f%b~&-J~+6+uyuS~2nm=Z`yqPw6$2yH*Xmu`zyQ_t^U@y8H=j#^wB)>On^) z%YQc3Uz_>aF~W$)7aCm0QDg>Flj~fD=*TF3L zVXbyesr^jnvUROETIpJIHhyikOKmz3Wj|&)4ggkn8VtCb31%Yl{OkJjead?TWl|Um z29GqBZWh*623D1i#}A}L|L46j@rd)EM8}d<{8wKFVvA59h>VxLC_F~z)K;2I#2(j@{}CtRIDWjok=YeSFJv>R%hE-g;#ovwT450uYt@b0Ak}zBL7R_G!+Zt%EOB?K@eeXT`YExjc}545QL^hPCPNjY)Ww@{yDF zXLIiCul(nd`GZ=bq(mn%@%WaP5J1__O0LB&PPm!R{G*vinWZ$9p+}qw_}>+2jZ${e z$4$z(_3?Q11$bb#6DaQ`L<<0B=1w%pB`IKxq-<-?SsSSZfJ*LR0gfl>BteQ1$G(Ki z*Q7o40&6iTL;awefM+^=P!4(d=2U2@>Ru3HlBn4Ng^rWK-l@OsBmj^`1Q6y3SVg$3 zHjQjBQSaGumE%YwNLik^Bm6r__?Q7CYdajtjh94t3l)Aoj1GRpA`Yu*iv$XnquRC? zyzY3$Ge(Ms-Z3zQN8SOSvZ-~PDYZw*DRmQ-Ou2TMZ zqY?^;Tq_hw^Bek3!OWTn0Lro)oHv#=&7Mb&1_CX}C1IhIp zUx+6yo+1+4QCWjO#fOigyaMfgQ@N)wq1#GM&`W2y=jr<%Qweuf(w-K`oj+1w6BMZ1 z?h`_H4B*ZP0Itt~HWw8yd4DqE1kciJMN!FEg4{$LA$dsXa|L&r;Oh~wydRwGXHgOj z&vvXx#S)OKdew_pQF$L@S4?}do|Tvbo>lz&F#fH?#Fw*>TND09(a+IW`L< zkJO<0$2me&>0<49w6SwARn*~EETV*HTQ0%^2)95;QEmL(hV*Khp=m`sJl6(TnA@f5 zG$upUNenD8Z+gC+@VkfaNq;#(GPy!F)ippSB8Rtnq{olxhbpsQa*R>2r4cSeps_1H zBxM{Tk7-u?_yq;DKg%w+!-~64oa{o#g|^elG?5>x$Pl=Z#}1bu;c~(nKUXuApmCi+ zvNbCBF_SYiie6`_)FrgRuxj{(YP{lJWZ7QCP@Qwdp zY(gY72o35m9Q39Nn`3OXqj;1c(5=cmbSr$(kCv;w&lup_vn*`sf8s!Vqh{?rVUq29 zv*9=hc>SmLxWry3uY0rigV0IC=zr)WX|DQX(52O(X1PI^6Y+^b?s+R?W#j7oMfg*V zqs8L?%^)tWNuOTuxt-44?Rj_W*Ymulr@LK!|K7&RI>k`y%Zd2N${J1Zh#$oS7?0J=8k7hmU1yNeF zoQ$QlWJ?S7M>eMnb&_(zuBKu(Px2t6ma|1&+ABZGG=KTSz{S0(Km;b>1^Uq=eEGHbOsQ1+ zQz8PIlSUC!ZcQT3a<+gn(lPzDu$w+>(#-QQkj*Ya(eWipKM4F>GEZ>Ft@D?P%P}7EDG>cxyEN?ac05O6g}) ziSuw}*3ImQ>Ygka`{q>2LMhYSg;1jVRLp3*O3rjM&XZlk2bhktp((SW!MSMj_oY|` zJ?D?sR3?Gp8H|3^X(({uaWspLQ;>Lzfb)Fh+jMP!X-VQhTt%}SFQ2xxb$cR)KQ%z! zw^?_C{;HAe=Y1WnVngl*G&}?#g1E)jVva@lSj=EZ_p5O{_oFyScivga9em7Y zOnaYpJ5h-KD=^T5E9lBwCzLhK^}A9#n`>}w<}1b_P$-!7fL}*TX0qS=7OJO>!3EB@ z&w8wIwH`wr1)%ZhUsh@aHmJiikpWt0so=+{j;$AExs_2ydy(Dp{(Z*)+3UdSLXD`C z`f?4M=+vp~%N~s){R2M<-+u3_LY`U{T9Nl|sM|J|D*2P`cu%R8D#$Cl{AV-0L>xkq zZukK13+RVoQav4V68BQs}=R{arvZdr7nuU-6m$s52jqK709=Uwqv*4;AHHF_527h3%)bB0l44j3ap-WYg z6tD_D&%DI~b58CQCG5DpS-E|%2$RY-KCC(5@UI&1TnK~M@+GD6BW)`56CXF#A88PM zM14Z8Is#|}3+$ayT`;fmk2&+s2N(VK4zYT`=xcXU7xOZ$uLJ;qSUP#dFUd}oQ(%aj zfz$R_Xh8AoyzlO!YWtI<0$jt#w_h8eU4rXYXxIz=v5BlG3hSbzACW99lnY5kfGBbW zB2^*X3aDTDmRas)0LFN~)!__ACK$cjunGG%&w%+bW{`RucX3StJ9MH8+qQ` ze4CG7b>mNzZ|^?CvfOV9-LBd4@%0-Ch8E)4bOJkX2l%D}#wL9Eg&&~LH>p;Na}M07 zYSajdl~b?zP;0faDJ}zvIk1TXX<6L9mC0%8VOiq2a~31uJcL{DqtBSgU&f*5kU=+u zH;1b_>$K zOy7HKq~6QDh`GUKVMZ1b#XvW>Efl?o*-`r0r?|X-w1k`g9nNs}5>Hd-{;<4~Tx637 zoh*T>yg2N(TTbh9haF2gD~Eg*lmzUQPj?}yST;fiROZt@Jkt~LeP^28Bhyhw6#czj z9vU>~f`kC-%1}%YHWyw|^c1hilkXh9a)W;vDYY+kQ((ur_xVjNuOpMu)=i6$q@Ctv zudOqU?4-D2u=91j`0hOu>+$jOwQ^Cc;>9Ps&57y}*@rr4MJwuaJq7u6tuOQ^A&vkc zI|+6zfcKVsw;%LI1S>}aV;{{_ZbjQ;jyW51sz-?22_y6PXuATRN;dEV<5>MM!>K&{ zTHeJaO767#n19FaW)srJuy+|NLwAjJD_~0zYhzT5!=cmw`AG&L^bZC9;zjK5<1Peu zM^7$7)g#lN7qT-es|p7ZM6g)!%%I=R>k~?3455KccV0`>38DP)E^nu6yPXBe(7@YY z;8F)i)~^&0Qs^5XbYYQgksnS1Ux}g3+1d~jOX+3u(o%9gp^*C5FnW`3wi*ocLw|!V zu_pxE6rsJMB%0lCZtA_$vFpv{c?3H*jqR%C_w<>GWmh|>_N#HcQBU1C+R^+ z9Xde)_)_2&lUr>IADeh9;ja6|BMXitf&@MmgP4lXw#_4Jb$1sZ8R&(jnJ!w-&8EN9 zpU4wRiRMcMWQ@FFxd2-g-u@!7&5~#r$_gNJWl;AdHPzACwrh zgC@CSk^bDdeVT0$*|%+%Rt;;w?dE7w?1>wGPA=Y#Mql#5-e=E|2ybZRhX_#Lv_Q6fu z!jb@hV26q8=^JNdu+)+1x<^gb$AA~G;!UUF0~;gnGCCN!c@s6Qv;H?21IQqZgvK#M zChsK(4F5NY&^4L)mys9RCd4=iwn{hWKM8ePe=yXPek+>I3OH287vPr!!h6nsSFQF*-6F@OqT!7~%abM7^x)YhwS~|&?YLvm*q^1vsYvLDXt8c1ltJ|3W zlf~J82i%uw!5h=UahzEVdwAQ@`VhnZI|pMBPGmp`6Yf&0W0c9=$~)U4cA&{mBt~?KalQhf;bA7 z#rw~ghqn=+JIRS)xN~?yt=iN96;AMsm$!O7)P_h<`wC5%U&VDG@S*{oc~0y-3B%UH zG_}Hc5mmfo1@3S>)^XC_v8{#}rg_jh;8|eb(d<9jxMN>>kKA$=hB-sh>7me^L&xoF zm9k0ecfm7MvJvr{2_RJbPr;bPP()?p?hpbnzeQPrC1-y>pU?8zrkHd&5Qr&y{x&v; z=U>=U3jo#Im80GX@?Zc>=Ss+gZ;58_21QfsCvRu&9{w11&m2MP$7iB}zyMMNp&e`D zLz+&h$&*!b=`({o3PnFU{`%tJNcb)9JxDB9sl}m(?`C=KJbp4WNgAC);adKkJpy3B zkNJDZXW`Vr1tmP=!fxt3bNhAJYq;LKQ&&8InoXQgioGBm>`I zRBNgXQp6c=5C#RN_(NCK@1MF(bmab7+zVKa@O{zM#Y^fqj;lAU=U1#YG_WtGw^XzS zdxN=6Ld66N`%4jE*td*Pv}%fqK$mSFIHFVwkE>l?6hcwQQzRIZo8vOPl>}~D6>@{~ zMQp%ya;@bH$x8c-1|`15$|*Q_FHKh45z#SCelZ#=sC$YM`aWOxl^v`ev5) zlWJe%$@0v_4y@=^)8Gg<-)@=)c{!iIDK=)S5BPaf+VMfDN4pVUV|X8<%kdf2;sreI z0;w#_e)z9Vjwd9{n~r$5>Kd(&jl<4ttA14XC+HvbsAGUSmhO?B!fu?@dNY#oss8CZ z>RR2kUUn@#Y>wvb=gB(=yR#*oX}c-oOgPGCDow4o15Dp(IHhpB*|-?R_wJ(~*aAWu~sPP5!nVpRG!sH%Xs)I>dssHmTPi zBw%2lpOA@-kf`-FQNA$n>4tdInb2Th3iX_cjSv7n1WI4OQ60V`uTvnUuA-k7zJ7-oSI;t=FtCBn4?F<~n?w9I66cCQW=->Q*Q}?yr%uGpr&)cBhi=Y;}j}I6EuYybuako)s z3Ah8uy{NXiF9@UxTv0jaiE!=KU={eZA*qvaFj8_UAX{uQgVyDKSK8ml9d zH6Z47Myc#cU7p7km3NJ1z@;Anir(pppU^)kQ!rOyI79$&AcVh!yM8xJlK9j3wO~N# z9-d#`xPixLKr;$R6&2n;LlaIBe(PN@kWUKW>Ggw)P^Su6O#qKjjNiG==5l`GbpCR* z!-_*Cykii>^)p_yJ)7wY&KV!$YJgOGR&&@!_>EcSG*-o^0BBo&wu~Q)$ZLP&Yo3T_%A8LuEr&Q3Uv?zv9 z5_@BL7;Rc@|5R;LYN;hCL1Gs|y?8>Ytw=4cC6-WhQNz>uFz58$kN4dBJNKTuo!^&h zAu(Hs2p>}wq(2WBA>hfA-^x4KIu*{Umq$6W0iiQ|ztsZ-i*r}>espidaamX#a`I1- z0mJ>l1&{JN`?+ci@Hk73EJJ9Y;C+z}I()VGma;rq;oJIxW33+RVnr=$p20wD_HZ8YfR{)4rN1nkUhivVjMVpn(NZi zU-4~9J`z{|>Y}!dm{W*_A4enl^fJwH5!uI=`cYFS(Hx z^0Dc9^L*g~)fDsVRbj7?@!iXVes3@%(wsx#=q+8qyj+F`$zG5bOfjX60lZpwazh)* z#$!I?b!}*4VSGkr^$2Np zbMMo?zr-IZe{DGs}L7B@%h@_f=q!RYmbIi)K7 zR)X7uh$xRYK?A%XZY;z$AeZAH2)jwye*8$q+UH*r4BVvQT0R zNnj9Yk)}&SfysEsBt7Y#_t|^E$4g_i}g*d{nsb5gOs7pReL~lc{yy@x#vyypso19)#kX*=rr`36qPAK+gd~Cy(Wwvqk%15oNod zskSi$=*zmHX~uudmwrcxj#%I#QpF-dW~UX-l2&wxXX4-I?>X*gYSL4Z%D5MgV*~8Q zUoVB{w#CQj$PC|_&?GE;PaPE~afWmEm=BOx*SQRP-;+XS6{E+t&+B0bo4TR%1(kZJ zh1-{Y2V;%9v$79j9$(r5UrU7R zl7>PsWOKTeV~}SzBq!L;{+bmfa&-kE_nb}_4aFN#B;)*|K$Ybj0+VL?ve0jzLv`uA1IkhgI|kyY{RFkkSVJ9rRoo*_GVo<_f7Iv z0WH`(2R}9J$r6j^@x$)a%hL7N&OH@DxHI;S~SYMPi}8_Ui}#~a)HqyX&{ zIiRWwuK3SwmIQ$$KtBmE(Pai^19IJ_U?t#6w;fm&DCj<=_+ypL9~rtFjlBF%4pqQx zw-(}`bs+Hni0gHL8tXhb2k>EC0A~TEER29~6X4V&3;e}`BmQpPBOj39QJg>Ferp3X MdQitqm_M}t13bG50{{R3 -- GitLab