Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_C1353562110='Pz48P2VpZQoKendCOTkgOG9nYVZ3bzhfZ293UiB7CgovLyoqKioqKioq..

Decoded Output download

$_C1353562110=base64_decode($_C1353562110);$_C1353562110=strtr($_C1353562110,'yAXWO3MtKec8CYNSj0Bi659pFlg2UvQaLJoGqH7rIVZDPbz41mkREwsfTnhxdu','QAdCBX9GJpnwTu5Ri8ahvMs2NSr0DzPk7FoEg41ImftqY6cWxZ3ejlULyHVbOK');$_R=str_replace('__FILE__',"'".$_F."'",$_C1353562110);eval($_R);$_R=0;$_C1353562110=0;?><?php

class workflow_role {

//********* VARIABLES ***********
    var $db;
    var $role_master;
    var $project_id;
    var $status;
    var $created_by;
    var $current_date;
    var $current_date_time;
    var $obj_query;
    var $return;
    var $line;
    var $sth;
    var $primary_usergroup;
    var $secondary_usergroup;

//********* CONSTRUCTOR FUNTIONS  ************

    function __construct($db) {
        $this->db = $db;
        // $this->id = '';
    }

//**************** SET FUNTIONS  *********************

    function setRoleMaster($value) {
        if ($value == '')
            $this->role_master = '';
        else
            $this->role_master = $value;
        return true;
    }

    function setDescription($value) {
        if ($value == '')
            $this->description = '';
        else
            $this->description = $value;
        return true;
    }

    function setId($value) {
        if ($value == '')
            $this->id = '';
        else
            $this->id = $value;
        return true;
    }

    function setRoleMasterId($value) {
        if ($value == '')
            $this->role_master_id = '';
        else
            $this->role_master_id = $value;
        return true;
    }

    function setUserId($value) {
        if ($value == '')
            $this->user_id = '';
        else
            $this->user_id = $value;
        return true;
    }

    function setUserRole($value) {
        if ($value == '')
            $this->user_role = '';
        else
            $this->user_role = $value;
        return true;
    }

    function setProjectId($value) {
        if ($value == '')
            $this->project_id = '';
        else
            $this->project_id = $value;
        return true;
    }

    function setStatus($value) {
        if ($value == '')
            $this->status = '';
        else
            $this->status = $value;
        return true;
    }

    function setRoleType($value) {
        if ($value == '')
            $this->role_type = '';
        else
            $this->role_type = $value;
        return true;
    }

    function setUserGroupId($value) {
        if ($value == '')
            $this->user_group_id = '';
        else
            $this->user_group_id = $value;
        return true;
    }

    function setCreatedBy($value) {
        if ($value == '')
            $this->created_by = '';
        else
            $this->created_by = $value;
        return true;
    }

    function setLogDatetime($value) {
        if ($value == '')
            $this->log_datetime = '';
        else
            $this->log_datetime = $value;
        return true;
    }

    function setCurrentDate() {
        $this->current_date = date("Y" . "-" . "m" . "-" . "d");
        return true;
    }

    function setCurrentDateTime() {
        $this->current_date_time = date("Y-m-d H:i:s A"); //'YYYY-MM-DD HH:MM:SS'
        return true;
    }

    function setPrimaryUserGroupId($value) {
        if ($value == '')
            $this->primary_usergroup = '';
        else
            $this->primary_usergroup = $value;
        return true;
    }

    function setSecondaryUserGroupId($value) {
        if ($value == '')
            $this->secondary_usergroup = '';
        else
            $this->secondary_usergroup = $value;
        return true;
    }

    function setUserType($value) {
        if ($value == '')
            $this->user_type = '';
        else
            $this->user_type = $value;
        return true;
    }

    function setDepartmentId($value) {
        if ($value == '')
            $this->department_id = '';
        else
            $this->department_id = $value;
        return true;
    }



//*********** Functions *****************************



    function add_role_master($role_type) {
        $this->sth = $this->db->prepare("insert into workflow_roles(                                    
                                project_id,                             
                                role_master,
                                user_type,                                                              
                                                                description,
                                status,
                                                                created_by,
                                log_datetime) values (:PROJECTID,:ROLEMASTER,:USERTYPE, :DESCRIPTION,:STATUS,:CREATEDBY, :LOGDATETIME)");


        $this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
        $this->sth->bindValue(':ROLEMASTER', $this->role_master, PDO::PARAM_STR);
        $this->sth->bindValue(':USERTYPE', $role_type, PDO::PARAM_STR);
        $this->sth->bindValue(':DESCRIPTION', $this->description, PDO::PARAM_STR);
        $this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
        $this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
        $this->sth->bindValue(':LOGDATETIME', $this->log_datetime, PDO::PARAM_STR);

        $this->sth->execute();
		//print_r($this->sth->debugDumpParams());
        return $this->db->lastInsertId();
    }

    function Check_Availability() {
        if (empty($this->id)) {
            $this->sth = $this->db->prepare("SELECT id FROM workflow_roles WHERE role_master = :ROLEMASTER AND project_id =$this->project_id", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            $this->sth->execute(array(':ROLEMASTER' => $this->role_master));
        } else {
            $this->sth = $this->db->prepare("SELECT id FROM workflow_roles WHERE role_master = :ROLEMASTER AND id <> :ID AND project_id =$this->project_id", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            $this->sth->execute(array(':ROLEMASTER' => $this->role_master, ':ID' => $this->id));
        }

        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function get_RoleMaster_All() {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_roles WHERE project_id = :PROJECTID ORDER BY id DESC");
        $this->sth->execute(array(':PROJECTID' => $this->project_id));
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function get_RoleMaster_ID($value) {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_roles WHERE id = :ID ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $this->sth->execute(array(':ID' => $value));
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }
    
     function get_RoleMaster_ID_BY_bvid($value) {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_builder_values WHERE id = :ID ",array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $this->sth->execute(array(':ID' => $value));
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }
    function get_Roletype_BY_role_master($value){
        $this->sth = $this->db->prepare("SELECT * FROM workflow_role_usergroup WHERE role_master_id = :ID ",array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $this->sth->execute(array(':ID' => $value));
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }
    
    function edit_role_master($value) {

        $this->sth = $this->db->prepare("update workflow_roles set                              
                                role_master = :ROLEMASTER,
								user_type = :ROLETYPE,
                                                                description = :DESCRIPTION,
                                status = :STATUS where id = :ID");

        $this->sth->bindValue(':ROLEMASTER', $this->role_master, PDO::PARAM_STR);
		$this->sth->bindValue(':ROLETYPE', $this->role_type, PDO::PARAM_STR);
        $this->sth->bindValue(':DESCRIPTION', $this->description, PDO::PARAM_STR);
        $this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
        $this->sth->bindValue(':ID', $value, PDO::PARAM_STR);

        return $this->sth->execute();
    }

    function delete_role_master($value) {
        $this->sth = $this->db->prepare("delete from workflow_roles where id= :ID");
        $this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
        return $this->sth->execute();
    }

    function get_RoleMaster_Status() {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_roles WHERE project_id = :PROJECTID AND status = :STATUS ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $this->sth->execute(array(':PROJECTID' => $this->project_id, ':STATUS' => $this->status));

        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getRoleMaster_Unassigned($gid, $pid, $role_master_id) {
$query ="SELECT u.id, u.fname, u.mname, u.lname FROM user AS u
                                  LEFT OUTER JOIN login_mast AS l ON u.id = l.user_id
                                  LEFT OUTER JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0)
                                  WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND g.id = $gid                         
                                  AND u.id NOT IN (SELECT user_id FROM workflow_role_users WHERE w_role_id = $role_master_id AND project_id = $pid)
                                  GROUP BY l.user_id ORDER BY u.fname ASC";
								  
								 
								  
        $this->sth = $this->db->prepare($query);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function geRoleMaster_Assigned($pid, $role_master_id) {
$query="SELECT u.id, u.fname, u.mname, u.lname FROM workflow_role_users AS w
	  LEFT OUTER JOIN user AS u ON u.id = w.user_id
	  LEFT OUTER JOIN login_mast AS l ON u.id = l.user_id
	  LEFT OUTER JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0)
	  WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND w.w_role_id = $role_master_id AND w.project_id = $pid
	  GROUP BY l.user_id ORDER BY u.fname ASC";
	 
								   
        $this->sth = $this->db->prepare($query);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

   

    function Verify_Assign_RoleMaster() {
//echo "SELECT id FROM `workflow_role_users` WHERE user_id = $this->user_id  AND w_role_id = $this->role_master_id";die();
        $this->sth = $this->db->prepare("SELECT id FROM `workflow_role_users` WHERE user_id = :USERID AND w_role_id = :ROLEMASTERID");
        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':USERID', $this->user_id, PDO::PARAM_STR);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function add_Assign_Mem_RoleMaster($dept_id) {
		
		 
        $this->sth = $this->db->prepare("insert into workflow_role_users(project_id, w_role_id, user_id,department_id, is_assigne_by) values($this->project_id, $this->role_master_id, $this->user_id, $dept_id,  $this->created_by)");
        $this->sth->execute();
        return $this->db->lastInsertId();  
    }

    function delete_role_user() {
        $this->sth = $this->db->prepare("delete from workflow_role_users where user_id= :USERID AND w_role_id = :ROLEMASTERID AND project_id = :PROJECTID");
        $this->sth->bindValue(":USERID", $this->user_id, PDO::PARAM_STR);
        $this->sth->bindValue(":ROLEMASTERID", $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(":PROJECTID", $this->project_id, PDO::PARAM_STR);
        return $this->sth->execute();
    }

    function update_role_user_status() {

        $this->sth = $this->db->prepare("update workflow_role_users set status = :STATUS where project_id = :PID AND user_id = :USERID AND role_master_id = :ROLEMASTERID");

        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);
        $this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
        $this->sth->bindValue(':USERID', $this->user_id, PDO::PARAM_STR);

        return $this->sth->execute();
    }

    function clear_role_user_status() {

        $this->sth = $this->db->prepare("update workflow_role_users set status = :STATUS where project_id = :PID AND role_master_id = :ROLEMASTERID");

        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);
        $this->sth->bindValue(':STATUS', $this->status, PDO::PARAM_STR);
        //$this->sth->bindValue(':USERID', $this->user_id, PDO::PARAM_STR);

        return $this->sth->execute();
    }

    function get_RoleUser_byStatus($value) {

        $this->sth = $this->db->prepare("SELECT * FROM `workflow_role_users` WHERE project_id = :PID AND role_master_id = :ROLEMASTERID AND status = :STATUS");
        //echo "SELECT id FROM `workflow_role_users` WHERE project_id = '$this->project_id' AND role_master_id = '$this->role_master_id' AND status = '$value'";
        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);
        $this->sth->bindValue(':STATUS', $value, PDO::PARAM_STR);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

//*********************************************    
//      WORKFLOW ROLE USER GROUP
//*********************************************

    function get_Assigned_Usergroup() {

        $this->sth = $this->db->prepare("SELECT * FROM `workflow_role_usergroup` WHERE role_master_id = :ROLEMASTERID");

        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }
    
 
    function Verify_Assign_Usergroup() {

        $this->sth = $this->db->prepare("SELECT id,role_type FROM `workflow_role_usergroup` WHERE user_group_id = :USERGROUPID AND project_id = :PID AND role_type = :ROLETYPE AND role_master_id = :ROLEMASTERID");

        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':USERGROUPID', $this->user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(":ROLETYPE", $this->role_type, PDO::PARAM_STR);
        $this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function add_Assign_Usergroup_RoleMaster() {

        $this->sth = $this->db->prepare("insert into workflow_role_usergroup(project_id, role_master_id, role_type, user_group_id, created_by, log_datetime) values(:PROJECTID, :ROLEMASTERID, :ROLETYPE, :USERGROUPID, :CREATEDBY, :LOGDATETIME)");


        $this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':ROLETYPE', $this->role_type, PDO::PARAM_STR);
        $this->sth->bindValue(':USERGROUPID', $this->user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(':CREATEDBY', $this->created_by, PDO::PARAM_STR);
        $this->sth->bindValue(':LOGDATETIME', $this->log_datetime, PDO::PARAM_STR);

        $this->sth->execute();
        return $this->db->lastInsertId();
    }

    function delete_role_usergroup() {
        $this->sth = $this->db->prepare("delete from workflow_role_usergroup where role_type = :ROLETYPE AND role_master_id = :ROLEMASTERID AND project_id = :PROJECTID");

        $this->sth->bindValue(":ROLEMASTERID", $this->role_master_id, PDO::PARAM_STR);
        //$this->sth->bindValue(':USERGROUPID', $this->user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(":ROLETYPE", $this->role_type, PDO::PARAM_STR);
        $this->sth->bindValue(":PROJECTID", $this->project_id, PDO::PARAM_STR);
        return $this->sth->execute();
    }

    function update_assign_role_usergroup() {

//        echo "update workflow_role_usergroup set user_group_id = $this->user_group_id where project_id = $this->project_id  AND role_master_id = $this->role_master_id AND role_type = $this->role_type";die;
        $this->sth = $this->db->prepare("update workflow_role_usergroup set user_group_id = :USERGROUPID where project_id = :PID  AND role_master_id = :ROLEMASTERID AND role_type = :ROLETYPE");


        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':ROLETYPE', $this->role_type, PDO::PARAM_STR);
        $this->sth->bindValue(':USERGROUPID', $this->user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);


        return $this->sth->execute();
    }

    function get_Assigned_Usergroup_RoleType($value) {

        $this->sth = $this->db->prepare("SELECT * FROM `workflow_role_usergroup` WHERE role_master_id = :ROLEMASTERID AND role_type = $value ");

        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function get_RoleMaster_AllActive() {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_roles WHERE project_id = :PROJECTID AND status = 1 ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $this->sth->execute(array(':PROJECTID' => $this->project_id));
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getWorkflowAssignedToRole($user_group_id, $project_id) {
        $this->sth = $this->db->prepare("SELECT wbv.id,wbv.builder_id,wbv.step_name,wb.workflow_title,wis.im_id,GROUP_CONCAT(wbds.doc_set_value_id) as doc_set_values,wbv.target_days 
                FROM workflow_builder_values wbv
                LEFT JOIN workflow_rules wr ON wr.id = wbv.rule_id
                LEFT JOIN workflow_formulas wf on wf.rule_id = wbv.rule_id 
                JOIN workflow_role_usergroup wru on (wru.role_master_id = wbv.role_master_id AND wbv.role_master_id <> -1) OR (wru.role_master_id = wf.role_master_id)
                JOIN workflow_builder wb on wbv.builder_id = wb.id
                LEFT JOIN workflow_im_settings wis on wis.wf_id = wbv.builder_id and wis.im_id and wis.im_id != 0
                LEFT JOIN workflow_builder_doc_set wbds ON wbv.id = wbds.builder_value_id
                Where wru.user_group_id =:ROLE and wbv.project_id =:PROJECTID AND wb.status = '1'
                GROUP BY wbv.id;");
        $this->sth->bindValue(":ROLE", $user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(":PROJECTID", $project_id, PDO::PARAM_STR);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getWorkflowStepPendingToRole($user_id, $user_group_id, $project_id, $im_id, $builder_id, $step_id) {

        //echo $user_id.', '.$user_group_id.', '.$project_id.', '.$im_id.', '.$builder_id;

        $this->sth = $this->db->prepare("SELECT (SELECT COUNT(wd.id) FROM workflow_im AS wd
        LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
        LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) <= 1 and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' AND wd.a_builder_value_id = '$step_id' and wd.a_status NOT IN(1,4,5)) as '<=1',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '2' AND '5' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' AND wd.a_builder_value_id = '$step_id' and wd.a_status NOT IN(1,4,5)) as '2-5',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '6' AND '20' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' AND wd.a_builder_value_id = '$step_id' and wd.a_status NOT IN(1,4,5)) as '6-20',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '20' AND '45' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id'AND wd.a_builder_value_id = '$step_id' and wd.a_status NOT IN(1,4,5)) as '20-45',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) >45 and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' AND wd.a_builder_value_id = '$step_id' and wd.a_status NOT IN(1,4,5)) as '>45'
            ");
        

        //now try
        //$this->sth->bindValue(":USERID", $user_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":ROLE", $user_group_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":PROJECTID", $project_id, PDO::PARAM_STR);
        // $this->sth->bindValue(":INDEXMASTERID", $im_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":BUILDERID", $builder_id, PDO::PARAM_STR);
        $this->sth->execute();
        //print_r($this->sth->errorInfo()); die();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getWorkflowPendingToRole($user_id, $user_group_id, $project_id, $im_id, $builder_id) {

        //echo $user_id.', '.$user_group_id.', '.$project_id.', '.$im_id.', '.$builder_id;

        $this->sth = $this->db->prepare("SELECT (SELECT COUNT(wd.id) FROM workflow_im AS wd
        LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
        LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) <= 1 and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '<=1',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '2' AND '5' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '2-5',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '6' AND '20' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '6-20',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '20' AND '45' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '20-45',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) >45 and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_user_group = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '>45'
            ");




        //now try
        //$this->sth->bindValue(":USERID", $user_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":ROLE", $user_group_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":PROJECTID", $project_id, PDO::PARAM_STR);
        // $this->sth->bindValue(":INDEXMASTERID", $im_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":BUILDERID", $builder_id, PDO::PARAM_STR);
        $this->sth->execute();
        //print_r($this->sth->errorInfo()); die();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getWorkflowAssignedBuilderBydocset($doc_set, $step) {
        //echo "SELECT * FROM workflow_builder_doc_set wbds where wbds.builder_value_id = $step and doc_set_value_id = $doc_set";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_builder_doc_set wbds where wbds.builder_value_id = $step and doc_set_value_id = $doc_set");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getWorkflowOverdue_Due_Notdue($user_group_id, $project_id, $im_id, $target_days, $builder_id) {

        $this->sth = $this->db->prepare("SELECT (
        SELECT count(id) FROM workflow_im
        WHERE project_id = :PROJECTID and im_id = :INDEXMASTERID and a_user_group = :ROLE and a_status NOT IN(1,4,5) and builder_id = :BUILDERID and  DATE(DATE_ADD(updated_at,INTERVAL :TARGET_DAYS DAY)) < DATE(curdate()))  as 'overdue',
        (SELECT count(id) FROM workflow_im
        WHERE project_id = :PROJECTID and im_id = :INDEXMASTERID and a_user_group = :ROLE and a_status NOT IN(1,4,5) and builder_id = :BUILDERID and  DATE(DATE_ADD(updated_at,INTERVAL :TARGET_DAYS DAY)) = DATE(curdate())) as 'due',
        (SELECT count(id) FROM workflow_im
        WHERE project_id = :PROJECTID and im_id = :INDEXMASTERID and a_user_group = :ROLE and a_status NOT IN(1,4,5) and builder_id = :BUILDERID and  DATE(DATE_ADD(updated_at,INTERVAL :TARGET_DAYS DAY)) > DATE(curdate())) as 'notdue'");
        $this->sth->bindValue(":ROLE", $user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(":PROJECTID", $project_id, PDO::PARAM_STR);
        $this->sth->bindValue(":INDEXMASTERID", $im_id, PDO::PARAM_STR);
        $this->sth->bindValue(":TARGET_DAYS", $target_days, PDO::PARAM_STR);
        $this->sth->bindValue(":BUILDERID", $builder_id, PDO::PARAM_STR);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function update_assign_role_usergroup_1($role_t) {

//        echo "update workflow_role_usergroup set user_group_id = $this->user_group_id where project_id = $this->project_id  AND role_master_id = $this->role_master_id AND role_type = $this->role_type";die;
        $this->sth = $this->db->prepare("update workflow_role_usergroup set user_group_id = :USERGROUPID, role_type = :ROLETYPE where project_id = :PID  AND role_master_id = :ROLEMASTERID AND role_type = '$role_t'");


        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':ROLETYPE', $this->role_type, PDO::PARAM_STR);
        $this->sth->bindValue(':USERGROUPID', $this->user_group_id, PDO::PARAM_STR);
        $this->sth->bindValue(':PID', $this->project_id, PDO::PARAM_STR);


        return $this->sth->execute();
    }


    function getWorkflowAssignedBuilderDetails($role_id) {
        //echo "SELECT * FROM workflow_role_usergroup  where user_group_id = $role_id";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_role_usergroup  where user_group_id = $role_id ");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }


    function get_RoleMaster_StatusType($user_type) {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_roles WHERE project_id = :PROJECTID AND status = :STATUS  and user_type = $user_type ORDER BY id DESC", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $this->sth->execute(array(':PROJECTID' => $this->project_id, ':STATUS' => $this->status));

        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    
   
    function getWorkflowPendingToRoleByUserDep($user_id, $user_group_id, $project_id, $im_id, $builder_id) {

        //echo $user_id.', '.$user_group_id.', '.$project_id.', '.$im_id.', '.$builder_id;

        $this->sth = $this->db->prepare("SELECT (SELECT COUNT(wd.id) FROM workflow_im AS wd
        LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
        LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) <= 1 and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_department_id = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '<=1',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '2' AND '5' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_department_id = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '2-5',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '6' AND '20' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_department_id = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '6-20',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) BETWEEN '20' AND '45' and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_department_id = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '20-45',
            (SELECT COUNT(wd.id) FROM workflow_im AS wd
            LEFT OUTER JOIN workflow_builder AS wb ON (wd.builder_id = wb.id)
            LEFT OUTER JOIN workflow_im_aroles AS wr ON (wr.user_id = '$user_id' AND wd.a_builder_value_id = wr.builder_value_id AND wd.builder_id = wr.builder_id  AND wd.im_id = wr.im_id AND wd.record_set_id = wr.record_set_id) 
            WHERE wb.status='1' AND DATEDIFF(wd.a_target_date, NOW()) >45 and wd.project_id = '$project_id' and wd.im_id = '$im_id' and (wd.a_department_id = '$user_group_id' OR IF(wr.user_id IS NULL, 0, 1) > 0) and wd.builder_id = '$builder_id' and wd.a_status NOT IN(1,4,5)) as '>45'
            ");




        //now try
        //$this->sth->bindValue(":USERID", $user_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":ROLE", $user_group_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":PROJECTID", $project_id, PDO::PARAM_STR);
        // $this->sth->bindValue(":INDEXMASTERID", $im_id, PDO::PARAM_STR);
        //  $this->sth->bindValue(":BUILDERID", $builder_id, PDO::PARAM_STR);
        $this->sth->execute();
        //print_r($this->sth->errorInfo()); die();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    
   
    function get_workflow_imFileds_Lusers($pid, $bid, $bvid, $im_id, $im_rid,$user_id) {

        $this->sth = $this->db->prepare("SELECT * FROM workflow_im_lusers WHERE project_id=:PID AND builder_id = :BID AND builder_value_id = :BVID AND im_id = :IMID AND record_set_id = :IMRID and user_id = :USERID and status = 20 ORDER BY id ASC");

        $this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
        $this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
        $this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
        $this->sth->bindValue(':IMID', $im_id, PDO::PARAM_STR);
        $this->sth->bindValue(':IMRID', $im_rid, PDO::PARAM_STR);
        $this->sth->bindValue(':USERID', $user_id, PDO::PARAM_STR);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function get_workflow_step_access_Lusers($pid, $bid, $bvid, $im_id, $im_rid,$user_id) {

        //echo "SELECT * FROM workflow_status_im WHERE project_id= $pid AND builder_id = $bid AND builder_value_id = $bvid AND record_set_id = $im_rid and created_by = $user_id and status in(21,22) ORDER BY id ASC";

        $this->sth = $this->db->prepare("SELECT * FROM workflow_status_im WHERE project_id=:PID AND builder_id = :BID AND builder_value_id = :BVID AND record_set_id = :IMRID and created_by = :USERID and status in(21,22) ORDER BY id ASC");

        $this->sth->bindValue(':PID', $pid, PDO::PARAM_STR);
        $this->sth->bindValue(':BID', $bid, PDO::PARAM_STR);
        $this->sth->bindValue(':BVID', $bvid, PDO::PARAM_STR);
       // $this->sth->bindValue(':IMID', $im_id, PDO::PARAM_STR);
        $this->sth->bindValue(':IMRID', $im_rid, PDO::PARAM_STR);
        $this->sth->bindValue(':USERID', $user_id, PDO::PARAM_STR);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }
    
    //  Start the user base Wf query




    function getUserInfo($value){
        $this->sth = $this->db->prepare("SELECT u.fname,u.lname,wr.w_role_id,w.role_master FROM workflow_roles w INNER JOIN
        workflow_role_users wr ON w.id=wr.w_role_id INNER JOIN user u ON u.id =wr.user_id WHERE w.id=".$value); 
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function geRoleMaster_Assigned_RoleId($role_master_id) {
		$query ="SELECT u.id, u.fname, u.mname, u.lname, w.user_role FROM workflow_role_users AS w
        LEFT OUTER JOIN user AS u ON u.id = w.user_id
        LEFT OUTER JOIN login_mast AS l ON u.id = l.user_id
        LEFT OUTER JOIN user_group AS g ON (FIND_IN_SET(g.id, l.role) > 0 OR FIND_IN_SET(g.id, l.alt_role) > 0)
        WHERE l.role != '2' AND l.role != '1' AND l.user_status = '1' AND w.w_role_id = $role_master_id
        GROUP BY l.user_id ORDER BY u.fname ASC";
	 
        $this->sth = $this->db->prepare($query);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function add_Assign_User_Role() {

        $this->sth = $this->db->prepare("insert into workflow_role_users (project_id, w_role_id, user_id, department_id) values(:PROJECTID, :ROLEMASTERID, :USERID, :DEPARTMENT)");


        $this->sth->bindValue(':PROJECTID', $this->project_id, PDO::PARAM_STR);
        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':USERID', $this->user_id, PDO::PARAM_STR);
        $this->sth->bindValue(':DEPARTMENT', $this->department_id, PDO::PARAM_STR);
        
        $this->sth->execute();
        return $this->db->lastInsertId();
    }

    function getWorkflowAssignedUserDetails($role_id) {
        //echo "SELECT * FROM workflow_role_usergroup  where user_group_id = $role_id";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_role_users  where w_role_id = $role_id ");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }

    function delete_Assign_User_Role($value) {
        $this->sth = $this->db->prepare("delete from workflow_role_users where w_role_id= :ID");
        $this->sth->bindValue(":ID", $value, PDO::PARAM_STR);
        return $this->sth->execute();
    }

   function getWorkflowAUserAssignedBuilderDetails_old($role_id,$user_id,$department_id) {
        //echo "SELECT * FROM workflow_role_usergroup  where user_group_id = $role_id";
        // echo "SELECT * FROM workflow_role_users  where w_role_id = $role_id and user_id = $user_id and department_id = $department_id ";
                //echo"<br>";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_role_users  where w_role_id = $role_id and user_id = $user_id and department_id = $department_id");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }
    function getWorkflowUserDepartment($role_id,$user_id,$department_id) {
        //echo "SELECT * FROM workflow_role_usergroup  where user_group_id = $role_id";
        //echo "SELECT * FROM workflow_role_users  where w_role_id = $role_id and department_id = $department_id ";
        ;
        $this->sth = $this->db->prepare("SELECT * FROM workflow_role_users  where w_role_id = $role_id  and department_id = $department_id ");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }

    function getWorkflowAssignedToRoleByUser($user_id, $project_id) {
       // echo "SELECT wbv.id,wbv.builder_id,wbv.step_name,wb.workflow_title,wis.im_id,GROUP_CONCAT(wbds.doc_set_value_id) as doc_set_values,wbv.target_days 
       //          FROM workflow_builder_values wbv
       //          LEFT JOIN workflow_rules wr ON wr.id = wbv.rule_id
       //          LEFT JOIN workflow_formulas wf on wf.rule_id = wbv.rule_id 
       //          JOIN workflow_role_users wru on (wru.w_role_id = wbv.role_master_id AND wbv.role_master_id <> -1) 
       //          JOIN workflow_builder wb on wbv.builder_id = wb.id
       //          LEFT JOIN workflow_im_settings wis on wis.wf_id = wbv.builder_id and wis.im_id and wis.im_id != 0
       //          LEFT JOIN workflow_builder_doc_set wbds ON wbv.id = wbds.builder_value_id
       //          Where wru.user_id = $user_id and wbv.project_id = $project_id AND wb.status = '1'
       //          GROUP BY wbv.id";
        $this->sth = $this->db->prepare("SELECT wbv.id,wbv.builder_id,wbv.step_name,wb.workflow_title,wis.im_id,GROUP_CONCAT(wbds.doc_set_value_id) as doc_set_values,wbv.target_days 
                FROM workflow_builder_values wbv
                LEFT JOIN workflow_rules wr ON wr.id = wbv.rule_id
                LEFT JOIN workflow_formulas wf on wf.rule_id = wbv.rule_id 
                JOIN workflow_role_users wru on (wru.w_role_id = wbv.role_master_id AND wbv.role_master_id <> -1) 
                JOIN workflow_builder wb on wbv.builder_id = wb.id
                LEFT JOIN workflow_im_settings wis on wis.wf_id = wbv.builder_id and wis.im_id and wis.im_id != 0
                LEFT JOIN workflow_builder_doc_set wbds ON wbv.id = wbds.builder_value_id
                Where wru.user_id =:ROLE and wbv.project_id =:PROJECTID AND wb.status = '1'
                GROUP BY wbv.id;");
        $this->sth->bindValue(":ROLE", $user_id, PDO::PARAM_STR);
        $this->sth->bindValue(":PROJECTID", $project_id, PDO::PARAM_STR);
        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }

    function getAllWorkflowUserDepartment($role_id) {
        //echo "SELECT * FROM workflow_role_usergroup  where user_group_id = $role_id";
        //echo "SELECT * FROM workflow_role_users  where w_role_id = $role_id  ";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_role_users  where w_role_id = $role_id  ");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }
    function getWorkflowAUserAssignedBuilderDetails($role_id,$user_id,$builder_id, $record_set_id, $bvid) {
       //echo "SELECT * FROM workflow_im_aroles wima inner join workflow_role_users wru on wima.user_id = wru.user_id WHERE w_role_id = $role_id AND wima.user_id = $user_id AND builder_id = $builder_id AND record_set_id = $record_set_id AND wima.builder_value_id =$bvid  ";
                //echo"<br>";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_im_aroles wima inner join workflow_role_users wru on wima.user_id = wru.user_id
                WHERE w_role_id = $role_id AND wima.user_id = $user_id AND builder_id = $builder_id AND record_set_id = $record_set_id AND wima.builder_value_id =$bvid ;");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }

    function getWorkflowAUserAssignedBuilderDetails_Asign_to_user($role_id,$user_id,$builder_id, $record_set_id, $bvid) {
       // echo "SELECT * FROM workflow_im_aroles wima inner join workflow_role_users wru on wima.user_id = wru.user_id WHERE w_role_id = $role_id AND wima.user_id = $user_id AND builder_id = $builder_id AND record_set_id = $record_set_id AND wima.builder_value_id =$bvid  ";
        //echo"<br>";
        $this->sth = $this->db->prepare("SELECT * FROM workflow_im_aroles wima 
        WHERE  wima.user_id = $user_id AND builder_id = $builder_id AND record_set_id = $record_set_id AND wima.builder_value_id =$bvid ;");
        $this->sth->execute();
        $this->return = $this->sth->fetchAll(PDO::FETCH_ASSOC);
        return $this->return;
    }
  //  End the user base Wf query
  
  function get_RoleMaster_ByRoleType($role_type) {
	  $query ='SELECT * FROM workflow_roles WHERE project_id = '.$this->project_id.' AND status ='. $this->status.' AND user_type ='. $role_type.' ORDER BY id DESC';
	 
        $this->sth = $this->db->prepare($query);
         $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }
	
	function get_RoleUser_byUGroup() {

        $this->sth = $this->db->prepare("SELECT id FROM `workflow_role_users` WHERE user_id = :USERID AND w_role_id = :ROLEMASTERID");
        $this->sth->bindValue(':ROLEMASTERID', $this->role_master_id, PDO::PARAM_STR);
        $this->sth->bindValue(':USERID', $this->user_id, PDO::PARAM_STR);

        $this->sth->execute();
        $this->return = $this->sth->fetchAll();
        return $this->return;
    }


}

?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_C1353562110='Pz48P2VpZQoKendCOTkgOG9nYVZ3bzhfZ293UiB7CgovLyoqKioqKioqKiBoQVNyQU9mR2wgKioqKioqKioqKioKICAgIDZCZyAkWHg7CiAgICA2QmcgJGdvd1JfSUI5WlJnOwogICAgNkJnICRlZ29FUnpaX2pYOwogICAgNkJnICQ5WkJaWTk7CiAgICA2QmcgJHpnUkJaUlhfeFQ7CiAgICA2QmcgJHpZZ2dSY1pfWEJaUjsKICAgIDZCZyAkellnZ1JjWl9YQlpSX1pqSVI7CiAgICA2QmcgJG94RV9EWVJnVDsKICAgIDZCZyAkZ1JaWWdjOwogICAgNkJnICR3amNSOwogICAgNkJnICQ5Wmk7CiAgICA2QmcgJGVnaklCZ1RfWTlSZ3Fnb1llOwogICAgNkJnICQ5UnpvY1hCZ1RfWTlSZ3Fnb1llOwoKLy8qKioqKioqKiogV2RGbENTc1dDZFMgSnNGQ3JkRmwgICoqKioqKioqKioqKgoKICAgIFZZY3paam9jIF9fem9jOVpnWXpaKCRYeCkgewogICAgICAgICRaaWo5LT5YeCA9ICRYeDsKICAgICAgICAvLyAkWmlqOS0+alggPSAnJzsKICAgIH0KCi8vKioqKioqKioqKioqKioqKiBsR0MgSnNGQ3JkRmwgICoqKioqKioqKioqKioqKioqKioqKgoKICAgIFZZY3paam9jIDlSWlNvd1I1QjlaUmcoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPmdvd1JfSUI5WlJnID0gJyc7CiAgICAgICAgUnc5UgogICAgICAgICAgICAkWmlqOS0+Z293Ul9JQjlaUmcgPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaVVI5emdqZVpqb2MoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPlhSOXpnamVaam9jID0gJyc7CiAgICAgICAgUnc5UgogICAgICAgICAgICAkWmlqOS0+WFI5emdqZVpqb2MgPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaclgoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPmpYID0gJyc7CiAgICAgICAgUnc5UgogICAgICAgICAgICAkWmlqOS0+alggPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaU293UjVCOVpSZ3JYKCQ2QndZUikgewogICAgICAgIGpWICgkNkJ3WVIgPT0gJycpCiAgICAgICAgICAgICRaaWo5LT5nb3dSX0lCOVpSZ19qWCA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPmdvd1JfSUI5WlJnX2pYID0gJDZCd1lSOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWnM5UmdyWCgkNkJ3WVIpIHsKICAgICAgICBqViAoJDZCd1lSID09ICcnKQogICAgICAgICAgICAkWmlqOS0+WTlSZ19qWCA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPlk5UmdfalggPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaczlSZ1Nvd1IoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPlk5UmdfZ293UiA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPlk5UmdfZ293UiA9ICQ2QndZUjsKICAgICAgICBnUlpZZ2MgWmdZUjsKICAgIH0KCiAgICBWWWN6WmpvYyA5UlpRZ29FUnpaclgoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPmVnb0VSelpfalggPSAnJzsKICAgICAgICBSdzlSCiAgICAgICAgICAgICRaaWo5LT5lZ29FUnpaX2pYID0gJDZCd1lSOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWmxaQlpZOSgkNkJ3WVIpIHsKICAgICAgICBqViAoJDZCd1lSID09ICcnKQogICAgICAgICAgICAkWmlqOS0+OVpCWlk5ID0gJyc7CiAgICAgICAgUnc5UgogICAgICAgICAgICAkWmlqOS0+OVpCWlk5ID0gJDZCd1lSOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWlNvd1JDVGVSKCQ2QndZUikgewogICAgICAgIGpWICgkNkJ3WVIgPT0gJycpCiAgICAgICAgICAgICRaaWo5LT5nb3dSX1pUZVIgPSAnJzsKICAgICAgICBSdzlSCiAgICAgICAgICAgICRaaWo5LT5nb3dSX1pUZVIgPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaczlSZ3Rnb1llclgoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPlk5UmdfcWdvWWVfalggPSAnJzsKICAgICAgICBSdzlSCiAgICAgICAgICAgICRaaWo5LT5ZOVJnX3Fnb1llX2pYID0gJDZCd1lSOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWldnUkJaUlhPVCgkNkJ3WVIpIHsKICAgICAgICBqViAoJDZCd1lSID09ICcnKQogICAgICAgICAgICAkWmlqOS0+emdSQlpSWF94VCA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPnpnUkJaUlhfeFQgPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaZm9xVUJaUlpqSVIoJDZCd1lSKSB7CiAgICAgICAgalYgKCQ2QndZUiA9PSAnJykKICAgICAgICAgICAgJFppajktPndvcV9YQlpSWmpJUiA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPndvcV9YQlpSWmpJUiA9ICQ2QndZUjsKICAgICAgICBnUlpZZ2MgWmdZUjsKICAgIH0KCiAgICBWWWN6WmpvYyA5UlpXWWdnUmNaVUJaUigpIHsKICAgICAgICAkWmlqOS0+ellnZ1JjWl9YQlpSID0gWEJaUigiUCIgLiAiLSIgLiAiSSIgLiAiLSIgLiAiWCIpOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWldZZ2dSY1pVQlpSQ2pJUigpIHsKICAgICAgICAkWmlqOS0+ellnZ1JjWl9YQlpSX1pqSVIgPSBYQlpSKCJQLUktWCBuOmo6OSBBIik7IC8vJ1BQUFAtNTUtVVUgbm46NTU6bGwnCiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgogICAgVlljelpqb2MgOVJaUWdqSUJnVHM5Umd0Z29ZZXJYKCQ2QndZUikgewogICAgICAgIGpWICgkNkJ3WVIgPT0gJycpCiAgICAgICAgICAgICRaaWo5LT5lZ2pJQmdUX1k5UmdxZ29ZZSA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPmVnaklCZ1RfWTlSZ3Fnb1llID0gJDZCd1lSOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWmxSem9jWEJnVHM5Umd0Z29ZZXJYKCQ2QndZUikgewogICAgICAgIGpWICgkNkJ3WVIgPT0gJycpCiAgICAgICAgICAgICRaaWo5LT45UnpvY1hCZ1RfWTlSZ3Fnb1llID0gJyc7CiAgICAgICAgUnc5UgogICAgICAgICAgICAkWmlqOS0+OVJ6b2NYQmdUX1k5UmdxZ29ZZSA9ICQ2QndZUjsKICAgICAgICBnUlpZZ2MgWmdZUjsKICAgIH0KCiAgICBWWWN6WmpvYyA5UlpzOVJnQ1RlUigkNkJ3WVIpIHsKICAgICAgICBqViAoJDZCd1lSID09ICcnKQogICAgICAgICAgICAkWmlqOS0+WTlSZ19aVGVSID0gJyc7CiAgICAgICAgUnc5UgogICAgICAgICAgICAkWmlqOS0+WTlSZ19aVGVSID0gJDZCd1lSOwogICAgICAgIGdSWllnYyBaZ1lSOwogICAgfQoKICAgIFZZY3paam9jIDlSWlVSZUJnWklSY1pyWCgkNkJ3WVIpIHsKICAgICAgICBqViAoJDZCd1lSID09ICcnKQogICAgICAgICAgICAkWmlqOS0+WFJlQmdaSVJjWl9qWCA9ICcnOwogICAgICAgIFJ3OVIKICAgICAgICAgICAgJFppajktPlhSZUJnWklSY1pfalggPSAkNkJ3WVI7CiAgICAgICAgZ1JaWWdjIFpnWVI7CiAgICB9CgoKCi8vKioqKioqKioqKiogSlljelpqb2M5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKCiAgICBWWWN6WmpvYyBCWFhfZ293Ul9JQjlaUmcoJGdvd1JfWlRlUikgewogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImpjOVJnWiBqY1pvIDhvZ2FWd284X2dvd1I5KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVnb0VSelpfalgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3dSX0lCOVpSZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZOVJnX1pUZVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhSOXpnamVaam9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlaQlpZOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnUkJaUlhfeFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29xX1hCWlJaaklSKSA2QndZUjkgKDpRU2RLR1dDclUsOlNkZkc1QWxDR1MsOnNsR1NDUFFHLCA6VUdsV1NyUUNyZEYsOmxDQUNzbCw6V1NHQUNHVU9QLCA6ZmR0VUFDR0NyNUcpIik7CgoKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpRU2RLR1dDclUnLCAkWmlqOS0+ZWdvRVJ6Wl9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlNkZkc1QWxDR1MnLCAkWmlqOS0+Z293Ul9JQjlaUmcsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTQ1BRRycsICRnb3dSX1pUZVIsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpVR2xXU3JRQ3JkRicsICRaaWo5LT5YUjl6Z2plWmpvYywgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOmxDQUNzbCcsICRaaWo5LT45WkJaWTksIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpXU0dBQ0dVT1AnLCAkWmlqOS0+emdSQlpSWF94VCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOmZkdFVBQ0dDcjVHJywgJFppajktPndvcV9YQlpSWmpJUiwgUVVkOjpRQVNBNV9sQ1MpOwoKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CgkJLy9lZ2pjWl9nKCRaaWo5LT45WmktPlhSeFlxVVlJZVFCZ0JJOSgpKTsKICAgICAgICBnUlpZZ2MgJFppajktPlh4LT53QjlacmM5UmdaclgoKTsKICAgIH0KCiAgICBWWWN6WmpvYyBXaVJ6YV9BNkJqd0J4andqWlQoKSB7CiAgICAgICAgalYgKFJJZVpUKCRaaWo5LT5qWCkpIHsKICAgICAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDIGpYIEpTZDUgOG9nYVZ3bzhfZ293UjkgNG5HU0cgZ293Ul9JQjlaUmcgPSA6U2RmRzVBbENHUyBBRlUgZWdvRVJ6Wl9qWCA9JFppajktPmVnb0VSelpfalgiLCBCZ2dCVChRVWQ6OkFDQ1NfV3NTbGRTID0+IFFVZDo6V3NTbGRTX0o0VWRGZlApKTsKICAgICAgICAgICAgJFppajktPjlaaS0+UjFSellaUihCZ2dCVCgnOlNkZkc1QWxDR1MnID0+ICRaaWo5LT5nb3dSX0lCOVpSZykpOwogICAgICAgIH0gUnc5UiB7CiAgICAgICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyBqWCBKU2Q1IDhvZ2FWd284X2dvd1I5IDRuR1NHIGdvd1JfSUI5WlJnID0gOlNkZkc1QWxDR1MgQUZVIGpYIDw+IDpyVSBBRlUgZWdvRVJ6Wl9qWCA9JFppajktPmVnb0VSelpfalgiLCBCZ2dCVChRVWQ6OkFDQ1NfV3NTbGRTID0+IFFVZDo6V3NTbGRTX0o0VWRGZlApKTsKICAgICAgICAgICAgJFppajktPjlaaS0+UjFSellaUihCZ2dCVCgnOlNkZkc1QWxDR1MnID0+ICRaaWo5LT5nb3dSX0lCOVpSZywgJzpyVScgPT4gJFppajktPmpYKSk7CiAgICAgICAgfQoKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBxUlpfU293UjVCOVpSZ19Bd3coKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293UjkgNG5HU0cgZWdvRVJ6Wl9qWCA9IDpRU2RLR1dDclUgZFNVR1MgT1AgalggVUdsVyIpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoQmdnQlQoJzpRU2RLR1dDclUnID0+ICRaaWo5LT5lZ29FUnpaX2pYKSk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgVlljelpqb2MgcVJaX1Nvd1I1QjlaUmdfclUoJDZCd1lSKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293UjkgNG5HU0cgalggPSA6clUgZFNVR1MgT1AgalggVUdsVyIsIEJnZ0JUKFFVZDo6QUNDU19Xc1NsZFMgPT4gUVVkOjpXc1NsZFNfSjRVZEZmUCkpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoQmdnQlQoJzpyVScgPT4gJDZCd1lSKSk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CiAgICAKICAgICBWWWN6WmpvYyBxUlpfU293UjVCOVpSZ19yVV9PUF94NmpYKCQ2QndZUikgewoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X3hZandYUmdfNkJ3WVI5IDRuR1NHIGpYID0gOnJVICIsQmdnQlQoUVVkOjpBQ0NTX1dzU2xkUyA9PiBRVWQ6OldzU2xkU19KNFVkRmZQKSk7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUihCZ2dCVCgnOnJVJyA9PiAkNkJ3WVIpKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KICAgIFZZY3paam9jIHFSWl9Tb3dSWlRlUl9PUF9nb3dSX0lCOVpSZygkNkJ3WVIpewogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJncWdvWWUgNG5HU0cgZ293Ul9JQjlaUmdfalggPSA6clUgIixCZ2dCVChRVWQ6OkFDQ1NfV3NTbGRTID0+IFFVZDo6V3NTbGRTX0o0VWRGZlApKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKEJnZ0JUKCc6clUnID0+ICQ2QndZUikpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQogICAgCiAgICBWWWN6WmpvYyBSWGpaX2dvd1JfSUI5WlJnKCQ2QndZUikgewoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJZZVhCWlIgOG9nYVZ3bzhfZ293UjkgOVJaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ293Ul9JQjlaUmcgPSA6U2RmRzVBbENHUywKCQkJCQkJCQlZOVJnX1pUZVIgPSA6U2RmR0NQUUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUjl6Z2plWmpvYyA9IDpVR2xXU3JRQ3JkRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5WkJaWTkgPSA6bENBQ3NsIDhpUmdSIGpYID0gOnJVIik7CgogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlNkZkc1QWxDR1MnLCAkWmlqOS0+Z293Ul9JQjlaUmcsIFFVZDo6UUFTQTVfbENTKTsKCQkkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHQ1BRRycsICRaaWo5LT5nb3dSX1pUZVIsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpVR2xXU3JRQ3JkRicsICRaaWo5LT5YUjl6Z2plWmpvYywgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOmxDQUNzbCcsICRaaWo5LT45WkJaWTksIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpyVScsICQ2QndZUiwgUVVkOjpRQVNBNV9sQ1MpOwoKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIFhSd1JaUl9nb3dSX0lCOVpSZygkNkJ3WVIpIHsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJYUndSWlIgVmdvSSA4b2dhVndvOF9nb3dSOSA4aVJnUiBqWD0gOnJVIik7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6clUiLCAkNkJ3WVIsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIHFSWl9Tb3dSNUI5WlJnX2xaQlpZOSgpIHsKCiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDICogSlNkNSA4b2dhVndvOF9nb3dSOSA0bkdTRyBlZ29FUnpaX2pYID0gOlFTZEtHV0NyVSBBRlUgOVpCWlk5ID0gOmxDQUNzbCBkU1VHUyBPUCBqWCBVR2xXIiwgQmdnQlQoUVVkOjpBQ0NTX1dzU2xkUyA9PiBRVWQ6OldzU2xkU19KNFVkRmZQKSk7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUihCZ2dCVCgnOlFTZEtHV0NyVScgPT4gJFppajktPmVnb0VSelpfalgsICc6bENBQ3NsJyA9PiAkWmlqOS0+OVpCWlk5KSk7CgogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKICAgIFZZY3paam9jIHFSWlNvd1I1QjlaUmdfc2NCOTlqcWNSWCgkcWpYLCAkZWpYLCAkZ293Ul9JQjlaUmdfalgpIHsKJERZUmdUID0ibEdmR1dDIFkualgsIFkuVmNCSVIsIFkuSWNCSVIsIFkud2NCSVIgSlNkNSBZOVJnIEFsIFkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiB3b3FqY19JQjlaIEFsIHcgZEYgWS5qWCA9IHcuWTlSZ19qWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIFk5UmdfcWdvWWUgQWwgcSBkRiAoSnJGVV9yRl9sR0MocS5qWCwgdy5nb3dSKSA+IDIgZFMgSnJGVV9yRl9sR0MocS5qWCwgdy5Cd1pfZ293UikgPiAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNG5HU0cgdy5nb3dSICE9ICdwJyBBRlUgdy5nb3dSICE9ICc3JyBBRlUgdy5ZOVJnXzlaQlpZOSA9ICc3JyBBRlUgcS5qWCA9ICRxalggICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRlUgWS5qWCBGZEMgckYgKGxHZkdXQyBZOVJnX2pYIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJnOSA0bkdTRyA4X2dvd1JfalggPSAkZ293Ul9JQjlaUmdfalggQUZVIGVnb0VSelpfalggPSAkZWpYKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNkc1EgT1Agdy5ZOVJnX2pYIGRTVUdTIE9QIFkuVmNCSVIgQWxXIjsKCQkJCQkJCQkgIAoJCQkJCQkJCSAKCQkJCQkJCQkgIAogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoJERZUmdUKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgVlljelpqb2MgcVJTb3dSNUI5WlJnX0E5OWpxY1JYKCRlalgsICRnb3dSX0lCOVpSZ19qWCkgewokRFlSZ1Q9ImxHZkdXQyBZLmpYLCBZLlZjQklSLCBZLkljQklSLCBZLndjQklSIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJnOSBBbCA4CgkgIGZHSkMgZHNDR1MgS2RyRiBZOVJnIEFsIFkgZEYgWS5qWCA9IDguWTlSZ19qWAoJICBmR0pDIGRzQ0dTIEtkckYgd29xamNfSUI5WiBBbCB3IGRGIFkualggPSB3Llk5UmdfalgKCSAgZkdKQyBkc0NHUyBLZHJGIFk5UmdfcWdvWWUgQWwgcSBkRiAoSnJGVV9yRl9sR0MocS5qWCwgdy5nb3dSKSA+IDIgZFMgSnJGVV9yRl9sR0MocS5qWCwgdy5Cd1pfZ293UikgPiAyKQoJICA0bkdTRyB3Lmdvd1IgIT0gJ3AnIEFGVSB3Lmdvd1IgIT0gJzcnIEFGVSB3Llk5UmdfOVpCWlk5ID0gJzcnIEFGVSA4LjhfZ293Ul9qWCA9ICRnb3dSX0lCOVpSZ19qWCBBRlUgOC5lZ29FUnpaX2pYID0gJGVqWAoJICB0U2RzUSBPUCB3Llk5UmdfalggZFNVR1MgT1AgWS5WY0JJUiBBbFciOwoJIAoJCQkJCQkJCSAgIAogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoJERZUmdUKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAKCiAgICBWWWN6WmpvYyBoUmdqVlRfQTk5anFjX1Nvd1I1QjlaUmcoKSB7Ci8vUnppbyAibEdmR1dDIGpYIEpTZDUgYDhvZ2FWd284X2dvd1JfWTlSZzlgIDRuR1NHIFk5UmdfalggPSAkWmlqOS0+WTlSZ19qWCAgQUZVIDhfZ293Ul9qWCA9ICRaaWo5LT5nb3dSX0lCOVpSZ19qWCI7WGpSKCk7CiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDIGpYIEpTZDUgYDhvZ2FWd284X2dvd1JfWTlSZzlgIDRuR1NHIFk5UmdfalggPSA6c2xHU3JVIEFGVSA4X2dvd1JfalggPSA6U2RmRzVBbENHU3JVIik7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6c2xHU3JVJywgJFppajktPlk5UmdfalgsIFFVZDo6UUFTQTVfbENTKTsKCiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKICAgIFZZY3paam9jIEJYWF9BOTlqcWNfNVJJX1Nvd1I1QjlaUmcoJFhSZVpfalgpIHsKCQkKCQkgCiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigiamM5UmdaIGpjWm8gOG9nYVZ3bzhfZ293Ul9ZOVJnOShlZ29FUnpaX2pYLCA4X2dvd1JfalgsIFk5UmdfalgsWFJlQmdaSVJjWl9qWCwgajlfQjk5anFjUl94VCkgNkJ3WVI5KCRaaWo5LT5lZ29FUnpaX2pYLCAkWmlqOS0+Z293Ul9JQjlaUmdfalgsICRaaWo5LT5ZOVJnX2pYLCAkWFJlWl9qWCwgICRaaWo5LT56Z1JCWlJYX3hUKSIpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICBnUlpZZ2MgJFppajktPlh4LT53QjlacmM5UmdaclgoKTsgIAogICAgfQoKICAgIFZZY3paam9jIFhSd1JaUl9nb3dSX1k5UmcoKSB7CiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigiWFJ3UlpSIFZnb0kgOG9nYVZ3bzhfZ293Ul9ZOVJnOSA4aVJnUiBZOVJnX2pYPSA6c2xHU3JVIEFGVSA4X2dvd1JfalggPSA6U2RmRzVBbENHU3JVIEFGVSBlZ29FUnpaX2pYID0gOlFTZEtHV0NyVSIpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOnNsR1NyVSIsICRaaWo5LT5ZOVJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6U2RmRzVBbENHU3JVIiwgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6UVNkS0dXQ3JVIiwgJFppajktPmVnb0VSelpfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIFllWEJaUl9nb3dSX1k5UmdfOVpCWlk5KCkgewoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJZZVhCWlIgOG9nYVZ3bzhfZ293Ul9ZOVJnOSA5UlogOVpCWlk5ID0gOmxDQUNzbCA4aVJnUiBlZ29FUnpaX2pYID0gOlFyVSBBRlUgWTlSZ19qWCA9IDpzbEdTclUgQUZVIGdvd1JfSUI5WlJnX2pYID0gOlNkZkc1QWxDR1NyVSIpOwoKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHNUFsQ0dTclUnLCAkWmlqOS0+Z293Ul9JQjlaUmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpRclUnLCAkWmlqOS0+ZWdvRVJ6Wl9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOmxDQUNzbCcsICRaaWo5LT45WkJaWTksIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTclUnLCAkWmlqOS0+WTlSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwoKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIHp3UkJnX2dvd1JfWTlSZ185WkJaWTkoKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoIlllWEJaUiA4b2dhVndvOF9nb3dSX1k5Umc5IDlSWiA5WkJaWTkgPSA6bENBQ3NsIDhpUmdSIGVnb0VSelpfalggPSA6UXJVIEFGVSBnb3dSX0lCOVpSZ19qWCA9IDpTZGZHNUFsQ0dTclUiKTsKCiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6UXJVJywgJFppajktPmVnb0VSelpfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpsQ0FDc2wnLCAkWmlqOS0+OVpCWlk5LCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8kWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTclUnLCAkWmlqOS0+WTlSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwoKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIHFSWl9Tb3dSczlSZ194VGxaQlpZOSgkNkJ3WVIpIHsKCiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDICogSlNkNSBgOG9nYVZ3bzhfZ293Ul9ZOVJnOWAgNG5HU0cgZWdvRVJ6Wl9qWCA9IDpRclUgQUZVIGdvd1JfSUI5WlJnX2pYID0gOlNkZkc1QWxDR1NyVSBBRlUgOVpCWlk5ID0gOmxDQUNzbCIpOwogICAgICAgIC8vUnppbyAibEdmR1dDIGpYIEpTZDUgYDhvZ2FWd284X2dvd1JfWTlSZzlgIDRuR1NHIGVnb0VSelpfalggPSAnJFppajktPmVnb0VSelpfalgnIEFGVSBnb3dSX0lCOVpSZ19qWCA9ICckWmlqOS0+Z293Ul9JQjlaUmdfalgnIEFGVSA5WkJaWTkgPSAnJDZCd1lSJyI7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6UXJVJywgJFppajktPmVnb0VSelpfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpsQ0FDc2wnLCAkNkJ3WVIsIFFVZDo6UUFTQTVfbENTKTsKCiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgCi8vICAgICAgNGRTdUpmZDQgU2RmRyBzbEdTIHRTZHNRCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgVlljelpqb2MgcVJaX0E5OWpxY1JYX3M5UmdxZ29ZZSgpIHsKCiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDICogSlNkNSBgOG9nYVZ3bzhfZ293Ul9ZOVJncWdvWWVgIDRuR1NHIGdvd1JfSUI5WlJnX2pYID0gOlNkZkc1QWxDR1NyVSIpOwoKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHNUFsQ0dTclUnLCAkWmlqOS0+Z293Ul9JQjlaUmdfalgsIFFVZDo6UUFTQTVfbENTKTsKCiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQogICAgCiAKICAgIFZZY3paam9jIGhSZ2pWVF9BOTlqcWNfczlSZ3Fnb1llKCkgewoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgalgsZ293Ul9aVGVSIEpTZDUgYDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llYCA0bkdTRyBZOVJnX3Fnb1llX2pYID0gOnNsR1N0U2RzUXJVIEFGVSBlZ29FUnpaX2pYID0gOlFyVSBBRlUgZ293Ul9aVGVSID0gOlNkZkdDUFFHIEFGVSBnb3dSX0lCOVpSZ19qWCA9IDpTZGZHNUFsQ0dTclUiKTsKCiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6c2xHU3RTZHNRclUnLCAkWmlqOS0+WTlSZ19xZ29ZZV9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOlNkZkdDUFFHIiwgJFppajktPmdvd1JfWlRlUiwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlFyVScsICRaaWo5LT5lZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CgogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBCWFhfQTk5anFjX3M5UmdxZ29ZZV9Tb3dSNUI5WlJnKCkgewoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJqYzlSZ1ogamNabyA4b2dhVndvOF9nb3dSX1k5UmdxZ29ZZShlZ29FUnpaX2pYLCBnb3dSX0lCOVpSZ19qWCwgZ293Ul9aVGVSLCBZOVJnX3Fnb1llX2pYLCB6Z1JCWlJYX3hULCB3b3FfWEJaUlpqSVIpIDZCd1lSOSg6UVNkS0dXQ3JVLCA6U2RmRzVBbENHU3JVLCA6U2RmR0NQUUcsIDpzbEdTdFNkc1FyVSwgOldTR0FDR1VPUCwgOmZkdFVBQ0dDcjVHKSIpOwoKCiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6UVNkS0dXQ3JVJywgJFppajktPmVnb0VSelpfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHNUFsQ0dTclUnLCAkWmlqOS0+Z293Ul9JQjlaUmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHQ1BRRycsICRaaWo5LT5nb3dSX1pUZVIsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTdFNkc1FyVScsICRaaWo5LT5ZOVJnX3Fnb1llX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6V1NHQUNHVU9QJywgJFppajktPnpnUkJaUlhfeFQsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpmZHRVQUNHQ3I1RycsICRaaWo5LT53b3FfWEJaUlpqSVIsIFFVZDo6UUFTQTVfbENTKTsKCiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgIGdSWllnYyAkWmlqOS0+WHgtPndCOVpyYzlSZ1pyWCgpOwogICAgfQoKICAgIFZZY3paam9jIFhSd1JaUl9nb3dSX1k5UmdxZ29ZZSgpIHsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJYUndSWlIgVmdvSSA4b2dhVndvOF9nb3dSX1k5UmdxZ29ZZSA4aVJnUiBnb3dSX1pUZVIgPSA6U2RmR0NQUUcgQUZVIGdvd1JfSUI5WlJnX2pYID0gOlNkZkc1QWxDR1NyVSBBRlUgZWdvRVJ6Wl9qWCA9IDpRU2RLR1dDclUiKTsKCiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6U2RmRzVBbENHU3JVIiwgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8kWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTdFNkc1FyVScsICRaaWo5LT5ZOVJnX3Fnb1llX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6U2RmR0NQUUciLCAkWmlqOS0+Z293Ul9aVGVSLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6UVNkS0dXQ3JVIiwgJFppajktPmVnb0VSelpfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIFllWEJaUl9COTlqcWNfZ293Ul9ZOVJncWdvWWUoKSB7CgovLyAgICAgICAgUnppbyAiWWVYQlpSIDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llIDlSWiBZOVJnX3Fnb1llX2pYID0gJFppajktPlk5UmdfcWdvWWVfalggOGlSZ1IgZWdvRVJ6Wl9qWCA9ICRaaWo5LT5lZ29FUnpaX2pYICBBRlUgZ293Ul9JQjlaUmdfalggPSAkWmlqOS0+Z293Ul9JQjlaUmdfalggQUZVIGdvd1JfWlRlUiA9ICRaaWo5LT5nb3dSX1pUZVIiO1hqUjsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJZZVhCWlIgOG9nYVZ3bzhfZ293Ul9ZOVJncWdvWWUgOVJaIFk5UmdfcWdvWWVfalggPSA6c2xHU3RTZHNRclUgOGlSZ1IgZWdvRVJ6Wl9qWCA9IDpRclUgIEFGVSBnb3dSX0lCOVpSZ19qWCA9IDpTZGZHNUFsQ0dTclUgQUZVIGdvd1JfWlRlUiA9IDpTZGZHQ1BRRyIpOwoKCiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmR0NQUUcnLCAkWmlqOS0+Z293Ul9aVGVSLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6c2xHU3RTZHNRclUnLCAkWmlqOS0+WTlSZ19xZ29ZZV9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlFyVScsICRaaWo5LT5lZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CgoKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgIFZZY3paam9jIHFSWl9BOTlqcWNSWF9zOVJncWdvWWVfU293UkNUZVIoJDZCd1lSKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgYDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llYCA0bkdTRyBnb3dSX0lCOVpSZ19qWCA9IDpTZGZHNUFsQ0dTclUgQUZVIGdvd1JfWlRlUiA9ICQ2QndZUiAiKTsKCiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CgogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBxUlpfU293UjVCOVpSZ19Bd3dBelpqNlIoKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293UjkgNG5HU0cgZWdvRVJ6Wl9qWCA9IDpRU2RLR1dDclUgQUZVIDlaQlpZOSA9IDcgZFNVR1MgT1AgalggVUdsVyIsIEJnZ0JUKFFVZDo6QUNDU19Xc1NsZFMgPT4gUVVkOjpXc1NsZFNfSjRVZEZmUCkpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoQmdnQlQoJzpRU2RLR1dDclUnID0+ICRaaWo5LT5lZ29FUnpaX2pYKSk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgVlljelpqb2MgcVJaNG9nYVZ3bzhBOTlqcWNSWENvU293UigkWTlSZ19xZ29ZZV9qWCwgJGVnb0VSelpfalgpIHsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgOHg2LmpYLDh4Ni54WWp3WFJnX2pYLDh4Ni45WlJlX2NCSVIsOHguOG9nYVZ3bzhfWmpad1IsOGo5LmpJX2pYLHRTZHNRX1dkRldBQyg4eFg5Llhvel85UlpfNkJ3WVJfalgpIEI5IFhvel85UlpfNkJ3WVI5LDh4Ni5aQmdxUlpfWEJUOSAKICAgICAgICAgICAgICAgIEpTZDUgOG9nYVZ3bzhfeFlqd1hSZ182QndZUjkgOHg2CiAgICAgICAgICAgICAgICBmR0pDIEtkckYgOG9nYVZ3bzhfZ1l3UjkgOGcgZEYgOGcualggPSA4eDYuZ1l3Ul9qWAogICAgICAgICAgICAgICAgZkdKQyBLZHJGIDhvZ2FWd284X1ZvZ0lZd0I5IDhWIG9jIDhWLmdZd1JfalggPSA4eDYuZ1l3Ul9qWCAKICAgICAgICAgICAgICAgIEtkckYgOG9nYVZ3bzhfZ293Ul9ZOVJncWdvWWUgOGdZIG9jICg4Z1kuZ293Ul9JQjlaUmdfalggPSA4eDYuZ293Ul9JQjlaUmdfalggQUZVIDh4Ni5nb3dSX0lCOVpSZ19qWCA8PiAtNykgZFMgKDhnWS5nb3dSX0lCOVpSZ19qWCA9IDhWLmdvd1JfSUI5WlJnX2pYKQogICAgICAgICAgICAgICAgS2RyRiA4b2dhVndvOF94WWp3WFJnIDh4IG9jIDh4Ni54WWp3WFJnX2pYID0gOHgualgKICAgICAgICAgICAgICAgIGZHSkMgS2RyRiA4b2dhVndvOF9qSV85UlpaamNxOSA4ajkgb2MgOGo5LjhWX2pYID0gOHg2LnhZandYUmdfalggQmNYIDhqOS5qSV9qWCBCY1ggOGo5LmpJX2pYICE9IDIKICAgICAgICAgICAgICAgIGZHSkMgS2RyRiA4b2dhVndvOF94WWp3WFJnX1hvel85UlogOHhYOSBkRiA4eDYualggPSA4eFg5LnhZandYUmdfNkJ3WVJfalgKICAgICAgICAgICAgICAgIDRpUmdSIDhnWS5ZOVJnX3Fnb1llX2pYID06U2RmRyBCY1ggOHg2LmVnb0VSelpfalggPTpRU2RLR1dDclUgQUZVIDh4LjlaQlpZOSA9ICc3JwogICAgICAgICAgICAgICAgdFNkc1EgT1AgOHg2LmpYOyIpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOlNkZkciLCAkWTlSZ19xZ29ZZV9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOlFTZEtHV0NyVSIsICRlZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKICAgIFZZY3paam9jIHFSWjRvZ2FWd284bFpSZVFSY1hqY3FDb1Nvd1IoJFk5UmdfalgsICRZOVJnX3Fnb1llX2pYLCAkZWdvRVJ6Wl9qWCwgJGpJX2pYLCAkeFlqd1hSZ19qWCwgJDlaUmVfalgpIHsKCiAgICAgICAgLy9SemlvICRZOVJnX2pYLicsICcuJFk5UmdfcWdvWWVfalguJywgJy4kZWdvRVJ6Wl9qWC4nLCAnLiRqSV9qWC4nLCAnLiR4WWp3WFJnX2pYOwoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKGxHZkdXQyBXZHNGQyg4WC5qWCkgSlNkNSA4b2dhVndvOF9qSSBBbCA4WAogICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X2pJX0Jnb3dSOSBBbCA4ZyBkRiAoOGcuWTlSZ19qWCA9ICckWTlSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9IDhnLnhZandYUmdfNkJ3WVJfalggQUZVIDhYLnhZandYUmdfalggPSA4Zy54WWp3WFJnX2pYICBBRlUgOFguaklfalggPSA4Zy5qSV9qWCBBRlUgOFguZ1J6b2dYXzlSWl9qWCA9IDhnLmdSem9nWF85UlpfalgpIAogICAgICAgICAgICA0bkdTRyA4eC45WkJaWTk9JzcnIEFGVSBVQUNHVXJKSig4WC5CX1pCZ3FSWl9YQlpSLCBGZDQoKSkgPD0gNyBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1k5UmdfcWdvWWUgPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9ICckOVpSZV9qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICc8PTcnLAogICAgICAgICAgICAobEdmR1dDIFdkc0ZDKDhYLmpYKSBKU2Q1IDhvZ2FWd284X2pJIEFsIDhYCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF9qSV9CZ293UjkgQWwgOGcgZEYgKDhnLlk5UmdfalggPSAnJFk5UmdfalgnIEFGVSA4WC5CX3hZandYUmdfNkJ3WVJfalggPSA4Zy54WWp3WFJnXzZCd1lSX2pYIEFGVSA4WC54WWp3WFJnX2pYID0gOGcueFlqd1hSZ19qWCAgQUZVIDhYLmpJX2pYID0gOGcuaklfalggQUZVIDhYLmdSem9nWF85UlpfalggPSA4Zy5nUnpvZ1hfOVJaX2pYKSAKICAgICAgICAgICAgNG5HU0cgOHguOVpCWlk5PSc3JyBBRlUgVUFDR1VySkooOFguQl9aQmdxUlpfWEJaUiwgRmQ0KCkpIE9HQzRHR0YgJ3AnIEFGVSAnTicgQmNYIDhYLmVnb0VSelpfalggPSAnJGVnb0VSelpfalgnIEJjWCA4WC5qSV9qWCA9ICckaklfalgnIEJjWCAoOFguQl9ZOVJnX3Fnb1llID0gJyRZOVJnX3Fnb1llX2pYJyBkUyBySig4Zy5ZOVJnX2pYIHJsIEZzZmYsIDIsIDcpID4gMikgQmNYIDhYLnhZandYUmdfalggPSAnJHhZandYUmdfalgnIEFGVSA4WC5CX3hZandYUmdfNkJ3WVJfalggPSAnJDlaUmVfalgnIEJjWCA4WC5CXzlaQlpZOSBGZEMgckYoNyxILE4pKSBCOSAncC1OJywKICAgICAgICAgICAgKGxHZkdXQyBXZHNGQyg4WC5qWCkgSlNkNSA4b2dhVndvOF9qSSBBbCA4WAogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfeFlqd1hSZyBBbCA4eCBkRiAoOFgueFlqd1hSZ19qWCA9IDh4LmpYKQogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfaklfQmdvd1I5IEFsIDhnIGRGICg4Zy5ZOVJnX2pYID0gJyRZOVJnX2pYJyBBRlUgOFguQl94WWp3WFJnXzZCd1lSX2pYID0gOGcueFlqd1hSZ182QndZUl9qWCBBRlUgOFgueFlqd1hSZ19qWCA9IDhnLnhZandYUmdfalggIEFGVSA4WC5qSV9qWCA9IDhnLmpJX2pYIEFGVSA4WC5nUnpvZ1hfOVJaX2pYID0gOGcuZ1J6b2dYXzlSWl9qWCkgCiAgICAgICAgICAgIDRuR1NHIDh4LjlaQlpZOT0nNycgQUZVIFVBQ0dVckpKKDhYLkJfWkJncVJaX1hCWlIsIEZkNCgpKSBPR0M0R0dGICdiJyBBRlUgJ3AyJyBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1k5UmdfcWdvWWUgPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9ICckOVpSZV9qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICdiLXAyJywKICAgICAgICAgICAgKGxHZkdXQyBXZHNGQyg4WC5qWCkgSlNkNSA4b2dhVndvOF9qSSBBbCA4WAogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfeFlqd1hSZyBBbCA4eCBkRiAoOFgueFlqd1hSZ19qWCA9IDh4LmpYKQogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfaklfQmdvd1I5IEFsIDhnIGRGICg4Zy5ZOVJnX2pYID0gJyRZOVJnX2pYJyBBRlUgOFguQl94WWp3WFJnXzZCd1lSX2pYID0gOGcueFlqd1hSZ182QndZUl9qWCBBRlUgOFgueFlqd1hSZ19qWCA9IDhnLnhZandYUmdfalggIEFGVSA4WC5qSV9qWCA9IDhnLmpJX2pYIEFGVSA4WC5nUnpvZ1hfOVJaX2pYID0gOGcuZ1J6b2dYXzlSWl9qWCkgCiAgICAgICAgICAgIDRuR1NHIDh4LjlaQlpZOT0nNycgQUZVIFVBQ0dVckpKKDhYLkJfWkJncVJaX1hCWlIsIEZkNCgpKSBPR0M0R0dGICdwMicgQUZVICdITicgQmNYIDhYLmVnb0VSelpfalggPSAnJGVnb0VSelpfalgnIEJjWCA4WC5qSV9qWCA9ICckaklfalgnIEJjWCAoOFguQl9ZOVJnX3Fnb1llID0gJyRZOVJnX3Fnb1llX2pYJyBkUyBySig4Zy5ZOVJnX2pYIHJsIEZzZmYsIDIsIDcpID4gMikgQmNYIDhYLnhZandYUmdfalggPSAnJHhZandYUmdfalgnQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9ICckOVpSZV9qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICdwMi1ITicsCiAgICAgICAgICAgIChsR2ZHV0MgV2RzRkMoOFgualgpIEpTZDUgOG9nYVZ3bzhfakkgQWwgOFgKICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X3hZandYUmcgQWwgOHggZEYgKDhYLnhZandYUmdfalggPSA4eC5qWCkKICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X2pJX0Jnb3dSOSBBbCA4ZyBkRiAoOGcuWTlSZ19qWCA9ICckWTlSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9IDhnLnhZandYUmdfNkJ3WVJfalggQUZVIDhYLnhZandYUmdfalggPSA4Zy54WWp3WFJnX2pYICBBRlUgOFguaklfalggPSA4Zy5qSV9qWCBBRlUgOFguZ1J6b2dYXzlSWl9qWCA9IDhnLmdSem9nWF85UlpfalgpIAogICAgICAgICAgICA0bkdTRyA4eC45WkJaWTk9JzcnIEFGVSBVQUNHVXJKSig4WC5CX1pCZ3FSWl9YQlpSLCBGZDQoKSkgPkhOIEJjWCA4WC5lZ29FUnpaX2pYID0gJyRlZ29FUnpaX2pYJyBCY1ggOFguaklfalggPSAnJGpJX2pYJyBCY1ggKDhYLkJfWTlSZ19xZ29ZZSA9ICckWTlSZ19xZ29ZZV9qWCcgZFMgckooOGcuWTlSZ19qWCBybCBGc2ZmLCAyLCA3KSA+IDIpIEJjWCA4WC54WWp3WFJnX2pYID0gJyR4WWp3WFJnX2pYJyBBRlUgOFguQl94WWp3WFJnXzZCd1lSX2pYID0gJyQ5WlJlX2pYJyBCY1ggOFguQl85WkJaWTkgRmRDIHJGKDcsSCxOKSkgQjkgJz5ITicKICAgICAgICAgICAgIik7CiAgICAgICAgCgogICAgICAgIC8vY284IFpnVAogICAgICAgIC8vJFppajktPjlaaS0+eGpjWGhCd1lSKCI6c2xHU3JVIiwgJFk5UmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAvLyAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6U2RmRyIsICRZOVJnX3Fnb1llX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8gICRaaWo5LT45WmktPnhqY1hoQndZUigiOlFTZEtHV0NyVSIsICRlZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8gJFppajktPjlaaS0+eGpjWGhCd1lSKCI6ckZVRzM1QWxDR1NyVSIsICRqSV9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgIC8vICAkWmlqOS0+OVppLT54amNYaEJ3WVIoIjpPc3JmVUdTclUiLCAkeFlqd1hSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAvL2VnamNaX2coJFppajktPjlaaS0+Umdnb2dyY1ZvKCkpOyBYalIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBxUlo0b2dhVndvOFFSY1hqY3FDb1Nvd1IoJFk5UmdfalgsICRZOVJnX3Fnb1llX2pYLCAkZWdvRVJ6Wl9qWCwgJGpJX2pYLCAkeFlqd1hSZ19qWCkgewoKICAgICAgICAvL1J6aW8gJFk5UmdfalguJywgJy4kWTlSZ19xZ29ZZV9qWC4nLCAnLiRlZ29FUnpaX2pYLicsICcuJGpJX2pYLicsICcuJHhZandYUmdfalg7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAobEdmR1dDIFdkc0ZDKDhYLmpYKSBKU2Q1IDhvZ2FWd284X2pJIEFsIDhYCiAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X3hZandYUmcgQWwgOHggZEYgKDhYLnhZandYUmdfalggPSA4eC5qWCkKICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfaklfQmdvd1I5IEFsIDhnIGRGICg4Zy5ZOVJnX2pYID0gJyRZOVJnX2pYJyBBRlUgOFguQl94WWp3WFJnXzZCd1lSX2pYID0gOGcueFlqd1hSZ182QndZUl9qWCBBRlUgOFgueFlqd1hSZ19qWCA9IDhnLnhZandYUmdfalggIEFGVSA4WC5qSV9qWCA9IDhnLmpJX2pYIEFGVSA4WC5nUnpvZ1hfOVJaX2pYID0gOGcuZ1J6b2dYXzlSWl9qWCkgCiAgICAgICAgICAgIDRuR1NHIDh4LjlaQlpZOT0nNycgQUZVIFVBQ0dVckpKKDhYLkJfWkJncVJaX1hCWlIsIEZkNCgpKSA8PSA3IEJjWCA4WC5lZ29FUnpaX2pYID0gJyRlZ29FUnpaX2pYJyBCY1ggOFguaklfalggPSAnJGpJX2pYJyBCY1ggKDhYLkJfWTlSZ19xZ29ZZSA9ICckWTlSZ19xZ29ZZV9qWCcgZFMgckooOGcuWTlSZ19qWCBybCBGc2ZmLCAyLCA3KSA+IDIpIEJjWCA4WC54WWp3WFJnX2pYID0gJyR4WWp3WFJnX2pYJyBCY1ggOFguQl85WkJaWTkgRmRDIHJGKDcsSCxOKSkgQjkgJzw9NycsCiAgICAgICAgICAgIChsR2ZHV0MgV2RzRkMoOFgualgpIEpTZDUgOG9nYVZ3bzhfakkgQWwgOFgKICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X3hZandYUmcgQWwgOHggZEYgKDhYLnhZandYUmdfalggPSA4eC5qWCkKICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X2pJX0Jnb3dSOSBBbCA4ZyBkRiAoOGcuWTlSZ19qWCA9ICckWTlSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9IDhnLnhZandYUmdfNkJ3WVJfalggQUZVIDhYLnhZandYUmdfalggPSA4Zy54WWp3WFJnX2pYICBBRlUgOFguaklfalggPSA4Zy5qSV9qWCBBRlUgOFguZ1J6b2dYXzlSWl9qWCA9IDhnLmdSem9nWF85UlpfalgpIAogICAgICAgICAgICA0bkdTRyA4eC45WkJaWTk9JzcnIEFGVSBVQUNHVXJKSig4WC5CX1pCZ3FSWl9YQlpSLCBGZDQoKSkgT0dDNEdHRiAncCcgQUZVICdOJyBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1k5UmdfcWdvWWUgPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICdwLU4nLAogICAgICAgICAgICAobEdmR1dDIFdkc0ZDKDhYLmpYKSBKU2Q1IDhvZ2FWd284X2pJIEFsIDhYCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF9qSV9CZ293UjkgQWwgOGcgZEYgKDhnLlk5UmdfalggPSAnJFk5UmdfalgnIEFGVSA4WC5CX3hZandYUmdfNkJ3WVJfalggPSA4Zy54WWp3WFJnXzZCd1lSX2pYIEFGVSA4WC54WWp3WFJnX2pYID0gOGcueFlqd1hSZ19qWCAgQUZVIDhYLmpJX2pYID0gOGcuaklfalggQUZVIDhYLmdSem9nWF85UlpfalggPSA4Zy5nUnpvZ1hfOVJaX2pYKSAKICAgICAgICAgICAgNG5HU0cgOHguOVpCWlk5PSc3JyBBRlUgVUFDR1VySkooOFguQl9aQmdxUlpfWEJaUiwgRmQ0KCkpIE9HQzRHR0YgJ2InIEFGVSAncDInIEJjWCA4WC5lZ29FUnpaX2pYID0gJyRlZ29FUnpaX2pYJyBCY1ggOFguaklfalggPSAnJGpJX2pYJyBCY1ggKDhYLkJfWTlSZ19xZ29ZZSA9ICckWTlSZ19xZ29ZZV9qWCcgZFMgckooOGcuWTlSZ19qWCBybCBGc2ZmLCAyLCA3KSA+IDIpIEJjWCA4WC54WWp3WFJnX2pYID0gJyR4WWp3WFJnX2pYJyBCY1ggOFguQl85WkJaWTkgRmRDIHJGKDcsSCxOKSkgQjkgJ2ItcDInLAogICAgICAgICAgICAobEdmR1dDIFdkc0ZDKDhYLmpYKSBKU2Q1IDhvZ2FWd284X2pJIEFsIDhYCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF9qSV9CZ293UjkgQWwgOGcgZEYgKDhnLlk5UmdfalggPSAnJFk5UmdfalgnIEFGVSA4WC5CX3hZandYUmdfNkJ3WVJfalggPSA4Zy54WWp3WFJnXzZCd1lSX2pYIEFGVSA4WC54WWp3WFJnX2pYID0gOGcueFlqd1hSZ19qWCAgQUZVIDhYLmpJX2pYID0gOGcuaklfalggQUZVIDhYLmdSem9nWF85UlpfalggPSA4Zy5nUnpvZ1hfOVJaX2pYKSAKICAgICAgICAgICAgNG5HU0cgOHguOVpCWlk5PSc3JyBBRlUgVUFDR1VySkooOFguQl9aQmdxUlpfWEJaUiwgRmQ0KCkpIE9HQzRHR0YgJ3AyJyBBRlUgJ0hOJyBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1k5UmdfcWdvWWUgPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICdwMi1ITicsCiAgICAgICAgICAgIChsR2ZHV0MgV2RzRkMoOFgualgpIEpTZDUgOG9nYVZ3bzhfakkgQWwgOFgKICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X3hZandYUmcgQWwgOHggZEYgKDhYLnhZandYUmdfalggPSA4eC5qWCkKICAgICAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X2pJX0Jnb3dSOSBBbCA4ZyBkRiAoOGcuWTlSZ19qWCA9ICckWTlSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9IDhnLnhZandYUmdfNkJ3WVJfalggQUZVIDhYLnhZandYUmdfalggPSA4Zy54WWp3WFJnX2pYICBBRlUgOFguaklfalggPSA4Zy5qSV9qWCBBRlUgOFguZ1J6b2dYXzlSWl9qWCA9IDhnLmdSem9nWF85UlpfalgpIAogICAgICAgICAgICA0bkdTRyA4eC45WkJaWTk9JzcnIEFGVSBVQUNHVXJKSig4WC5CX1pCZ3FSWl9YQlpSLCBGZDQoKSkgPkhOIEJjWCA4WC5lZ29FUnpaX2pYID0gJyRlZ29FUnpaX2pYJyBCY1ggOFguaklfalggPSAnJGpJX2pYJyBCY1ggKDhYLkJfWTlSZ19xZ29ZZSA9ICckWTlSZ19xZ29ZZV9qWCcgZFMgckooOGcuWTlSZ19qWCBybCBGc2ZmLCAyLCA3KSA+IDIpIEJjWCA4WC54WWp3WFJnX2pYID0gJyR4WWp3WFJnX2pYJyBCY1ggOFguQl85WkJaWTkgRmRDIHJGKDcsSCxOKSkgQjkgJz5ITicKICAgICAgICAgICAgIik7CgoKCgogICAgICAgIC8vY284IFpnVAogICAgICAgIC8vJFppajktPjlaaS0+eGpjWGhCd1lSKCI6c2xHU3JVIiwgJFk5UmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAvLyAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6U2RmRyIsICRZOVJnX3Fnb1llX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8gICRaaWo5LT45WmktPnhqY1hoQndZUigiOlFTZEtHV0NyVSIsICRlZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8gJFppajktPjlaaS0+eGpjWGhCd1lSKCI6ckZVRzM1QWxDR1NyVSIsICRqSV9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgIC8vICAkWmlqOS0+OVppLT54amNYaEJ3WVIoIjpPc3JmVUdTclUiLCAkeFlqd1hSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAvL2VnamNaX2coJFppajktPjlaaS0+Umdnb2dyY1ZvKCkpOyBYalIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBxUlo0b2dhVndvOEE5OWpxY1JYT1lqd1hSZ09UWG96OVJaKCRYb3pfOVJaLCAkOVpSZSkgewogICAgICAgIC8vUnppbyAibEdmR1dDICogSlNkNSA4b2dhVndvOF94WWp3WFJnX1hvel85UlogOHhYOSA4aVJnUiA4eFg5LnhZandYUmdfNkJ3WVJfalggPSAkOVpSZSBCY1ggWG96XzlSWl82QndZUl9qWCA9ICRYb3pfOVJaIjsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X3hZandYUmdfWG96XzlSWiA4eFg5IDhpUmdSIDh4WDkueFlqd1hSZ182QndZUl9qWCA9ICQ5WlJlIEJjWCBYb3pfOVJaXzZCd1lSX2pYID0gJFhvel85UloiKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgVlljelpqb2MgcVJaNG9nYVZ3bzhkNlJnWFlSX1VZUl9Gb1pYWVIoJFk5UmdfcWdvWWVfalgsICRlZ29FUnpaX2pYLCAkaklfalgsICRaQmdxUlpfWEJUOSwgJHhZandYUmdfalgpIHsKCiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDICgKICAgICAgICBsR2ZHV0Mgem9ZY1ooalgpIEpTZDUgOG9nYVZ3bzhfakkKICAgICAgICA0bkdTRyBlZ29FUnpaX2pYID0gOlFTZEtHV0NyVSBCY1ggaklfalggPSA6ckZVRzM1QWxDR1NyVSBCY1ggQl9ZOVJnX3Fnb1llID0gOlNkZkcgQmNYIEJfOVpCWlk5IEZkQyByRig3LEgsTikgQmNYIHhZandYUmdfalggPSA6T3NyZlVHU3JVIEJjWCAgVUFDRyhVQUNHX0FVVShZZVhCWlJYX0JaLHJGQ0dTaEFmIDpDQVN0R0NfVUFQbCBVQVApKSA8IFVBQ0coellnWEJaUigpKSkgIEI5ICdvNlJnWFlSJywKICAgICAgICAobEdmR1dDIHpvWWNaKGpYKSBKU2Q1IDhvZ2FWd284X2pJCiAgICAgICAgNG5HU0cgZWdvRVJ6Wl9qWCA9IDpRU2RLR1dDclUgQmNYIGpJX2pYID0gOnJGVUczNUFsQ0dTclUgQmNYIEJfWTlSZ19xZ29ZZSA9IDpTZGZHIEJjWCBCXzlaQlpZOSBGZEMgckYoNyxILE4pIEJjWCB4WWp3WFJnX2pYID0gOk9zcmZVR1NyVSBCY1ggIFVBQ0coVUFDR19BVVUoWWVYQlpSWF9CWixyRkNHU2hBZiA6Q0FTdEdDX1VBUGwgVUFQKSkgPSBVQUNHKHpZZ1hCWlIoKSkpIEI5ICdYWVInLAogICAgICAgIChsR2ZHV0Mgem9ZY1ooalgpIEpTZDUgOG9nYVZ3bzhfakkKICAgICAgICA0bkdTRyBlZ29FUnpaX2pYID0gOlFTZEtHV0NyVSBCY1ggaklfalggPSA6ckZVRzM1QWxDR1NyVSBCY1ggQl9ZOVJnX3Fnb1llID0gOlNkZkcgQmNYIEJfOVpCWlk5IEZkQyByRig3LEgsTikgQmNYIHhZandYUmdfalggPSA6T3NyZlVHU3JVIEJjWCAgVUFDRyhVQUNHX0FVVShZZVhCWlJYX0JaLHJGQ0dTaEFmIDpDQVN0R0NfVUFQbCBVQVApKSA+IFVBQ0coellnWEJaUigpKSkgQjkgJ2NvWlhZUiciKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoIjpTZGZHIiwgJFk5UmdfcWdvWWVfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoIjpRU2RLR1dDclUiLCAkZWdvRVJ6Wl9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOnJGVUczNUFsQ0dTclUiLCAkaklfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoIjpDQVN0R0NfVUFQbCIsICRaQmdxUlpfWEJUOSwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOk9zcmZVR1NyVSIsICR4WWp3WFJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKICAgIFZZY3paam9jIFllWEJaUl9COTlqcWNfZ293Ul9ZOVJncWdvWWVfNygkZ293Ul9aKSB7CgovLyAgICAgICAgUnppbyAiWWVYQlpSIDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llIDlSWiBZOVJnX3Fnb1llX2pYID0gJFppajktPlk5UmdfcWdvWWVfalggOGlSZ1IgZWdvRVJ6Wl9qWCA9ICRaaWo5LT5lZ29FUnpaX2pYICBBRlUgZ293Ul9JQjlaUmdfalggPSAkWmlqOS0+Z293Ul9JQjlaUmdfalggQUZVIGdvd1JfWlRlUiA9ICRaaWo5LT5nb3dSX1pUZVIiO1hqUjsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJZZVhCWlIgOG9nYVZ3bzhfZ293Ul9ZOVJncWdvWWUgOVJaIFk5UmdfcWdvWWVfalggPSA6c2xHU3RTZHNRclUsIGdvd1JfWlRlUiA9IDpTZGZHQ1BRRyA4aVJnUiBlZ29FUnpaX2pYID0gOlFyVSAgQUZVIGdvd1JfSUI5WlJnX2pYID0gOlNkZkc1QWxDR1NyVSBBRlUgZ293Ul9aVGVSID0gJyRnb3dSX1onIik7CgoKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHNUFsQ0dTclUnLCAkWmlqOS0+Z293Ul9JQjlaUmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpTZGZHQ1BRRycsICRaaWo5LT5nb3dSX1pUZVIsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTdFNkc1FyVScsICRaaWo5LT5ZOVJnX3Fnb1llX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6UXJVJywgJFppajktPmVnb0VSelpfalgsIFFVZDo6UUFTQTVfbENTKTsKCgogICAgICAgIGdSWllnYyAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICB9CgoKICAgIFZZY3paam9jIHFSWjRvZ2FWd284QTk5anFjUlhPWWp3WFJnVVJaQmp3OSgkZ293Ul9qWCkgewogICAgICAgIC8vUnppbyAibEdmR1dDICogSlNkNSA4b2dhVndvOF9nb3dSX1k5UmdxZ29ZZSAgOGlSZ1IgWTlSZ19xZ29ZZV9qWCA9ICRnb3dSX2pYIjsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llICA4aVJnUiBZOVJnX3Fnb1llX2pYID0gJGdvd1JfalggIik7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dyhRVWQ6OkpHQ1duX0FsbGRXKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCgogICAgVlljelpqb2MgcVJaX1Nvd1I1QjlaUmdfbFpCWlk5Q1RlUigkWTlSZ19aVGVSKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293UjkgNG5HU0cgZWdvRVJ6Wl9qWCA9IDpRU2RLR1dDclUgQUZVIDlaQlpZOSA9IDpsQ0FDc2wgIEJjWCBZOVJnX1pUZVIgPSAkWTlSZ19aVGVSIGRTVUdTIE9QIGpYIFVHbFciLCBCZ2dCVChRVWQ6OkFDQ1NfV3NTbGRTID0+IFFVZDo6V3NTbGRTX0o0VWRGZlApKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKEJnZ0JUKCc6UVNkS0dXQ3JVJyA9PiAkWmlqOS0+ZWdvRVJ6Wl9qWCwgJzpsQ0FDc2wnID0+ICRaaWo5LT45WkJaWTkpKTsKCiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgCiAgIAogICAgVlljelpqb2MgcVJaNG9nYVZ3bzhRUmNYamNxQ29Tb3dST1RzOVJnVVJlKCRZOVJnX2pYLCAkWTlSZ19xZ29ZZV9qWCwgJGVnb0VSelpfalgsICRqSV9qWCwgJHhZandYUmdfalgpIHsKCiAgICAgICAgLy9SemlvICRZOVJnX2pYLicsICcuJFk5UmdfcWdvWWVfalguJywgJy4kZWdvRVJ6Wl9qWC4nLCAnLiRqSV9qWC4nLCAnLiR4WWp3WFJnX2pYOwoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKGxHZkdXQyBXZHNGQyg4WC5qWCkgSlNkNSA4b2dhVndvOF9qSSBBbCA4WAogICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgZkdKQyBkc0NHUyBLZHJGIDhvZ2FWd284X2pJX0Jnb3dSOSBBbCA4ZyBkRiAoOGcuWTlSZ19qWCA9ICckWTlSZ19qWCcgQUZVIDhYLkJfeFlqd1hSZ182QndZUl9qWCA9IDhnLnhZandYUmdfNkJ3WVJfalggQUZVIDhYLnhZandYUmdfalggPSA4Zy54WWp3WFJnX2pYICBBRlUgOFguaklfalggPSA4Zy5qSV9qWCBBRlUgOFguZ1J6b2dYXzlSWl9qWCA9IDhnLmdSem9nWF85UlpfalgpIAogICAgICAgICAgICA0bkdTRyA4eC45WkJaWTk9JzcnIEFGVSBVQUNHVXJKSig4WC5CX1pCZ3FSWl9YQlpSLCBGZDQoKSkgPD0gNyBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1hSZUJnWklSY1pfalggPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICc8PTcnLAogICAgICAgICAgICAobEdmR1dDIFdkc0ZDKDhYLmpYKSBKU2Q1IDhvZ2FWd284X2pJIEFsIDhYCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF9qSV9CZ293UjkgQWwgOGcgZEYgKDhnLlk5UmdfalggPSAnJFk5UmdfalgnIEFGVSA4WC5CX3hZandYUmdfNkJ3WVJfalggPSA4Zy54WWp3WFJnXzZCd1lSX2pYIEFGVSA4WC54WWp3WFJnX2pYID0gOGcueFlqd1hSZ19qWCAgQUZVIDhYLmpJX2pYID0gOGcuaklfalggQUZVIDhYLmdSem9nWF85UlpfalggPSA4Zy5nUnpvZ1hfOVJaX2pYKSAKICAgICAgICAgICAgNG5HU0cgOHguOVpCWlk5PSc3JyBBRlUgVUFDR1VySkooOFguQl9aQmdxUlpfWEJaUiwgRmQ0KCkpIE9HQzRHR0YgJ3AnIEFGVSAnTicgQmNYIDhYLmVnb0VSelpfalggPSAnJGVnb0VSelpfalgnIEJjWCA4WC5qSV9qWCA9ICckaklfalgnIEJjWCAoOFguQl9YUmVCZ1pJUmNaX2pYID0gJyRZOVJnX3Fnb1llX2pYJyBkUyBySig4Zy5ZOVJnX2pYIHJsIEZzZmYsIDIsIDcpID4gMikgQmNYIDhYLnhZandYUmdfalggPSAnJHhZandYUmdfalgnIEJjWCA4WC5CXzlaQlpZOSBGZEMgckYoNyxILE4pKSBCOSAncC1OJywKICAgICAgICAgICAgKGxHZkdXQyBXZHNGQyg4WC5qWCkgSlNkNSA4b2dhVndvOF9qSSBBbCA4WAogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfeFlqd1hSZyBBbCA4eCBkRiAoOFgueFlqd1hSZ19qWCA9IDh4LmpYKQogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfaklfQmdvd1I5IEFsIDhnIGRGICg4Zy5ZOVJnX2pYID0gJyRZOVJnX2pYJyBBRlUgOFguQl94WWp3WFJnXzZCd1lSX2pYID0gOGcueFlqd1hSZ182QndZUl9qWCBBRlUgOFgueFlqd1hSZ19qWCA9IDhnLnhZandYUmdfalggIEFGVSA4WC5qSV9qWCA9IDhnLmpJX2pYIEFGVSA4WC5nUnpvZ1hfOVJaX2pYID0gOGcuZ1J6b2dYXzlSWl9qWCkgCiAgICAgICAgICAgIDRuR1NHIDh4LjlaQlpZOT0nNycgQUZVIFVBQ0dVckpKKDhYLkJfWkJncVJaX1hCWlIsIEZkNCgpKSBPR0M0R0dGICdiJyBBRlUgJ3AyJyBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1hSZUJnWklSY1pfalggPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICdiLXAyJywKICAgICAgICAgICAgKGxHZkdXQyBXZHNGQyg4WC5qWCkgSlNkNSA4b2dhVndvOF9qSSBBbCA4WAogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfeFlqd1hSZyBBbCA4eCBkRiAoOFgueFlqd1hSZ19qWCA9IDh4LmpYKQogICAgICAgICAgICBmR0pDIGRzQ0dTIEtkckYgOG9nYVZ3bzhfaklfQmdvd1I5IEFsIDhnIGRGICg4Zy5ZOVJnX2pYID0gJyRZOVJnX2pYJyBBRlUgOFguQl94WWp3WFJnXzZCd1lSX2pYID0gOGcueFlqd1hSZ182QndZUl9qWCBBRlUgOFgueFlqd1hSZ19qWCA9IDhnLnhZandYUmdfalggIEFGVSA4WC5qSV9qWCA9IDhnLmpJX2pYIEFGVSA4WC5nUnpvZ1hfOVJaX2pYID0gOGcuZ1J6b2dYXzlSWl9qWCkgCiAgICAgICAgICAgIDRuR1NHIDh4LjlaQlpZOT0nNycgQUZVIFVBQ0dVckpKKDhYLkJfWkJncVJaX1hCWlIsIEZkNCgpKSBPR0M0R0dGICdwMicgQUZVICdITicgQmNYIDhYLmVnb0VSelpfalggPSAnJGVnb0VSelpfalgnIEJjWCA4WC5qSV9qWCA9ICckaklfalgnIEJjWCAoOFguQl9YUmVCZ1pJUmNaX2pYID0gJyRZOVJnX3Fnb1llX2pYJyBkUyBySig4Zy5ZOVJnX2pYIHJsIEZzZmYsIDIsIDcpID4gMikgQmNYIDhYLnhZandYUmdfalggPSAnJHhZandYUmdfalgnIEJjWCA4WC5CXzlaQlpZOSBGZEMgckYoNyxILE4pKSBCOSAncDItSE4nLAogICAgICAgICAgICAobEdmR1dDIFdkc0ZDKDhYLmpYKSBKU2Q1IDhvZ2FWd284X2pJIEFsIDhYCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF94WWp3WFJnIEFsIDh4IGRGICg4WC54WWp3WFJnX2pYID0gOHgualgpCiAgICAgICAgICAgIGZHSkMgZHNDR1MgS2RyRiA4b2dhVndvOF9qSV9CZ293UjkgQWwgOGcgZEYgKDhnLlk5UmdfalggPSAnJFk5UmdfalgnIEFGVSA4WC5CX3hZandYUmdfNkJ3WVJfalggPSA4Zy54WWp3WFJnXzZCd1lSX2pYIEFGVSA4WC54WWp3WFJnX2pYID0gOGcueFlqd1hSZ19qWCAgQUZVIDhYLmpJX2pYID0gOGcuaklfalggQUZVIDhYLmdSem9nWF85UlpfalggPSA4Zy5nUnpvZ1hfOVJaX2pYKSAKICAgICAgICAgICAgNG5HU0cgOHguOVpCWlk5PSc3JyBBRlUgVUFDR1VySkooOFguQl9aQmdxUlpfWEJaUiwgRmQ0KCkpID5ITiBCY1ggOFguZWdvRVJ6Wl9qWCA9ICckZWdvRVJ6Wl9qWCcgQmNYIDhYLmpJX2pYID0gJyRqSV9qWCcgQmNYICg4WC5CX1hSZUJnWklSY1pfalggPSAnJFk5UmdfcWdvWWVfalgnIGRTIHJKKDhnLlk5UmdfalggcmwgRnNmZiwgMiwgNykgPiAyKSBCY1ggOFgueFlqd1hSZ19qWCA9ICckeFlqd1hSZ19qWCcgQmNYIDhYLkJfOVpCWlk5IEZkQyByRig3LEgsTikpIEI5ICc+SE4nCiAgICAgICAgICAgICIpOwoKCgoKICAgICAgICAvL2NvOCBaZ1QKICAgICAgICAvLyRaaWo5LT45WmktPnhqY1hoQndZUigiOnNsR1NyVSIsICRZOVJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgLy8gICRaaWo5LT45WmktPnhqY1hoQndZUigiOlNkZkciLCAkWTlSZ19xZ29ZZV9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgIC8vICAkWmlqOS0+OVppLT54amNYaEJ3WVIoIjpRU2RLR1dDclUiLCAkZWdvRVJ6Wl9qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgIC8vICRaaWo5LT45WmktPnhqY1hoQndZUigiOnJGVUczNUFsQ0dTclUiLCAkaklfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAvLyAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6T3NyZlVHU3JVIiwgJHhZandYUmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgLy9lZ2pjWl9nKCRaaWo5LT45WmktPlJnZ29ncmNWbygpKTsgWGpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgCiAgIAogICAgVlljelpqb2MgcVJaXzhvZ2FWd284X2pJSmp3Ulg5X2ZZOVJnOSgkZWpYLCAkeGpYLCAkeDZqWCwgJGpJX2pYLCAkaklfZ2pYLCRZOVJnX2pYKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfaklfd1k5Umc5IDRuR1NHIGVnb0VSelpfalg9OlFyVSBBRlUgeFlqd1hSZ19qWCA9IDpPclUgQUZVIHhZandYUmdfNkJ3WVJfalggPSA6T2hyVSBBRlUgaklfalggPSA6cjVyVSBBRlUgZ1J6b2dYXzlSWl9qWCA9IDpyNVNyVSBCY1ggWTlSZ19qWCA9IDpzbEdTclUgQmNYIDlaQlpZOSA9IHAyIGRTVUdTIE9QIGpYIEFsVyIpOwoKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpRclUnLCAkZWpYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6T3JVJywgJHhqWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOk9oclUnLCAkeDZqWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOnI1clUnLCAkaklfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpyNVNyVScsICRqSV9nalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpzbEdTclUnLCAkWTlSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBxUlpfOG9nYVZ3bzhfOVpSZV9CenpSOTlfZlk5Umc5KCRlalgsICR4algsICR4NmpYLCAkaklfalgsICRqSV9nalgsJFk5UmdfalgpIHsKCiAgICAgICAgLy9SemlvICJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284XzlaQlpZOV9qSSA0bkdTRyBlZ29FUnpaX2pYPSAkZWpYIEFGVSB4WWp3WFJnX2pYID0gJHhqWCBBRlUgeFlqd1hSZ182QndZUl9qWCA9ICR4NmpYIEFGVSBnUnpvZ1hfOVJaX2pYID0gJGpJX2dqWCBCY1ggemdSQlpSWF94VCA9ICRZOVJnX2pYIEJjWCA5WkJaWTkgamMocDcscHApIGRTVUdTIE9QIGpYIEFsVyI7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfOVpCWlk5X2pJIDRuR1NHIGVnb0VSelpfalg9OlFyVSBBRlUgeFlqd1hSZ19qWCA9IDpPclUgQUZVIHhZandYUmdfNkJ3WVJfalggPSA6T2hyVSBBRlUgZ1J6b2dYXzlSWl9qWCA9IDpyNVNyVSBCY1ggemdSQlpSWF94VCA9IDpzbEdTclUgQmNYIDlaQlpZOSBqYyhwNyxwcCkgZFNVR1MgT1AgalggQWxXIik7CgogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlFyVScsICRlalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpPclUnLCAkeGpYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6T2hyVScsICR4NmpYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAvLyAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpyNXJVJywgJGpJX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6cjVTclUnLCAkaklfZ2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6c2xHU3JVJywgJFk5UmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CiAgICAKICAgIC8vICBsWkJnWiBaaVIgWTlSZyB4QjlSIDRWIERZUmdUCgoKCgogICAgVlljelpqb2MgcVJaczlSZ3JjVm8oJDZCd1lSKXsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgWS5WY0JJUixZLndjQklSLDhnLjhfZ293Ul9qWCw4Lmdvd1JfSUI5WlJnIEpTZDUgOG9nYVZ3bzhfZ293UjkgOCByRkZHUyBLZHJGCiAgICAgICAgOG9nYVZ3bzhfZ293Ul9ZOVJnOSA4ZyBkRiA4LmpYPThnLjhfZ293Ul9qWCByRkZHUyBLZHJGIFk5UmcgWSBkRiBZLmpYID04Zy5ZOVJnX2pYIDRuR1NHIDgualg9Ii4kNkJ3WVIpOyAKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgVlljelpqb2MgcVJTb3dSNUI5WlJnX0E5OWpxY1JYX1Nvd1JyWCgkZ293Ul9JQjlaUmdfalgpIHsKCQkkRFlSZ1QgPSJsR2ZHV0MgWS5qWCwgWS5WY0JJUiwgWS5JY0JJUiwgWS53Y0JJUiwgOC5ZOVJnX2dvd1IgSlNkNSA4b2dhVndvOF9nb3dSX1k5Umc5IEFsIDgKICAgICAgICBmR0pDIGRzQ0dTIEtkckYgWTlSZyBBbCBZIGRGIFkualggPSA4Llk5UmdfalgKICAgICAgICBmR0pDIGRzQ0dTIEtkckYgd29xamNfSUI5WiBBbCB3IGRGIFkualggPSB3Llk5UmdfalgKICAgICAgICBmR0pDIGRzQ0dTIEtkckYgWTlSZ19xZ29ZZSBBbCBxIGRGIChKckZVX3JGX2xHQyhxLmpYLCB3Lmdvd1IpID4gMiBkUyBKckZVX3JGX2xHQyhxLmpYLCB3LkJ3Wl9nb3dSKSA+IDIpCiAgICAgICAgNG5HU0cgdy5nb3dSICE9ICdwJyBBRlUgdy5nb3dSICE9ICc3JyBBRlUgdy5ZOVJnXzlaQlpZOSA9ICc3JyBBRlUgOC44X2dvd1JfalggPSAkZ293Ul9JQjlaUmdfalgKICAgICAgICB0U2RzUSBPUCB3Llk5UmdfalggZFNVR1MgT1AgWS5WY0JJUiBBbFciOwoJIAogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoJERZUmdUKTsKCiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKICAgIFZZY3paam9jIEJYWF9BOTlqcWNfczlSZ19Tb3dSKCkgewoKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJqYzlSZ1ogamNabyA4b2dhVndvOF9nb3dSX1k5Umc5IChlZ29FUnpaX2pYLCA4X2dvd1JfalgsIFk5UmdfalgsIFhSZUJnWklSY1pfalgpIDZCd1lSOSg6UVNkS0dXQ3JVLCA6U2RmRzVBbENHU3JVLCA6c2xHU3JVLCA6VUdRQVNDNUdGQykiKTsKCgogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlFTZEtHV0NyVScsICRaaWo5LT5lZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6U2RmRzVBbENHU3JVJywgJFppajktPmdvd1JfSUI5WlJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCc6c2xHU3JVJywgJFppajktPlk5UmdfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAkWmlqOS0+OVppLT54amNYaEJ3WVIoJzpVR1FBU0M1R0ZDJywgJFppajktPlhSZUJnWklSY1pfalgsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICAKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5YeC0+d0I5WnJjOVJnWnJYKCk7CiAgICB9CgogICAgVlljelpqb2MgcVJaNG9nYVZ3bzhBOTlqcWNSWHM5UmdVUlpCanc5KCRnb3dSX2pYKSB7CiAgICAgICAgLy9SemlvICJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llICA4aVJnUiBZOVJnX3Fnb1llX2pYID0gJGdvd1JfalgiOwogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJnOSAgOGlSZ1IgOF9nb3dSX2pYID0gJGdvd1JfalggIik7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dyhRVWQ6OkpHQ1duX0FsbGRXKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBYUndSWlJfQTk5anFjX3M5UmdfU293UigkNkJ3WVIpIHsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJYUndSWlIgVmdvSSA4b2dhVndvOF9nb3dSX1k5Umc5IDhpUmdSIDhfZ293Ul9qWD0gOnJVIik7CiAgICAgICAgJFppajktPjlaaS0+eGpjWGhCd1lSKCI6clUiLCAkNkJ3WVIsIFFVZDo6UUFTQTVfbENTKTsKICAgICAgICBnUlpZZ2MgJFppajktPjlaaS0+UjFSellaUigpOwogICAgfQoKICAgVlljelpqb2MgcVJaNG9nYVZ3bzhBczlSZ0E5OWpxY1JYT1lqd1hSZ1VSWkJqdzlfb3dYKCRnb3dSX2pYLCRZOVJnX2pYLCRYUmVCZ1pJUmNaX2pYKSB7CiAgICAgICAgLy9SemlvICJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X2dvd1JfWTlSZ3Fnb1llICA4aVJnUiBZOVJnX3Fnb1llX2pYID0gJGdvd1JfalgiOwogICAgICAgIC8vIFJ6aW8gImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJnOSAgOGlSZ1IgOF9nb3dSX2pYID0gJGdvd1JfalggQmNYIFk5UmdfalggPSAkWTlSZ19qWCBCY1ggWFJlQmdaSVJjWl9qWCA9ICRYUmVCZ1pJUmNaX2pYICI7CiAgICAgICAgICAgICAgICAvL1J6aW8iPHhnPiI7CiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDICogSlNkNSA4b2dhVndvOF9nb3dSX1k5Umc5ICA4aVJnUiA4X2dvd1JfalggPSAkZ293Ul9qWCBCY1ggWTlSZ19qWCA9ICRZOVJnX2pYIEJjWCBYUmVCZ1pJUmNaX2pYID0gJFhSZUJnWklSY1pfalgiKTsKICAgICAgICAkWmlqOS0+OVppLT5SMVJ6WVpSKCk7CiAgICAgICAgJFppajktPmdSWllnYyA9ICRaaWo5LT45WmktPlZSWnppQXd3KFFVZDo6SkdDV25fQWxsZFcpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQogICAgVlljelpqb2MgcVJaNG9nYVZ3bzhzOVJnVVJlQmdaSVJjWigkZ293Ul9qWCwkWTlSZ19qWCwkWFJlQmdaSVJjWl9qWCkgewogICAgICAgIC8vUnppbyAibEdmR1dDICogSlNkNSA4b2dhVndvOF9nb3dSX1k5UmdxZ29ZZSAgOGlSZ1IgWTlSZ19xZ29ZZV9qWCA9ICRnb3dSX2pYIjsKICAgICAgICAvL1J6aW8gImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJnOSAgOGlSZ1IgOF9nb3dSX2pYID0gJGdvd1JfalggQmNYIFhSZUJnWklSY1pfalggPSAkWFJlQmdaSVJjWl9qWCAiOwogICAgICAgIDsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X2dvd1JfWTlSZzkgIDhpUmdSIDhfZ293Ul9qWCA9ICRnb3dSX2pYICBCY1ggWFJlQmdaSVJjWl9qWCA9ICRYUmVCZ1pJUmNaX2pYICIpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coUVVkOjpKR0NXbl9BbGxkVyk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CgogICAgVlljelpqb2MgcVJaNG9nYVZ3bzhBOTlqcWNSWENvU293Uk9UczlSZygkWTlSZ19qWCwgJGVnb0VSelpfalgpIHsKICAgICAgIC8vIFJ6aW8gImxHZkdXQyA4eDYualgsOHg2LnhZandYUmdfalgsOHg2LjlaUmVfY0JJUiw4eC44b2dhVndvOF9aalp3Uiw4ajkuaklfalgsdFNkc1FfV2RGV0FDKDh4WDkuWG96XzlSWl82QndZUl9qWCkgQjkgWG96XzlSWl82QndZUjksOHg2LlpCZ3FSWl9YQlQ5IAogICAgICAgLy8gICAgICAgICAgSlNkNSA4b2dhVndvOF94WWp3WFJnXzZCd1lSOSA4eDYKICAgICAgIC8vICAgICAgICAgIGZHSkMgS2RyRiA4b2dhVndvOF9nWXdSOSA4ZyBkRiA4Zy5qWCA9IDh4Ni5nWXdSX2pYCiAgICAgICAvLyAgICAgICAgICBmR0pDIEtkckYgOG9nYVZ3bzhfVm9nSVl3QjkgOFYgb2MgOFYuZ1l3Ul9qWCA9IDh4Ni5nWXdSX2pYIAogICAgICAgLy8gICAgICAgICAgS2RyRiA4b2dhVndvOF9nb3dSX1k5Umc5IDhnWSBvYyAoOGdZLjhfZ293Ul9qWCA9IDh4Ni5nb3dSX0lCOVpSZ19qWCBBRlUgOHg2Lmdvd1JfSUI5WlJnX2pYIDw+IC03KSAKICAgICAgIC8vICAgICAgICAgIEtkckYgOG9nYVZ3bzhfeFlqd1hSZyA4eCBvYyA4eDYueFlqd1hSZ19qWCA9IDh4LmpYCiAgICAgICAvLyAgICAgICAgICBmR0pDIEtkckYgOG9nYVZ3bzhfaklfOVJaWmpjcTkgOGo5IG9jIDhqOS44Vl9qWCA9IDh4Ni54WWp3WFJnX2pYIEJjWCA4ajkuaklfalggQmNYIDhqOS5qSV9qWCAhPSAyCiAgICAgICAvLyAgICAgICAgICBmR0pDIEtkckYgOG9nYVZ3bzhfeFlqd1hSZ19Yb3pfOVJaIDh4WDkgZEYgOHg2LmpYID0gOHhYOS54WWp3WFJnXzZCd1lSX2pYCiAgICAgICAvLyAgICAgICAgICA0aVJnUiA4Z1kuWTlSZ19qWCA9ICRZOVJnX2pYIEJjWCA4eDYuZWdvRVJ6Wl9qWCA9ICRlZ29FUnpaX2pYIEFGVSA4eC45WkJaWTkgPSAnNycKICAgICAgIC8vICAgICAgICAgIHRTZHNRIE9QIDh4Ni5qWCI7CiAgICAgICAgJFppajktPjlaaSA9ICRaaWo5LT5YeC0+ZWdSZUJnUigibEdmR1dDIDh4Ni5qWCw4eDYueFlqd1hSZ19qWCw4eDYuOVpSZV9jQklSLDh4LjhvZ2FWd284X1pqWndSLDhqOS5qSV9qWCx0U2RzUV9XZEZXQUMoOHhYOS5Yb3pfOVJaXzZCd1lSX2pYKSBCOSBYb3pfOVJaXzZCd1lSOSw4eDYuWkJncVJaX1hCVDkgCiAgICAgICAgICAgICAgICBKU2Q1IDhvZ2FWd284X3hZandYUmdfNkJ3WVI5IDh4NgogICAgICAgICAgICAgICAgZkdKQyBLZHJGIDhvZ2FWd284X2dZd1I5IDhnIGRGIDhnLmpYID0gOHg2LmdZd1JfalgKICAgICAgICAgICAgICAgIGZHSkMgS2RyRiA4b2dhVndvOF9Wb2dJWXdCOSA4ViBvYyA4Vi5nWXdSX2pYID0gOHg2LmdZd1JfalggCiAgICAgICAgICAgICAgICBLZHJGIDhvZ2FWd284X2dvd1JfWTlSZzkgOGdZIG9jICg4Z1kuOF9nb3dSX2pYID0gOHg2Lmdvd1JfSUI5WlJnX2pYIEFGVSA4eDYuZ293Ul9JQjlaUmdfalggPD4gLTcpIAogICAgICAgICAgICAgICAgS2RyRiA4b2dhVndvOF94WWp3WFJnIDh4IG9jIDh4Ni54WWp3WFJnX2pYID0gOHgualgKICAgICAgICAgICAgICAgIGZHSkMgS2RyRiA4b2dhVndvOF9qSV85UlpaamNxOSA4ajkgb2MgOGo5LjhWX2pYID0gOHg2LnhZandYUmdfalggQmNYIDhqOS5qSV9qWCBCY1ggOGo5LmpJX2pYICE9IDIKICAgICAgICAgICAgICAgIGZHSkMgS2RyRiA4b2dhVndvOF94WWp3WFJnX1hvel85UlogOHhYOSBkRiA4eDYualggPSA4eFg5LnhZandYUmdfNkJ3WVJfalgKICAgICAgICAgICAgICAgIDRpUmdSIDhnWS5ZOVJnX2pYID06U2RmRyBCY1ggOHg2LmVnb0VSelpfalggPTpRU2RLR1dDclUgQUZVIDh4LjlaQlpZOSA9ICc3JwogICAgICAgICAgICAgICAgdFNkc1EgT1AgOHg2LmpYOyIpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOlNkZkciLCAkWTlSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUigiOlFTZEtHV0NyVSIsICRlZ29FUnpaX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoKICAgIFZZY3paam9jIHFSWkF3dzRvZ2FWd284czlSZ1VSZUJnWklSY1ooJGdvd1JfalgpIHsKICAgICAgICAvL1J6aW8gImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJncWdvWWUgIDhpUmdSIFk5UmdfcWdvWWVfalggPSAkZ293Ul9qWCI7CiAgICAgICAgLy9SemlvICJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X2dvd1JfWTlSZzkgIDhpUmdSIDhfZ293Ul9qWCA9ICRnb3dSX2pYICAiOwogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293Ul9ZOVJnOSAgOGlSZ1IgOF9nb3dSX2pYID0gJGdvd1JfalggICIpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coUVVkOjpKR0NXbl9BbGxkVyk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CiAgICBWWWN6WmpvYyBxUlo0b2dhVndvOEFzOVJnQTk5anFjUlhPWWp3WFJnVVJaQmp3OSgkZ293Ul9qWCwkWTlSZ19qWCwkeFlqd1hSZ19qWCwgJGdSem9nWF85UlpfalgsICR4NmpYKSB7CiAgICAgICAvL1J6aW8gImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfaklfQmdvd1I5IDhqSUIgamNjUmcgRW9qYyA4b2dhVndvOF9nb3dSX1k5Umc5IDhnWSBvYyA4aklCLlk5UmdfalggPSA4Z1kuWTlSZ19qWCA0bkdTRyA4X2dvd1JfalggPSAkZ293Ul9qWCBBRlUgOGpJQi5ZOVJnX2pYID0gJFk5UmdfalggQUZVIHhZandYUmdfalggPSAkeFlqd1hSZ19qWCBBRlUgZ1J6b2dYXzlSWl9qWCA9ICRnUnpvZ1hfOVJaX2pYIEFGVSA4aklCLnhZandYUmdfNkJ3WVJfalggPSR4NmpYICAiOwogICAgICAgICAgICAgICAgLy9SemlvIjx4Zz4iOwogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfaklfQmdvd1I5IDhqSUIgamNjUmcgRW9qYyA4b2dhVndvOF9nb3dSX1k5Umc5IDhnWSBvYyA4aklCLlk5UmdfalggPSA4Z1kuWTlSZ19qWAogICAgICAgICAgICAgICAgNG5HU0cgOF9nb3dSX2pYID0gJGdvd1JfalggQUZVIDhqSUIuWTlSZ19qWCA9ICRZOVJnX2pYIEFGVSB4WWp3WFJnX2pYID0gJHhZandYUmdfalggQUZVIGdSem9nWF85UlpfalggPSAkZ1J6b2dYXzlSWl9qWCBBRlUgOGpJQi54WWp3WFJnXzZCd1lSX2pYID0keDZqWCA7Iik7CiAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dyhRVWQ6OkpHQ1duX0FsbGRXKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCiAgICBWWWN6WmpvYyBxUlo0b2dhVndvOEFzOVJnQTk5anFjUlhPWWp3WFJnVVJaQmp3OV9BOWpxY19ab19ZOVJnKCRnb3dSX2pYLCRZOVJnX2pYLCR4WWp3WFJnX2pYLCAkZ1J6b2dYXzlSWl9qWCwgJHg2algpIHsKICAgICAgIC8vIFJ6aW8gImxHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfaklfQmdvd1I5IDhqSUIgamNjUmcgRW9qYyA4b2dhVndvOF9nb3dSX1k5Umc5IDhnWSBvYyA4aklCLlk5UmdfalggPSA4Z1kuWTlSZ19qWCA0bkdTRyA4X2dvd1JfalggPSAkZ293Ul9qWCBBRlUgOGpJQi5ZOVJnX2pYID0gJFk5UmdfalggQUZVIHhZandYUmdfalggPSAkeFlqd1hSZ19qWCBBRlUgZ1J6b2dYXzlSWl9qWCA9ICRnUnpvZ1hfOVJaX2pYIEFGVSA4aklCLnhZandYUmdfNkJ3WVJfalggPSR4NmpYICAiOwogICAgICAgIC8vUnppbyI8eGc+IjsKICAgICAgICAkWmlqOS0+OVppID0gJFppajktPlh4LT5lZ1JlQmdSKCJsR2ZHV0MgKiBKU2Q1IDhvZ2FWd284X2pJX0Jnb3dSOSA4aklCIAogICAgICAgIDRuR1NHICA4aklCLlk5UmdfalggPSAkWTlSZ19qWCBBRlUgeFlqd1hSZ19qWCA9ICR4WWp3WFJnX2pYIEFGVSBnUnpvZ1hfOVJaX2pYID0gJGdSem9nWF85UlpfalggQUZVIDhqSUIueFlqd1hSZ182QndZUl9qWCA9JHg2alggOyIpOwogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coUVVkOjpKR0NXbl9BbGxkVyk7CiAgICAgICAgZ1JaWWdjICRaaWo5LT5nUlpZZ2M7CiAgICB9CiAgLy8gIEdjWCBaaVIgWTlSZyB4QjlSIDRWIERZUmdUCiAgCiAgVlljelpqb2MgcVJaX1Nvd1I1QjlaUmdfT1RTb3dSQ1RlUigkZ293Ul9aVGVSKSB7CgkgICREWVJnVCA9J2xHZkdXQyAqIEpTZDUgOG9nYVZ3bzhfZ293UjkgNG5HU0cgZWdvRVJ6Wl9qWCA9ICcuJFppajktPmVnb0VSelpfalguJyBBRlUgOVpCWlk5ID0nLiAkWmlqOS0+OVpCWlk5LicgQUZVIFk5UmdfWlRlUiA9Jy4gJGdvd1JfWlRlUi4nIGRTVUdTIE9QIGpYIFVHbFcnOwoJIAogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoJERZUmdUKTsKICAgICAgICAgJFppajktPjlaaS0+UjFSellaUigpOwogICAgICAgICRaaWo5LT5nUlpZZ2MgPSAkWmlqOS0+OVppLT5WUlp6aUF3dygpOwogICAgICAgIGdSWllnYyAkWmlqOS0+Z1JaWWdjOwogICAgfQoJCglWWWN6WmpvYyBxUlpfU293UnM5UmdfeFRzdGdvWWUoKSB7CgogICAgICAgICRaaWo5LT45WmkgPSAkWmlqOS0+WHgtPmVnUmVCZ1IoImxHZkdXQyBqWCBKU2Q1IGA4b2dhVndvOF9nb3dSX1k5Umc5YCA0bkdTRyBZOVJnX2pYID0gOnNsR1NyVSBBRlUgOF9nb3dSX2pYID0gOlNkZkc1QWxDR1NyVSIpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOlNkZkc1QWxDR1NyVScsICRaaWo5LT5nb3dSX0lCOVpSZ19qWCwgUVVkOjpRQVNBNV9sQ1MpOwogICAgICAgICRaaWo5LT45WmktPnhqY1hoQndZUignOnNsR1NyVScsICRaaWo5LT5ZOVJnX2pYLCBRVWQ6OlFBU0E1X2xDUyk7CgogICAgICAgICRaaWo5LT45WmktPlIxUnpZWlIoKTsKICAgICAgICAkWmlqOS0+Z1JaWWdjID0gJFppajktPjlaaS0+VlJaemlBd3coKTsKICAgICAgICBnUlpZZ2MgJFppajktPmdSWllnYzsKICAgIH0KCgp9Cgo/Pg=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwneUFYV08zTXRLZWM4Q1lOU2owQmk2NTlwRmxnMlV2UWFMSm9HcUg3cklWWkRQYno0MW1rUkV3c2ZUbmh4ZHUnLCdRQWRDQlg5R0pwbndUdTVSaThhaHZNczJOU3IwRHpQazdGb0VnNDFJbWZ0cVk2Y1d4WjNlamxVTHlIVmJPSycpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R ?><?php class workflow_role { //********* VARIABLES ******..
$_C1353562110 ?><?php class workflow_role { //********* VARIABLES ******..

Stats

MD5 9ef69fb777136a731a3acb42ad1ce723
Eval Count 2
Decode Time 232 ms