From a1df5a0dbc73c5248a078aff6f568cd7f76896c7 Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 18 Aug 2017 19:46:43 +0630 Subject: [PATCH] update menu_sync --- .../menu_item_instances_controller.rb | 30 ++++++++++++-- .../settings/set_menu_items_controller.rb | 33 ++++++++-------- .../settings/simple_menu_items_controller.rb | 37 +++++++++++++++--- app/helpers/application_helper.rb | 1 - app/models/menu_item_attribute.rb | 2 +- app/models/menu_item_instance.rb | 3 ++ .../restaurant/menu/_menu_item.json.jbuilder | 31 +++++++++++++-- .../menu_item_instances/_form.html.erb | 33 ++++++++++------ .../menu_item_instances/edit.html.erb | 2 +- .../settings/menu_item_instances/new.html.erb | 2 +- .../menu_item_instances/show.html.erb | 5 ++- ...170402084230_create_menu_item_instances.rb | 1 + db/seeds.rb | 1 + public/image/menu_images/icons8-Food-100.png | Bin 0 -> 5031 bytes 14 files changed, 135 insertions(+), 46 deletions(-) create mode 100644 public/image/menu_images/icons8-Food-100.png diff --git a/app/controllers/settings/menu_item_instances_controller.rb b/app/controllers/settings/menu_item_instances_controller.rb index fd651e5e..0d276602 100644 --- a/app/controllers/settings/menu_item_instances_controller.rb +++ b/app/controllers/settings/menu_item_instances_controller.rb @@ -21,12 +21,14 @@ class Settings::MenuItemInstancesController < ApplicationController id = MenuItemInstance.findParentCategory(@item) @category = MenuCategory.find(id) @settings_menu_item_instances = MenuItemInstance.new + @item_sets = ItemSet.all end # GET /settings/menu_item_instances/1/edit def edit id = MenuItemInstance.findParentCategory(@item) @category = MenuCategory.find(id) + @item_sets = ItemSet.all end # POST /settings/menu_item_instances @@ -45,6 +47,18 @@ class Settings::MenuItemInstancesController < ApplicationController id = MenuItemInstance.findParentCategory(catID) category = MenuCategory.find(id) + + # Bind for Item Sets + if params[:menu_item_instance][:item_sets].count > 1 + params[:menu_item_instance][:item_sets].delete_at(0) + + sets = ItemSet.find(params[:menu_item_instance][:item_sets]) + + if sets.count > 0 + @settings_menu_item.item_sets = sets + end + end + respond_to do |format| if @settings_menu_item_instances.save @settings_menu_item_instances.item_attributes = params[:menu_item_instance][:item_attributes].reject(&:blank?) @@ -70,6 +84,18 @@ class Settings::MenuItemInstancesController < ApplicationController id = MenuItemInstance.findParentCategory(catID) category = MenuCategory.find(id) + + # Bind for Item Sets + if params[:menu_item_instance][:item_sets].count > 1 + params[:menu_item_instance][:item_sets].delete_at(0) + + sets = ItemSet.find(params[:menu_item_instance][:item_sets]) + + if sets.count > 0 + @settings_menu_item.item_sets = sets + end + end + respond_to do |format| if @settings_menu_item_instances.update(settings_menu_item_instance_params) @@ -122,8 +148,6 @@ class Settings::MenuItemInstancesController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_menu_item_instance_params - - params.require(:menu_item_instance).permit(:item_instance_code, :item_instance_name, :price, :item_attributes, :is_on_promotion, :promotion_price, :is_available,:menu_category_id,:menu_item_id) - + params.require(:menu_item_instance).permit(:item_instance_code, :item_instance_name, :price, :item_attributes, :is_on_promotion, :promotion_price, :is_available,:menu_category_id,:menu_item_id, :is_default, :item_sets) end end diff --git a/app/controllers/settings/set_menu_items_controller.rb b/app/controllers/settings/set_menu_items_controller.rb index 60fa3b7d..4f451de5 100644 --- a/app/controllers/settings/set_menu_items_controller.rb +++ b/app/controllers/settings/set_menu_items_controller.rb @@ -33,29 +33,30 @@ class Settings::SetMenuItemsController < ApplicationController def create @settings_menu_item = MenuItem.new(settings_menu_item_params) - # if params[:simple_menu_item][:menu_item_id] == '' + # if params[:set_menu_item][:menu_item_id] == '' @settings_menu_item.menu_category_id = params[:menu_category_id] # end @settings_menu_item.created_by = current_login_employee.name + # Remove "" default first + params[:set_menu_item][:item_attributes].delete_at(0) + params[:set_menu_item][:item_options].delete_at(0) + # Bind for Item Sets - if params[:simple_menu_item][:item_sets].count > 1 - params[:simple_menu_item][:item_sets].delete_at(0) + if params[:set_menu_item][:item_sets].count > 1 + params[:set_menu_item][:item_sets].delete_at(0) - sets = ItemSet.find(params[:simple_menu_item][:item_sets]) + sets = ItemSet.find(params[:set_menu_item][:item_sets]) if sets.count > 0 @settings_menu_item.item_sets = sets end end - - # Remove "" default first - params[:simple_menu_item][:item_attributes].delete_at(0) - params[:simple_menu_item][:item_options].delete_at(0) + respond_to do |format| if @settings_menu_item.save menu_item = MenuItem.find(@settings_menu_item.id) - menu_item.update_attributes(item_attributes: params[:simple_menu_item][:item_attributes], item_options: params[:simple_menu_item][:item_options]) + menu_item.update_attributes(item_attributes: params[:set_menu_item][:item_attributes], item_options: params[:set_menu_item][:item_options]) format.html { redirect_to settings_menu_category_set_menu_items_path, notice: 'Menu item was successfully created.' } format.json { render :show, status: :created, location: @settings_menu_item } @@ -70,14 +71,14 @@ class Settings::SetMenuItemsController < ApplicationController # PATCH/PUT /settings/menu_items/1.json def update # Remove "" default first - params[:simple_menu_item][:item_attributes].delete_at(0) - params[:simple_menu_item][:item_options].delete_at(0) + params[:set_menu_item][:item_attributes].delete_at(0) + params[:set_menu_item][:item_options].delete_at(0) # Bind for Item Sets - if params[:simple_menu_item][:item_sets].count > 1 - params[:simple_menu_item][:item_sets].delete_at(0) + if params[:set_menu_item][:item_sets].count > 1 + params[:set_menu_item][:item_sets].delete_at(0) - sets = ItemSet.find(params[:simple_menu_item][:item_sets]) + sets = ItemSet.find(params[:set_menu_item][:item_sets]) if sets.count > 0 @settings_menu_item.item_sets = sets @@ -88,7 +89,7 @@ class Settings::SetMenuItemsController < ApplicationController respond_to do |format| if @settings_menu_item.update(settings_menu_item_params) - @settings_menu_item.update_attributes(item_attributes: params[:simple_menu_item][:item_attributes], item_options: params[:simple_menu_item][:item_options]) + @settings_menu_item.update_attributes(item_attributes: params[:set_menu_item][:item_attributes], item_options: params[:set_menu_item][:item_options]) format.html { redirect_to settings_menu_category_set_menu_items_path, notice: 'Menu item was successfully updated.' } format.json { render :show, status: :ok, location: @settings_menu_item } @@ -131,6 +132,6 @@ class Settings::SetMenuItemsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_menu_item_params - params.require(:set_menu_item).permit(:item_code, :name, :alt_name, :type, :image_path, :menu_category_id,:account_id , :item_attributes, :item_options, :min_qty, :is_sub_item, :is_available, :created_by) + params.require(:set_menu_item).permit(:item_code, :name, :alt_name, :type, :image_path, :menu_category_id,:account_id , :item_attributes, :item_options, :min_qty, :is_sub_item, :is_available, :created_by, :item_sets) end end diff --git a/app/controllers/settings/simple_menu_items_controller.rb b/app/controllers/settings/simple_menu_items_controller.rb index 60949618..4cf9318c 100644 --- a/app/controllers/settings/simple_menu_items_controller.rb +++ b/app/controllers/settings/simple_menu_items_controller.rb @@ -37,6 +37,34 @@ class Settings::SimpleMenuItemsController < ApplicationController # end @settings_menu_item.created_by = current_login_employee.name + # Remove "" default first + params[:simple_menu_item][:item_attributes].delete_at(0) + params[:simple_menu_item][:item_options].delete_at(0) + + # attr_format = [] + # param_count = params[:simple_menu_item][:item_attributes].count + # # Format for attributes json + # params[:simple_menu_item][:item_attributes].each do|attr_id| + # menu_attr = MenuItemAttribute.find(attr_id) + # if attr_format.count == 0 + # attr_format.push({ type: menu_attr.attribute_type, value: [] }) + # end + + # attr_format.each do |af| + # if menu_attr.attribute_type == af[:type] + # af[:value].push(menu_attr.value) + # else + # new_attr = {type: menu_attr.attribute_type, value: [ menu_attr.value ] } + # attr_format.push(new_attr) + # end + + # break if attr_format.count > param_count + # end + + # param_count -= 1 + # end + # @settings_menu_item.item_attributes = attr_format + # Bind for Item Sets if params[:simple_menu_item][:item_sets].count > 1 params[:simple_menu_item][:item_sets].delete_at(0) @@ -47,14 +75,11 @@ class Settings::SimpleMenuItemsController < ApplicationController @settings_menu_item.item_sets = sets end end - - # Remove "" default first - params[:simple_menu_item][:item_attributes].delete_at(0) - params[:simple_menu_item][:item_options].delete_at(0) + respond_to do |format| if @settings_menu_item.save menu_item = MenuItem.find(@settings_menu_item.id) - menu_item.update_attributes(item_attributes: params[:simple_menu_item][:item_attributes], item_options: params[:simple_menu_item][:item_options]) + menu_item.update_attributes(item_options: params[:simple_menu_item][:item_options]) format.html { redirect_to settings_menu_category_simple_menu_items_path, notice: 'Menu item was successfully created.' } format.json { render :show, status: :created, location: @settings_menu_item } @@ -129,6 +154,6 @@ class Settings::SimpleMenuItemsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_menu_item_params - params.require(:simple_menu_item).permit(:item_code, :name, :alt_name, :type, :image_path, :menu_category_id, :account_id, :item_attributes, :item_options, :min_qty, :is_sub_item, :is_available, :created_by) + params.require(:simple_menu_item).permit(:item_code, :name, :alt_name, :type, :image_path, :menu_category_id, :account_id, :item_attributes, :item_options, :min_qty, :is_sub_item, :is_available, :created_by, :item_sets) end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ae3934e4..037767c9 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,4 @@ module ApplicationHelper - def flash_class(level) case level when :notice then "alert alert-info fade-in" diff --git a/app/models/menu_item_attribute.rb b/app/models/menu_item_attribute.rb index a2fd0d1c..54d2f34e 100644 --- a/app/models/menu_item_attribute.rb +++ b/app/models/menu_item_attribute.rb @@ -1,6 +1,6 @@ class MenuItemAttribute < ApplicationRecord validates_presence_of :attribute_type, :name, :value def self.collection - MenuItemAttribute.select("id, name").map { |e| [e.name, e.id] } + MenuItemAttribute.select("name, value").map { |e| [e.name, e.value] } end end diff --git a/app/models/menu_item_instance.rb b/app/models/menu_item_instance.rb index 579b7a5a..de5be7b5 100644 --- a/app/models/menu_item_instance.rb +++ b/app/models/menu_item_instance.rb @@ -1,5 +1,8 @@ class MenuItemInstance < ApplicationRecord belongs_to :menu_item + + has_many :menu_instance_item_sets + has_many :item_sets, through: :menu_instance_item_sets # before_create :generate_menu_item_instance_code def self.findParentCategory(item) diff --git a/app/views/api/restaurant/menu/_menu_item.json.jbuilder b/app/views/api/restaurant/menu/_menu_item.json.jbuilder index ffad3dc2..297e7932 100644 --- a/app/views/api/restaurant/menu/_menu_item.json.jbuilder +++ b/app/views/api/restaurant/menu/_menu_item.json.jbuilder @@ -1,3 +1,26 @@ +# Format for attributes json +attr_format = [] +param_count = item.item_attributes.count +# Format for attributes json +item.item_attributes.each do|attr_id| + menu_attr = MenuItemAttribute.find(attr_id) + if attr_format.count == 0 + attr_format.push({ type: menu_attr.attribute_type, value: [] }) + end + + attr_format.each do |af| + if menu_attr.attribute_type == af[:type] + af[:value].push(menu_attr.value) + else + new_attr = {type: menu_attr.attribute_type, value: [ menu_attr.value ] } + attr_format.push(new_attr) + end + + break if attr_format.count > param_count + end + + param_count -= 1 +end #Menu Item Information json.id item.id @@ -12,7 +35,8 @@ json.account_id item.account_id json.min_qty item.min_qty json.is_available item.is_available json.is_sub_item item.is_sub_item -json.attributes item.item_attributes +json.item_sets item.item_sets +json.attributes attr_format json.options item.item_options # json.min_selectable_item item.min_selectable_item # json.max_selectable_item item.max_selectable_item @@ -26,17 +50,16 @@ json.options item.item_options # json.promotion_price = item_instance.promotion_price # json.item_attributes = item_instance.item_attributes -# elsif item.menu_item_instances.count > 1 then json.instances item.menu_item_instances do |is| json.code = is.item_instance_code json.name = is.item_instance_name json.price = is.price json.is_available = is.is_available + json.is_default = is.is_default json.is_on_promotion = is.is_on_promotion json.promotion_price = is.promotion_price json.item_attributes = is.item_attributes - # end - + json.item_sets is.item_sets end #Child Menu items diff --git a/app/views/settings/menu_item_instances/_form.html.erb b/app/views/settings/menu_item_instances/_form.html.erb index 54edfab4..c86ff780 100644 --- a/app/views/settings/menu_item_instances/_form.html.erb +++ b/app/views/settings/menu_item_instances/_form.html.erb @@ -3,21 +3,32 @@ <%= f.error_notification %> -
- <%= f.input :item_instance_code %> - <%= f.input :item_instance_name %> - <%= f.input :price %> +
+
+ <%= f.input :item_instance_code %> + <%= f.input :item_instance_name %> + <%= f.input :price %> - <%= f.input :item_attributes, collection: MenuItemAttribute.collection, input_html: { multiple: true } %> + <%= f.input :item_attributes, collection: MenuItemAttribute.collection, input_html: { multiple: true } %> - - <%= f.input :is_on_promotion %> - <%= f.input :promotion_price %> - <%= f.input :is_available %> + <%= f.input :is_on_promotion %> + <%= f.input :promotion_price %> +
-
- <%= f.button :submit %> +
+
+
+ <%= f.input :is_available %> + <%= f.input :is_default %> + + <%= f.input :item_sets, :collection => @item_sets, :input_html => { :multiple => true }, :class => "form-control item_sets" %> +
+
+ +
+ <%= f.button :submit %> +
<% end %> diff --git a/app/views/settings/menu_item_instances/edit.html.erb b/app/views/settings/menu_item_instances/edit.html.erb index 01a47cc0..d5884474 100644 --- a/app/views/settings/menu_item_instances/edit.html.erb +++ b/app/views/settings/menu_item_instances/edit.html.erb @@ -11,6 +11,6 @@
  • Edit
  • - <%= render 'form', settings_menu_item_menu_item_instances: @settings_menu_item_instances %> + <%= render 'form', settings_menu_item_menu_item_instances: @settings_menu_item_instances, item_sets: @item_sets %>
    diff --git a/app/views/settings/menu_item_instances/new.html.erb b/app/views/settings/menu_item_instances/new.html.erb index ccbc8fe8..9b1c5331 100644 --- a/app/views/settings/menu_item_instances/new.html.erb +++ b/app/views/settings/menu_item_instances/new.html.erb @@ -14,6 +14,6 @@
  • New Menu Item Instance
  • - <%= render 'form', settings_simple_menu_item_menu_item_instances: @settings_menu_item_instances %> + <%= render 'form', settings_simple_menu_item_menu_item_instances: @settings_menu_item_instances, item_sets: @item_sets %> diff --git a/app/views/settings/menu_item_instances/show.html.erb b/app/views/settings/menu_item_instances/show.html.erb index 40383b51..2fb1ca39 100644 --- a/app/views/settings/menu_item_instances/show.html.erb +++ b/app/views/settings/menu_item_instances/show.html.erb @@ -24,8 +24,8 @@ On Promotion Promotion Price Available - Created At - + Is Default + Created At @@ -38,6 +38,7 @@ <%= @settings_menu_item_instances.is_on_promotion %> <%= @settings_menu_item_instances.promotion_price %> <%= @settings_menu_item_instances.is_available %> + <%= @settings_menu_item_instances.is_default %> <%= @settings_menu_item_instances.created_at.utc.getlocal.strftime("%Y-%m-%d/%I:%M %p") %> <% if params[:simple_menu_item_id] %> <%= link_to 'Edit', edit_settings_simple_menu_item_menu_item_instance_path(@item,@settings_menu_item_instances) %> diff --git a/db/migrate/20170402084230_create_menu_item_instances.rb b/db/migrate/20170402084230_create_menu_item_instances.rb index c79cb322..8e95f8f5 100644 --- a/db/migrate/20170402084230_create_menu_item_instances.rb +++ b/db/migrate/20170402084230_create_menu_item_instances.rb @@ -9,6 +9,7 @@ class CreateMenuItemInstances < ActiveRecord::Migration[5.1] t.boolean :is_on_promotion, :null => false, :default => false t.decimal :promotion_price, :precision => 10, :scale => 2, :null => false, :default => 0.00 t.boolean :is_available, :null => false, :default => true + t.boolean :is_default, :null => false, :default => true t.timestamps end end diff --git a/db/seeds.rb b/db/seeds.rb index 2a9e422a..bf458f2a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -125,6 +125,7 @@ product = Account.create({title: "Product", account_type: "2"}) #Default Menu Options menu_options = MenuItemOption.create([{option_type: "Spicy", name: "Less Spicy", value: "less_spicy"},{option_type: "Spicy", name: "Spicy", value: "spicy"},{option_type: "Spicy", name: "Super Spicy", value: "super_spicy"}]) menu_options = MenuItemOption.create([{option_type: "Oil", name: "Less Oil", value: "less_oil"},{name: "No MSG", value: "no_msg"},{option_type: "Sweet", name: "Less Sweet", value: "less_sweet"}]) +menu_pkg_options = MenuItemOption.create([{option_type: "Package", name: "Bottle", value: "Bottle"},{option_type: "Package", name: "Can", value: "can"}]) # #Default Menu Category menu_category1 = MenuCategory.create({menu: menu, code:"C001", name: "Soup Base", alt_name: "Soup_base", order_by: 1, is_available: 1, created_by: "SYSTEM DEFAULT"}) diff --git a/public/image/menu_images/icons8-Food-100.png b/public/image/menu_images/icons8-Food-100.png new file mode 100644 index 0000000000000000000000000000000000000000..a77e616915a0092eebe86fb03492d432df762dd9 GIT binary patch literal 5031 zcmV;Y6IkqtP)=6J8S`pvvI{d)Rc zqnXhtMORTsdVT-;JNo;&zb3eo3Tg&OLG|WNXK)9Q0$T*GfNWX6<9QJBLV@+$TX!fb z2+*cdy!wx?)wg*oWS{HbH#F4+D4wSTwVBpMDB1!lUVZro^%rDy*aGs(#-<9Yl0B5t zd6_m|P~|k#H@sHAGt)k8-O#idz;`n(FO=)mfT#bVvA#vD&lZp^8=AHe;P124fr6+e z5XTI=mFd*MEgPEF65!Wa9z<^-jt9m5*aEV3L(@$F6|56e@0*U`O6W=IaZrEPGjqi^X5S>>7?;9DP{g=@xLRkMV9B#*G-AeDDlVaeAL6VKA_t#6t?+m!+6o`%MC zb*_MHUEj131h24+<)4~_mET&8V8B)W`xs*WvR=N}jr~7(%WSZrvEJ7}{_Ulv1xf%% zjS5ybJY&{%ZvQE?A2_Z5?gR*r#k zTZ3r%@ow7%B3&(8H|%Huh)#cZKQb40e|8=ifs8FuP#ge?6#}I|DJH5?L{y5QI7K+F z=>tFV+OHA4J*fYz0V`zMjUCPM+LcHJJcZ0$dLL#jn`2gU@aKEbbGbVW5Rsj!8Xn|T zaycODo6aMtYtMdWIVxw}oj)FvgO*Od{to&sT{CL_=Z405rowtkytX-Y&ZjVc^+RU4 z!@Kt5+Q*;hzdHePU)_AvE}AK&9&v%#P)JIM&H2VEU5C} z)ceQKaim>JJv^%u7f2c)ybvoYAA^N2Jw56Hxqa~(PW|j1V;sE=jr9|}4vJTKdEv~; zJIM(r`NFHqqUxIl2rtCSrcc8C&#m&>_kztAxix^J-`{2S&#UU|r1G-L-f8>|;*pqC zaPxpnx_1f|tzBle@1**s0kUQNj-7;%=UM5=i$9GSD;F2+MEmI&uljn`w0Le2EDB=P zx7S#jT@QWQ&$tUVuSL`HXlQg&dD%dDKvr#d3c=!# zIsU8dT{zNwK>uA-m&LNY>MLVerVXohw@w0ZMU^r4IvFZ$gbkrTt=g z$4<72iI3iB!OiwgBflrr*Gc6SCzap9vu`|Gk^#bR9C?bB0b<&1Mid3EaR$h|b*UY4 z&)G{j`>X$R?B47ze-4$ir<-{$e{dX^_x&mHJEhGH+t;mi8=sTPd;8ig?E8;*%_^J# zVU)uth)=viz^lF%Kt!XWTZi-c{fjdyFeVhxo7~sghpvHyFttlHWkq;+$~g1$gJTr zq*yhx-cSizqYAF534p{@8PM=Zv5JXGir87+x5Gg*s~1hnN#*4MVW#&-ziHJ*nfArB zFe8b8*r~o&KscjfO%cIk6H-EoQVKO32Biu6&}d9M`%`kr&B!RKyrR%{lM!rwc%kn| zL7dgs3ds5$yFiGp+btZcV9_|mGVhuihdMMg8nMv({Ca-~vE;c9H`P~U-%cxBCbUIB zc%KOSW~cfJ6p~VTmzM`IyEL68s6&I$)X_;LyTd_TO|dygP0LN?b=qebE7obBA_8Wp zz9P#qneLMlLYPvNZhKT?QD{-Qx>@L?b1gxdI=%=u{_y6gn`l%qnK41KoRJu)3)9V zE4ZY(??c>F-fS*3QT4UmsV^-H;(;-8M)1a9%2?`TT;u_<+l6O~N*GJ)I(5;g&I*X- z#0deIV0TMr`l9$CxlbHND84ebFe&Du8o>W1&F_@bj!oOw*kg5y74J8=Q|;S!5m4Cm&Oa0W&LcR2vNgy>fw+B&$igOMUUZd z0qH!^f#bh74)3LGYw3V+UPGqde!bedA2B-eR!`j_XD5bZQ5UG86TYaxnV{Eq`AhgBMI$2(Jn40Y;hMUsBptM5?kp-+zX@Ic1g=&mm zFgjxA7r7A8aNu?vWeUNniXe&u1iWdUt;QaWpfW%$8_eMjCX@2bgCX415<_)kSA6}9 zbrDK;@t{n*zXtOj&-|>~@wY!j=gAJU8MZ()O6rUg@KOQ63$<|pg0EN0*_Lc_n6D%p zjpFUW5PB#NB+%Y%UJzNQtqR2-DP^+cnTa8cQ|vV^qoorA zDh~9g43G~OshCq_HAuRx%4~hN8Wa6r*5UiXSh*J0K`}29GE)dMEE;zXW&LI*7Ip#D zI0Nj)Hf?8ElqEIA0X$ZbIz}UFJfczj^m>XKri6giW8xMcJUhbk`*4ByF;G^#xLV4-L~E{IuZxD~xa7riT6O~77y$E?{P&FnAdIU1 zx+Hl5;*Tq)S0_&4ajCPd zy}I+rIsHNj6W)}NwQkqxTzQbFkJ}x7F#5r?udXP??2-VgxJ@N9vvh`|*xjG9k9{de z6tZ_nL3^A#!X&v5?sf9*^6?(U&#ZnJWp`DkW$irLj;^-Er5&&G%M}ojb+MJtKyli^ z+YO@SRt)Ec5_^}s6iweqW;w|41M*P)1z1%jl` zZAYFdP$Lcq>$vPNwws_A2h0S2SumY2*)dfbi}?nI(cA|^L0pQbWD~RIYLu+aMo1V*L@N~D)6U*W|#V7@ovTJXNfFA&uO1!L0@w88ITagSHEi$BQWNwL>)DI0QDW{WO zAh(pkTF4L(csX(J8xWaHVSi&RZ0=Y^Kcqd}8VORT~qVZ2fMsHAQLBQ zcyyV)V$%HEl#?%K6e3|^+Xx}4>qS`r#$q{k1cL4f#K{Yp1SZQA9R8Tl)F~>~JY{dI z`~DA0%x1h8HZx*b;z0DhN*tSI5$H0d7zW5tG-^u`OmKscjhh_HZ?mPiX8Eu$XiFYDR< zasUy0^*kWg|MX{k{JTW37O%d8tk1N^3i+7Ez9_^)NRPZyh-h-)0kH-d^B48a<2+_9 zn-}Ml(b(0K9k_TX5lYs}LK`tal%fzG`p&cFB=LY`8t^!4GwxE67t^~@gDw>>Yk5d);^ff<+x`6w7bqqmNM`Z@)re&5mTO@r%WP;W@(;1S7Twj8BmB@oUXi52!EFP7P|7xL@Eo*}T^@ zFuINF4j{hZ04(m?1v4@2!PKh5ZZJP>c+a_P6$<`-FLM%hj2a?FHkdK1-B` z&o9IT4{xh<96XI{r_6hWj^oO+3~_!a#_AJscjkDRz-;I7;|np`_T!`)F+k?lKam!n zod?7%CStZH+G~A&d?7MG+-`D>7$CBjdq#uT(2p-fP9e^|o;!eeC5>c0FBf&hD*asC z$r~VE-nQyFcNu5jG@dLiOs}CIUx)#WA177b0O5^tqPNiKxW!53!FS+uaSuDYUtfp} z5I1jV-T>k4Saxq)iEl-@8RCXL!#*qU>kE-nh_g>5FMuQ?L$LQ`_2+t=o>Jmp<)px_ zO^x*h^GqBMNN8*c7CdWtSJ)QbXkQq|-blS3?d0ppIUvbFu(!x{Fc`a9xPEQg6Gp~p ztjB@$nBY4DA-p_N2dnv6&cqjDl=teS$_XIf`}U6I8YS%ZD|;B;vW&bu+QOTZs-UZ_bxz3uVS&o*7FbpQVE|A{>L^er0>BUG-Y+gi_1t@0IXCmK zGf)Pv*@U#BxB#Gqg0|!npiF!rGC-Uxz8L|Myr9G0I!vPg*=#c*KK--veZQ&8Hj1CL zo-v(Pwn!!cBA~mzvwdB&E8-bu-~p+aUX58R7kRGf@PEDwEta_YmQ_H!zEf2^r4l7m zt5G^*3W}=AJ$GEps6}H4pTB}|=XFH7Zb0o1JJ!Y2N+pC9xsW+LAQSJMihDjc&-1uW z?AnL$&A#jcVt4zLgn}rUIuS)x6)2uorT?6(r1lMBsOttI-M0|w>PGBF;t_d1x#{|u z_O0Mp7Vn%1m5sr;x%Z%WYSpkPAk)b)$}tLJloS4Q7y8d$PF3e2(52tDdG4ST1u_4t zbzuLyrNN#)oNV4_X3Lt|%bN|RJ+~4{ne_<=w~podd(Znv(f`pUy_sBCi^V`ZUL92D z-aCTci`NpvcR2y?OQ`dJOkVRyuIJZx{rzVyVju~Kmy_nc8vq~%Fmt<(U_Jdl%m8L$ zhxuUrnG7b+Wpd(i6sd%bi5+y9Jg3&ezS!=(0gfQ+uoV*1(-D?J>nU0&aS