From 81c82812d75a0c32171c27d2edac87db8278d315 Mon Sep 17 00:00:00 2001 From: Joonhyup Lee Date: Wed, 5 Jun 2024 22:03:02 +0900 Subject: [PATCH 1/3] :sparkles: Simplify types --- lib/program.ml | 72 ++++++-------------------------------------------- 1 file changed, 8 insertions(+), 64 deletions(-) diff --git a/lib/program.ml b/lib/program.ml index 54fa4c7..9278ac4 100644 --- a/lib/program.ml +++ b/lib/program.ml @@ -206,15 +206,7 @@ type program = { funs : fn list; exp : Exp.t } [@@deriving sexp] module Type_safe = struct type real = float - - type _ value = - | Int : int -> int value - | Real : real -> real value - | Bool : bool -> bool value - type _ ty = Tyi : int ty | Tyr : real ty | Tyb : bool ty - type ('a, 'b, 'c) bop = ('a ty * 'b ty * 'c ty) * ('a -> 'b -> 'c) - type ('a, 'b) uop = ('a ty * 'b ty) * ('a -> 'b) type _ params = | [] : unit params @@ -239,10 +231,10 @@ module Type_safe = struct | ( :: ) : ('a, 'd) texp * ('b, 'd) args -> ('a * 'b, 'd) args and (_, _) exp = - | Value : 'a value -> ('a, _) exp + | Value : 'a -> ('a, _) exp | Var : Id.t -> _ exp - | Bop : ('a, 'b, 'c) bop * ('a, 'd) texp * ('b, 'd) texp -> ('c, 'd) exp - | Uop : ('a, 'b) uop * ('a, 'd) texp -> ('b, 'd) exp + | Bop : ('a -> 'b -> 'c) * ('a, 'd) texp * ('b, 'd) texp -> ('c, 'd) exp + | Uop : ('a -> 'b) * ('a, 'd) texp -> ('b, 'd) exp (* TODO: Add list and record constructors *) (*| List : ('a, 'd) exp list -> ('a list, 'd) exp*) (*| Record : ('k * 'v, 'd) exp list -> ('k * 'v, 'd) exp*) @@ -268,58 +260,10 @@ module Type_safe = struct | [] -> Id.Set.empty | { exp; _ } :: es -> Id.(fv exp @| fv_args es) - let bop (type a b c) (op : (a, b, c) bop) (v1 : a value) (v2 : b value) : - c value = - match (op, v1, v2) with - | ((Tyi, Tyi, Tyi), op), Int i1, Int i2 -> Int (op i1 i2) - | ((Tyi, Tyi, Tyr), op), Int i1, Int i2 -> Real (op i1 i2) - | ((Tyi, Tyi, Tyb), op), Int i1, Int i2 -> Bool (op i1 i2) - | ((Tyi, Tyr, Tyi), op), Int i, Real r -> Int (op i r) - | ((Tyi, Tyr, Tyr), op), Int i, Real r -> Real (op i r) - | ((Tyi, Tyr, Tyb), op), Int i, Real r -> Bool (op i r) - | ((Tyi, Tyb, Tyr), op), Int i, Bool b -> Real (op i b) - | ((Tyi, Tyb, Tyi), op), Int i, Bool b -> Int (op i b) - | ((Tyi, Tyb, Tyb), op), Int i, Bool b -> Bool (op i b) - | ((Tyr, Tyi, Tyi), op), Real r, Int i -> Int (op r i) - | ((Tyr, Tyi, Tyr), op), Real r, Int i -> Real (op r i) - | ((Tyr, Tyi, Tyb), op), Real r, Int i -> Bool (op r i) - | ((Tyr, Tyr, Tyi), op), Real r1, Real r2 -> Int (op r1 r2) - | ((Tyr, Tyr, Tyr), op), Real r1, Real r2 -> Real (op r1 r2) - | ((Tyr, Tyr, Tyb), op), Real r1, Real r2 -> Bool (op r1 r2) - | ((Tyr, Tyb, Tyi), op), Real r, Bool b -> Int (op r b) - | ((Tyr, Tyb, Tyr), op), Real r, Bool b -> Real (op r b) - | ((Tyr, Tyb, Tyb), op), Real r, Bool b -> Bool (op r b) - | ((Tyb, Tyi, Tyr), op), Bool b, Int i -> Real (op b i) - | ((Tyb, Tyi, Tyi), op), Bool b, Int i -> Int (op b i) - | ((Tyb, Tyi, Tyb), op), Bool b, Int i -> Bool (op b i) - | ((Tyb, Tyr, Tyi), op), Bool b, Real r -> Int (op b r) - | ((Tyb, Tyr, Tyr), op), Bool b, Real r -> Real (op b r) - | ((Tyb, Tyr, Tyb), op), Bool b, Real r -> Bool (op b r) - | ((Tyb, Tyb, Tyi), op), Bool b1, Bool b2 -> Int (op b1 b2) - | ((Tyb, Tyb, Tyr), op), Bool b1, Bool b2 -> Real (op b1 b2) - | ((Tyb, Tyb, Tyb), op), Bool b1, Bool b2 -> Bool (op b1 b2) - - let uop (type a b) (op : (a, b) uop) (v : a value) : b value = - match (op, v) with - | ((Tyi, Tyi), op), Int i -> Int (op i) - | ((Tyi, Tyr), op), Int i -> Real (op i) - | ((Tyi, Tyb), op), Int i -> Bool (op i) - | ((Tyr, Tyi), op), Real r -> Int (op r) - | ((Tyr, Tyr), op), Real r -> Real (op r) - | ((Tyr, Tyb), op), Real r -> Bool (op r) - | ((Tyb, Tyi), op), Bool b -> Int (op b) - | ((Tyb, Tyr), op), Bool b -> Real (op b) - | ((Tyb, Tyb), op), Bool b -> Bool (op b) - type _ vargs = | [] : unit vargs | ( :: ) : ('a ty * 'a) * 'b vargs -> ('a * 'b) vargs - let varg_of_value : type a. a value -> a ty * a = function - | Int i -> (Tyi, i) - | Real r -> (Tyr, r) - | Bool b -> (Tyb, b) - exception Dist_type_error of string let get_bernoulli (type a b) (ret : a ty) (vargs : b vargs) : a dist = @@ -380,16 +324,16 @@ module Type_safe = struct | (Value _ | Var _) as e -> e | Bop (op, te1, te2) -> ( match (peval te1, peval te2) with - | { exp = Value v1; _ }, { exp = Value v2; _ } -> Value (bop op v1 v2) + | { exp = Value v1; _ }, { exp = Value v2; _ } -> Value (op v1 v2) | te1, te2 -> Bop (op, te1, te2)) | Uop (op, te) -> ( match peval te with - | { exp = Value v; _ } -> Value (uop op v) + | { exp = Value v; _ } -> Value (op v) | e -> Uop (op, e)) | If (te_pred, te_cons, te_alt) -> ( match peval te_pred with - | { exp = Value (Bool true); _ } -> (peval te_cons).exp - | { exp = Value (Bool false); _ } -> (peval te_alt).exp + | { exp = Value true; _ } -> (peval te_cons).exp + | { exp = Value false; _ } -> (peval te_alt).exp | te_pred -> If (te_pred, peval te_cons, peval te_alt)) | Call (f, args) -> ( match peval_args args with @@ -409,7 +353,7 @@ module Type_safe = struct | te :: tl -> ( match (peval te, peval_args tl) with | { ty; exp = Value v }, (tl, Some vargs) -> - ({ ty; exp = Value v } :: tl, Some (varg_of_value v :: vargs)) + ({ ty; exp = Value v } :: tl, Some ((ty, v) :: vargs)) | te, (tl, _) -> (te :: tl, None)) (*let rec convert (exp : Exp.t) : (float, non_det) exp =*) From b69eca26d6b2f880fe29597fad5c781945537d6e Mon Sep 17 00:00:00 2001 From: Joonhyup Lee Date: Fri, 7 Jun 2024 04:10:29 +0900 Subject: [PATCH 2/3] :sparkles: Implemented full pipeline --- bin/main.ml | 9 +- lib/lexer.mll | 2 + lib/parser.mly | 2 + lib/program.ml | 155 ------ lib/typedprog.ml | 890 +++++++++++++++++++++++++++++++++++ samples/normal_bernoulli.png | Bin 23484 -> 20891 bytes samples/normal_bernoulli.stp | 2 +- samples/simple_itpp.png | Bin 17426 -> 17677 bytes samples/student.png | Bin 16944 -> 17026 bytes samples/student.stp | 12 +- 10 files changed, 906 insertions(+), 166 deletions(-) create mode 100644 lib/typedprog.ml diff --git a/bin/main.ml b/bin/main.ml index 5baee90..485b000 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -37,6 +37,7 @@ let command : Command.t = and pp_opt = flag "-pp" no_arg ~doc:" Pretty print the program" and graph_opt = flag "-graph" no_arg ~doc:" Print the compiled graph" in fun () -> + let open Typedprog in if pp_opt then ( printf "Pretty-print: %s\n" filename; print_s [%sexp (get_program filename : Program.program)]); @@ -46,16 +47,16 @@ let command : Command.t = if pp_opt then printf "\n"; printf "Compile: %s\n" filename; Out_channel.flush stdout; - let graph, query = get_program filename |> Compiler.compile in + let graph, query = get_program filename |> Compiler.compile_program in graph_query := Some (graph, query); - print_s [%sexp (graph : Graph.t)]); - + print_s [%sexp (Printing.of_graph graph : Printing.graph)]); if pp_opt || graph_opt then printf "\n"; printf "Inference: %s\n" filename; Out_channel.flush stdout; let graph, query = !graph_query - |> Option.value ~default:(get_program filename |> Compiler.compile) + |> Option.value + ~default:(get_program filename |> Compiler.compile_program) in printf "Query result saved at %s\n" (Evaluator.infer ~filename graph query)) diff --git a/lib/lexer.mll b/lib/lexer.mll index ff3c2f7..097ca43 100644 --- a/lib/lexer.mll +++ b/lib/lexer.mll @@ -15,6 +15,8 @@ let keywords = ("in", IN); ("sample", SAMPLE); ("observe", OBSERVE); + ("true", BOOL true); + ("false", BOOL false); ] } diff --git a/lib/parser.mly b/lib/parser.mly index 7aabb79..d79f336 100644 --- a/lib/parser.mly +++ b/lib/parser.mly @@ -4,6 +4,7 @@ open Program %token INT %token REAL +%token BOOL %token ID %token IF THEN ELSE FUN LET IN %token PLUS MINUS NEG MULT DIV RPLUS RMINUS RNEG RMULT RDIV EQ NE LT GT RLT RGT AND OR NOT @@ -36,6 +37,7 @@ exp: | LPAREN; e = exp; RPAREN { e } | i = INT { Int i } | r = REAL { Real r } + | b = BOOL { Bool b } | x = ID { Var x } | f = ID; LPAREN; es = args; RPAREN { Call (f, es) } | IF; e_pred = exp; THEN; e_con = exp; ELSE; e_alt = exp { If (e_pred, e_con, e_alt) } diff --git a/lib/program.ml b/lib/program.ml index 9278ac4..a8c2411 100644 --- a/lib/program.ml +++ b/lib/program.ml @@ -203,158 +203,3 @@ end type fn = { name : Id.t; params : Id.t list; body : Exp.t } [@@deriving sexp] type program = { funs : fn list; exp : Exp.t } [@@deriving sexp] - -module Type_safe = struct - type real = float - type _ ty = Tyi : int ty | Tyr : real ty | Tyb : bool ty - - type _ params = - | [] : unit params - | ( :: ) : 'a ty * 'b params -> ('a * 'b) params - - type det = Det - type non_det = Non_det - type 'a sampler = unit -> 'a - type 'a log_pmdf = 'a -> real - - type 'a dist = { - name : Id.t; - ty : 'a ty; - sampler : 'a sampler; - log_pmdf : 'a log_pmdf; - } - - type any_dist = Any_dist : 'a dist -> any_dist - - type (_, _) args = - | [] : (unit, _) args - | ( :: ) : ('a, 'd) texp * ('b, 'd) args -> ('a * 'b, 'd) args - - and (_, _) exp = - | Value : 'a -> ('a, _) exp - | Var : Id.t -> _ exp - | Bop : ('a -> 'b -> 'c) * ('a, 'd) texp * ('b, 'd) texp -> ('c, 'd) exp - | Uop : ('a -> 'b) * ('a, 'd) texp -> ('b, 'd) exp - (* TODO: Add list and record constructors *) - (*| List : ('a, 'd) exp list -> ('a list, 'd) exp*) - (*| Record : ('k * 'v, 'd) exp list -> ('k * 'v, 'd) exp*) - | If : (bool, 'd) texp * ('a, 'd) texp * ('a, 'd) texp -> ('a, 'd) exp - | Let : Id.t * ('a, non_det) texp * ('b, non_det) texp -> ('b, non_det) exp - | Call : Id.t * ('a, 'd) args -> ('b, 'd) exp - | Sample : ('a, non_det) texp -> ('a, non_det) exp - | Observe : ('a, non_det) texp * ('a, non_det) texp -> ('a, non_det) exp - | Dist : 'b dist -> ('b, det) exp - - and ('a, 'd) texp = { ty : 'a ty; exp : ('a, 'd) exp } - - let rec fv : type a. (a, det) exp -> Id.Set.t = function - | Value _ | Dist _ -> Id.Set.empty - | Var x -> Id.Set.singleton x - | Bop (_, { exp = e1; _ }, { exp = e2; _ }) -> Id.(fv e1 @| fv e2) - | Uop (_, { exp; _ }) -> fv exp - | If ({ exp = e_pred; _ }, { exp = e_cons; _ }, { exp = e_alt; _ }) -> - Id.(fv e_pred @| fv e_cons @| fv e_alt) - | Call (_, args) -> fv_args args - - and fv_args : type a. (a, det) args -> Id.Set.t = function - | [] -> Id.Set.empty - | { exp; _ } :: es -> Id.(fv exp @| fv_args es) - - type _ vargs = - | [] : unit vargs - | ( :: ) : ('a ty * 'a) * 'b vargs -> ('a * 'b) vargs - - exception Dist_type_error of string - - let get_bernoulli (type a b) (ret : a ty) (vargs : b vargs) : a dist = - let open Owl.Stats in - match (ret, vargs) with - | Tyb, [ (Tyr, p) ] -> - { - name = "bernoulli"; - ty = Tyb; - sampler = (fun () -> binomial_rvs ~p ~n:1 = 1); - log_pmdf = (fun b -> binomial_logpdf ~p ~n:1 (Bool.to_int b)); - } - | Tyb, [] -> raise (Dist_type_error "Bernoulli: too few args") - | Tyb, [ (Tyi, i) ] -> - raise (Dist_type_error (sprintf "Bernoulli: got %i expected real" i)) - | Tyb, [ (Tyb, b) ] -> - raise (Dist_type_error (sprintf "Bernoulli: got %b expected real" b)) - | Tyb, _ -> raise (Dist_type_error "Bernoulli: too many arguments") - | _, _ -> raise (Dist_type_error "Bernoulli: should return bool") - - let get_normal (type a b) (ret : a ty) (vargs : b vargs) : a dist = - let open Owl.Stats in - match (ret, vargs) with - | Tyr, [ (Tyr, mu); (Tyr, sigma) ] -> - { - name = "normal"; - ty = Tyr; - sampler = (fun () -> gaussian_rvs ~mu ~sigma); - log_pmdf = gaussian_logpdf ~mu ~sigma; - } - | Tyr, [] | Tyr, [ _ ] -> raise (Dist_type_error "Normal: too few args") - | Tyr, [ (Tyi, i); _ ] -> - raise (Dist_type_error (sprintf "Normal: got %i expected real" i)) - | Tyr, [ (Tyr, _); (Tyi, i) ] -> - raise (Dist_type_error (sprintf "Normal: got %i expected real" i)) - | Tyr, [ (Tyb, b); _ ] -> - raise (Dist_type_error (sprintf "Normal: got %b expected real" b)) - | Tyr, [ (Tyr, _); (Tyb, b) ] -> - raise (Dist_type_error (sprintf "Normal: got %b expected real" b)) - | Tyr, _ -> raise (Dist_type_error "Normal: too many arguments") - | _, _ -> raise (Dist_type_error "Normal: should return real") - - type ('arg, 'k) cont_dist_box = { - k : 'a 'b. ('a params * 'b ty) * ('arg vargs -> 'b dist) -> 'k; - } - - let dist_lookup (name : Id.t) (ret : 'a ty) (vargs : 'b vargs) : 'a dist = - match name with - | "bernoulli" -> get_bernoulli ret vargs - | "normal" -> get_normal ret vargs - (* TODO: Add more distributions *) - | _ -> raise (Invalid_argument "Distribution not found") - - let rec peval : type a. (a, det) texp -> (a, det) texp = - fun { ty; exp } -> - let exp = - match exp with - | (Value _ | Var _) as e -> e - | Bop (op, te1, te2) -> ( - match (peval te1, peval te2) with - | { exp = Value v1; _ }, { exp = Value v2; _ } -> Value (op v1 v2) - | te1, te2 -> Bop (op, te1, te2)) - | Uop (op, te) -> ( - match peval te with - | { exp = Value v; _ } -> Value (op v) - | e -> Uop (op, e)) - | If (te_pred, te_cons, te_alt) -> ( - match peval te_pred with - | { exp = Value true; _ } -> (peval te_cons).exp - | { exp = Value false; _ } -> (peval te_alt).exp - | te_pred -> If (te_pred, peval te_cons, peval te_alt)) - | Call (f, args) -> ( - match peval_args args with - | args, None -> Call (f, args) - | _, Some vargs -> - (* All arguments are fully evaluated; - Go ahead and fully evaluate the (primitive) call. - It is a primitive call as this is a deterministic expression. *) - Dist (dist_lookup f ty vargs)) - | Dist _ as e -> e (* TODO: probably should not be encountered *) - in - { ty; exp } - - and peval_args : type a. (a, det) args -> (a, det) args * a vargs option = - function - | [] -> ([], Some []) - | te :: tl -> ( - match (peval te, peval_args tl) with - | { ty; exp = Value v }, (tl, Some vargs) -> - ({ ty; exp = Value v } :: tl, Some ((ty, v) :: vargs)) - | te, (tl, _) -> (te :: tl, None)) - - (*let rec convert (exp : Exp.t) : (float, non_det) exp =*) -end diff --git a/lib/typedprog.ml b/lib/typedprog.ml new file mode 100644 index 0000000..1c84e93 --- /dev/null +++ b/lib/typedprog.ml @@ -0,0 +1,890 @@ +open! Core +open Program + +module Syntax = struct + type real = float + type _ ty = Tyi : int ty | Tyr : real ty | Tyb : bool ty + + type _ params = + | [] : unit params + | ( :: ) : 'a ty * 'b params -> ('a * 'b) params + + type det = Det + type non_det = Non_det + + type _ vargs = + | [] : unit vargs + | ( :: ) : ('a ty * 'a) * 'b vargs -> ('a * 'b) vargs + + type ('a, 'b) dist = { + ret : 'a ty; + name : Id.t; + params : 'b params; + sampler : 'b vargs -> 'a; + log_pmdf : 'b vargs -> 'a -> real; + } + + type ('a, 'b, 'c) bop = { name : Id.t; f : 'a -> 'b -> 'c } + type ('a, 'b) uop = { name : Id.t; f : 'a -> 'b } + + type (_, _) args = + | [] : (unit, _) args + | ( :: ) : ('a, 'd) texp * ('b, 'd) args -> ('a * 'b, 'd) args + + and (_, _) exp = + | Value : 'a -> ('a, _) exp + | Var : Id.t -> _ exp + | Bop : ('a, 'b, 'c) bop * ('a, 'd) texp * ('b, 'd) texp -> ('c, 'd) exp + | Uop : ('a, 'b) uop * ('a, 'd) texp -> ('b, 'd) exp + (* TODO: Add list and record constructors *) + (*| List : ('a, 'd) exp list -> ('a list, 'd) exp*) + (*| Record : ('k * 'v, 'd) exp list -> ('k * 'v, 'd) exp*) + | If : (bool, 'd) texp * ('a, 'd) texp * ('a, 'd) texp -> ('a, 'd) exp + | Let : Id.t * ('a, non_det) texp * ('b, non_det) texp -> ('b, non_det) exp + | Call : ('a, 'b) dist * ('b, 'd) args -> ('a, 'd) exp + | Sample : ('a, non_det) texp -> ('a, non_det) exp + | Observe : ('a, non_det) texp * ('a, non_det) texp -> ('a, non_det) exp + + and ('a, 'd) texp = { ty : 'a ty; exp : ('a, 'd) exp } + + let rec fv : type a. (a, det) exp -> Id.Set.t = function + | Value _ -> Id.Set.empty + | Var x -> Id.Set.singleton x + | Bop (_, { exp = e1; _ }, { exp = e2; _ }) -> Id.(fv e1 @| fv e2) + | Uop (_, { exp; _ }) -> fv exp + | If ({ exp = e_pred; _ }, { exp = e_cons; _ }, { exp = e_alt; _ }) -> + Id.(fv e_pred @| fv e_cons @| fv e_alt) + | Call (_, args) -> fv_args args + + and fv_args : type a. (a, det) args -> Id.Set.t = function + | [] -> Id.Set.empty + | { exp; _ } :: es -> Id.(fv exp @| fv_args es) + + type any_ndet = Any : (_, non_det) texp -> any_ndet + type any_det = Any : (_, det) texp -> any_det + type any_ty = Any : _ ty -> any_ty + type any_params = Any : _ params -> any_params + type any_v = Any : ('a ty * 'a) -> any_v + type any_dist = Any : _ dist -> any_dist + type tyenv = any_ty Id.Map.t +end + +module Typing = struct + open Syntax + + let gen_args = + let cnt = ref 0 in + fun () -> + let arg = "$arg" ^ string_of_int !cnt in + incr cnt; + arg + + let rec subst (env : Id.t Id.Map.t) (e : Exp.t) = + let subst' = subst env in + match e with + | Int _ | Real _ | Bool _ -> e + | Var x -> ( + match Map.find env x with + | None -> failwith ("Unbound variable " ^ x) + | Some v -> Var v) + | Add (e1, e2) -> Add (subst' e1, subst' e2) + | Radd (e1, e2) -> Radd (subst' e1, subst' e2) + | Minus (e1, e2) -> Minus (subst' e1, subst' e2) + | Rminus (e1, e2) -> Rminus (subst' e1, subst' e2) + | Neg e -> Neg (subst' e) + | Rneg e -> Rneg (subst' e) + | Mult (e1, e2) -> Mult (subst' e1, subst' e2) + | Rmult (e1, e2) -> Rmult (subst' e1, subst' e2) + | Div (e1, e2) -> Div (subst' e1, subst' e2) + | Rdiv (e1, e2) -> Rdiv (subst' e1, subst' e2) + | Eq (e1, e2) -> Eq (subst' e1, subst' e2) + | Req (e1, e2) -> Req (subst' e1, subst' e2) + | Noteq (e1, e2) -> Noteq (subst' e1, subst' e2) + | Less (e1, e2) -> Less (subst' e1, subst' e2) + | Rless (e1, e2) -> Rless (subst' e1, subst' e2) + | And (e1, e2) -> And (subst' e1, subst' e2) + | Or (e1, e2) -> Or (subst' e1, subst' e2) + | Seq (e1, e2) -> Seq (subst' e1, subst' e2) + | Not e -> Not (subst' e) + | Assign (x, e1, e2) -> + Assign (x, subst' e1, subst (Map.set env ~key:x ~data:x) e2) + | If (cond, yes, no) -> If (subst' cond, subst' yes, subst' no) + | Call (f, args) -> + let args = List.map ~f:subst' args in + Call (f, args) + | Sample e -> Sample (subst' e) + | Observe (d, e) -> Observe (subst' d, subst' e) + | List _ -> failwith "List not implemented" + | Record _ -> failwith "Record not implemented" + + let rec inline_one (fn : fn) (prog : program) = + let rec inline_exp scope (e : Exp.t) = + let inline_exp' = inline_exp scope in + match e with + | Int _ | Real _ | Bool _ -> e + | Var x -> + if Set.mem scope x then e else failwith ("Unbound variable " ^ x) + | Add (e1, e2) -> Add (inline_exp' e1, inline_exp' e2) + | Radd (e1, e2) -> Radd (inline_exp' e1, inline_exp' e2) + | Minus (e1, e2) -> Minus (inline_exp' e1, inline_exp' e2) + | Rminus (e1, e2) -> Rminus (inline_exp' e1, inline_exp' e2) + | Neg e -> Neg (inline_exp' e) + | Rneg e -> Rneg (inline_exp' e) + | Mult (e1, e2) -> Mult (inline_exp' e1, inline_exp' e2) + | Rmult (e1, e2) -> Rmult (inline_exp' e1, inline_exp' e2) + | Div (e1, e2) -> Div (inline_exp' e1, inline_exp' e2) + | Rdiv (e1, e2) -> Rdiv (inline_exp' e1, inline_exp' e2) + | Eq (e1, e2) -> Eq (inline_exp' e1, inline_exp' e2) + | Req (e1, e2) -> Req (inline_exp' e1, inline_exp' e2) + | Noteq (e1, e2) -> Noteq (inline_exp' e1, inline_exp' e2) + | Less (e1, e2) -> Less (inline_exp' e1, inline_exp' e2) + | Rless (e1, e2) -> Rless (inline_exp' e1, inline_exp' e2) + | And (e1, e2) -> And (inline_exp' e1, inline_exp' e2) + | Or (e1, e2) -> Or (inline_exp' e1, inline_exp' e2) + | Seq (e1, e2) -> Seq (inline_exp' e1, inline_exp' e2) + | Not e -> Not (inline_exp' e) + | Assign (x, e1, e2) -> + Assign (x, inline_exp' e1, inline_exp (Set.add scope x) e2) + | If (cond, yes, no) -> + If (inline_exp' cond, inline_exp' yes, inline_exp' no) + | Call (f, args) -> + let args = List.map ~f:inline_exp' args in + if Id.(equal f fn.name) then + let kvpair = + try List.zip_exn fn.params args + with _ -> + failwith + ("Argument length mismatch when calling function " ^ fn.name) + in + let kvpair = + List.map ~f:(fun (k, v) -> (k, gen_args (), v)) kvpair + in + let env = + List.fold kvpair ~init:Id.Map.empty ~f:(fun acc (k, v, _) -> + Map.set acc ~key:k ~data:v) + in + List.fold kvpair ~init:(subst env fn.body) + ~f:(fun acc (_, v, arg) -> Exp.Assign (v, arg, acc)) + else Call (f, args) + | Sample e -> Sample (inline_exp' e) + | Observe (d, e) -> Observe (inline_exp' d, inline_exp' e) + | List _ -> failwith "List not implemented" + | Record _ -> failwith "Record not implemented" + in + let { funs; exp } = prog in + match funs with + | [] -> { funs = []; exp = inline_exp Id.Set.empty exp } + | { name; params; body } :: funs -> + let body = inline_exp (Id.Set.of_list params) body in + if Id.(equal name fn.name) then + { funs = { name; params; body } :: funs; exp } + else + let { funs; exp } = inline_one fn { funs; exp } in + { funs = { name; params; body } :: funs; exp } + + let rec inline (prog : program) = + let { funs; exp } = prog in + match funs with + | [] -> exp + | fn :: funs -> inline (inline_one fn { funs; exp }) + + let get_dist (name : Id.t) : any_dist = + let open Owl.Stats in + match name with + | "bernoulli" -> + Any + { + ret = Tyb; + name = "bernoulli"; + params = [ Tyr ]; + sampler = (fun [ (Tyr, p) ] -> binomial_rvs ~p ~n:1 = 1); + log_pmdf = + (fun [ (Tyr, p) ] b -> binomial_logpdf ~p ~n:1 (Bool.to_int b)); + } + | "normal" -> + Any + { + ret = Tyr; + name = "normal"; + params = [ Tyr; Tyr ]; + sampler = + (fun [ (Tyr, mu); (Tyr, sigma) ] -> gaussian_rvs ~mu ~sigma); + log_pmdf = + (fun [ (Tyr, mu); (Tyr, sigma) ] -> gaussian_logpdf ~mu ~sigma); + } + | _ -> failwith "Unknown primitive function" + + let rec check : type a. tyenv -> Exp.t -> a ty -> (a, non_det) texp = + fun tyenv e ty -> + match e with + | Var x -> ( + match Map.find tyenv x with + | None -> failwith ("Unbound variable " ^ x) + | Some (Any t) -> ( + match (t, ty) with + | Tyi, Tyi -> { ty; exp = Var x } + | Tyr, Tyr -> { ty; exp = Var x } + | Tyb, Tyb -> { ty; exp = Var x } + | _, _ -> failwith ("Variable " ^ x ^ " type mismatch"))) + | Int i -> ( + match ty with + | Tyi -> { ty; exp = Value i } + | _ -> failwith "Expected something other than int") + | Add (e1, e2) -> ( + match ty with + | Tyi -> check_bop tyenv "+" ( + ) Tyi Tyi Tyi e1 e2 + | _ -> failwith "Expected something other than int") + | Minus (e1, e2) -> ( + match ty with + | Tyi -> check_bop tyenv "-" ( - ) Tyi Tyi Tyi e1 e2 + | _ -> failwith "Expected something other than int") + | Neg e -> ( + match ty with + | Tyi -> check_uop tyenv "-" Int.neg Tyi Tyi e + | _ -> failwith "Expected something other than int") + | Mult (e1, e2) -> ( + match ty with + | Tyi -> check_bop tyenv "*" ( * ) Tyi Tyi Tyi e1 e2 + | _ -> failwith "Expected something other than int") + | Div (e1, e2) -> ( + match ty with + | Tyi -> check_bop tyenv "/" ( / ) Tyi Tyi Tyi e1 e2 + | _ -> failwith "Expected something other than int") + | Real r -> ( + match ty with + | Tyr -> { ty; exp = Value r } + | _ -> failwith "Expected something other than float") + | Radd (e1, e2) -> ( + match ty with + | Tyr -> check_bop tyenv "+" ( +. ) Tyr Tyr Tyr e1 e2 + | _ -> failwith "Expected something other than float") + | Rminus (e1, e2) -> ( + match ty with + | Tyr -> check_bop tyenv "-" ( -. ) Tyr Tyr Tyr e1 e2 + | _ -> failwith "Expected something other than float") + | Rneg e -> ( + match ty with + | Tyr -> check_uop tyenv "-" Float.neg Tyr Tyr e + | _ -> failwith "Expected something other than float") + | Rmult (e1, e2) -> ( + match ty with + | Tyr -> check_bop tyenv "*" ( *. ) Tyr Tyr Tyr e1 e2 + | _ -> failwith "Expected something other than float") + | Rdiv (e1, e2) -> ( + match ty with + | Tyr -> check_bop tyenv "/" ( /. ) Tyr Tyr Tyr e1 e2 + | _ -> failwith "Expected something other than float") + | Bool b -> ( + match ty with + | Tyb -> { ty; exp = Value b } + | _ -> failwith "Expected something other than bool") + | Eq (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "=" Int.( = ) Tyi Tyi Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | Req (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "=" Float.( = ) Tyr Tyr Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | Noteq (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "<>" Int.( <> ) Tyi Tyi Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | Less (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "<" Int.( < ) Tyi Tyi Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | Rless (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "<" Float.( < ) Tyr Tyr Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | And (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "&&" ( && ) Tyb Tyb Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | Or (e1, e2) -> ( + match ty with + | Tyb -> check_bop tyenv "||" ( || ) Tyb Tyb Tyb e1 e2 + | _ -> failwith "Expected something other than bool") + | Not e -> ( + match ty with + | Tyb -> check_uop tyenv "!" not Tyb Tyb e + | _ -> failwith "Expected something other than bool") + | Observe (d, e) -> ( + let (Any td) = convert tyenv d in + let (Any te) = convert tyenv e in + match (ty, td.ty, te.ty) with + | Tyi, Tyi, Tyi -> { ty; exp = Observe (td, te) } + | Tyr, Tyr, Tyr -> { ty; exp = Observe (td, te) } + | Tyb, Tyb, Tyb -> { ty; exp = Observe (td, te) } + | _, _, _ -> failwith "Argument to observe has different types") + | Seq (e1, e2) -> + let (Any te1) = convert tyenv e1 in + let te2 = check tyenv e2 ty in + { ty; exp = Let ("_", te1, te2) } + | Assign (x, e1, e2) -> + let (Any ({ ty = ty1; exp = _ } as te1)) = convert tyenv e1 in + let tyenv = Map.set tyenv ~key:x ~data:(Any ty1) in + let te2 = check tyenv e2 ty in + { ty; exp = Let (x, te1, te2) } + | If (pred, conseq, alt) -> + let tpred = check tyenv pred Tyb in + let tconseq = check tyenv conseq ty in + let talt = check tyenv alt ty in + { ty; exp = If (tpred, tconseq, talt) } + | Call (prim, args) -> ( + let (Any dist) = get_dist prim in + let args = check_args tyenv args dist.params in + match (dist.ret, ty) with + | Tyi, Tyi -> { ty; exp = Call (dist, args) } + | Tyr, Tyr -> { ty; exp = Call (dist, args) } + | Tyb, Tyb -> { ty; exp = Call (dist, args) } + | _, _ -> failwith "No") + | Sample e -> + let te = check tyenv e ty in + { ty; exp = Sample te } + | List _ -> failwith "List not implemented" + | Record _ -> failwith "Record not implemented" + + and check_uop : + type arg ret. + tyenv -> + Id.t -> + (arg -> ret) -> + arg ty -> + ret ty -> + Exp.t -> + (ret, non_det) texp = + fun tyenv name f t ty e -> + let te = check tyenv e t in + { ty; exp = Uop ({ name; f }, te) } + + and check_bop : + type arg1 arg2 ret. + tyenv -> + Id.t -> + (arg1 -> arg2 -> ret) -> + arg1 ty -> + arg2 ty -> + ret ty -> + Exp.t -> + Exp.t -> + (ret, non_det) texp = + fun tyenv name f t1 t2 ty e1 e2 -> + let te1 = check tyenv e1 t1 in + let te2 = check tyenv e2 t2 in + { ty; exp = Bop ({ name; f }, te1, te2) } + + and check_args : type a. tyenv -> Exp.t list -> a params -> (a, non_det) args + = + fun tyenv el tyl -> + match tyl with + | [] -> [] + | argty :: argtys -> ( + match el with + | [] -> failwith "Primitive call failed" + | arg :: args -> + let arg = check tyenv arg argty in + let args = check_args tyenv args argtys in + arg :: args) + + and convert (tyenv : tyenv) (e : Exp.t) : any_ndet = + match e with + | Var x -> ( + match Map.find tyenv x with + | None -> failwith ("Unbound variable " ^ x) + | Some (Any t) -> Any { ty = t; exp = Var x }) + | Int _ | Add _ | Minus _ | Neg _ | Mult _ | Div _ -> + Any (check tyenv e Tyi) + | Real _ | Radd _ | Rminus _ | Rneg _ | Rmult _ | Rdiv _ -> + Any (check tyenv e Tyr) + | Bool _ | Eq _ | Req _ | Noteq _ | Less _ | Rless _ | And _ | Or _ | Not _ + -> + Any (check tyenv e Tyb) + | Observe (d, e) -> ( + let (Any td) = convert tyenv d in + let (Any te) = convert tyenv e in + match (td.ty, te.ty) with + | Tyi, Tyi -> Any { ty = Tyi; exp = Observe (td, te) } + | Tyr, Tyr -> Any { ty = Tyr; exp = Observe (td, te) } + | Tyb, Tyb -> Any { ty = Tyb; exp = Observe (td, te) } + | _, _ -> failwith "Argument to observe has different types.") + | Seq (e1, e2) -> + let (Any te1) = convert tyenv e1 in + let (Any ({ ty = ty2; exp = _ } as te2)) = convert tyenv e2 in + Any { ty = ty2; exp = Let ("_", te1, te2) } + | Assign (x, e1, e2) -> + let (Any ({ ty = ty1; exp = _ } as te1)) = convert tyenv e1 in + let tyenv = Map.set tyenv ~key:x ~data:(Any ty1) in + let (Any ({ ty = ty2; exp = _ } as te2)) = convert tyenv e2 in + Any { ty = ty2; exp = Let (x, te1, te2) } + | If (pred, conseq, alt) -> ( + let tpred = check tyenv pred Tyb in + let (Any tconseq) = convert tyenv conseq in + let (Any talt) = convert tyenv alt in + match (tconseq.ty, talt.ty) with + | Tyi, Tyi -> Any { ty = Tyi; exp = If (tpred, tconseq, talt) } + | Tyr, Tyr -> Any { ty = Tyr; exp = If (tpred, tconseq, talt) } + | Tyb, Tyb -> Any { ty = Tyb; exp = If (tpred, tconseq, talt) } + | _, _ -> + failwith "Branches of an if statement must return the same type") + | Call (prim, args) -> + let (Any dist) = get_dist prim in + let args = check_args tyenv args dist.params in + Any { ty = dist.ret; exp = Call (dist, args) } + | Sample e -> + let (Any te) = convert tyenv e in + Any { ty = te.ty; exp = Sample te } + | List _ -> failwith "List not implemented" + | Record _ -> failwith "Record not implemented" +end + +module Graph = struct + open Syntax + + type vertex = Id.t + type arc = vertex * vertex + type pmdf_map = any_det Id.Map.t + type obs_map = any_det Id.Map.t + + type t = { + vertices : vertex list; + arcs : arc list; + pmdf_map : pmdf_map; + obs_map : obs_map; + } + + let empty = + { + vertices = []; + arcs = []; + pmdf_map = Id.Map.empty; + obs_map = Id.Map.empty; + } + + let union g1 g2 = + { + vertices = g1.vertices @ g2.vertices; + arcs = g1.arcs @ g2.arcs; + pmdf_map = + Map.merge g1.pmdf_map g2.pmdf_map ~f:(fun ~key:_ v -> + match v with + | `Left det | `Right det -> Some det + | `Both _ -> + failwith "Graph.union: duplicate deterministic expression"); + obs_map = + Map.merge g1.obs_map g2.obs_map ~f:(fun ~key:_ v -> + match v with + | `Left obs | `Right obs -> Some obs + | `Both _ -> failwith "Graph.union: duplicate observation"); + } + + let ( @| ) = union + + let unobserved_vertices_pmdfs ({ vertices; pmdf_map; obs_map; _ } : t) : + (vertex * any_det) list = + List.filter_map vertices ~f:(fun v -> + if Map.mem obs_map v then None + else + let pmdf = Map.find_exn pmdf_map v in + Some (v, pmdf)) +end + +module Compiler = struct + open Syntax + + type env = any_det Id.Map.t + + let gen_vertex = + let cnt = ref 0 in + fun () -> + let v = "X" ^ string_of_int !cnt in + incr cnt; + v + + exception Score_invalid_arguments + exception Not_closed_observation + + let rec peval : type a. (a, det) texp -> (a, det) texp = + fun { ty; exp } -> + let exp = + match exp with + | (Value _ | Var _) as e -> e + | Bop (op, te1, te2) -> ( + match (peval te1, peval te2) with + | { exp = Value v1; _ }, { exp = Value v2; _ } -> Value (op.f v1 v2) + | te1, te2 -> Bop (op, te1, te2)) + | Uop (op, te) -> ( + match peval te with + | { exp = Value v; _ } -> Value (op.f v) + | e -> Uop (op, e)) + | If (te_pred, te_cons, te_alt) -> ( + match peval te_pred with + | { exp = Value true; _ } -> (peval te_cons).exp + | { exp = Value false; _ } -> (peval te_alt).exp + | te_pred -> If (te_pred, peval te_cons, peval te_alt)) + | Call (f, args) -> ( + match peval_args args with + | args, None -> Call (f, args) + | _, Some vargs -> + (* All arguments are fully evaluated; + Go ahead and fully evaluate the (primitive) call. + It is a primitive call as this is a deterministic expression. *) + Call + ( { + ret = f.ret; + name = f.name; + params = []; + sampler = (fun [] -> f.sampler vargs); + log_pmdf = (fun [] -> f.log_pmdf vargs); + }, + [] )) + in + { ty; exp } + + and peval_args : type a. (a, det) args -> (a, det) args * a vargs option = + function + | [] -> ([], Some []) + | te :: tl -> ( + match (peval te, peval_args tl) with + | { ty; exp = Value v }, (tl, Some vargs) -> + ({ ty; exp = Value v } :: tl, Some ((ty, v) :: vargs)) + | te, (tl, _) -> (te :: tl, None)) + + let rec score : type a. (a, det) texp -> Id.t -> (a, det) texp = + fun e var -> + match e.exp with + | If (e_pred, e_con, e_alt) -> + let s_con = score e_con var in + let s_alt = score e_alt var in + { ty = e.ty; exp = If (e_pred, s_con, s_alt) } + | Call _ -> e + | _ -> raise Score_invalid_arguments + + let rec compile : + type a. + env -> (bool, det) texp -> (a, non_det) texp -> Graph.t * (a, det) texp = + fun env pred e -> + let { ty; exp } = e in + match exp with + | Value v -> (Graph.empty, { ty; exp = Value v }) + | Var x -> ( + let (Any { ty = tx; exp }) = Map.find_exn env x in + match (tx, ty) with + | Tyi, Tyi -> (Graph.empty, { ty; exp }) + | Tyr, Tyr -> (Graph.empty, { ty; exp }) + | Tyb, Tyb -> (Graph.empty, { ty; exp }) + | _, _ -> assert false) + | Bop (op, e1, e2) -> + let g1, te1 = compile env pred e1 in + let g2, te2 = compile env pred e2 in + Graph.(g1 @| g2, { ty; exp = Bop (op, te1, te2) }) + | Uop (op, e) -> + let g, te = compile env pred e in + (g, { ty; exp = Uop (op, te) }) + | If (e_pred, e_con, e_alt) -> ( + let g1, de_pred = compile env pred e_pred in + let pred_con = + peval + { ty = Tyb; exp = Bop ({ f = ( && ); name = "&&" }, pred, de_pred) } + in + let pred_alt = + peval + { + ty = Tyb; + exp = + Bop + ( { f = ( && ); name = "&&" }, + pred, + { ty = Tyb; exp = Uop ({ f = not; name = "!" }, de_pred) } + ); + } + in + let g2, de_con = compile env pred_con e_con in + let g3, de_alt = compile env pred_alt e_alt in + let g = Graph.(g1 @| g2 @| g3) in + match pred_con.exp with + | Value true -> (g, de_con) + | Value false -> (g, de_alt) + | _ -> (g, { ty; exp = If (de_pred, de_con, de_alt) })) + | Let (x, e, body) -> + let g1, det_exp1 = compile env pred e in + let g2, det_exp2 = + compile (Map.set env ~key:x ~data:(Any det_exp1)) pred body + in + Graph.(g1 @| g2, det_exp2) + | Call (f, args) -> + let g, args = compile_args env pred args in + (g, { ty; exp = Call (f, args) }) + | Sample e -> + let g, de = compile env pred e in + let v = gen_vertex () in + let de_fvs = fv de.exp in + let f : any_det = Any (score de v) in + let g' = + Graph. + { + vertices = [ v ]; + arcs = List.map (Set.to_list de_fvs) ~f:(fun z -> (z, v)); + pmdf_map = Id.Map.singleton v f; + obs_map = Id.Map.empty; + } + in + Graph.(g @| g', { ty; exp = Var v }) + | Observe (e1, e2) -> + let g1, de1 = compile env pred e1 in + let g2, de2 = compile env pred e2 in + let v = gen_vertex () in + let f1 = score de1 v in + let one : type a. a ty -> (a, unit) dist = + fun ty -> + match ty with + | Tyi -> + { + ret = ty; + name = "one"; + params = []; + sampler = (fun _ -> 1); + log_pmdf = (fun [] _ -> 0.0); + } + | Tyr -> + { + ret = ty; + name = "one"; + params = []; + sampler = (fun _ -> 1.0); + log_pmdf = (fun [] _ -> 0.0); + } + | Tyb -> + { + ret = Tyb; + name = "one"; + params = []; + sampler = (fun _ -> true); + log_pmdf = (fun [] _ -> 0.0); + } + in + let f = { ty; exp = If (pred, f1, { ty; exp = Call (one ty, []) }) } in + let fvs = Id.(fv de1.exp @| fv pred.exp) in + if not (Set.is_empty (fv de2.exp)) then raise Not_closed_observation; + let g' = + Graph. + { + vertices = [ v ]; + arcs = List.map (Set.to_list fvs) ~f:(fun z -> (z, v)); + pmdf_map = Id.Map.singleton v (Any f : any_det); + obs_map = Id.Map.singleton v (Any de2 : any_det); + } + in + Graph.(g1 @| g2 @| g', de2) + + and compile_args : + type a. + env -> (bool, det) texp -> (a, non_det) args -> Graph.t * (a, det) args = + fun env pred args -> + match args with + | [] -> (Graph.empty, []) + | arg :: args -> + let g, arg = compile env pred arg in + let g', args = compile_args env pred args in + Graph.(g @| g', arg :: args) + + let compile_program (prog : program) : Graph.t * any_det = + let open Typing in + let (Any e) = convert Id.Map.empty (inline prog) in + let g, e = compile Id.Map.empty { ty = Tyb; exp = Value true } e in + (g, Any e) +end + +module Printing = struct + open Syntax + + type t = + | Value : Id.t -> t + | Var : Id.t -> t + | Bop : Id.t * t * t -> t + | Uop : Id.t * t -> t + (* TODO: Add list and record constructors *) + (*| List : ('a, 'd) exp list -> ('a list, 'd) exp*) + (*| Record : ('k * 'v, 'd) exp list -> ('k * 'v, 'd) exp*) + | If : t * t * t -> t + | Let : Id.t * t * t -> t + | Call : Id.t * t list -> t + | Sample : t -> t + | Observe : t * t -> t + [@@deriving sexp] + + type graph = { + vertices : Id.t list; + arcs : (Id.t * Id.t) list; + pmdf_map : t Id.Map.t; + obs_map : t Id.Map.t; + } + [@@deriving sexp] + + let rec of_exp : type a d. (a, d) texp -> t = + fun { ty; exp } -> + match exp with + | Value v -> ( + match ty with + | Tyi -> Value (string_of_int v) + | Tyr -> Value (string_of_float v) + | Tyb -> Value (string_of_bool v)) + | Var v -> Var v + | Bop (op, e1, e2) -> Bop (op.name, of_exp e1, of_exp e2) + | Uop (op, e) -> Uop (op.name, of_exp e) + | If (pred, cons, alt) -> If (of_exp pred, of_exp cons, of_exp alt) + | Let (x, e1, e2) -> Let (x, of_exp e1, of_exp e2) + | Call (f, args) -> Call (f.name, of_args args) + | Sample e -> Sample (of_exp e) + | Observe (d, e) -> Observe (of_exp d, of_exp e) + + and of_args : type a d. (a, d) args -> t list = function + | [] -> [] + | arg :: args -> of_exp arg :: of_args args + + let of_graph ({ vertices; arcs; pmdf_map; obs_map } : Graph.t) : graph = + { + vertices; + arcs; + pmdf_map = Map.map pmdf_map ~f:(fun (Any e) -> of_exp e); + obs_map = Map.map obs_map ~f:(fun (Any e) -> of_exp e); + } + + let to_string (Any e : any_det) = + e |> of_exp |> sexp_of_t |> Sexp.to_string_hum +end + +module Evaluator = struct + open Syntax + + type env = any_v Id.Table.t + + let rec eval : type a. env -> (a, det) texp -> a = + fun env { ty; exp } -> + match exp with + | Value v -> v + | Var x -> ( + let (Any (tv, v)) = Hashtbl.find_exn env x in + match (ty, tv) with + | Tyi, Tyi -> v + | Tyr, Tyr -> v + | Tyb, Tyb -> v + | _ -> assert false) + | Bop (op, te1, te2) -> op.f (eval env te1) (eval env te2) + | Uop (op, te) -> op.f (eval env te) + | If (te_pred, te_cons, te_alt) -> + if eval env te_pred then eval env te_cons else eval env te_alt + | Call (f, args) -> f.sampler (eval_args env args) + + and eval_args : type a. env -> (a, det) args -> a vargs = + fun env -> function + | [] -> [] + | te :: tl -> (te.ty, eval env te) :: eval_args env tl + + let rec eval_pmdf (env : env) (Any { ty; exp } : any_det) : + (any_v -> float) * any_v = + match exp with + | If (te_pred, te_cons, te_alt) -> + if eval env te_pred then eval_pmdf env (Any te_cons) + else eval_pmdf env (Any te_alt) + | Call (f, args) -> + let pmdf (Any (ty', v) : any_v) = + match (ty, ty') with + | Tyi, Tyi -> f.log_pmdf (eval_args env args) v + | Tyr, Tyr -> f.log_pmdf (eval_args env args) v + | Tyb, Tyb -> f.log_pmdf (eval_args env args) v + | _, _ -> assert false + in + (pmdf, Any (ty, eval env { ty; exp })) + | _ -> (* not reachable *) assert false + + let gibbs_sampling ~(num_samples : int) (graph : Graph.t) (query : any_det) : + float array = + (* Initialize the context with the observed values. Float conversion must + succeed as observed variables do not contain free variables *) + let default : type a. a ty -> a = function + | Tyi -> 0 + | Tyr -> 0.0 + | Tyb -> false + in + let ctx = Id.Table.create () in + let () = + Map.iteri graph.obs_map ~f:(fun ~key ~data:(Any { ty; exp }) -> + let data : any_v = Any (ty, eval ctx { ty; exp }) in + Hashtbl.set ctx ~key ~data) + in + let unobserved = Graph.unobserved_vertices_pmdfs graph in + let () = + List.iter unobserved ~f:(fun (key, Any { ty; _ }) -> + let data : any_v = Any (ty, default ty) in + Hashtbl.set ctx ~key ~data) + in + + (* Adapted from gibbs_sampling of Owl *) + let a, b = (1000, 10) in + let num_iter = a + (b * num_samples) in + let samples = Array.create ~len:num_samples 0. in + for i = 0 to num_iter - 1 do + (* Gibbs step *) + List.iter unobserved ~f:(fun (key, exp) -> + let curr = Hashtbl.find_exn ctx key in + let log_pmdf, cand = eval_pmdf ctx exp in + + (* metropolis-hastings update logic *) + Hashtbl.set ctx ~key ~data:cand; + let log_pmdf', _ = eval_pmdf ctx exp in + let log_alpha = log_pmdf' curr -. log_pmdf cand in + + (* variables influenced by "name" *) + let name_infl = + Map.filteri graph.pmdf_map + ~f:(fun ~key:name ~data:(Any { exp; _ }) -> + Id.(name = key) || Set.mem (fv exp) key) + in + let log_alpha = + Map.fold name_infl ~init:log_alpha + ~f:(fun ~key:name ~data:exp acc -> + let prob_w_cand = + (fst (eval_pmdf ctx exp)) (Hashtbl.find_exn ctx name) + in + Hashtbl.set ctx ~key ~data:curr; + let prob_wo_cand = + (fst (eval_pmdf ctx exp)) (Hashtbl.find_exn ctx name) + in + Hashtbl.set ctx ~key ~data:cand; + acc +. prob_w_cand -. prob_wo_cand) + in + + let alpha = Float.exp log_alpha in + let uniform = Owl.Stats.std_uniform_rvs () in + if Float.(uniform > alpha) then Hashtbl.set ctx ~key ~data:curr); + + if i >= a && i mod b = 0 then + let (Any query) = query in + let query = + match (query.ty, eval ctx query) with + | Tyi, i -> float_of_int i + | Tyr, r -> r + | Tyb, b -> if b then 1.0 else 0.0 + in + samples.((i - a) / b) <- query + done; + + samples + + let infer ?(filename : string = "out") ?(num_samples : int = 100_000) + (graph : Graph.t) (query : any_det) : string = + let samples = gibbs_sampling graph ~num_samples query in + + let filename = String.chop_suffix_if_exists filename ~suffix:".stp" in + let plot_path = filename ^ ".png" in + + let open Owl_plplot in + let h = Plot.create plot_path in + Plot.set_title h (Printing.to_string query); + let mat = Owl.Mat.of_array samples 1 num_samples in + Plot.histogram ~h ~bin:50 mat; + Plot.output h; + plot_path +end diff --git a/samples/normal_bernoulli.png b/samples/normal_bernoulli.png index 79822650d5c65853297f752c63d9b0c3e4e00e64..a411366850147f59c726e24263806d54e7dbde57 100644 GIT binary patch literal 20891 zcmdVCby$|`w=MjtOL1Xf5P||OfdvwRfTFYk_)-EA0wO9Bf`W91tw`uA-AYQTfJmDl zEhSyjjdXLyqrbhcy|3@=z0di+>$lJO@DIf|p1AKh=a^%R`8-llmfJ?nL`@=*wvo@A zRwI!%+$E9LM{iz_|0$i+)Wlz#t|-WzCan>FqVnUPkx2VV|m+weeMf`fdkBHUQ&Uq}U8kQ8el7Lq!5eA{-Q5`&7%a1KibH~xUhP`A?i}0U z*@gbd$J?=tD#rES%w*Hk({(dUcJA8sqG6aP^YYcJF%KTd-PyFQbj4g#^LvX$Au}y) z&%nSQCZ@$|IaWGa+VgK(f`yEAw6&R~-15{er~4c5hZ9BY65H=$@tOUs=*cV51HIY6ZP z$B!Q(?G6StF=Pqn+3WR*8rjzLd^)tu%o1+P^GRB1W9|83hYpSP2I{Z=EN0b8y`Vj| z?87Wps-#X~r=oh0)#0|}E44b`7iz&W{ff94O(k)m#iG3yEHwZW{cK$s(s}N)h5?#VjgKG>juWi(^ma2t^>{saTi=f# zHEH^VckkXk7q2Wat%{|UPJCoI{qf$GYuBz}$$9dHtxG5z-g`w>d!C(@uhMVNcb*%~ z>aer7Ut1hb>)q)sD`Y#Q?k{g!*mg0`L6s8o?b|oO?iAgu0QSN1V4;Ak!)>`)>|{Bg zeU9JmY#@=|chtQT@T)q*V@*?D-%DB)jUrt0MyE#%;P5~RI( zq9+e3($M${b}IxPlE5w$8_(;;<`^1sD%9=dQIM?HQB%88(z9tBQ)5d@*`HX8i3!uz zmg&iJ1A2OTWnQ^CIc_U64NXl=WHLF@bvAf;HmA48ce=c)ir@ZtZEgs6-@t&wxH1km zamn-oqyM;W&7jSk+c3gya_z~uY$EM~X?07MMId9~cyv}?Gq!tUQ)UeeQ&Lhm$e!Nbu02oX^78Zf^>XT>PHb>g?yn3txN_yiix*A^a3h+( z{`yPAqMdijGRkU+SoG(o9^AftTPMrh_2-W-^Yim|qs`&REPu4iN&1`3Pjum?N;yrN zV4Ee5JtXp78iGhYx;k(E$77uoyN&|aSc`ANHaY%0T8Qh2bf+29OdY+KBEu=k$@r=x z7VY9>%ItVYTEnn$d64Duyyccq6Fa+E!~qhemBq?NT+5x8md3IiHagekm$yZfSY!gJ4mStNSJx;_qKy;Ofl45I8Vk;w`&ed^&%sQtUB3pQu&OX068v zS@q{kIz;VKVSOkyxH;AF9GT8W<&5%~QLaUo)^pB|fdxcG&XeQO0W{QR%I&#GJ z)BSDCqBf0L7W(nZ;bSZN_0ump4aRCDX=>LxDX3yxOR^YyA<<%I)&2-?6onj7>9}y}Z26 zN-kVQP;S_?)uBJ!K2^Wa&4PjqIWaL|9O-IT9&~tVZak2Eu-jLP<+#<=FAMI-LO>0( z!wuv0TKatUNgN6RckkU>nQgH!Ji1TRW&r0^wpDZDO?Jnvjy%Vy63)ndhp&9jZ<1V| z`1I=4t4R0N>>sB{`@MFOc&&eY{*z3(=+Je~s!;4&4SV)&KcDMuIrZPaYf{+t_4Uu5 zJxiwOAXh(mvfthQ>yy8JCHnn zc-yW57f{$MA|zTSw;I_y57iw6rqN8%K^!u97k&MD#$SG>(ZCnEv}|_|ceG{_c2{tC z_zhvEOr6ok`~_TOwYAk1p7V=t*Z42ynHU&!4-PucPh58FSzef$)a^m23pt|M@#BTsOKz@cRaI3hOD`Xv0J-g~k|TY6ahgf2 zQC>Qe#BN)gD_rwuAM_S!7ie3n3>V`dGf6mQH0l3AQYF%lh9#qf%ls>L@>z))zvbS> z*9IKq<{aCk!7$?pM_D%ooz=;8r3oCl{!-~g>}}k*@x+M}c6N4JX&3pzd9{MKGm8d| z{l(8;RbQ_`iNQ`<;&Uy`KxsO9!|hF3Ab(Q*(DxMGP>BNzAMdM1%WBx^El4M)q!<_& zl&xq63pS%-)ySF)GXXB|V`dHy4_A=8znz(zTmyimWIywTLH`Uz{RE?bmQJo+%3vqJ zdFge-%Z!;lbIyeus>;f&?d;5f`EdsZqg-CT|8R$DJdoAn<^>_@DATXw=k{*hv{1IP zG-oCpa^lXW;L1O@Yyq;loZ6m#HH+14{_>eKU*jX)L{W_2y?f^?xyZ%El~C@sI5%#w z7<=c=oePNsyeO3wz1iu3B`M=Cye`_9sF5Vc;@ATa@aLa@(pj`;TstQvRd}Q2tt-Nc zPCrX0btjwbA5>Jjg4PI5(;0pDsnL-U;LC{ca6NT(cHeyxPIb-APIxg+w?ry{`n0U9 zsc?uOgIU1BM(xVUz>0jTvCd8b)4GJZx;j9quWSno3xM0RGc&G3FXLHwX-FFp*@drPCTro2n4hswO^4jX|z9vZZ zqrab1|AY3SaOJ?@;HCsswuSYzY84?zg!l^R6YI+2S~t+p(C7nUAzSo>zOWl_4-X6! zLFPj!mfl|%wWrc+eFD?uO1DzzQGa%_D62=8T1|2dq7N zC(xjA>kF8YcadJ)G@_NRZ+v@0cW@~kjotU}-)CoMk#v$ja`1MH&j0MTwz5Jgcx5~M z9aVQbi}<_pyXEEOf^7C7gTk5b zx?=WYM0H$USwcc;K|f5@zL&I-IAOYn_<8i`=iD68*Y)l;7;VX_`ug>uw|B}Vo`o<& zbjE*=4 z#sV;ZvB^tF7(g+?jqty5@~qU#bl0Z`^`>cQ3iWI-kbc#T=O{|X-o2r~-ys1N^X)4NWh6DIYs} z{P;pjR{P}SgZk1xBWPZ6DGOS^9Bof^8RF%}y{5&rG6w7hTAD_4I z=cz2V&QsU;>=jX_#2_NlVq#)!ZUP6Rc|*TxfAeO-{KMbKMoA8sN1a<^FtnRy;+&Jf zWWGEgq#(1Ogur%Ugp4akTC=Uut}T}OCI7@g&9P;0A9pKUzqRq_1$y$BZ6a~IvQs-H9LFgTy?1}z;1+u zGj4YV;tM||B_*H&@DCOtBgHSnn%UavMkxSdfH>&)P!hil&*1tBZ+4yB*x*%Km9+-2 z1>z+%B0}=gds4V^mT^@C2o1mN)3!*p<9Sn+$lOdK=F8GB4pie_<&6h&KI6|i2#>}wSx->2GIYuwT}nn~W++Ccza4ynR( zeaO>SK0l;TC^g4{$e&83%Td_f-Q5+gsJ|jY2KNLzE3~rEZZrh@D=W)hM@MJy9Jh#h z>oFwZnk8HGeFqL4P|R`~PC>iQbo6@AVCPCrUw{AE(4#5S0nC{?ZGfnsKc80E-jBcm z#N(ET=6#?I{MTe#Cazego?XS5Z*K&U-=lC+fgqcJoHRpX42pdM59wLi*`?0!4oU^q z!>ZS$Bdz7Zi78NNHqPUqk2D2xuEvo8=RbSz)LM}UKHGooewYs zXk=ny@`bajd~6oj4~vE(#ABT_^W`x^ZEY>etE;Q)+RC_l;nG+xxFMWyMOhg@Ui#a& z+o`F!t=SyWH>1C8MoR7bAWIihQB_rl&5e{)SXj8+p3_@XQv+;{zFI;;;?C{cin)U; z-&YW=NEW?!xP`LIv&KZgU5RpX_CMl`;F{W-XW3l@xQv^=ys`omH8MI1ChhX9XeIb0 zHVzJOK62(^lTxHrY*WEna1k}NwY}kG4KcrsQb@1T9EQ^kU zjub7D>2|b0i!z6zv1bF)W=?+rD+wkH&CCHdHlEDqKsLU%hniw&l(NODu!W z;Vu;QDE$$lN;-1p>eU|9i19hS1r|2L-5R%=tyHqJvw=dV_r+A3EO*|aVJCwF_5Ehz ze@S3ZUu8HCxdtJ9+IZcioj5qt=i=i2cH`RtIdkWHOz+{-SbnBsH#@=A?cK4Xv%fzu zG&C3Kn&>sKzn^iQr4O&%8eP3-=T231^$f$Z0DZRwLn6Q#3fCu;AfK8(0jX3axuj_0 z$*rloJrSP@7qx9JaLrx5rZ{;j4jGnH>XyEZs1SCG!dWRAW>Mh-2Ts}?AO#SYH1oKr zMSmz8Py)LpBSRQf4LKmN{foXfPU3+6FJ)2+E`F;rXy;^$3Yv-q0u;4IED?0ec0C8N_#Qu)vF2Iqt(?_>NFm* znv07I$|~qo+KVD=Y^Ty1P=>hjQmak8yuG(=+onN$4}LD_>4k@d;nPu3o#>hQbTU+k zSFn50CcdmbUzZCi8lj8is=ktK`bTNP9vK-KumcVt=@Km-0cL_NDUXoIT?}{^IoILt zj;hdS> zK`9eCR5UDkH@iN9iN-G!c8RHSq2Y!!t(WT5X}O?gK=z8ywOUiB?cKXK_sSRQztU2{ z#rrZH;oiSry35vnr12?*B4}7jd#|B>cn00OcA;B7aW^wAeYlMzh!*r2b(%9^DCm*R zj<)%er99n5-l!yRuUaW8mfLr@YOOpsrN(t`-@Y9;6UF~!0SD^WH8V5a6ou9*6wdbN zr>J@ZE6dAqFX^nl0;C|fs;zGAy|sbL#nshcs^{IiW7q_LNtpr|0@V=pzsnZTYrH+5 zr{{?Vw+8; zWY5xgVF&tm6#BZ69sneu^PlZMfj4xuwKdL4L&C`M5Y+LpC|t2?eP?;^-aYzucFVr< z;Dm$(=VEVJgCjAZwi3h~LRT&1<>lK!!&FDh*#iPhrXb64kV~toL{`J^iBxFp#%2bF zcgoCoe~LbqWi?^A%c7~h{o+Dy;81^(0|$4SmVVq;^ELo{e<(X!4d{W&{}cAx&uG^C8M@Nj?qxomJQXl4BLwW5w&_ifIm zB??ioFRPZD-a>&vFY8fuO*J*j6Tw9gC0uJy*vJ(0Xy?<++n%sr!?j^cmZq5*7(5FK zN?67Qa|Q2SDz$nx8EkreR-s-%wAX5d0)PHhW8*BF!5TC|It3a!IwA4##Bg3$ciR_W=C8=5)JvPeIjj zMfX5Aq8+OyBP;tBNW1w>bSZk>hdDi4N^jcO&^p{ZKrqE;W+gMvGoH?^& zGGjYeTHo5WPp7~%30I5y;xilE%8u+X%*eqZ64bdfLm~x0_`0h4C(1yL10A`tva)d9 z37ei;MV2Q%CZ>mVZN8Y`SgEOdo`Q%73)@$F{L7awK(@krwt|tMrv;ZDW!GuGSelLG z1jvng+K|@K`QZ)+86Ez6=kfdoh%#vIKiAhE;o#^+z!kbISOHoQa8HyUB8|5!W6C}$ zDJewk$B!RD@0YS6QEuD5y&X3md56>YU3PXw(BbZ9XC+^!r|)K>$1&rgy#lJ*+9U)8 zYd(F7E`J9Y2xjf_<>!Dg;!xBAYva%M_w=xHavB>M<>cmOU2me~nuA#8J;BHq>Fup_ z{`~pu4(>UF0i=0AtwbpXoJ#n|ZU0Rr@_(!P%Cd<{OZfZy+d@A8pbp+HiEJGa5%J?B zE+`g6+S^aG0Cg?sUAiKBHBGQH8s%})h6pVY&eMASH}b91G|r( zo12@NtfW*?SxNu)F`}T<&SMIAmL3*!-%^!N$K=#t5sHR~2tXsEE-+d+XK((=>g~!Uyw zP+y=!E65>xl!m1yws1vXK@2!LIw}PToUnluwx1#!4SeA>ct%~l4m$K_4mG9*+-H*X zo>DF(#=Fn||NM*h0BJ@Ypaaw+P=b!=6+^>JU}=a6TPmPY(Z<%Bg6>7jC@;5l(;dKv zZz`TIygaMpltKaj@*xq#-9eZ8V;8p9Iv_bvqv(MYOyL*xqq(npJtqLW!VQa(LB zjdHSWkAU>k3nbG6SnDXya4Gjyv<=nO)kelepFf95I0pz)*BK)urRl8E?oCeWWLw2H z1wUrsS09F#ZYGw(&+g|Bnf#0T zi-yR)@Hl)sO)SJtR#tZiq)5S`+Yf2K=|Q8og8{dbODU<|hgGWml7OENt_r30`Eyzs zM!IN7XyC{qg^Ya$_G1sTYiTv0mkRMYEhB@_I(y+jtYyXj&D+{!L2_-`8vcQsozh$S z!MlxuWxw9~?)9^0wb8zkIY6PN+W~4+7)(x6C0KfTdIH_;gLh-$Z-~;Uc90mu#q7-+ zQrm#q^&u+4#(-R2DEbUBUFQ_WxDpDUNz!%k^y$-}(%L3dKxM|%o31T&tVO_H0=fxb zgsvw7TpRkoBq3OGq*LVZIoLwF(FCt8RJjAV8gvmyeERe$Y$Is}i;3bt1_u|wF)?}< z@fXa$5dHM)czH@|B9V}^(0xEUa9WzZu|?##+wwbh@*OG~7!?p*5g`iSzaO$496Sg}>|Ow%?04_fZBbo4L~myevT6c4f_IjbG%Q+K zUiOmhMzz@3i-RX@JSMdG3aFo*3=qjBbjbIrp`m}ShN-FP$&(*p=HO{e_x7#;(FKAc zNf-cPN0Ete>iO3P`1#XrABQ}OVnuy_mzSW99?VhfWQbF}Zd%a1ZA8=gk6^D#4B{k6 zveAcuHVJz4I66q6-(R0udy(u#y^%> ze5PR(?7?M2;HAh33JDnlKap#I&hFhuASMiQMf>mGyBEl}3Gfcl6R`b|?pwGv#^L!H ztBx)Phr>!sOAGzhy!G9yR|3xo9}dpLq!)V)q(>YU4?B^Md3t6>!gi?6EG<94&(8+x zzlFs(09C3^ro0IZa2`4ya$^2fV0GM7Oc>FGO!m76RKK(Ao*8c7*|iN zDlQOVQ8i(JG7_B!>k1)8;{wh(Dg(?iC>c6BI)9(5Xcw+t-MlT93r#O52EZFB zr%s*v!hx;29-g1IsmL{8;aIlAhY!Ps^bh0(-3?}%rRhO7!o;?N9IJ-bG1%w4t}cPp ze(XBv{lA!iCrmg=9s+P5K(I&eM+qkQR69FOb_P-};qm)8(v~ao_uqZZnPx`De{*sY zvOOWi9>^wfJpj+Mqo}r42p%)&N=C+&AxFv@8nm9OkZ8aBqYeINP(i=S)@k`OX9fWM z!9tZ+D#A*nq@;n$<8&8CoY8@y=fkBS3Fo&>!SD|(tS*fcNRb7gMLHi!E3AFEcLsKS zgSGMSuFw*%b%Fgtl|IFY&F&#UxC{RuztD9xaw{9rrtu5iR67q^g5I-2M> z|NXqYBM7+{)(0O5a?9d%!V@8USzr&ZV+M*-fSKIy{8YsQy z1sBuYS9p#d)wCh#w9WeqybhgzwO?46;M$?m7CO(R4jjWPDn9dqIVROFu-PJxTN@R5 zF=8(<30!)QP6r&)>3-}a>CD~wvIuB8TsZ@Si2LetXJ@DD(k$Lt+S1}Y()bz~8;R`2 z2D~{c=OKUe8+3|j^DpGs9K`bLuPtgt%X&i=o~t`|7Mk61xP5!J%fg!h51c`Q(~(%O z0MnMYqs6T5F1@AxF#Dz0kGEr0wlEyJ4mu1d>+SWXE5b}NRDeR#{x2;Jg+)Z{;dg;n z3Zl8c>(hh$ygZ}wplWn;xWzcJLbAg{7tO=FBAU|A?|!0^HVZ`%z{BixLO{++vUE1y4q4sB#70dybs z{P^+4dCt7{DM%~;lSc|M!m0mBRQ<>C_HSPKRD5ea$@CU>1{6fzBS-2-%28DizEVFw z@Am9jKk*7M*F%S(Qo&+WR8;(W9bs}#_Ez(4apuo-}!Bs5-4O-;HgDXX5Z@YIYk zM~c~}>L|5Qkx1|OferU~7Xe_n!XzLYt;%w(KCvF2RjAV3jYH5iJ3Q%l#+co~-Vp=^ zi7pCE;|rO`1&c#Ta2L2we4qj+-3pQH_Qov{&SMDWN+@4#7D*65U}zj|F}AR<5H+9m z<3{e10OnP=e7Or>06QklzGI#6my>IN!V?>Y84g_lP$@ztSh^7u5n*m%P@ASNWk}?p zI;Xrx%Yk5i<6~pJ0c_1*5Z3aS>WScf-`?I=}f9wXypUwn3SK zKU7jusy7kl(|zmG7i0{7X#Uu)wq(n43jjj{Q7_fJ+hAy!JEU7A3t zC)#w&80R!b;(P;P0>ZI-O)aHB3Ubda^xD$lThYG9T6_EtOp^z`~kJ-AE@e-`aU zn=2dry4AfEl!=H)7K*5(jVW$d=={QhhWKA_gGIlT+vc4+xVCHGK3;MSP-&SLv?mAy zOKth;hampKE|Y%|4MCFV-`Fs1s=iKH+Jp^+os5Dr4Ev@66=(n;sVZzgt)UJs;4kQy zEiJjXMdsF#>bt6>)>^YHBA4SdzknV-a-&%|qJrw74C6|ffv?1O)D~hb=er)@K2Jt1 zA1CCNgW+#clYlT#f=cw^iS}EdRUuO}lg~emj3ivW8@o4<*nbI3SY+hF@=C&+iE_G$ zh9&vTAyO~+cbOE;Dzu4!15oxurQF?6pfQ$_3%wrxde~b^tPxj7O}_0XQ_ws(&5iMq zYXA+Qs7gXo|5p~)aQJ%)828!fX@WABVckut6N9RQmQdg2=e?$2!igp^Ly{)Q`8?bb z;JCHv+Ou$jYdd~!Xn-^qPPd$i&ZrtC8mp~Z`vE%Gb@=EA_MR2%8buF&_6TqcpcE@A z0v}&RM+YH+#f^WY+O!Eq0SQh{IY~aa(!do%@Lhp;i>fRnBvjkhmJiJV*GX@Waz)DA zWSFrJ$}oQBmc|I9h|%YYiW`6s^^rucmD*KJn9=_mWX=C7G5$NQ=oe=TLo5&_q;n-I zv~7vi6MNT@qTCkHif!9;YA_Hjqu|P$%IL+1mOy1F$LPO;x2I~S_d%nf{TIeW5>g-f z(^xjqaOGIFKY!PB^Z|rnIPAFfX<|_4Kz2?}QBl!-H}GXkL8P+zs~jQ!vEwv9W!ERc53dzMdmy z-~ZUOiJP)TIwhuI7+Q@kP?;zMVl@?&{lDwD@Qvm=Y;I^ZFYb`$-C;tovazuNKT=+q z2Nykr2Hd5lV0g7^v8i#=+?@jh^XSU|?P{sYu9K#)qfzwUbNC0cw1`+bqJkjB1TNoh z3Wk^C=+UDZv^z*ce*=-8L3(d$!nqOZoRP7Pu5MC2ecMWKV4!_(DIE_FPr48s0MJtT z6sSqI)Nr(qP7w|w_!htj9u^bg=O2#^yr}c$>Z1eMrEnT7!3rTRF8=$BuV23o#)Gb8 zBk9Oy;-j^&w!q(387b8g3f+6Qu zo6O(Y8YTI|g4LtBxU{sisVN%_u8}bi&r#G$hy+H)o2aOAb91#+rAZ#K4g&<-{ukQ1 zJ&uY5-f|LThCxXRSW7Y_Cv|pO64xzkq#rQ2jTf%9|ALXYMT8rV+g~1xsLCjA@BRp# zl#3V%KvTmT{PN5JlFDXxqBIghgS66X3>RhUq`Y|#GcdlM4H8ro3_t#E3Bpfg3z#9dojVxXftxQjZ0?bl~vHrfCxDZQ3AJ8P@QK^$wy|LN1$&}Bgj z28A#D?htr(QIk~8;o8*G2pbCQp~UrxO`)L!P3C!bJ*kcsr(RzMgs^}AC8QuD;{sUk zP#w=bVAq@UVE)KBCoLnb8`Yb$L0`As3 zAAqq#LY$`hl>WgigTREb)UoRxgCZ5s&R>Uis$9c70wpw)dEY+TM;l0)l<4U0hdbGN zieHxy{t@tyTYjfl>;Y^EAVP*;Z4;pG5r>IOzuG34*a>+4Uy6kgxR$?M5_p%JD{{T@ z+ekU|P4Kf^#JU6`;)&M=W){J;BH194^MQDOEsG)Uu6wlFOGt9p>@cuJk&jhl-w92; z``@u3c}g^B)=NrDnFO!GU8?k@7CN`Qd?^TE|I&?h7w|2lM1p*AaCjFPssE*R+G*v< zU#I-2H`bZ_daVX{r4Mf8pZkF5G_7Oz?f=cQpMLRg5QLhRKdj5RC-pHNQ)f25ZD=NSUs%&%pKg*OtS_II`Blq)tkbHgJY6NzZI%||646} z*Yi1PzP{ex*oNVH)2X#YxO>Y>N)9i5b0&En-m{g+^{G(Xik%r`{QpL?ke#OdO}siKf_A-iTI z?DOZ(SdfFesCL}>7phL(YpTBr_)E+1WOOwKP|nyK!qq0=d@xKGqE2B5h08Lvuai19zO%>QCQ` z`A)&%+2(Dc3d&LINh${akW#t`lJ-c5a{OZ-pQBh}kJl$Xh>bSK4J4^p!?yXGv0WtS99*PpvKN{X_FzX0~hk5^K`Ww=r=>VJ`gGcLqj-o(#%sd0r~mxVWR#bYL`(! zlg@Cx7YA9AC=IP^U~|Gn+32SoR^i2I?<703E^M$gqU9>awwoL87>7g6t`CYOKDlq# zE@F}gyM&9feLVrW!RGO3ChuVWqdoy86uYJ`y>0jvR26r04WRHr)VPD`EVW#m9t;(+ zfMvLOq#XADm>BjHP1xz_9&I{|@`#_)@zOJ;D1=p24B_kRAFe$y13pmkf$iUJ`1=hc zP9tL?tA*{@Nb0s6AG6n70|_-m<*sa!dG%p zN%zEMxQTW194x^RR#ajf#=I`!DN?lbH8|EA3*BM1C~OLL%3sAyw1id9!vonWXVJET zh$hUT$J|%*ps}W>x1e{&YzHwnGc(>%Sem8gp_xQC$@?6G!4Sdy%8XJqa%->AU1vW|I3-n>!y6LZB#O!8mt-2(g{i+Yb0t1a9>)yDLvRpGWnw8uz zyloRW+dEfyav+pDJ9p&RmW}u>qJ-waZsJe%wWP%I=FL}c-Xu;+G@PFq)zCZWS6vu< z*q~@(s-IIa=#|6IE6{t89%Ewr8Iny*H)Jo0(c4O28aW`(F{RHvn)AQS7AXx%3NzH z+EWD`on|!Ox9{B1NUY>mgHn*x#<-dPgZ)-Loi`r;3-UPWO&Pk2t$cj5KNqK z{~9;^Jxl-f#WV)1uUKHw@YEm2!T*(&nGs-PZg!?YKhV$b{5v?s0;Ojr?%gNcJ)BBLZ_RSwn$^4H&YgiiCfo;Z?~nPzv)H08 zuKKFY*6e8l>2dpn#OlJ>i}#5a6$J}^d8v3%p+Y!plbYNg>$=qr?bOcZXRr@6 z&~9w&U~Sp4{!M7A3w5M#VNZJG_=7-~1>W%$7k!`S%v_{_IM&h22&W;M#umq6tYaT5&Z@-M|&finqZ zeua7C*RQK7Vy+=$s%uqj8%W7TU%nV(#OvqJpGM9=mU$LKPkp66huruGsl#kGbAuEE` zqTMkzCM`9}p0rBWQ$=oj7reLqf@HEB&mZy!?<|yiMJ=Zb`>f1N?V5AXRR(NwBAgS|6QQ@GS``(^Dipa)bl!s7oI@fsB!ruXhqYda zlQVur1DHvLi{!?3R2k3o`)~i$(}Bv9em2nYBz|(9J(!M838w z+}z#}Te8q?Mf5EIeQ;k$(_!?cAt52WgW6hJ*Z^X)kZj@V)yvXIst=zOFEyw-;w}4( zLb1Y3WU2&`T(9r)O1w2O)+@0*CSgit>;LQ-?iXLA84$pOrl+_&dzqMc!_4T%qWb!b zkkp#ejbXZlI~b-dWD>#P@{u4+Q^P=J#IJ>8!O;hC;Pq9M`DK*zkWr&WN9>B(*7&z? zXWQ&Muxs%#xQ|e0By0-6V?_@=kSrBj&G>=Ur4)t0C2hzU9|_%ZpAGa;30v zosRCp;vzjgeMo-NJv{vadqMH<^d4rFm+G(}W;C1vk(ZiU3BJdy3Zxfu@p(a1PZ44Q zE;~yB^f+WorL_Y4@rck+-7Ho$P>fDaPFYgVlyS!h=FM^PYPtl<$I0iLsi|vBgl8aK zx5{R`cyaQjx^j@fhmjzZ*BfSLFo%XUMSvC+3|364U&P?i1y&eY(S6eFJ&L>GzPiwl z)8{?z*UU2k> z)z{U57MNZhbB7oJGb&E+{{2lrD(MEe{O0Cn9V@9XsNb;Yj;S`}B&u`6D{|%YW-+U}&;M>Io_$^IALrypjEr!P2+blE{T2qZsoFg0sXn zRRagb{_h^|!aycGtD@olbt%X;i;GSQeIX~Gn_Rm#IDc#&fq?s)nwuOI^&YsBqI*ng z_5v}t0IoB)Z405Yfta60 z)J62G!ZcgouLC%%s~d_8)b#T5!UY8~nNiZ^T~mueeM18eEj6~BLh9x^(@g9)N(8>t zXia5k#z|LKH@X^wI*PSaUM!**CWRB+xZi5CrtF$g2%X;ep=+jt9fgH-S+GuLse#$` zSQ8MUa*8+zt~~B+LU^;%gX=kZS6oI?0Gy={FFx_`Al2TwuRIEp6CQD=x^;fVEd;2h zjixyqKG`_fGYlCLO8_=sVkr6PzrKj^JeqCWApF@B_fN>m$dD-+@Xgl-Zn|?BXa}_X zjl%7f6yhk~_)_EC&sbSa!ry{LgvyFRNjD%m^r!#>?0^3qa>yG``@kNg{CZLdVXV2Q zi)J@Umo_>a;dP_&)d!o$$ADK6FZ+&LfxxVoHnp|QgnL>+K|xlQuvz}=C)&`i;6s?g zMu_TJSOAoL$5_scrm2Jlp}D1U{cfZg1aJuHJ)Xa{@Wa15iQg}M0k$XI?Ftz2sIO~i zK&m-@?3jbIb6KxdwdJKF5D?zIJ0GhCoJ7MUe8y(q`N(P$+$GSoFc)CLvX5Nps*A2e zS-BGZBGSTX<6ECgxh^roUtn!wk^nOuCebck>cku!M!aD3|67zHxf26wdoTb6FD{@K zIxt`;j3dZAxLuE=Ixv8)M~((VQOFF%#m4ad1Efa}TyXFN3w{`=7XV$|X2?drIZ!FJF)|l){c3#<+=%=y`2Dy*BuH7$ zV`nOo3A_7=>3-}wHuTK=!-BldRE>xe}!*)h9d#7KtzNr z-<;<3!QBs?1v?pQf%LdDZXV3GUwsL%_smM@*h>+ z9#i#NACLnqdg;=or9h-h96x*!v+1jtt0bl;LoEuLhSyy-1YQqde>u!IrbImFht_Y) z*?T%E5op1Xzmf3)*zxW4cti|88(VjSzI$&@hC839>U%Y-?7Z&3SkA@PRHJa>(K7J* zZ5y-g5b9RG6Tal&F`(P;t*y)TM*(+^$VF7-S16lslULo zfw8hpTld^tm^3_RprL`ea7Zm!F>-q2RfefEddaMTdI6^IHpbu{{I zg9N9HF2AI>m{UqhUqy8J-WA$cx8X{>0;Ll84`bgw>K`QyU^B%1^6~b@Go8$q%+c`p zDaRAetkdy#Y*DRoehY(C-{&396_A$|mFnSl9c&-AKfAZKjcN$M5H6&pqLUVm9TicYRq~V#< zub9G>MKHk&BScG66F}3;dQ&m6Tu2C%JK3(MP;y|*W0@I(*6WTZA+#&qZAZzo_;lH+ zlZ=T7m~!ox)EXX#O>`W1RswHL0j$p`O2E=EL*jyhD>-CXVKwrA*-dgtBO>a%R!Q$9 zepy^tc(na?A$B|J#AS!|#3PaJKHu}p(Lqay@H_5b0nvm9$^B+&{^J_+pM1!!Jd25D$`IaPsTdme{HQad;Gr$Po;_ zV@sghKzoemyF~@w3}PXDMy@GFQleoI4?<^Px&YwjiNdxCEnX6&Pj1 zKp?z0ATVY6*L$>o0%iFSj6bJx*m>waEmT74T zU0p}2qSb_;6Eit!g~{dU>IBWCKt5eNJcXwE5h+Rw>56m!!$asY;Gw|t1R}*9C$Yy~ z>|Q6Gb_J5d-QyS!C+wm8`m1;Vl9swU)NQOB25_{rw5qE~zwgioaDbkRxAlpddFY19Jo|*T)cW3&ufP2q9=MQ_Yz1G_Q9R)e5&6M<%Bob-!xwEI0 zNThXMB+}X#^0oL)*|?e-{@HNxywqvZ3h{r@MF|f{q`jnbr%$Rlh7Yy5=mZ)qulzJO zzUR4b(}ug=tm3a}!a8#f)V$0RPB|2r!JVzdk(|wWEl49-wxZd$uI?BWqnFbCI@_s) zv|HOXf6&=6{>Ch@f9>x!^v3QUzJ4+LF1&HGb`)9Zd+nM#vf#e|anVfVLa~$)AN_jV z$zD$_d;CM<(+yO_KW9(T;kVcM{>cwDWf20`dRp_YWhfJ$vk9z`-Yw!hxx6sy@!gN# zkZcW!Wcq_GCMVx{YM@qLOjk{fMTne468|nmS5%*(nR!Gv-|*6<{eS;mY4Bm~hE(kw z`{8E%Q(lQ-s-9Jpw3=O-=`i^m%5$YTt0qS3*Y6J~NTw$zCWi7|e&FMCUPB{vh!gi9 zdoyT=H1+;Allv|jnoRS?v~R@gVv(M{mX>q>mxEGLAB`)*O6ACKf?SM=-(_O6|lz*1F&t|HpBG_Nh<6?Ws`O~I;{*=h4;h5 zIXO1rvzJtvs(jT{RAv_zOpJ~7a<9H_XqZlWDdITRnRU4~UiR^EtM)?e;<&~^v6aP% z^pfTInGTPcu`%*Zo5FdGq#M(8liPZ`%R_|h2KX+#y1ug5E9S6c14ckKIlx3xY+)$# z`^SKixt_-kEvIi%mj@p{FD+eGTAF8M$-V1$PfwG|@VSX9v4ps|_wU|uYGs*rzPfQt zV6OR@YO=b%o88PvoAyhKycS_xFj1n2BSt+<$Ei2MAv`=>&-Lf~Fsr!Q{-;l$e(h#*pq}iRmgT$m*ltjy4Nd|+u-;9?l(6# z%Fb+il-^i3IEB$Gk&YXvO_0~re02H55>OH*MN3 zar(@e`U9bdzBFf>uMEj!P_Jv(r}Kv0yLT@z@POCY^z?Dr<>i?Yv9VX{B)n<$9J|Vb zI3&E^`_M9pxwn4!z#=T%+T7fnWl_N-<70&x*U{24GdFK3@$e|m>+im~k=E?Nl~>o- zm}SpnSc+Wd#-mm!u;ea0aSy6lN4ABWIZJEUZKlm6%#<%Iy?DN?vhv8WV^gU)?RNtL zJXV%wZc_Wua*bdoY<5Vl?f0UttgNK>`(QKj?b|-DPnDHvrE*zXS1^T}H+UX8fN>eo zU1E>9eEG5jITsgKxdGNr2&d*gFO5v&is~n)%FD|3xJ}kH>ba!$6dY^g?Z6t)?%A?s zi-b3(hJGYLx4>S)``x>DVNCSI`byL{sSbB&O-*xu`mk+Tt?ipHpD%FBJmQT@ zOiZ-uD1OK)zf+=cy4n2Dp+mke8b2^ZBz36;;5`?;ph` zt51y!6@tL(>INcGsr4;?%ZJ% zvJYhJ&CfKcn(nK4+tEP;lAs8LkLaI?`c}0Ynfd4|u=_aJ*>`g3aSD}h-bj07y9B59 zOBs7=EE&nT_6WLTPRnz>{Fbeu_wHfL$(l6Z%}w;Wxw=NWO*d7Et?1bATzzL`aLw<( z|Nix>hL~8%{Fp-3=g*%nee_@d+i!J?o~PFE(c>vLQ&D;Rd{0|mUS1U?mR@5j>AOp@ zzbrH~w6IWEUA=K-p=70C=6ifx9HW5EY4Wb_?)oB^8SUc7j~_2!#weJP2J7>#^_tD> zq@|r1&gm$gA4op75=uoVc z@@(@)#GIS;$?6>oPbS94ou`K$MMkzGXCS(DICQuLcQE2{kwLFmShz0?=R}IQXt@t| zzV=+rD_5EeohClNEf3*x7^u69IJ7cX`=i*s$+`6z+gFbxK7AwYqwZ` z|IpObM8S-NT|axVp{L?;j%6FW*KDuY ziqmKS2k?%0N{AquH z%FhD@I}dBQPSvX;O-vfQsi*|@S4X*ymmZ!uEW2`QM-JN~_h785_WG!Gq`JfVNu9?9 zBPu6De#D&*;p|10*e2oV=%}&fV*nGE7dbgOH@)A&^ssW03cX)Xkh-2GFcEfZfo=aj zFVl|VBBv#6vkDIi7iZ@UWMt}$#>1PPSN;JYwmY>67hf#4j~=xWkal#O#SX_7(69?#zi}rLycD^jnp)4$&|-r8 z6|?N-k+uScO&ee8i4&NQwAbxHcb zJm%>|#_h3Ze0IkB2>JN<9CqmL?VXvdm2W)Yo1JZkMK7aYP*4C+vXaLnOB-K?HJM{Wo#sseL_OoDr%DNnH&y1in?z&fAO97R;*bGZzM3s#o3>TgHd=U8hPQa z!NHaUc_z=-R~Ot_gM2>(bk| zZzpGNZEdw&QM-EexmK#&xpQ+^ZkA2~dgNOf8Hc;Or&_O79oBwH;D)g11l>ouUwn%vf&Q1 zj^d^0lb&AGkB?vBEt2x+aGTl8B-%RJhI+uz&~Vc(?hC-2j~+c*zkWUP*NYb~=4#JH zx{TyuN2IDDMK*gZ4eF1Kj9}Lx1s^$lc!|d4yqw%liPmz4C6Yn`8+IiHHY>ANe@$f0 z(Fig>Utc~q`r3DQXdWLkXYumJ9QgRqNC5Y)(D7U9;6A*l6XYW1uf10!e}Q`xahWD( ze)HxHKwNKU=Y{!{n%UXe9HdP7q3TH)_u6&ONYSFvzH7w~u3fk8JyZR#J)(VfW@dro z&x?kJvCkbFiXP3CD&YQ+e3q}#0par_g)_hVbbo(>%%h9+{=0bI*ydu3e0cY+wSEim z^@#1Ioup3^#B@xKc62m13nGPcag9!ozO-nvne3~HPsfwbzgkBXT0Byp9MaEQdw;)F z@#1*7yvS5wPL6}EZC3xO;oi@Wt^p|1Z>S!eddMQ1Z$GS+td`o4qIqd9_4)JX$FDT+ z+H?zmb^DGT^^3QqrKNf4{f-|$9$&ucZ%;HdG_=RLk2$7h7bBx?|JsQrh4R{`FJHdI zAlY2IR{rUeMxISK#-at8z-?jL4J!&4(9W?GabL`(elr=%T23`l*oK8^>KxdAcL#@# zuI}NIdc^N4(FGZD>#jF90fx1Yr(Eo1l?$hq5MCU6Tk)7bef}dE>3!mARfS}BMpDur zh#1eU>e}fNm!?-VKbT&kSL~XnU*gUvXv@7B+f`Xv8SCS+xw$r(fjQs+GqyoTwt2{$ zJqPKYKQFQaioCI@DG`Seor@PQA|M-m%u_e1iX5(qxm{ASf+)f+w2{>Ms%4U-AmAsN ziK)MP_by^Vd8N|Eokw)oyfj`~JQ~_dx=K@t*;bA8Sf2A^;Ac5-AhhGEm3L*7*y#7~ z6GNF*?m!6{nWR^;#L^4;I~3TkWKsEdC~!hhunbix{}W#zHgWp2|FS~<7Ypfs?QLoq z>-ZEWdMa9qTyjwJ9v)FnsI?nu&C|>@&d#keLuHkhm)F$X%yT6R`H&-Yn{ELba5z=t5s^Z%74dsuS0fV>0D^O+p25KK@$t^i&g@PKp0A^8 z`(0gK1BDZ*zkPmmw5`BFeKvY!p<@Nh@|hZkbHjcfo)=g{2=CH+_yh#<0Ftp3)W@Tf zl9EtF;Dz5K^rfmHHsV`>J3@kj^78X>XB_Hjh+A1!9eSmnVJj@0M~=MA&TcF5D0v_i z;?2u0<>cfPCF;f^8>Zs3;5yx8g8e-(GNR|RkkWvaB#NRP&<58*RGu2`SmE-R^Lap~ zn`dLx^74x3@4p8Mn<8&HInC82DF+Gn0VBwVpCEAfK`LS;T6Pq>Vf3W;s3g?7&G#oz zGVx)v-lWx2n2nZ<`AGo#@p7&pJo&}eTi{y zkB+AQIEkX_TW>GFMQ}xtfR?dFsPo#)21ZS>q&NJ| zkH^frqc_uf6iPqEdwFLxzpIhBw_4i zZ)HTXQqp$O#O)_fo(vFM&V571$Y-j6b+=vA6uI?^aG=%Gj4jW`u1y_Knq8B|f=Z84 z?5!&K6Q!iEv*uf6`}I{1kp)SVtvCm*%&3q*aa{^}UsfhPx6;6uR6=ps8jzYqiv1&E z00`iRt}sOb6tI=y0uRH&%miFfMx!)1$g%BN0~QpEO`}Tf>(MMlGYod16j}5L-+aeq zMa3F`ER>{95AG8$W}XLcRLVM%H?9Iqo1fp_Z{07cu_em!8-=>My5@a_V?}!DYJgVl zGNvkJWo0R;sYVInSH3wk&+gi^!SnS6qk2>MsQ#&W0?-x~whGtu+pa8)dVqgn;R$*` zKb-zD(i|ZlIm7sKD60EeYEX#LhbvHAFZ%evHLwPPCPnl!gBCn zy)!%h{^2gKGmVwis94eP2R{aY?Z^C9?tt}LzQ2J8^ajPq>o#v&OAA;F5Rx``3#BLa zIad37T76d@_r+O33W751Q;@XEFs`7lrKMq&OL3yBADnvq`t{A5H&?(1A-8L(cj0;I z8Oux$&wdnJ{#njd;!A(b4B!e2GNqISVL(7YKnlzCq952O@K};DNpYdbCB;A)YHnwu zBw+lkD6SqVL`mBNgDX5rpc1 z4^ke8s3!xwS{fP}N=i>P4)n9d%pBn7pLt{w$+K${!*PqN_V#!%1n^P(&(zek&1fBo zH0385BVgO7P;ZVoq~+9zmWiCd&g(26%&GYxIJlwMZ2|X%Age~cijmol99jPHP~M9G z@A*Hx@vKw3j3y(2L@1asbthb=Ey|q;f(;-Dt6(kuCcHFRTjV^I5pHN~Ts+h6LLe2C zT)+N0(r26h>C;)}cc`^)Qm@-U;Ko;nH@3Tsil9CV(Q`g0cN)`o%ahmHK`ugY$F^3F0EP9nt?;vT342PhbP2dFyn%jA0O3}ojFasT1BZSDFKUAE&95t-B1y)Ra8*mw*GdyNY5(r2k>oAkF;+rcUj_YV4mlhnU7JzIbAd|>K+{A;MsOP zzJCDAI8BF6%-uDc0}0A{tn=jheQRXzdV0P^G{DyV{16Zs{+Tw1D2x(G+-b*-9k>Tz*`88tNi5U@l1jUbRQv%&uwPM! zl|M;HV8s+%XXyr5M`$C)>>T3$$&)wUou!QNE$hN-c$kr%o}G{i?j@mG$8Ulk_Vx9l zzWY=bBmDm!iLHV!0Fb->{>$HdxHxY|0Z8r-5Z-raD{g5oki%;-CJ@a%=gytGBOUi( z*Es{^a%Z4lFh1&fPVa>klk2ep?(L!=k=UwAOZ$NYkg$77xk?r@5YO)1-!4fPbP700 zK)}h-@zWNp+5<@a5#8kkn&YF_Gzk27?7tUQ|Cr1mA;+=kgoIusL-UN>!oo#QD$!j) z9|)8!S(lHRR!0Yj&L;v4rk%o<^4YqsRqh6M3`X7k@S*Z>*_SV0C}>z9jl2~ut*jKa z?W;yLM78@wb*$(~B>7HDYvV~4!H6U5>}F7DaMk2476StVO#AbU46RIKS>#OUA3j{g zY+fhuX;c&gyqs7Zp4hUF9bH^HhFOs6CA>jiIm}P?OLzmJE-Wk%@a5;vpD0WsfE0!k z5Ufo(*<$#4c1Sb7Lu>-AlB{dRM^D8h%IW3!r1r-87%XQ>P+C^DpbW6*$i}zz=d>i5c zuJN^QsKF(?uV263lxfm&IqvlZwnK+X%gd85S^+OR7Zpz{W4zD#N?tm7@-?DBvWBvX ziXk8U4xa;zMp^bK^T5g!FHN@~X#mRrnrh_RCI!_qt~e4?hjP8TTHzouXL)sIcG)Xa z0sj7a&oA8IbsAWQ6m(Wr)~)A}3HV|%=6A%D@7y_!;`7rM#O7*nj-#q-Y7N)dtiz2% z*g>t#A|J^qw3XzYk&zJ{9gU!-TEHtJB69e!?2WS|g+pb1MFe6)#R)hTut%gBBuA4q zNt~RSa^psi*{<6+){&_ZpD0R9Jp0Ed+5juCr6s(<$ZTZxmHfWEv~ZJ}LoFrx&e}vV zNMjgs1lVNVJg6^7@odx-B=+|oZ?s1!C&=COB3_|-NI(sfV>f}O%Lb04un(jMWgA`m z{j+Izomuu=R8Cce3{%MgFOYJ%Zmif;b`K#KMBnek8}{wnhi@f_C+!{}Jjs}v#mV&E zNS8`S6W85rScCQdH9GloOuXHGURg&6vY&~2l3Fq&BjdpyYyl;tz@U(j$ND>W?hK1E zZQrgS*?q$L8?i{$()F$gv?7v&fHgXUxdP=?jset0o^*QJI5<2!eDGI9M1g`ufBV+0 zGGgx=+Su5Xeg2#kep*V3OXIn?+Me#e!jk_0EdSR(ym-JEeMkD-InX#VW@gX2$G{;? zPfZ2wAc9tUVqzausAq|Z-15AuuV0~jiL4@-C~t7&KB@jmBT-zXouQ$ zB(ontKmx0A%_N%xT+qVQV2;~@{d%P}rhS;w>-06IeACm@fON_B-5749)+gczNPZ+- zN?|{HkaVh=i=(4T!I$^%ezxo$o{jbJ!&+q{$2x@Y2l^}39Zv#-}WM)1j z2I(v&odTKPJ*l=|`uzEWJ&HuGi;a!_`t>Wa^TfNdvVrdbV(xuUZXbxpEK`Veom!Qbc`s)-BkwfXY-40By6}1}5cmI$l%SE` zn68!0zIX4dwl+5?!OYCef)QzHG`K&$wf`;|NPE7f-n|>k*|@eGQZK|0RQwQ;!HLKD zUm`wX5l&Zh2L$}xyYxqmKO;_=<(_kN%uTv;L?@RU#p#hFN4UAUIXKM0_5?>A-H27t zLL`v(_I8JYb5QcBFE(dgp6IQjmB`J@gXW)vEQm7GWoCqt=i=!<(!hzM&JX)N`cT@- zHZW|u1?giWb3AytJ@~@o+}sM}TX*bG<>$fPq^GF#Z8t>O8P5eaH57X6@cfS-KfZiX z0>(r*(yj#ORD!ERJE}Va%yM1Q^JvV>JKM%W5cHBUFTx9QbIF-AGBdm1;rUGW;;ZGM z?R!zDYGvmejdXVI_4-s^UQm0B;6>cQBn-FYsK2{Mxl^@0qL`)XN$gUIHGuySv-b1Mk-H zBV499pTyPu{QP(g2G*s~6|w$FDs5X-d8<8+Q3~V4o&21bs5Q%$jIl;l-19^)onPdr z$Jgfu<4^GhK2l&!K}>Bwq=YQfntiqBK`KETqG0a%{OFQ<<}y4QRh5ni3Cn33IYcX!!`lQ}0?iNutjGj2E zCGZQ{Upo&4uoaBZ?b}j#CQ!>37AdQKkFVf6c9bD9S6{F;&a&CM`pT&S?SpWC_!Npg z;B&nGE;y>kDIMBIgOM~qex{dSeKj4zZPIURk4JI$Pn|A*Cg_AsRQ!?NA^#v>X>5TW zYd}j&t9c)n7@u@r@@EvnOn-ie`Vq7I2lNM%1t5d6TNu*_F)0oNVs-3xT3V}?m#ML_ z?}STBOP}~Yt+a#M0AT#&$&(CE+}b0pmlktS)-;I{8|B$vj)3u8<3BSh{}31dFa4lV zx~2Mb1UN1bWRQvO5Y@_51%HR|d|%8qWh{l8&^{cnuCuc0glh(;Fbsje;I6Bio6BS$ zL9vxTQA-XA!mysjv{pq3sVgcPL@q)v!EinKh3Y||fT#xYSTzbg5IAu{qZodWIIT9X zBe50|V(b`z0ft|U$zKKG|M_25vmA2kBEecs4X93>PE{jpHj$B$zn*UgEiIR32BP*m z;XKEm-$3&J%5?PF+S;tFtmOp2C)_q?iDy6p9~%1n5M~J$RSLEk8zjJ&Rvqr37Jtp5 z#g!|Blv;ky)^-xLfMK`dp2lDN@qhjVBUq7jyq>QWAmGD5GYn3f(#6FEUyuBj7)9ha zt(OoiB7_{4OIBu9p6P08Y0ZzlrGl1z{)P%^fECw{4i*rCk)c(9nfXa`5R=EEwWQ>& zwf9MN+B!#_X^Qkp%<7+AzfOXM0Kn~*mluk0vmC75d4#d{bbT>aR@6I!h+#v3E|js@ znx=h-ec+DBw`^%Ibjs{Ef^R@Z=5xN?Ah>zRqBaSsl$4Z&kWjkD zi+#tA*@5-s85 zWq7CnuNijjV)OF8dpE!K7DONkZ^XS&R){EO*;?dXJw0j;H;CM_rmW8ndl#4!e}b1G zC;YJ<++1C945DyjNOmMEy&Loo$d6r3x}H~+Ti zFSR5Ut<>o>k8N<+1fbqlwdT4@{q*_s>I>X#!BR*ucJaMk*=F?v!FisZp43n8Hke+z z^nGN+Qt&WgimO$KQ+m{1Ttd(cBP}^ra4D!J%)`)u?QBlXM1+1^6eP~G`~!Vc&RB=< z_nm`njQs6*;w!t%=Xw=hNTaXxW#5# zuL0h<488d1MGYZXv+Wl4q-iIddymRY&CJZ)-HW@01q3w7Ym$@`q;uv+JytlpOxyD9 zFru8jF_M1UJPN0fC9exT@zsNbpHOe+C;1(-OSQ+HZYuB#b zzPy@*c3NJ@?}8_!J<~)U$oux~kAz{PwiY6Ey_wzV(_V91&tp4MQc!G__#7psPfqX( z7+@~ld|N;Yi0S4C*Hz&HGz<*p+`AwJLs4LzAiRu;Gbn;>;c$ez2TKcZ9?{*2e z^t^7}+5*|O@WW({bTBx-FJO`o?3S@&|6m_f)rhd{(W@|sAH(Z20(T3Uoqsq^ss zMEZrg3FW7#`}GtGtDc+XDC-qfHb$JLC(AOHdePZ9|mB%OU#? z$|u;8AR`a3VdaX)yxS~;`0!6iV@Y?q!58fZ0vp#8?v>9P&Y&4s{2LG*;;k*;6T{^7%i3*1Af zHbK@92?Q)lUKMJWXdXE1RLHG?VxTLwnp(xh#5Aq=46N!7n8{)Ke)7uf2PN2O`4ik4Q`!-v;?eA-%W z08Rw)d9}z_0+B0`-uPI5z&0P1#vLbu+}n>T2K@JtBb7GbVvb*UMf!yr$0sHTi^=%7 z%|t8|{@B>lznI>>hSbOD=~kwuiC}t3;w-6Z3-B6g|9=33A_Q-5k6;`87B>hD^3z?+ zeqcycl$gcW=l|ix$HvAWH$)!464w13zPXHX4C^7dT0wOa3KrpofPzWvCeY%zGTfj* z_p5NJ)Olv)%3MZb;-?QEB-M8P4>^xMSs-!jJ;c}6wl=tlc5U1Cw6@AT^ z6dIbEQ$tN)`Z{2&)6z{?#W%CR#e`e3@&b3bsGAl!k5Sq7 ziRVbhH*Va3803#K9aVK4!w8Tg`Oksm^k?<_VZ_)WlrzFBCn&d>w7CVF3Yn;6VWhxJ zedmrH6`?%eqgECZ)+UkI?(jP6f~!KDNKL(hZGN~H3BLo*N5DJwHg=di4jnp2{uA2| z;FOT5;UGooK>8iP`rekeCYm`jJ9}z;9L9R>Yz|s3z19q)^UyIApe+g3>Q4OOZ?+UH zcoY$#+ph-6yMTz5BdCmE$>gs(B_RRHs0eYgz5gmAil(L}B6E@;;VuR|H(xvjxEQ0B z3_ql>u<$e8{=PoP@{TI;byFx>LjnU;UUVW5L&m$?eIGTou7t$z)K8%z=X_?|z1xc# z!y9C26ow-2_U+p)PEN9qc!60D;!-RuJ-`$N>FJ}ZIAIJ~V71J9a`!Cw2H@WqqRumg ztDXWFv@iPwdVy*Ejc`%fy&FfCQJx$p0tV)&|Ca18&M^Rpl|0uxOwyDqDJ87=&ov0zQM-ybZ1%A6Th$D7+9*zbd`U}E-fwXX~xlLSU|o7@DExw zVlZoItqOnMaxyhCI%fQN7pzqNAUsK}6c|=zI$2rSimIxdaMUv!nFV22?pGsBIc_!a zvJB;U0RaKC-&2SZY{ZM#IpRO~qW4q@6}5~E3^W%yU1NR+FZ$u$_}&NhNDW(P2t@4) zL~UVV0kxIYEA*&||6B#pz#t|h)B+!KU-grCFhttm5de>5xa!TOpp)h| I{y>Kvs&Zlabhg~(MRx~SH)cdF*bxt<&O%!`zmZh z$j`y6JT8}*SjWeY2`MR`iRvA}WZV8jzP#+Wk!p~^2s%dqwEEwIcB)(gELhy~1hEBo zt-`O=gy;toIYhc&L3{V^-JJRWLrSTZ60}OkpD+<_?x}w?fBZ!T{lgaW-}=icI}w+V zFld{ftezgm3IZAB2ExaKP_RL4DY?0hSXG3ESPB;y;PC-CB~X@|^8KxPe-gB#1W`I{ zXSP-WBs@j9?0eXs z`JjK&AoV|Z+p5k8(h+1a7gv={V!fFvd(f(qdKY#nM3PWKW1!!(;TNR%{-g9E(z14u zbN0VZ(;&qTkB&0^O;0_STyJb>sPUh|3MLnJ_o%bOW|ppR@ciRXelamIQBnHY9NO7tMn>;F+VH29Q3!AU z!5zYnH3`2XB{}(32M4ATS1+7B>n)d1kSwwr_GWOz6&0!e+kn^jSaiO*{Sz)i>7j^D zp3T7%CuV^|bEO-$5Z48w2|pzn_QBvBE>dt&W9jIQ4% zemDJ)d-wKwnbtq6KYWdhjEwoTo?d&zabd8p4-TFOe+=)q_QYG*2N}iO7eT12a%mSj zzDP(gsc--}KadH{o?uWQ&abAgb6{XNAHbk8Xeq#Kh90&9URP~xQzk*cdcr>U675CzzYpR-g-C?SNZ_fq|j+5wY74 zzD!5QO?!k-K$bmzTrE{i>h$T*j$ARMZ)}rU0&b8x^~S<$7zFKyay?eup>N|MK7ING zmK|UY;JxeZ?Z=IY_4SK)9_>^q*o1FD3q%gO+T>)27va4M2#`nOK-}s69S#??F}>e| z%IujQ-b*@KW_l2<7*2Jfk1)OfC4qqoUU!votK21hiI!x3pADiaN zZ>NXRQ+M~yofjF;mc_0DGk{Wjk&~mocLzZ8Ifoe!}H>Mq@;4LwAiCsr;J^Dl@EH3*ShlkO1nKJ`(K1m5yS3Z)$T8$ecZU z_CWq5Eehb$o2xJ@1kOj1r&2Hu1Oi1eJTC42ubs}75gd>Vjz5)Z!{wn>@;sZ4h70pq3a7SQ@Sa=8yGg2*iX>pxt6`f|+x``?z|Xx#T$hL555tT?qdqMQ&zPC1ymuSK zJ6to718p}<$IJrJWs=RYapOiVo!rimku>DpM0HH2f;ya?pq`fD#8fNDK$fQbvF5t7 z_a7oUx@qcCVWQygaLt5|rany={1n*o9p1l@62Qi+Bxj0TWseHtel8ytQq7-rHG8B}d-1vrGzvl7aRURKaWpjNZ7H4RHYeL|a% zDOwh?IRL;^6cnPNyqCcP29*wZrU&4kX!`oK#bKAb7a8fk%AkOlWs4Dim~GL-tFPZ- z7J?C>^OFpcj>G3E;XV{~oxOVI%uT`rYYpM%muD&l%NZ-_muQyAMRa_0bukOAC&l49 zgx>mRr`Voh0;>NLOKR@pJ+GpGvs7@&;S5OfF*S+edr0D^PSdR)GdXbJ0LY8CAQhW~ z;O2BL(u2|E`Ymr>%FZejW>9|RWn@z9@ueK-p-jMSi=TRTEatC4O|pG5PzTzVF8ug( zA3)&>>U_|lSYP|g1C(%^;&FuDGEkRunM7jHB+do+r`ih)2dpxo&o6!4GI0PR0@|=3 z{|I00ybhP?#4qi|=-+sWE~I)8%UyubG&N4s)oi_FqYVnYH2zGW_5`K ze+M2HaGUUc!M%mI#SKxdiN24h%~d>mF}wV(j}O-7j!(7G2#E&To$6@`%bu{Us!dBGQY!V z4*7BFSh6N3ce%ZDK3jwypTi$gd$*~osGP`naGQ!L4VeP$kc2nx0}=OS5ivce+}vOs zV@w|dyu&uOGpq%GX)@t`bZZNvma1y~NxvFX+aLG$$$4_mpLLnJ@GL25s|5Pu{b~6h zR}i2O@Eb-d={RQ`xBy*koqD5vNzr%k4$z;FPy{s+APr!VF!nK$NRyk8ZeUY|7lN^F zai(OYt=O&L;^A{ryW9-X3HvlvB)Z`|Ukce^OHAV+?O`q3=^;(#caRI9X9As=I`|+c zK)Q;s#Q6`Cr@><3#kd{q%#9=w3^Ui<~>lVNta3MC(akO^k#$%(5?YI$^j2I}BF? z{8ne5VtnPjFeOljFkUyQp{!&wrgVTV17MPjaYCX@-47U!zS)-?eTR3RhkQ)^Eha#e z9(G{g4@g4J+;93Wf%4w8abtnU$};FkR6IwG$^y}}lUzT5;|IQOX*Ge(0vP`7t<4P~ z$e0Zer4h?|o28*bWpNS232SF~&BqN?d%^<);bDMmM#U(2zzb(n_<}d`@yV>uavZob z_4B+0`NPsW=bIZmp9n30UhVry9QX{^EHI;KO2>f2r}m ze&|}uB7k6q)@Gd9aAiMOHTW?Yk6VPkO9SA2GcY)aUPqi|A=z>krcGc!))xnFZk6m- zNUn#fg|$&ZrmLf4I0e!s79D<~@BAG4N-EADU}O7a*$vhfM=ESLrMM~$j_LLmMrX8|45>|{ zJJFCAfufTSBS+N()e2k_3WFAW(k5>05{Wbxd%|SZXF~l;3o-aFez+Q?*!c*DfgJaI z-PzS;kdu*>6{y{`j^xbuhHdO~6Ywbx0wCK=ZzgIPZO;_Xh-8OlI<6u0>7p*Br>74q z;d>;rZ9#FDfr>vG^&r#{D`>70&#v#-wO;cuX1W_uXt7U93@rgK@87z$AxQe*uUXr5 z)L4dKXI%@2Br&}*m_JNIg%q5{9iYE8m)HV4-(Zd0yTuK1iFEmd3>BLpY8EspHk$I; zbAa5&aTXY05~-g&=DGwdZq&PW?b@@)l6cN|lv@izYpbWQlxS#ZaOS{}TF;LkIKM>w zM(}l$-3Hqg&Z1`>+@~-)y$XUxaUKuOlUaLsO`i=y6ifw(B8(w)ejm_x>B~(?PApMf zbEIOVwc*_OCr`SFo;ThlQq_qg7qFVH^LhQEoOWTi{pAmDQzNb?WMHer#vbtS@F)m^ zjS{66a-

O?ZzP2WrG_Z^GPI3fXkZldow|3d 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 diff --git a/samples/normal_bernoulli.stp b/samples/normal_bernoulli.stp index 1940a25..9d07cdf 100644 --- a/samples/normal_bernoulli.stp +++ b/samples/normal_bernoulli.stp @@ -1,7 +1,7 @@ fun main() { let x = sample(normal(0.0, 1.0)) in let y = bernoulli(if (x >. 1.0) then 0.9 else 0.1) in - observe(y, 1); + observe(y, true); x } diff --git a/samples/simple_itpp.png b/samples/simple_itpp.png index de43f00df89e35d9920374f3086fa44837cdc9d0..72e62c7f7f968e04a9977708425b387f5aae9da2 100644 GIT binary patch literal 17677 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 literal 17426 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 K6EBY$-S}VFTV#Cz diff --git a/samples/student.png b/samples/student.png index 38ac022ddab5734c14531c961359124098ed5ec8..318b5ac19f09b8109b5ab7085589e09c4fef1918 100644 GIT binary patch literal 17026 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 Kqe+L)U;96mh+={O diff --git a/samples/student.stp b/samples/student.stp index 4fb8332..338a1ef 100644 --- a/samples/student.stp +++ b/samples/student.stp @@ -1,7 +1,7 @@ fun determine_grade(difficult, smart) { - if difficult = 1 & smart = 1 then 0.8 - else if difficult = 1 & smart = 0 then 0.3 - else if difficult = 0 & smart = 1 then 0.95 + if difficult & smart then 0.8 + else if difficult & !smart then 0.3 + else if !difficult & smart then 0.95 else 0.5 } @@ -9,9 +9,9 @@ let difficult = sample(bernoulli(0.4)) in let smart = sample(bernoulli(0.3)) in let grade = bernoulli(determine_grade(difficult, smart)) in let sat = bernoulli( - if smart = 1 then 0.95 + if smart then 0.95 else 0.2 ) in -observe(grade, 0); -observe(sat, 1); +observe(grade, false); +observe(sat, true); smart From 8e3aa5573aca943cc04bc8e71be4be2c09928da9 Mon Sep 17 00:00:00 2001 From: Joonhyup Lee Date: Fri, 7 Jun 2024 04:14:23 +0900 Subject: [PATCH 3/3] :green_heart: Fix sample type errors --- samples/normal_bernoulli.png | Bin 20891 -> 19558 bytes samples/simple_itpp.png | Bin 17677 -> 17992 bytes samples/simple_itpp.stp | 2 +- samples/student.png | Bin 17026 -> 17009 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/normal_bernoulli.png b/samples/normal_bernoulli.png index a411366850147f59c726e24263806d54e7dbde57..05037bd4a321091e49035fe1482be9eefbe12d3a 100644 GIT binary patch literal 19558 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 literal 20891 zcmdVCby$|`w=MjtOL1Xf5P||OfdvwRfTFYk_)-EA0wO9Bf`W91tw`uA-AYQTfJmDl zEhSyjjdXLyqrbhcy|3@=z0di+>$lJO@DIf|p1AKh=a^%R`8-llmfJ?nL`@=*wvo@A zRwI!%+$E9LM{iz_|0$i+)Wlz#t|-WzCan>FqVnUPkx2VV|m+weeMf`fdkBHUQ&Uq}U8kQ8el7Lq!5eA{-Q5`&7%a1KibH~xUhP`A?i}0U z*@gbd$J?=tD#rES%w*Hk({(dUcJA8sqG6aP^YYcJF%KTd-PyFQbj4g#^LvX$Au}y) z&%nSQCZ@$|IaWGa+VgK(f`yEAw6&R~-15{er~4c5hZ9BY65H=$@tOUs=*cV51HIY6ZP z$B!Q(?G6StF=Pqn+3WR*8rjzLd^)tu%o1+P^GRB1W9|83hYpSP2I{Z=EN0b8y`Vj| z?87Wps-#X~r=oh0)#0|}E44b`7iz&W{ff94O(k)m#iG3yEHwZW{cK$s(s}N)h5?#VjgKG>juWi(^ma2t^>{saTi=f# zHEH^VckkXk7q2Wat%{|UPJCoI{qf$GYuBz}$$9dHtxG5z-g`w>d!C(@uhMVNcb*%~ z>aer7Ut1hb>)q)sD`Y#Q?k{g!*mg0`L6s8o?b|oO?iAgu0QSN1V4;Ak!)>`)>|{Bg zeU9JmY#@=|chtQT@T)q*V@*?D-%DB)jUrt0MyE#%;P5~RI( zq9+e3($M${b}IxPlE5w$8_(;;<`^1sD%9=dQIM?HQB%88(z9tBQ)5d@*`HX8i3!uz zmg&iJ1A2OTWnQ^CIc_U64NXl=WHLF@bvAf;HmA48ce=c)ir@ZtZEgs6-@t&wxH1km zamn-oqyM;W&7jSk+c3gya_z~uY$EM~X?07MMId9~cyv}?Gq!tUQ)UeeQ&Lhm$e!Nbu02oX^78Zf^>XT>PHb>g?yn3txN_yiix*A^a3h+( z{`yPAqMdijGRkU+SoG(o9^AftTPMrh_2-W-^Yim|qs`&REPu4iN&1`3Pjum?N;yrN zV4Ee5JtXp78iGhYx;k(E$77uoyN&|aSc`ANHaY%0T8Qh2bf+29OdY+KBEu=k$@r=x z7VY9>%ItVYTEnn$d64Duyyccq6Fa+E!~qhemBq?NT+5x8md3IiHagekm$yZfSY!gJ4mStNSJx;_qKy;Ofl45I8Vk;w`&ed^&%sQtUB3pQu&OX068v zS@q{kIz;VKVSOkyxH;AF9GT8W<&5%~QLaUo)^pB|fdxcG&XeQO0W{QR%I&#GJ z)BSDCqBf0L7W(nZ;bSZN_0ump4aRCDX=>LxDX3yxOR^YyA<<%I)&2-?6onj7>9}y}Z26 zN-kVQP;S_?)uBJ!K2^Wa&4PjqIWaL|9O-IT9&~tVZak2Eu-jLP<+#<=FAMI-LO>0( z!wuv0TKatUNgN6RckkU>nQgH!Ji1TRW&r0^wpDZDO?Jnvjy%Vy63)ndhp&9jZ<1V| z`1I=4t4R0N>>sB{`@MFOc&&eY{*z3(=+Je~s!;4&4SV)&KcDMuIrZPaYf{+t_4Uu5 zJxiwOAXh(mvfthQ>yy8JCHnn zc-yW57f{$MA|zTSw;I_y57iw6rqN8%K^!u97k&MD#$SG>(ZCnEv}|_|ceG{_c2{tC z_zhvEOr6ok`~_TOwYAk1p7V=t*Z42ynHU&!4-PucPh58FSzef$)a^m23pt|M@#BTsOKz@cRaI3hOD`Xv0J-g~k|TY6ahgf2 zQC>Qe#BN)gD_rwuAM_S!7ie3n3>V`dGf6mQH0l3AQYF%lh9#qf%ls>L@>z))zvbS> z*9IKq<{aCk!7$?pM_D%ooz=;8r3oCl{!-~g>}}k*@x+M}c6N4JX&3pzd9{MKGm8d| z{l(8;RbQ_`iNQ`<;&Uy`KxsO9!|hF3Ab(Q*(DxMGP>BNzAMdM1%WBx^El4M)q!<_& zl&xq63pS%-)ySF)GXXB|V`dHy4_A=8znz(zTmyimWIywTLH`Uz{RE?bmQJo+%3vqJ zdFge-%Z!;lbIyeus>;f&?d;5f`EdsZqg-CT|8R$DJdoAn<^>_@DATXw=k{*hv{1IP zG-oCpa^lXW;L1O@Yyq;loZ6m#HH+14{_>eKU*jX)L{W_2y?f^?xyZ%El~C@sI5%#w z7<=c=oePNsyeO3wz1iu3B`M=Cye`_9sF5Vc;@ATa@aLa@(pj`;TstQvRd}Q2tt-Nc zPCrX0btjwbA5>Jjg4PI5(;0pDsnL-U;LC{ca6NT(cHeyxPIb-APIxg+w?ry{`n0U9 zsc?uOgIU1BM(xVUz>0jTvCd8b)4GJZx;j9quWSno3xM0RGc&G3FXLHwX-FFp*@drPCTro2n4hswO^4jX|z9vZZ zqrab1|AY3SaOJ?@;HCsswuSYzY84?zg!l^R6YI+2S~t+p(C7nUAzSo>zOWl_4-X6! zLFPj!mfl|%wWrc+eFD?uO1DzzQGa%_D62=8T1|2dq7N zC(xjA>kF8YcadJ)G@_NRZ+v@0cW@~kjotU}-)CoMk#v$ja`1MH&j0MTwz5Jgcx5~M z9aVQbi}<_pyXEEOf^7C7gTk5b zx?=WYM0H$USwcc;K|f5@zL&I-IAOYn_<8i`=iD68*Y)l;7;VX_`ug>uw|B}Vo`o<& zbjE*=4 z#sV;ZvB^tF7(g+?jqty5@~qU#bl0Z`^`>cQ3iWI-kbc#T=O{|X-o2r~-ys1N^X)4NWh6DIYs} z{P;pjR{P}SgZk1xBWPZ6DGOS^9Bof^8RF%}y{5&rG6w7hTAD_4I z=cz2V&QsU;>=jX_#2_NlVq#)!ZUP6Rc|*TxfAeO-{KMbKMoA8sN1a<^FtnRy;+&Jf zWWGEgq#(1Ogur%Ugp4akTC=Uut}T}OCI7@g&9P;0A9pKUzqRq_1$y$BZ6a~IvQs-H9LFgTy?1}z;1+u zGj4YV;tM||B_*H&@DCOtBgHSnn%UavMkxSdfH>&)P!hil&*1tBZ+4yB*x*%Km9+-2 z1>z+%B0}=gds4V^mT^@C2o1mN)3!*p<9Sn+$lOdK=F8GB4pie_<&6h&KI6|i2#>}wSx->2GIYuwT}nn~W++Ccza4ynR( zeaO>SK0l;TC^g4{$e&83%Td_f-Q5+gsJ|jY2KNLzE3~rEZZrh@D=W)hM@MJy9Jh#h z>oFwZnk8HGeFqL4P|R`~PC>iQbo6@AVCPCrUw{AE(4#5S0nC{?ZGfnsKc80E-jBcm z#N(ET=6#?I{MTe#Cazego?XS5Z*K&U-=lC+fgqcJoHRpX42pdM59wLi*`?0!4oU^q z!>ZS$Bdz7Zi78NNHqPUqk2D2xuEvo8=RbSz)LM}UKHGooewYs zXk=ny@`bajd~6oj4~vE(#ABT_^W`x^ZEY>etE;Q)+RC_l;nG+xxFMWyMOhg@Ui#a& z+o`F!t=SyWH>1C8MoR7bAWIihQB_rl&5e{)SXj8+p3_@XQv+;{zFI;;;?C{cin)U; z-&YW=NEW?!xP`LIv&KZgU5RpX_CMl`;F{W-XW3l@xQv^=ys`omH8MI1ChhX9XeIb0 zHVzJOK62(^lTxHrY*WEna1k}NwY}kG4KcrsQb@1T9EQ^kU zjub7D>2|b0i!z6zv1bF)W=?+rD+wkH&CCHdHlEDqKsLU%hniw&l(NODu!W z;Vu;QDE$$lN;-1p>eU|9i19hS1r|2L-5R%=tyHqJvw=dV_r+A3EO*|aVJCwF_5Ehz ze@S3ZUu8HCxdtJ9+IZcioj5qt=i=i2cH`RtIdkWHOz+{-SbnBsH#@=A?cK4Xv%fzu zG&C3Kn&>sKzn^iQr4O&%8eP3-=T231^$f$Z0DZRwLn6Q#3fCu;AfK8(0jX3axuj_0 z$*rloJrSP@7qx9JaLrx5rZ{;j4jGnH>XyEZs1SCG!dWRAW>Mh-2Ts}?AO#SYH1oKr zMSmz8Py)LpBSRQf4LKmN{foXfPU3+6FJ)2+E`F;rXy;^$3Yv-q0u;4IED?0ec0C8N_#Qu)vF2Iqt(?_>NFm* znv07I$|~qo+KVD=Y^Ty1P=>hjQmak8yuG(=+onN$4}LD_>4k@d;nPu3o#>hQbTU+k zSFn50CcdmbUzZCi8lj8is=ktK`bTNP9vK-KumcVt=@Km-0cL_NDUXoIT?}{^IoILt zj;hdS> zK`9eCR5UDkH@iN9iN-G!c8RHSq2Y!!t(WT5X}O?gK=z8ywOUiB?cKXK_sSRQztU2{ z#rrZH;oiSry35vnr12?*B4}7jd#|B>cn00OcA;B7aW^wAeYlMzh!*r2b(%9^DCm*R zj<)%er99n5-l!yRuUaW8mfLr@YOOpsrN(t`-@Y9;6UF~!0SD^WH8V5a6ou9*6wdbN zr>J@ZE6dAqFX^nl0;C|fs;zGAy|sbL#nshcs^{IiW7q_LNtpr|0@V=pzsnZTYrH+5 zr{{?Vw+8; zWY5xgVF&tm6#BZ69sneu^PlZMfj4xuwKdL4L&C`M5Y+LpC|t2?eP?;^-aYzucFVr< z;Dm$(=VEVJgCjAZwi3h~LRT&1<>lK!!&FDh*#iPhrXb64kV~toL{`J^iBxFp#%2bF zcgoCoe~LbqWi?^A%c7~h{o+Dy;81^(0|$4SmVVq;^ELo{e<(X!4d{W&{}cAx&uG^C8M@Nj?qxomJQXl4BLwW5w&_ifIm zB??ioFRPZD-a>&vFY8fuO*J*j6Tw9gC0uJy*vJ(0Xy?<++n%sr!?j^cmZq5*7(5FK zN?67Qa|Q2SDz$nx8EkreR-s-%wAX5d0)PHhW8*BF!5TC|It3a!IwA4##Bg3$ciR_W=C8=5)JvPeIjj zMfX5Aq8+OyBP;tBNW1w>bSZk>hdDi4N^jcO&^p{ZKrqE;W+gMvGoH?^& zGGjYeTHo5WPp7~%30I5y;xilE%8u+X%*eqZ64bdfLm~x0_`0h4C(1yL10A`tva)d9 z37ei;MV2Q%CZ>mVZN8Y`SgEOdo`Q%73)@$F{L7awK(@krwt|tMrv;ZDW!GuGSelLG z1jvng+K|@K`QZ)+86Ez6=kfdoh%#vIKiAhE;o#^+z!kbISOHoQa8HyUB8|5!W6C}$ zDJewk$B!RD@0YS6QEuD5y&X3md56>YU3PXw(BbZ9XC+^!r|)K>$1&rgy#lJ*+9U)8 zYd(F7E`J9Y2xjf_<>!Dg;!xBAYva%M_w=xHavB>M<>cmOU2me~nuA#8J;BHq>Fup_ z{`~pu4(>UF0i=0AtwbpXoJ#n|ZU0Rr@_(!P%Cd<{OZfZy+d@A8pbp+HiEJGa5%J?B zE+`g6+S^aG0Cg?sUAiKBHBGQH8s%})h6pVY&eMASH}b91G|r( zo12@NtfW*?SxNu)F`}T<&SMIAmL3*!-%^!N$K=#t5sHR~2tXsEE-+d+XK((=>g~!Uyw zP+y=!E65>xl!m1yws1vXK@2!LIw}PToUnluwx1#!4SeA>ct%~l4m$K_4mG9*+-H*X zo>DF(#=Fn||NM*h0BJ@Ypaaw+P=b!=6+^>JU}=a6TPmPY(Z<%Bg6>7jC@;5l(;dKv zZz`TIygaMpltKaj@*xq#-9eZ8V;8p9Iv_bvqv(MYOyL*xqq(npJtqLW!VQa(LB zjdHSWkAU>k3nbG6SnDXya4Gjyv<=nO)kelepFf95I0pz)*BK)urRl8E?oCeWWLw2H z1wUrsS09F#ZYGw(&+g|Bnf#0T zi-yR)@Hl)sO)SJtR#tZiq)5S`+Yf2K=|Q8og8{dbODU<|hgGWml7OENt_r30`Eyzs zM!IN7XyC{qg^Ya$_G1sTYiTv0mkRMYEhB@_I(y+jtYyXj&D+{!L2_-`8vcQsozh$S z!MlxuWxw9~?)9^0wb8zkIY6PN+W~4+7)(x6C0KfTdIH_;gLh-$Z-~;Uc90mu#q7-+ zQrm#q^&u+4#(-R2DEbUBUFQ_WxDpDUNz!%k^y$-}(%L3dKxM|%o31T&tVO_H0=fxb zgsvw7TpRkoBq3OGq*LVZIoLwF(FCt8RJjAV8gvmyeERe$Y$Is}i;3bt1_u|wF)?}< z@fXa$5dHM)czH@|B9V}^(0xEUa9WzZu|?##+wwbh@*OG~7!?p*5g`iSzaO$496Sg}>|Ow%?04_fZBbo4L~myevT6c4f_IjbG%Q+K zUiOmhMzz@3i-RX@JSMdG3aFo*3=qjBbjbIrp`m}ShN-FP$&(*p=HO{e_x7#;(FKAc zNf-cPN0Ete>iO3P`1#XrABQ}OVnuy_mzSW99?VhfWQbF}Zd%a1ZA8=gk6^D#4B{k6 zveAcuHVJz4I66q6-(R0udy(u#y^%> ze5PR(?7?M2;HAh33JDnlKap#I&hFhuASMiQMf>mGyBEl}3Gfcl6R`b|?pwGv#^L!H ztBx)Phr>!sOAGzhy!G9yR|3xo9}dpLq!)V)q(>YU4?B^Md3t6>!gi?6EG<94&(8+x zzlFs(09C3^ro0IZa2`4ya$^2fV0GM7Oc>FGO!m76RKK(Ao*8c7*|iN zDlQOVQ8i(JG7_B!>k1)8;{wh(Dg(?iC>c6BI)9(5Xcw+t-MlT93r#O52EZFB zr%s*v!hx;29-g1IsmL{8;aIlAhY!Ps^bh0(-3?}%rRhO7!o;?N9IJ-bG1%w4t}cPp ze(XBv{lA!iCrmg=9s+P5K(I&eM+qkQR69FOb_P-};qm)8(v~ao_uqZZnPx`De{*sY zvOOWi9>^wfJpj+Mqo}r42p%)&N=C+&AxFv@8nm9OkZ8aBqYeINP(i=S)@k`OX9fWM z!9tZ+D#A*nq@;n$<8&8CoY8@y=fkBS3Fo&>!SD|(tS*fcNRb7gMLHi!E3AFEcLsKS zgSGMSuFw*%b%Fgtl|IFY&F&#UxC{RuztD9xaw{9rrtu5iR67q^g5I-2M> z|NXqYBM7+{)(0O5a?9d%!V@8USzr&ZV+M*-fSKIy{8YsQy z1sBuYS9p#d)wCh#w9WeqybhgzwO?46;M$?m7CO(R4jjWPDn9dqIVROFu-PJxTN@R5 zF=8(<30!)QP6r&)>3-}a>CD~wvIuB8TsZ@Si2LetXJ@DD(k$Lt+S1}Y()bz~8;R`2 z2D~{c=OKUe8+3|j^DpGs9K`bLuPtgt%X&i=o~t`|7Mk61xP5!J%fg!h51c`Q(~(%O z0MnMYqs6T5F1@AxF#Dz0kGEr0wlEyJ4mu1d>+SWXE5b}NRDeR#{x2;Jg+)Z{;dg;n z3Zl8c>(hh$ygZ}wplWn;xWzcJLbAg{7tO=FBAU|A?|!0^HVZ`%z{BixLO{++vUE1y4q4sB#70dybs z{P^+4dCt7{DM%~;lSc|M!m0mBRQ<>C_HSPKRD5ea$@CU>1{6fzBS-2-%28DizEVFw z@Am9jKk*7M*F%S(Qo&+WR8;(W9bs}#_Ez(4apuo-}!Bs5-4O-;HgDXX5Z@YIYk zM~c~}>L|5Qkx1|OferU~7Xe_n!XzLYt;%w(KCvF2RjAV3jYH5iJ3Q%l#+co~-Vp=^ zi7pCE;|rO`1&c#Ta2L2we4qj+-3pQH_Qov{&SMDWN+@4#7D*65U}zj|F}AR<5H+9m z<3{e10OnP=e7Or>06QklzGI#6my>IN!V?>Y84g_lP$@ztSh^7u5n*m%P@ASNWk}?p zI;Xrx%Yk5i<6~pJ0c_1*5Z3aS>WScf-`?I=}f9wXypUwn3SK zKU7jusy7kl(|zmG7i0{7X#Uu)wq(n43jjj{Q7_fJ+hAy!JEU7A3t zC)#w&80R!b;(P;P0>ZI-O)aHB3Ubda^xD$lThYG9T6_EtOp^z`~kJ-AE@e-`aU zn=2dry4AfEl!=H)7K*5(jVW$d=={QhhWKA_gGIlT+vc4+xVCHGK3;MSP-&SLv?mAy zOKth;hampKE|Y%|4MCFV-`Fs1s=iKH+Jp^+os5Dr4Ev@66=(n;sVZzgt)UJs;4kQy zEiJjXMdsF#>bt6>)>^YHBA4SdzknV-a-&%|qJrw74C6|ffv?1O)D~hb=er)@K2Jt1 zA1CCNgW+#clYlT#f=cw^iS}EdRUuO}lg~emj3ivW8@o4<*nbI3SY+hF@=C&+iE_G$ zh9&vTAyO~+cbOE;Dzu4!15oxurQF?6pfQ$_3%wrxde~b^tPxj7O}_0XQ_ws(&5iMq zYXA+Qs7gXo|5p~)aQJ%)828!fX@WABVckut6N9RQmQdg2=e?$2!igp^Ly{)Q`8?bb z;JCHv+Ou$jYdd~!Xn-^qPPd$i&ZrtC8mp~Z`vE%Gb@=EA_MR2%8buF&_6TqcpcE@A z0v}&RM+YH+#f^WY+O!Eq0SQh{IY~aa(!do%@Lhp;i>fRnBvjkhmJiJV*GX@Waz)DA zWSFrJ$}oQBmc|I9h|%YYiW`6s^^rucmD*KJn9=_mWX=C7G5$NQ=oe=TLo5&_q;n-I zv~7vi6MNT@qTCkHif!9;YA_Hjqu|P$%IL+1mOy1F$LPO;x2I~S_d%nf{TIeW5>g-f z(^xjqaOGIFKY!PB^Z|rnIPAFfX<|_4Kz2?}QBl!-H}GXkL8P+zs~jQ!vEwv9W!ERc53dzMdmy z-~ZUOiJP)TIwhuI7+Q@kP?;zMVl@?&{lDwD@Qvm=Y;I^ZFYb`$-C;tovazuNKT=+q z2Nykr2Hd5lV0g7^v8i#=+?@jh^XSU|?P{sYu9K#)qfzwUbNC0cw1`+bqJkjB1TNoh z3Wk^C=+UDZv^z*ce*=-8L3(d$!nqOZoRP7Pu5MC2ecMWKV4!_(DIE_FPr48s0MJtT z6sSqI)Nr(qP7w|w_!htj9u^bg=O2#^yr}c$>Z1eMrEnT7!3rTRF8=$BuV23o#)Gb8 zBk9Oy;-j^&w!q(387b8g3f+6Qu zo6O(Y8YTI|g4LtBxU{sisVN%_u8}bi&r#G$hy+H)o2aOAb91#+rAZ#K4g&<-{ukQ1 zJ&uY5-f|LThCxXRSW7Y_Cv|pO64xzkq#rQ2jTf%9|ALXYMT8rV+g~1xsLCjA@BRp# zl#3V%KvTmT{PN5JlFDXxqBIghgS66X3>RhUq`Y|#GcdlM4H8ro3_t#E3Bpfg3z#9dojVxXftxQjZ0?bl~vHrfCxDZQ3AJ8P@QK^$wy|LN1$&}Bgj z28A#D?htr(QIk~8;o8*G2pbCQp~UrxO`)L!P3C!bJ*kcsr(RzMgs^}AC8QuD;{sUk zP#w=bVAq@UVE)KBCoLnb8`Yb$L0`As3 zAAqq#LY$`hl>WgigTREb)UoRxgCZ5s&R>Uis$9c70wpw)dEY+TM;l0)l<4U0hdbGN zieHxy{t@tyTYjfl>;Y^EAVP*;Z4;pG5r>IOzuG34*a>+4Uy6kgxR$?M5_p%JD{{T@ z+ekU|P4Kf^#JU6`;)&M=W){J;BH194^MQDOEsG)Uu6wlFOGt9p>@cuJk&jhl-w92; z``@u3c}g^B)=NrDnFO!GU8?k@7CN`Qd?^TE|I&?h7w|2lM1p*AaCjFPssE*R+G*v< zU#I-2H`bZ_daVX{r4Mf8pZkF5G_7Oz?f=cQpMLRg5QLhRKdj5RC-pHNQ)f25ZD=NSUs%&%pKg*OtS_II`Blq)tkbHgJY6NzZI%||646} z*Yi1PzP{ex*oNVH)2X#YxO>Y>N)9i5b0&En-m{g+^{G(Xik%r`{QpL?ke#OdO}siKf_A-iTI z?DOZ(SdfFesCL}>7phL(YpTBr_)E+1WOOwKP|nyK!qq0=d@xKGqE2B5h08Lvuai19zO%>QCQ` z`A)&%+2(Dc3d&LINh${akW#t`lJ-c5a{OZ-pQBh}kJl$Xh>bSK4J4^p!?yXGv0WtS99*PpvKN{X_FzX0~hk5^K`Ww=r=>VJ`gGcLqj-o(#%sd0r~mxVWR#bYL`(! zlg@Cx7YA9AC=IP^U~|Gn+32SoR^i2I?<703E^M$gqU9>awwoL87>7g6t`CYOKDlq# zE@F}gyM&9feLVrW!RGO3ChuVWqdoy86uYJ`y>0jvR26r04WRHr)VPD`EVW#m9t;(+ zfMvLOq#XADm>BjHP1xz_9&I{|@`#_)@zOJ;D1=p24B_kRAFe$y13pmkf$iUJ`1=hc zP9tL?tA*{@Nb0s6AG6n70|_-m<*sa!dG%p zN%zEMxQTW194x^RR#ajf#=I`!DN?lbH8|EA3*BM1C~OLL%3sAyw1id9!vonWXVJET zh$hUT$J|%*ps}W>x1e{&YzHwnGc(>%Sem8gp_xQC$@?6G!4Sdy%8XJqa%->AU1vW|I3-n>!y6LZB#O!8mt-2(g{i+Yb0t1a9>)yDLvRpGWnw8uz zyloRW+dEfyav+pDJ9p&RmW}u>qJ-waZsJe%wWP%I=FL}c-Xu;+G@PFq)zCZWS6vu< z*q~@(s-IIa=#|6IE6{t89%Ewr8Iny*H)Jo0(c4O28aW`(F{RHvn)AQS7AXx%3NzH z+EWD`on|!Ox9{B1NUY>mgHn*x#<-dPgZ)-Loi`r;3-UPWO&Pk2t$cj5KNqK z{~9;^Jxl-f#WV)1uUKHw@YEm2!T*(&nGs-PZg!?YKhV$b{5v?s0;Ojr?%gNcJ)BBLZ_RSwn$^4H&YgiiCfo;Z?~nPzv)H08 zuKKFY*6e8l>2dpn#OlJ>i}#5a6$J}^d8v3%p+Y!plbYNg>$=qr?bOcZXRr@6 z&~9w&U~Sp4{!M7A3w5M#VNZJG_=7-~1>W%$7k!`S%v_{_IM&h22&W;M#umq6tYaT5&Z@-M|&finqZ zeua7C*RQK7Vy+=$s%uqj8%W7TU%nV(#OvqJpGM9=mU$LKPkp66huruGsl#kGbAuEE` zqTMkzCM`9}p0rBWQ$=oj7reLqf@HEB&mZy!?<|yiMJ=Zb`>f1N?V5AXRR(NwBAgS|6QQ@GS``(^Dipa)bl!s7oI@fsB!ruXhqYda zlQVur1DHvLi{!?3R2k3o`)~i$(}Bv9em2nYBz|(9J(!M838w z+}z#}Te8q?Mf5EIeQ;k$(_!?cAt52WgW6hJ*Z^X)kZj@V)yvXIst=zOFEyw-;w}4( zLb1Y3WU2&`T(9r)O1w2O)+@0*CSgit>;LQ-?iXLA84$pOrl+_&dzqMc!_4T%qWb!b zkkp#ejbXZlI~b-dWD>#P@{u4+Q^P=J#IJ>8!O;hC;Pq9M`DK*zkWr&WN9>B(*7&z? zXWQ&Muxs%#xQ|e0By0-6V?_@=kSrBj&G>=Ur4)t0C2hzU9|_%ZpAGa;30v zosRCp;vzjgeMo-NJv{vadqMH<^d4rFm+G(}W;C1vk(ZiU3BJdy3Zxfu@p(a1PZ44Q zE;~yB^f+WorL_Y4@rck+-7Ho$P>fDaPFYgVlyS!h=FM^PYPtl<$I0iLsi|vBgl8aK zx5{R`cyaQjx^j@fhmjzZ*BfSLFo%XUMSvC+3|364U&P?i1y&eY(S6eFJ&L>GzPiwl z)8{?z*UU2k> z)z{U57MNZhbB7oJGb&E+{{2lrD(MEe{O0Cn9V@9XsNb;Yj;S`}B&u`6D{|%YW-+U}&;M>Io_$^IALrypjEr!P2+blE{T2qZsoFg0sXn zRRagb{_h^|!aycGtD@olbt%X;i;GSQeIX~Gn_Rm#IDc#&fq?s)nwuOI^&YsBqI*ng z_5v}t0IoB)Z405Yfta60 z)J62G!ZcgouLC%%s~d_8)b#T5!UY8~nNiZ^T~mueeM18eEj6~BLh9x^(@g9)N(8>t zXia5k#z|LKH@X^wI*PSaUM!**CWRB+xZi5CrtF$g2%X;ep=+jt9fgH-S+GuLse#$` zSQ8MUa*8+zt~~B+LU^;%gX=kZS6oI?0Gy={FFx_`Al2TwuRIEp6CQD=x^;fVEd;2h zjixyqKG`_fGYlCLO8_=sVkr6PzrKj^JeqCWApF@B_fN>m$dD-+@Xgl-Zn|?BXa}_X zjl%7f6yhk~_)_EC&sbSa!ry{LgvyFRNjD%m^r!#>?0^3qa>yG``@kNg{CZLdVXV2Q zi)J@Umo_>a;dP_&)d!o$$ADK6FZ+&LfxxVoHnp|QgnL>+K|xlQuvz}=C)&`i;6s?g zMu_TJSOAoL$5_scrm2Jlp}D1U{cfZg1aJuHJ)Xa{@Wa15iQg}M0k$XI?Ftz2sIO~i zK&m-@?3jbIb6KxdwdJKF5D?zIJ0GhCoJ7MUe8y(q`N(P$+$GSoFc)CLvX5Nps*A2e zS-BGZBGSTX<6ECgxh^roUtn!wk^nOuCebck>cku!M!aD3|67zHxf26wdoTb6FD{@K zIxt`;j3dZAxLuE=Ixv8)M~((VQOFF%#m4ad1Efa}TyXFN3w{`=7XV$|X2?drIZ!FJF)|l){c3#<+=%=y`2Dy*BuH7$ zV`nOo3A_7=>3-}wHuTK=!-BldRE>xe}!*)h9d#7KtzNr z-<;<3!QBs?1v?pQf%LdDZXV3GUwsL%_smM@*h>+ z9#i#NACLnqdg;=or9h-h96x*!v+1jtt0bl;LoEuLhSyy-1YQqde>u!IrbImFht_Y) z*?T%E5op1Xzmf3)*zxW4cti|88(VjSzI$&@hC839>U%Y-?7Z&3SkA@PRHJa>(K7J* zZ5y-g5b9RG6Tal&F`(P;t*y)TM*(+^$VF7-S16lslULo zfw8hpTld^tm^3_RprL`ea7Zm!F>-q2RfefEddaMTdI6^IHpbu{{I zg9N9HF2AI>m{UqhUqy8J-WA$cx8X{>0;Ll84`bgw>K`QyU^B%1^6~b@Go8$q%+c`p zDaRAetkdy#Y*DRoehY(C-{&396_A$|mFnSl9c&-AKfAZKjcN$M5H6&pqLUVm9TicYRq~V#< zub9G>MKHk&BScG66F}3;dQ&m6Tu2C%JK3(MP;y|*W0@I(*6WTZA+#&qZAZzo_;lH+ zlZ=T7m~!ox)EXX#O>`W1RswHL0j$p`O2E=EL*jyhD>-CXVKwrA*-dgtBO>a%R!Q$9 zepy^tc(na?A$B|J#AS!|#3PaJKHu}p(Lqay@H_5b0nvm9$^B+&{^J_+pM1!!Jd25D$`IaPsTdme{HQad;Gr$Po;_ zV@sghKzoemyF~@w3}PXDMy@GFQleoI4?<^Px&YwjiNdxCEnX6&Pj1 zKp?z0ATVY6*L$>o0%iFSj6bJx*m>waEmT74T zU0p}2qSb_;6Eit!g~{dU>IBWCKt5eNJcXwE5h+Rw>56m!!$asY;Gw|t1R}*9C$Yy~ z>|Q6Gb_J5d-QyS!C+wm8`m1;Vl9swU)NQOB25_{rw5qE~zwgioaDbkRxAlpddF0 zZ%A1;dU)aKTg@WaP;5Sy7!)jTZV_g3 zF0tp`0S=!R+1s|P`}kwYF3NQ5*tJtHBgXfSw;0SsUg?{QoOk~6=A6TZ4I7Bz?U&;1 z#5YnZ&ucQiz1=Re1~1;`BYwtzQw4wD`NI#RmfT`UgZ~(9j4zj0QW|T`?)PT)Aa`yg zkzU^L@T?COu#x2Wpx;eE$G;Eh^Ej@I_}_8~laPZ)94t1oxRP!-vId-wM4 zE;?R)t4ysYuK)5fqo9excvs2d%&;u|1`^3u=!X5ePsR<2in0MrVy?4K?GNIj>T3I^JzixC1Yy9@kV>-rspc^-e$l z^(NwLVq!vtlb@eoUteEJN{Ug$YU8F&4=!ydk-n^XYq+pl)!pqmJJLEE)LRuoxnYCY zOrxrYhsR}i4Dr~9&w?&zB1N6XItr%ZqxA)jX!2*d1jlYr>EIf6K~$UdDYqZ)~#FBQDW^E1%mplyRUxRN=FyM?71{SExZn6 zeRyOrstz-lu9az26D1ZPv2t~=MZ45({^!KEsmaOW;$lCU3$dDttg0=~^a7YAx}KbV z^!)jALDNsVrEUe98TuHRy`3HV!lkm+m7xfVz; zV-jiDItBO8(am+QuH@_FUrIO=x7)Wjw?&^(%*7s8*U2$c84;N3s}{v1b7mCpWMo{d zKGglTynK1o#&dD3XgrwLK!0R%v@KWlQF0tPDk@4fQK7(Xe)2uDr*3lq7Vp~Y2)mjA z%Z!q|ixm&IGKy?r5O@-p_7u;C6*Dk7225vHW-v{!lAA0#U)aS51k_xq5lhn0 z_n0@1RMH$cJ9kE6SuLrdb!^j7qqldcC6;XQEMsG1<>K$AddhwAgsw{y@2yX(m3Won z@iQ|sD=I4HtUuP&j90KlE1Wv@vp2+`a+w{g9&`8ty_myLBi8+>)0ma0@Re6y8@BEd zdMs$_Z@t=^u9Kgr5PG)6WyZKFIED7cE51t|ha;7oGV;aT7jojrhK7c>hPZX|)M$G1 zyFEA+Z5}*$;1f5}T~_v#c^ejDl{twj-hyYOKEXG=XLxuKw|`vSr>XBOEtYcr_03J} z?CidDywC9P?A^1UB1L`TX!J_;OI&>7I*OgMg>32zuJqTlY2r#9Aq}0=;(z=hr4m?M ztGsB0jpV(RG0$aY2$A%{@XhUT5o?!)!KBrdxw4QIYe7N5rs4aWo0{ZYTwKh%PL6Vj ziv)aK{Kt%g1h>4S63Gk z6O)BEZcmm-5>?3Py4BU)U8dZLUDTRojBSCijFj*!b-7wH-6-o~Vroh!8nLXd$bx|8 zSYRbS$A}3Sa*#iAVyB2jrQp5%jqhO)CQf#3zCq zZq*GnrL}KsZWr}jS^5|%7=FlR<@1FA_aCn)J*O)o5SG~i*&_X)B2{S;oTvH{oF9#h zj68kHm3so84~)j=-`!)RD>?PSD02(5__0HW=E_!=$18(4J3BjN{pcsWw}rH%sIqZ! zjVz9r)l^ny(FzI(c>MfIIg?Odd|FpGB95H*UVw;>hzK6P)FM8rPOX(?>?VW_t~~eS z4fP@Gw&~IQ?o!*YuO(LJYb2&WWt1+Y)|o{JnLl(Xcvx-}df3iLN$FFvO1#|sHVe&v znMBvUW=J^a&&Mbw6*&wCr=_LEk&&*f+w;=(ie^IvO^ZuPnv9Ry4{YDJ&;7@jSI_i{ zcDs1@Rfn^&u+X~fO%4-xof})mSiEoE%&}^noE~hTnL;> z#;*8*IaBXoqacxz3nQ?bUY(~ucGXr}yA2n$q8zw#`7*ZoGgcLc&@PN zNp84YPgJmLsV@h4&aWkzW}koMHP%_geAGS}o1VAyXHUs)MhOqM{7aoa;=1w2R;Hp? z?T4GK-`w6>?%0H#-C5++&S6>;6?xdMrvWLY$Cvlnxonw|dyy7%W1XFa4($b3OgGF@ zkZ8Tc;z`O64Lp}~@d@_Rwl`v9KgKjCdRGAifSuV3*TV$PFKTzDD~<_1V=zU4i=y+M(YddkY% z85jy&=Pu1KIS=idc=+fMZb3&+ucb1&MshyWl!hcH;5>P8rjF4kZp$8_Q!0UYjNN)x z?RnPo^Yb-gbGjQ?RistCZrtd08BWJS)C>6KsIhozMR42=va(Ws=h?lvydCQh# z_5=6p%oG$A-M`+Vn;mUGbm83=2WMosD}5h{PezL7uWes0o^uim9c3LGcDcVDO zx%*20Cw8Cu%nR@1ORT8gY;QErhda;f9Po=#7bU=ufHa6p@vNAXfTa-Pb61X@s>SZvC-1f z!W4Th&$PUKdvdY7zM)}mv|TezBVCr+y;0*F^2Lv@Z(L`Fn(}SBk$V^0axG`mtUf=F z#o`YR4q`s2c5_`FN=b@x?hAeT^l6;fi-H1fy+R=g2~T8RpSbUReM%9B>yXP(*z=4X z$Gb+qe&s*^lC+phv2{=2g9j6Ds3nqVBbDaz%a*Gz3Rt&hB^)pNlSHNiit1>uma&^lYdbTu1Q3aKu0={l zm_p*upFeABYmYlgT|&Ze`IMGkpQgzxtx}4by?Mcf6tfo4F6JrDRa0uv=()Ff zeA;IHabb#-+xD8J6)(@W14k&FK7GV}VY)i}(0l)VNGP2fsCLurG5Y@D0q_$R|InU$ zvnsjCc=hMP0w&4sQ^b*dNA2l_Edoaq7!O_2;tGz5i8-FOo|2N&$Ea*qJ_^{SOP7G- zmcJQLkPdGKj`X2pX3ikXojiHdJrhY9agTcyxy+<$SA6`~k!^YgX?&E~haXFp6y+k< zsWQ~l6Q_U5e(C4L@e@m!0t|SdJwF3@!TOA8=1_CGC?blJMJsN_G*4=UKb~=rWP1S)+=&!pKUb- z$krU$CF8@|>B=DCQQTyqmuXavV)5wVLz9{)Yu6Mcts%WRs`SfqV|vmm7Px|enp1qL z6Wa!o>C2jfBr--F9Y;1dH1A-A8l?feTlIXNggj9YG> z@ZRPy@>zvjn=AOpmA=4&M>P_wZr!Es-`?G$qNWBgKL?nL#N$oP{EVq519@?!45dAi!Bp z)CNuWic)%J=JCEhjWUmAfw^@gT3^(Va@A;8`^oPWalE%~-aL8oeKLKRS%EE$zRpqEqW>DsV3esKVG)`yW7OTl}(M%S+JUo{GQn8`pWdrguc(rp*Wwew{ zyki_vmpgN8;v^;>wGO-vW)fOJhATE`+%D2YP}q@2cxY@sm%u zcN%M$x9fC9cI;T= zl`SJ7Wp>|WQ2WD$Egkzlh6=bdkiKk3^GmMqV-W0epX>bH#hfe*xg2`Tc@inO45;jQ zk^CCT-AE#GMgpNn9Y-FAhC0uVoLls6)Z{@_A*s7B&T`KNt|M(fNi?Z~xg& z8{laBiQk|6n;+pnb?C>+wh^fI#S5|?D_NO5xYn% zL_n3gFTU}nmY>6rzKqx-=hcg;xe%BrOxUt5-$ugd?M4ZSvJ3D1xeZEnGg_EM9l4Gj z(=8OmaQda`xibK{v2=%ogr?ERH>Ikp`f_SKMgDL6oOuDa;ON|shn(u+b9dG&xSW7u zfD)hgXDV6l;>9O%WPrK2bl~U1qOZ-Iaq~g@!pD#47klQX`e~)j+j3HL4RE6%lJ_9z zOKddMD^ctlR0)PHw?BXWj8!%@HjX^zoP|_T{!HNf%WJ#Xl!VOd-`17r722mLMIJ?8 z;?FeDQE-J@JI8jKY?6J1o&EHU@lotOjkH{ibZvho0$20#)mBwi)vYUk`xY(wz>NR$ zq9EDFVx1>Qio1VEgsBnOX7) zSrr-yHz+bFAB&>(+@) zyxrC9J{PH!bY*}{RGK`iR!U~KFT`kC(MeZa+{15lGoCVx|AI`kxH~%Dk%8+`u44r? z;)@^OzkeSakDABN!C^5!*}H9@v`U~&>3m;(f_z5FY*;*{kB^T9k_*U-ePXo+s|zjV zzH}{5&o#uxqglOD|K#*=b2{z|KnUijF+~-ef!(yE?{02Xmvgw?Ua?w`4U^3}HXA4@ zMePGYorLJSnB!Bw?uETSf`p2_>Ca>akR&cH4xHpTEs4%*2-$q!vbTnZ$BJOhv1}k@ zZ~r)QWiYo6T7rn+;J$(D5$op|(n)Ap5s9O?yDsq+p`WqZQnsRge5X1M%fW*vNQ^2f zDlBDFAhxtVDW;))CP;J`i`TmrmN?S6)(h2f0Q(9k_wa;{GFAfcP_ z-A_v!z7Qa$QR3p@?SC1Sh?$vrtGJSzo14CV6vevqbJ>aD3HEIHJ~q~sYuN%AdDuSi z?c28&O{wNT>=0uhw$fio>f~8%qM~Xzzu(4Y904o3K*5gncD!<>;mbFmn@4PCEcj}> zN?a`)lVe{=0y8544t>syKOtLDRn;(P-@9~pw{L>y>I&V+uO-tdm};o{dSiUA!^+aU)C~$@tIt0$W9X}%#gT^;BeB1F0kH>@qIVY& zJ#11^5``xh@?O#;dgGAdmlcoL_PIZ)OHqpr7}{SI!mBxVJN2}hN+2d8UAG`h+IKfF z3%Ct``x{6EpM3eW^^sN1(j=gU%u1K&Bg|ZV%O3^?{@D^1H|FKw;Lvn_KcIxHLCKTe z_jP_I(MWpL=WTyJ*v|T)g3`zu4F4r?Riss2aSvK9`TUkGJcdvr8 z@Mn^iUtQ{#*ysL6pvixqsLFmPvFUq{K|BVhRYW<$~$0$E0+s3t{W zk--l&evt`cnVOqx*?*A3C+^jmHTNj%Z)3nBY!v)b#;9lUub7NklRtte$Zef?w?60| zW?#gUn@=iekE=}8@Ljg3$Kvh_5l60|C-?I5T3TA-(Jy`+6of3E=Bih+9urP$n6vgH zc%PTo)*#XQ-@QxFh{(d&+LY8xOV=V7z*s7O-55_Bk7m`nE$6`)!5lsO!>`g7YcVb8 zufha|b+@l{AyvmCAao4Dp6&%3mVjSM>C>AxC&H=9BG%U=hVY}Syz%PCC(-d!hrD{u zr8i?l95dN5m)XhW=UQBCy4p7d$Yk<|nwow!7SrJH@G9{gNe&=Bh?efls~h$A%x*IG z3fLdj3vzjJJmJmA;UkesvO672jz;?bIrRNhoRU(w=-0!WJP2y*zw_64#=l!t|0l}( zzxa_0_b(_s#+e(qR4m5^zM$6*jB51gFj+B&?qmfEE?1~ROE;gc_!4|}RO(Y0% z$%jQni@;_hoLDKpd-sBdPgzC?{%t1zKl4~$?PBn@Z6WvX*Oqy%0H}5x6Vkw8T@4Kl8JTy$kK;w(4|Tik+O;eGw5rl|f`a*C>r&G7{(X{=p%6d69ooDw zpX56S@b{Apm&4eqi{v#%x^y}53If6luj@&DAP{8wG(AAT2#L5fr|*j|Cq zv#P42zThTZ#5|d>`ExH`yr{*syL~lGfwj&tM}|Jg4wV_&iyOGWJRd|m_&9KW(u;_W zFmU^p=y9+O(t%7aO4JH0i6~rmw*I6MRK-0Xg*Bdf`|I|Rj7aX z)Bd|!*T1<71S#r3a7BP#2!52}moHz&p73_LdiB&H0!bGW88IeiKM)ca5t;ZpjS+PJ zwzkjB2t2EFk58K)2qWLBH47C|G3r1Ic7}rMP`e9)pbDy5e1}t;~3xjr(<Xw=3Goc=#Xys$0r%HPhok%Q**B2BNTDmvLPLoPxic6&_!;q)pBJ`<@03A{ zg3q%12weVtO89OnilOWDK&E*^;^W7Uv7Kr3s?PJRU%y`HQioQ%$r{qN=ZjrSnczH- zR?{56+X=fnr>s7ioSLF)TDNvBjWoNn#4+SnT3LE--kH>Skg^HN%agrT9ShhCF&A&v zO%hKJ;uKGtka(sEt^3?~H}l@Tdw1?U(6$d*LG_?taEN|}=j!rYc2*XX`*a=VhM*!q zVj?4%WY0%Bbv+n^DD*PLZjI`Of$p+Z+<<^n4?522d=U1;g3w+79|vGQ zf_5mwpiCcf8e6nm)}_wEdd0tbt6M30MIuGV@xPVrpBNAj|Jc6szg!`IWo2T<*gzga zC`&iuqfbwMku~kTiXe3P_wEKYpxPNAa1C zQOIn63q;=SUj_${paWc5a?|Mzw<(1TnPsLLcEGRl2bOQkmc55tl5_t+kx$O%(=6!C-i!_%Gc49gSsWt6)b*Il;R{gCEnC)&3Uo?^!MW zP5Jqo1kgVr4(XpTUL`>du)$W@NKL(3Ww3If69tM$WE#(rZ_8F@GN1+!QUw730~J>I zmUV1OXm{;8*eQK0RM@f^Am~XEhM&Cm`x}CadGq=;7_y(QD48KZ$`?jnzU%KFg*o!& zE&XL8k?h^iEYlA{6o?k+-WnEg=t6paSE@nT3c4Ye>46=4_Z~w%LM4_vbd{OlGSNF_*NBTE z<9K(a zC38cda4Xf3Jtwe4!*WkrhU4So_jQ1utMxB8N&(YdvF3bbAp5y<=jtOZ-k*C-cqQ-@ zRJ_H?NlK9bEgp-b`G9NCpm;(0?*>nXJOOeIyn-j5WA*2Ii6`O9t4|UWiMu?IWnzFi zWU$2o+7+g2v)sj8Z76A@AG%OI6G5eby3o5!dVI(Rib#lkQrm;FL3fA(klip;&tD1) zx}KwMKYyTz0TtDFWCAx^b(fZa5-Jt#NB@&o46gqI= zxC#w5bpW0I)vpO)g+?;pkL5mrtp$?_isz~I4VHQ6?L_&Nxv0a>&8?^s2y4v8h$Di0 zd_MphXh%^iUOHEJ*P;9qIx}W=Vrr^r{Pn9>uaGh8o@AUoEhl%DrWfp#bjF;fFVso` z4_01n5vnv z(l4=Epge&x?i073f?~J(Cj4|ZqSwNOh&-tghV-lGM8=D!l&)TVL1YEeCx1TeiKXRb z(@zoXov7E6EH4d-H~-K6E4=j2>zV#`aY9l^jx#bc^51(T%YD&N2l|XLq=tZFlXnP& zE2#=O2y@9FUY%D7@emGzlfPReAR~*$l?c=3NiTKxOgxc_)* zh<+*=8?F5Pdr;V|bnxgjgB&eLM4&Z;Tz)J@i4gs;3XkL-dT-<4oIx5l!?SLHsmIk!os)Pq_e?@gQkx6H1!6-lws&sgg z%MnjQn(fC8&vZc#-gRnW4U-BP8YY2Qaxnf~4gl22R zSIlLa;NO44Civmd)qJX{$yWz8$i3V5H>BhXRlwYG(8z=fnIDHL6C(#^tP5@rg1~`I z&N5n&`6`M%wlxai($Z8-0^xdm2nM(rGM_=Hgy#w>VeirUJ^lZqqw+rvo4?nX{vRTP zcl$eEuIoYP2JPO@*H`eDRRdZW)Y*_rnCq9VJ7lUjSy+tGaTvHw+=?TkYlVXX*g&iJ z>O_`t72&-b9K%CI?C~C~8lLO+Bn%2Gv-xF_Vy+^;bP3WWVsCel3zAWTMJ!9g9&IA;gF)mmZuwF$t!LV zfbs<285C5mukO$YQB%hsGohUM!IeRDl)GQJ&ON(5`hh?^P!8|W^B>s1|4V#;IEP^- zXbXda%e@otnR(|s8^xYtKfOAispT>^78w+z{#pQj188x3L|9;qeJ}=BYoqF!goK3A zt`bo)Ir%1wCDI*KT&RQQpV1#~?}Jxl-#)!bfxqye#=Z*NmL5`1(wS(KWi)zE;YF$+ z#S^Nny;{@ybMiCo=IfboRgvkQsQUhrU-l8g5KE*tiD? zDjPj)i%r>bVpr-QEM~k5Lm60f<2g$C1V9`LEv0Jn*RgrV$71kKTBNpY10s z(%Uu6Yy!Q#y>)rl{@dO42@$V`A z+Sk|D+iT1W7rG=ZkZrX4?72lbBcmSBV&DHC%bfp_N&bI{;$QFyb`*Hk;^X2*dtAk>SiWz@$|9)Alojg4xHajjOt!-%7e&$ZJb8zcMX`BYro zIeN+x^#+(=&6+jn3!;8Em)_p*i^fYWf7KgkZU6V{jhX^%Q1(>7KC07m31pv#!NG~u#)|;Hd;H>hCEMUtH}#4*XJV2l5;7_%Wqd(sPi_H6#3l|# zWD=2ZVfs6pQVH^oaCgJrwfD&7i!LsOb!Hv;Hql8*{rCSkft1A3872Tx77h(dJ~+zm zQ^XPiH)@5$G+BEO(l;hSn4ZkV#dYxDo4WW26hIUrC;TuBURA&^B+z8QoRhP!Z*3RBzMVX|=7%iuo0q4^8iQ;D&`@siJJ~t(792*i98F)V-Iwnp&HDEXAQ7P&CT%#Zl4jg>(fD^A? zK^d+X6B85jXKn0`Is^`_V-^Ljgee5vLfN=$u!l~O{a`(Gcxv>G-7Hnv8_sd7TFCML@lmh_K=t4sf5a-kWx!qp1Le;o z2G3qUl!)86^-JAa+uI>@Qg7WV293|dqZG2MyC{Mx0~|ywiy|w?>u_IRUw3d3sB}d_ zW&2fCRhO5S<#+L`o;@o!^+?*i=6Kn-uW_ap*lwzFDP&5KaH?gqs_JUtP=$nf?n?rp zlarHjQ=D=oKZ=Fq@w7uT3-wD+KYsXNd*uqEF3g>ujqQC?Q*Q10grp=_(!s5VL>8o^pq zuI2T;sPo3gK_;hX{N)qQ35bfe8)f1ikn>}$xep!EOlqKA=n@bR*g|n4*3-M3h`q3| zq26Bgurf{#H!ry|_0$%LWkR)b7z)Ih6vNZmtya0(X`fC6vQzMT%Fk#d~MqFHM7EBId7A||7cBgvJFtzlahM%;Git} z6hK4uO7+U@&Lg>N)r5S@1&~qUle*XH6=Hm>3qiJZehoe`f+1hV^8y*$~ z$y8i?Oi}xpc4Zm&lP6DLg3wV31d({;X*Gv6P(xnecux-@{>9g6h0#(oi+8{g41-O3 zB9a2j`#GK7Ktr#OCR2ncw*c*2-CpRrNSZJnqqdxVcD8Ty(>z4k zE_lXhrIC*bY8wqJGRRYMrMqW%ur+s}6hrBdCk~K+=UcxXeo+%p%&_j@)EaDP@Fq4s zpGb{cYJUwjdfG+Iuu%#J6=Pe5mzS1UfdOb~X9nT}IDG0e3?z`DCVhZ-Ly!=VQBGf+T(Vd7Q>_u(Kolm80W9&?&r`Ts|~32;yXlQOmDM#x82a9Y^V2IF5#u zm6gHHhT0)yUYtr^&3o>->M>&~guw#?bar%r7in6})lMfm(>O9g*l)6o6nAf{uI4^` z_^`ORewtERvVcM@06+FK$^dd=`U|)D%hDt=!$7+q2E<*vE*KocA-Op6 z(uDF?7;%X9-yTSBx=g%MBt2-OVU8CxjpD0jX!G{ zhQIJ!otTDsZ)gmD2GnwI?~zIB<-qsMmou*I+_{tB*pQ}Zi<;4)SP6t8z!Jww{C|A` zY}GyKO--=crH0x~oSTza`T31-07OUQIER(h2v!w7SvG~oF{i(&-$_a`g+FGcmcux_ zS?(sE_AB^E@Z-@8T6LOoc=X!aMgNLFwMI?iL>oo~bepDW9Um9y?DbS*7@p9xm>l>3 z-shilNJvcN@F5Od9-qOHTe8pPj3Y zU(ex)-F?fg2}VzNQ+)usT*pf^>$Yk*7)QnY){{mcU_ooXa`A?GWSyB>QoOQW`jez2 zx}xBPs>^W70`f!&nkwNLFt@}hvtpR>pFMji#+Z#wUmgPgTFsa~6HxZ>mlQjAlZ_$wznX^GegtLlhFoCyN(@ffU6NGMa~ zmrJqQWshPp*pM^_{j8ur>WVFf20!u9eYb`zdiAe7S^48ZaIj;~+fD7vj5x1m*;PD` zScc^OhPu$_Y~CiwAXri+WErFYR5oNv;(W#yhAg-i0I;U6QQH|uHCKAQnWn|DSzgq0 zGciuiDww=}rIOV&rX!cXL)c91QNEuZpg8YM z$#;(wF!ou#H2&qw7cl<>c*bzHjs03X!X$xnIhY>=AQL(l95@87yiLtq>O5uQQG4V@ zmZBvKyshWqSo!$zBUet%61?eP_F#%uE`N4QfZVSsW?UJFBYe}h==8tn9-?G_v)&!& z8eo}NfUvm}N1@-W#_Q8P)qtNQ$71zWlD>{3An0+2845`xf%0dx^z>$;Wz|uIODN3y znr(tq^ETmdc0u8x9Q11z38-Sg_*QjsyH-5Z-<`XM%9?VH}$XJ1jj%TE+X@$Wt^4%LCyIXX+$`gw)=g`EiZ2eLV^QawYa|dzm^&0~ZP5 z_Nm&~(A9>n%x!x#jMGKi^2-iMeh2ynUyz)(IU?Z;Dv2 z%bT7^d-)|ZZZ*s~dH<2H+D@9AO^uhE__Bnmgo?&(zf6{vNZau<*VmX99*bC4_9kFm z_tdfesQw~~WfPrMquBgwVb>ue>cT=%SI3XgIdY^GhnwHq85{Sag?zLQ>Skm|7fg+1 zp1V~O?ojBJx*hTV*4EaBwDVwp1Z&z$o z?lUwrbWx%Ue?$3@Y~i0;=JH#4E>&hVY*3vPnb?H`6|SzXIKBS^pMh&2EG!JVDVI*( zQ(H+@)drXdEG#T`^XUFuH04+KF;mvl>#WHOnO3i2*X-Cg9f?qGZfVicU)lvNP*bxd zh*OhjbxPff03Q(D%ZoPx5yukt1GNy|%ba)>63(_-i9D(xPRW;*c>;}rBEh*0g%z_J z8jfdDC|wp-R>dgz@Ny6Z{ zlFW2^4QV3|-jVjxIbJ$6I-)Qv5cRhC8D=%qoyW)O$HJX`g1D1{V#Aa4_pYNL3_c>8vaPdk0d(pP%}tVl7FJ6PU!^UH~blrlul3z-P2H zH8nLi!%i3y_?Vq!;#(ga99%0*`gj&$vHEl3f~l$L-uKYw7;*F%u>~dXM9T&~_m6&S zZwiTsXsD`AfrlgeXzS?U*L3VDJaEn2m}TSsC*V23qsXWP$|XExCT07Cs$9E&xjzz@*`RD6p#S3xZ4MlY^3DE-;~91&GmfgxXb#6y1GmpW&q&A zZ;eRDZ?*v7LDvYU1up_wZ_i61EWqmzy_dmC%O{*IDJh|)rB$KH&Ch2(cD2?>j4w?q zk#b{vLBTxc*V@|p^iD;Yyi1)HnM{w>ttdBdmqhCVqy)(*xZ>jG8+LmMP>s#HZrwVm zv~`cgg9ov^?*zn1q*sL4vHl>GyX}53HcRpmeBwXu#g7v6JuZCO!Uv!RlSrqfl}57!Zd6HG)zsRDv01}dYBp1)0QFeSj++lQCxhH>hnft>_ zhx{}9o*WWA%f5+bs{PxaW z8Z0{`nfLoWxoCLu!)m!;-Sgo?cWq8`wcK?PNqHaUoV55X?@~b5>jai##}qIKk}caC zHsXJgy$5_THqmW*l=$0~&C&S2;~Wisb(5x)8Gm`VLwp^E=)s|p*3{J0S>(*Fov)m~ z1HYG`)yupRE$+vE?dJtW#mBb$@oE2)rN$dSCuvgC)3+yS@(!HE&lqj))~8!`6${yX ze^>59Jv8k!pz)UxQZARf(Wkj3Qk>sEC1k2L+t6-7>rHU4?nC@lk? ziMN^^X>W;>V`>cY_V%XZwR|ocH~H(=`;Q-4CpG=V8;hK0`}_NQKZfR*HV-b%PpYNp zjI^Y5C2JS#WnidI8L1Olotl}ktdF`E#XLVhf9uw*+S*zh8yhw@HWfElJW77pw$AwM z+0v4g>6Bl;tQ!O3byAo_+?M+5qYE6yI`i#@wl1C*7Z;b1C|MjW7#|-OSzWr0&udy0 zW#RYn@$p+19frTuKRiz*X5-)x!EZO%oT#SuT3v6nn%F;=W^#>em*&Q$o}Oq;)hqk< z_Ku9!)t;(A><_wA#-DJ1e*59z$Bz{a>x?g6yoevCr>Bp8&HK^at!G?QRb~1q@{Fjc zsFv2(bDr;OYc28DG7s{A$B%2AE@Al0)uS`Md#I_czUJ0fSDSr%bIaqYL+1^N7{$Q6 zCfDh~W|qJzN4ZbkWuDlcwv)Xd@#0j%6_XP^)x1`n!;NwNoL+RvkrWgZ{{H@QGBU2l zdcwlOm^GJc*CxhFR&{#Rw%{@4jAh2s(lwav($Z4jI72q|)NkXJOc4SO$u_G!9R&_? zvSAvDs!2W7LG&6;rqj-2MRAI+7&F_h_thTrZb(o`JUOy||9&Um`%64>iPSMCpNKO6K;n2nXT$w|!^scY3F9L+u_|uzr z&7B1fatco-mhnX;mUq4H!Lj38$jG>a@-W-qUJQ@M&VKmt!8>XLDQS?U%V=Jo$99H% zY(T2xs;5jEt~SQXxG%PMb-FEDG^&LL1nB2(eQ?6QgVdc`% z(s(^;!;!YE>P&X6T0GaH+ADU{hsZQQuA$K7tA;c%JAHnoGxhdnaHth$P|V>_%FiU#Ucqw90?^H-Ydk$B|y z7m!6~nKqwfe9b=65F?dg_|ddAy(gnic(Er)ccuC0b;N&~?Q`yY$ML8rW>(GYQwE0- z0XJ^k@YqURZ)Z;}9?ET|x^iHDk&cM@7mg&=#T57Dp`nx#dm9^CVV5~weyz^PGj~*z zG#L1-_p!6reR0IQ=(;aA|2nRu`uO3)NM`TxG-(V!{s0E!p&e{sd1AGkT6bw>acrz; zwlhFZxHU@5M^0q<)Ujg&Km0{jq|Dq_muIhEzkXCM+&ow7VoHnLbH235$jeRf3P+OP z$_Kt65~FfhhtT#+gqCa=KTF`?Xh(sptgLs`yYh0o{!cI5mKXZ!B4($iPE8Gb&AV=H zKK$sQM83nAjv+bTve4#-cu3_fx`w{%bwUn^hsemthYufOA09q@ILo4a=AGB>9;q&=tZ`DrDECqm9M##wD!b|2X*U|;j@kP{|JyTBgVE8b;^s24Ye zE$iZ=m@#OpmSpV|ouZkM_M_U>tMe1p>_?@8ckJ9b-tEaG*@6x9>wan_M*?%z{hbF@ zQ*@TwtxANZo0J-|m^}peH*VU*&(B{`UY?hicQFWIgAX@yJPQl!NY)l$Vv6YRH_p;n z;Z(pj_3`x;wC&$vTwzO@aML z`eh4}%R7f@H{PszF6^4GnPa(r)3z_!7Md3>yhp^c>lS~_G-*89aq{HJ!Il(VWQe9F zWeEuhDL*&lriTxAAn)A0yFpi1SKnDtQPJ4g*k=!GZMcw`V9)@HS4#21V12X%xq-vz z*VZpx))Iv%wYcr)S4x$NJ?li9(~KxdShx(TD9fUGDaCFqPq$Eswc_#fmLkhjN(u_~ zZ*Hw;4Mu9-vU&5|&j7iGh6clr&s6eVzrXXkckiCA>vSNemrkzr3)D_*$rE8`{E)p~ zU&_D-QB;iHP9UaH`+tcZMd5Xt>YuC=>3Vr_w>}MWmDzl_$6eF@%a@d5rMGO~u9I!v zigzYwCF(|&St#d-iOOWe4tvh}^knk7~D*j@x_>#*w6+_8sMN5Bn~X z8gZJ9H%S+IL#^-{ePIsUM6ykrSq>fgIW^FD?AWoG0s|u>CPBwkog$|S+u*RUB3!Ol z<}p3gG8Pl0voO^tXVqDF$>|X}JDGu<}{R9no;Fq>Wx{pHInSR z2OL5%Rn1<)$Im}A*j)WZvHQ^iV!$k`O-}}IW^d9Hu3WV_SI?I{)e8P688-7qoI$yU4j?@l0@$1x3}ND zdv{~97nQW`%b6I(B<+H1*TtE@lIIBiW8Ucq_Ul~~B&mWxV#>oTPCNl&)gY_ zLGo5xRLP2`$UC+OI9giTzS^(?WPmSe`i+f^)F;&C4eujo9654?KwrGPIkw8IR&Q@_ z?Ck8^jVTduu*3xtesl&E#|PW85;HO;y>=h1QQt%I`YtAcN=jNk0~O6- z-6nqhVlIlyD6C|3Hvjzk5(ZoS@#FGfV#?mVHS<&U*RGj%7S4YR<(-_I{HVT{o)oc1? zY%JZ1&HO}9$prt(IUo#4Ny%;OC&ZW34hhZW(j{rR7#&03Mnmh zVFE3~k_gyqzrMYl?Q~{8b?Ou|GcyZ|X?N*8;47}>9VL&tdw@kkwYQO|?{OAi7kR~l zzT@c8qd}{I-H}Vhu8WA_ppz~2mG9mepL)h9xRM6uaeV=h@N2hYl4k3?{~8XfMu;0QWm$=Ny)L zs#WYV|MNqDeueM+OuLngh)`zc-Me>DFYbDHU_AM@i>T%(fWmX%?v&UD#3I^{dn@wu zufNHMKooq~J-7IjRg-ZlaiXO@v3ZcmZSKXzfFnOD{gIn)AO+T9{ZPOGv$?j?0LrT- zYJ)qBx5^Tgn1S=kJ7i5F>n^lyn;mo?$!e*I-$3&Eyh``Ra1s(R1#A%N9Xq~_jWJPE ztF3&R8UImf$KSzKC#bZdhT=}muJb2e2FxYrC6$qr;|;&yL?E~zcI-ltnJ@YjblQo{ zD~nyLfH(t~sQE5KBcq7Z*JGEgcJJDSv?X9Scs182pdN`W^pwdi8XCuyrTLN-S(2Ms z;CqoL5gK#D8Ff6sOOC%T4`?J@t$K1y*JZpM$z}@mTnbfu)e~VFSZ{m^h#Ocm&$|2U zfM=5$JFp`L<2(=(#3I;3Lb74!ZvsgcjOq*?NpNG%yF{tJzyEKfo`2gV@dit%>8=Y? zuT&DBCMKF)zWfcV+}P0YlE4S44!?O}LeV`kYPVl+Nk>OVmltPe$H!0G4Jw3 zpbbn#QjHW;v}AL%N?<@hW8|6j4i2*-D|69UWRD7bW7Wts264?Ws(VVX$Tw~_!Nm!? zcJD^|!Y;Lvj`EK3rQ?=VcoG~;Q{R9W9S+mTziC?6-rk<-o@uLZZ=W5-?B?c1p)uI3 zrYm&4R~jpsq}>^KTn$|5TW_!7$SpRV!Y?SjX8wxm>W)7u$mt8MW=A`Yv#}+srG#gZ zN?yG9N-6Gvr>AEYske_0+19PstW!s4<&spLG532|HPr1W#S~6*adFf6m6ViZk>=a{ z@W{!@(c{WVn46o!2T?n(LBAz^<+`HGjSz%kmEg&uw*322vSFc`SdVuafGct2> zrs17ICsi3@a&!6i?|)%X{Zy4fjL3su!B{H%=rx@q1sq1>n^8r~@aLaDe^xTNe=RRB zZ(HBm>#q%3X>V^2i6DzKefQqjoSR3(9lzIvaDhJ4@mWW%F;=8X0k@^OKOt`S0p#7| z%*^+FeKYMX5MbRPlmfQ>mq%_b%!~kd=mbg{G%K)a=V!XiPq3FPH6%ncd#3{v`-yY8 z%vqaJoI-R1b9mmncgZ>O)_PL6$&b7`Iy$NhJ)nd;ckWbBP*7zkxBl=AlV0J^WHoZ@ zz<~oGwM|IdW)xGiC9AH;{-1@bmylHgj>_qjxD}~LC{P-JAaQbXD#giW&4>cTZQZtQ zxQm!zr`Zk%k@=qiH*b<8K6o4!CUoW9eT4fZVjUhZi4?o9u3XA6#9&fNR@$nohx~Xu zQ)fg$Jy&vVe!N~5ON@{22dDU&VdTH|9AvmqUaQ)ws`MFA``bd%d%&ta;=-K>q6`Fr zz$HYB$B!SYzE&TPJe0uf9S{&uP*6a=QrZms4uDhSG>vOn0uvw>eC{0Y9T>>dE8B#P z6ekx^`{6^{TTwtvAcG?EO(^J2Uk#AZ+mOOX%tU1R+ zA0H{~LMHbm8@%J=$KMABP45IU>BpY{$9 zo8Jiv2n_`mx`dBmDzH)7FYmLm8iRsiKhRK~5Z!Ofk2S^J@ENmJp{(O~708SM3nJWC zT4SVw0Fl5b+TOm^Lj?gwO1io;Ni{SiBoEJ&TmTT5hJMn~(XsU~7y~UH^x@;jq?hN+ z&0p)J6N?UxcpnNERUjfGSXE9Aal5L-q~yR1i}* zd+wZt^#TJD2YHbWQIv1rzAd@%uCfw{vo)1j?{0lU)%*9GDJbe{Yr)m6B7|Kj#gGF_ z2{L0?LxYWI((rO?(8S~;o?igZ&1?6M}1?N zC2ehO5A)v1pmcX%MOYBOTjHMvtT&+HA{afV*{Arv;CgCrquR#zw^pNsWE-Xg3l zILj%WfU7*bq{Qwdd*D6C7#k$DyGDs;W$B&|4D{BPYIsRiU$pU9Czhma5Iz0JKjSPt&r-;Fwsq{Y@T zhYTsWIGk}!4C|;_T~o7{^U7VF6y9u<9OF}T^-*gV96Iz8n-mb{A=?HLk_(8y#pT&9 zshqv1uU*BSxJK1V*Y^)254p<(n8?Qi)pTyepcGP!+(60w`SWThr2+Mtey$3^*#YVZ zaJo=tAF|6{YHFi^sNp{djs49akR|e~^p|HGfoPdsz4=0V@8`(9qHCGM-Qx}swQ%0Q{s!7+Gme}(p?2wOvKRFyh&{5mt$4g5~C@|Xj2ETJ%K;rw)e2_B! z>qf)>#vJ?u)Ar{jXi%8O2L}fOJ3=o_wf%w2?le2fs)pA}&4QYSznf-h=u3g)KsPm3 z;1QzNdB?tg|%c)4YB^waT9=P_2@;zD##ASw+&e8|a} z^`qxSPvNLGHMB(SgT5MXP$D2KqqvR%B%Brypr?Zv9y7EC=C$5jUAH<{DWavN1w}z$ zItrVLW20VXLV8AqT)1Fsj#U>hs8;?S+|1OYY)Zur75@A8@4y=@-q(J^JfyVG=T zMdC`_IVfdWhzm{@iJ z8D?#ok^YM3zWX2r8bLRVi*U=g9caMpI8P6%sH^jV4gFbpsW~paIi6Cui;9XHNDA4u z{8N-_Vjo`LwqJf=jaSj>HJucHu$NGn$67P`a2Ke0?x^@o&cmDo#GV*t&}+H^O|~vs z9xGUK_kT0d{w*2pKA*)=L;+I667DMd3H3JQjh@3;G`T2{{D~-_vp0FSNdQ9z6l1=S@ud4sG_xumr$$v-2`AY}--(BJhT205o z&CLz4O!RHAJv_HFv_*-L)#qciWlT;zgSt9k%dcOJ)GN6<_Z|t>8hF*tZhCU^ct^Y{ z7vj3<#P;pm!F9#N#47gi^6~<9_)Q&*M$UprJ14>9dPp1T`r*&--%mpCY9K%h)YFIm z>{^y-QDX5IFTj8L#(%v{|L-R0uU)c+$pXW}-9Y0&hM!t4wRf%bj*YReRW$A}Stwfh zQBeoFHTn zdXH?{smPWniOqM4?kYs{ShTr77zkq1Mu}4f1ILpYA)nCEwE?qWJVKe6nwnZqx?Q<*1YF17&Mxb`A3z4%UJV51&3g4=%7u^p5-7SB#+X zG)%8}LSm)fvnN?St#nEZ>L{M>iUC7c5Dp%`>=JENc@XfWD3iOmLGA22|O*r!1X6r75IXm1+e!RShacHWp7ZvFhahdmJw z!#=1wwTF_DSOcWV7cX7_yX|2ihckfgAw_g^8#>~bR=npRd|(5e5)^cSxO&!(;NBGW z4iRf@+P%Le;BJnh9zeq{BLQpGdMi2*|FbIb-%;w;>N5)qOV!7ZMK1H#1}Y$RCN|fg z7;sl(*TSgdD-s(Qhu+kE)vHS9nP_3SA%XxK+mF>WiyxN?3TkDt5ugv<8Ek>(0o#hF z!^6Y3Z~yTpS3Pwq6KdYSa@FZ+KOdjt9VgvamQcDrs9ZIB&h`H+4gPbOTD&ipQLPI= zb;2s7KevIk(rjR0kXKL;RJ$JO@ndy$KytM`3I$q;96+d#SDRpk`u)NAg#{Q%@WDrq z9zjWIuxs7^&tx-yTcusw3DDdLwGmz|rnX7Qgh)!}9r;-@gUAf2$4cXUkyNoA(DoO} z>_a;rZ9$?tAKFB)9)caiaRh0IoM9xFhiJN)WMF9Maqk`#6&0-}Xc0t2F`sl|piuEXCu=)HW3SjlO6rMi?Xw4i zH2+vvH-@qTcTUAqlr!}0&;G`oAf@0DAD?jt5Q@s?$=O-FLf%FG#eY9!5|`v+c)QnPLQ_R;p7l#GlFTO#GmJm4^0Cl$mNhHMCV(~lKN3&uBC zBDBSRlS)DtL?(Vf&kL`hervh`K_!5C;9jxD+ft(ehMq!0Gg8zS?ipXzX0w!{>?`Ho zFV1=9=jPIApsnGRnVE^yZw_H~?pJriM(m9*?D%M)WDHQy6S&Z(MmsbWo`4_cArMFs z)|JMqz|bP5ASfufCYq$0-Bn1On{Lsi61y?@D(+u?R$Ty|1RVjwbOihsYaYsBI*_Db z@#uN9`g9Z(C(uqh%_qn)6c-nVK1BiQSYV39hsTFi<9Cvfyoc0)t~2_-@h|1j8}DIY zL?2Fyg^kT^C@BYS6#AVz>tTJ9bXu63L*;Xys+S0yQb=sZx@VjX0m1Wtc@f$UOUe8X zP%Tsn^RlSBVEZOD!JL4~KY}^+2@YK4oX|XozA!CYJ{oDgVPWCn!mwX8_yJQ|v?PaVVVl4Cj3$BbLjS=c9V>G$KR?zJCn$fTa6m<%Dd4!P z<~G*Wj>Bn{=ZVH>c5iR*9@ur{u zuz_`UtV;xr7A>*=UjqLhXeO_zc$f{;;`{gSH~66`=LC$><4sHmrXtmLK#`ch(@s7ShGe1zbNqn;& z#D|iK>Y~~$QaI}C2W%TuB2P;17$((It^k^bPkF!gMn>a-h8RMne2EKCSS+FMG^l*L zg)Giv(r{>i<(DW7157;T!M0S6kw{VqMM*V10bqq;$BgTc2;pQUE(qQyfP99pqqyn) zE$P=al2r3IKn=on{Yy@2YS<`vz?Q#*aC*Xsjh&57pC5w&&%S-4`NW$!SB5K)z5nn5 za_bN*Vjwn-(B|I1e-AD)+F7KT&xW4<>(?jRwX!1u0}bvdn4f-Van;C(>&(oFqeszt z8{swtw6mz_P1!iY7$=WF zBWWhdu}?^N{(SEmc&N&x*8s{pu9XlU&&p-lg8c`9ozh)9{Bnyzfz_cp~Zm?Y+FzJ z#-V9AkWO$dfB}IjR~K5*`Sn7#$2kY5etuvrWIoW^nNQ(>rEDiopxxnWT!+RsBT4?&lV9bX(PDRCUXGEjlv!s-c;U&J;Hu0*meTWqWy=W?o$qv6#3rG_f|xtq`{AxP3x0smO-%!Y>^9#i$Pt3)m*Nc)$iW}V&tI*e9rk9-x(^)l8}%P z6gu|F;(_S}3=ZVoGg&^m9>&g0^VW$MLhf*{!P2XAgqf8!2`+v}4(`TvTXV9|8-n#L zFz-!XsYTM+SSvFG+8iv5=v^?iHBN0|>1zCCoHnsr*-bO?;eZk?1A{9p54g|4g9j02 zPZI4}zJ5kaMP)_*=;6cV)ztvv8Wh@b1MO{)=Lp;mVCgyYx@ynMmLbA=SYmZ#C8-eX z64-6~UOsE&oT@q@KQFJekAAAdcN4^mG|UKdENqS;&!1}@`MwRDAH@zL=4LXo<0Z=0 z*1w?P!{2{g_Xhrq=7o>9H_!s3#zk0_;G_x($Bu4oZLP0Qv(;BseF}Ja%zYmh7ZQ2OM?U zee?p(sI-30)JT$yVVNvOdeco(4VrgXCmvK&BaI^|O2umGF1Mw-SjbyMgqEio;V(iG z37o=9K|@VGO(BFsGb*$^^%JZ5+gK^ub{gE#yo>n%B2r76lmIIY{fy}o6W+b*ygmJp z?nM2>Xp&gUOb)=}YS0Fu4a|ZO{g4-b@(p7Z!ffvyg{=~4t1m4rt)W2(HYQbCgF>Jq zHAkF+8tpJck%V>WWi`PHHvK-3R<@Bie(_&0%&(6-G*FP>F}ri;+~v!W$U`bYw`psf z6R}H?aJ03w{#d_WTU$FxOW#km++sf`=QscddbBGmE1!?0#v-l3zx|=M79BmDq*{@x zHZ(AZdHE7Oak%i0!irXTMDxy#-OB3fG&qD15z!T|5Dk$}Bd_9FGCnpp{sZ)$FlXC5 zN-%e@PulP_wq*#Wg;Ch~96gcP;m5ul6LWdfWal7!VM62Yc2|&BwzoS2{h-JkIoxtW zrEAac0|Y6|RdA^#sT%r$Djm_UaRu*T6Hg1G< z*BSj&Fgzv7o)_*iA2qica{NdFm-D9*8=st{hcfl}uvDyE1dhn87gInnHZChQ^G>iL zLz~dS+IpX_#s_o~8TRglK{-}BWEW0()Ns`?d!M}g<|fqgD(WSe{ZV4z&+#Ou&qlXv ztayu2CkQaWrdN%?cmR$#mF7rIO^wDf3Q=q7%(DZB4-+vqX`>J^Rglka>Fthr0LgQ->8f?%c4l!#OTk<|G|*Z%oFf zq@*C1pk`PoI?5VJza)Hl_P%fn&V^~<%pGD&Dq?Hb+L<&o|I8H~$tQ634D}7QV|uis{he41 zCYKD88z$_kq3{Hv^;65?mXwGnX1rYvF|QlDOv^r~2+FslC-9vC;*wpXL=8jJpHF1; zCRpEwfG3Y!0Ak-op&^;r3|zVR;b_D*GO~<|A>2VXcH;ol!9YnWIGgjwQO&)he)YWl z4keth-U5z=uJn}^nk0$Ct_Os780i~2_7h8U9Bf2j!_8-as6H{Lx(ZVlx_0RMJxxx7 zLu&&J@vxZ^jwp85svqn(g4P!7tHbY$i0?*=uSX)Se5b#=1pqetk+Zu7KoUZ z(mf92C6Y~CoRPS=$J*egRhdp-JH*2?lh+r{rIkf4#p!$-Riw*x7JAzdz@>Ug&9mcN zTsTn$jU><{1&2POm?@q`V-=abckS50;ksZ8r~%#sIIV6|ip}HH z1kUHA8P`Vvl5px*WLkA~!cK|}jc!bqTeIWljJT})Z^F@go`!~Mu9Wz6hsvX5uMKTN zweRQ8Li8!HuUD7)L|C;i%NWgUV7-+7v+0!*(ap!{NN%#%1He<{jS8_HpI~Iw?pE{= zd5XPmVq$`TBwuqptiWk4GWTsg7HGE1z3WI;%jRC0huwwIfM#|hZA3$M|9;@fZuiw$ zcfxGG{CM2jP|nQm3{4gXf;&uBtynv*F|f5&X*%YzM?y)nQ_%{J#-JK$Wt)c#IIwtl z)r3Yuo0CB=26_<0*34_SxWfQ=^!N#=%Xmt{gMAkQ->CLEr&}ux$7Rv#r>tm#A!E@9 z_n#;)+@eTnfHX*0Q?6apD0aC4AP$rZSLG749-Os#O6qc-%UL6lYr(H@ScIQ7|2B(!wgKkbLGppmfHhV5uCloz2TA1kR1+auToP?8pgjNXZ>+-2} z{bXzw-F{yU^?)NXkZ`Joxk{X8Em5J+mt`%WtdTFzAr9bxC9b5bF0j|yW$fZQVvKhN z&UV8gf?d0Ixh=2KCX?}G9y)aBOTv;wM0Z;{o)=`o`;`RMN}P&KB~F&%$Gk-h?E>J7 zW>P0zW#JY=(ikRpg&eev6(9^pC$NS|CCfAIfU%cKtd%SN3`j%1vR*K}7<%%fV>#HF z=~8dEsoY2;rX1Z0c&uUi@Q5?f^rGE;H8T6PEvi9&$Eq2%wtNCK9SvDYjHD{{$(hR z2hN5RTz7}(+B-^c_UrYErvT;+YWl&slnJ$kTTW^*O`=;^{Hv4<%)@1a?58wMLuq;R zy!xK#^WB&N@gxpq>xHG>$0-febE1=3Owba|EDei+ErbhopokB{h7xfp%T#5coj7Sk z9DHnP;pOA|;*s)gr%~qyz-AoMMN|aps9e10)$L|l(f6XvuuA%&SEGjCMUg)ScTTu#G!)d?IxqpNL1^8^CaX>89hemi)9f%mpCpiYe- zW%c*d?B1=fHHg!)N|c0q4|f9E1rgwMxj5G!?f+A!D*A)(mbL8WSv zIWv1tAi}GQo=80JelI#-c}q2SqmZpeBA9-Uc9B!_FQJByA3s{}yaL(>ut1?t`eVQY zlqr^dqZFt9ZH$9y$}Slx>>7Jd{ngGr%A53>oS^@Z=cEA40ATSf>BFX8vE8GQ1xXF$ z$AITlvi3iN{#S~zb0=(F`FeQ}uMn7nm-4CU$j+aG;DklVCxyOY*gQZwt_ZxuH0 z*WO@bqp(Bh`@ZbFpD(uup4xC_d7T8qc_pcLXU6uO|Joko<5+iY)D{5Dr(YeIejILkVef_#LE3sk4_KsU#Qc2d!px$*PJIW(ol91fpiN?)8`t70^ z1&O>bDhdA0fV#T6#l=N*j^|xnEi6V*DyOHXVZ+;Hhb06%A@T z6O&^h(vULtGBF{!Lr0US+bGW`E57akBy_`*Avm>ubeC6seLZ5J--~2xmCO#&mykE% z(>uJ&OPR%Pexs;@&B?7hjz!eLRwnR93P}OBffu diff --git a/samples/simple_itpp.stp b/samples/simple_itpp.stp index fdd84ba..9cd98b8 100644 --- a/samples/simple_itpp.stp +++ b/samples/simple_itpp.stp @@ -1,5 +1,5 @@ let z = sample(bernoulli(0.5)) in -let mu = if z = 0 then ~-.1.0 else 1.0 in +let mu = if !z then ~-.1.0 else 1.0 in let d = normal(mu, 1.0) in let y = 0.5 in observe(d, y); diff --git a/samples/student.png b/samples/student.png index 318b5ac19f09b8109b5ab7085589e09c4fef1918..8a96d94220611a709cdebca8d0eb9be7f3eb7438 100644 GIT binary patch literal 17009 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 D4|th( literal 17026 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