text:
CreateEmptyTalents("pudge")

-------------------------------------------
--                Flesh Heap
-------------------------------------------
LinkLuaModifier("modifier_flesh_heap", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_flesh_heap_return_timer", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)

imba_pudge_flesh_heap = class({})
function imba_pudge_flesh_heap:IsHiddenWhenStolen() return true end
function imba_pudge_flesh_heap:IsRefreshable() return false end
function imba_pudge_flesh_heap:IsStealable() return false end
function imba_pudge_flesh_heap:IsNetherWardStealable() return false end
function imba_pudge_flesh_heap:IsInnateAbility() return true end

function imba_pudge_flesh_heap:GetAbilityTextureName()
   return "pudge_flesh_heap"
end
-------------------------------------------

function imba_pudge_flesh_heap:GetIntrinsicModifierName()
	return "modifier_flesh_heap"
end
-------------------------------------------
modifier_flesh_heap_return_timer = class({})
function modifier_flesh_heap_return_timer:IsDebuff() return true end
function modifier_flesh_heap_return_timer:IsHidden() return not IsInToolsMode() end
function modifier_flesh_heap_return_timer:IsPurgable() return false end
function modifier_flesh_heap_return_timer:IsPurgeException() return false end
function modifier_flesh_heap_return_timer:IsStunDebuff() return false end
function modifier_flesh_heap_return_timer:RemoveOnDeath() return true end
function modifier_flesh_heap_return_timer:AllowIllusionDuplicate() return false end
-------------------------------------------
function modifier_flesh_heap_return_timer:GetAttributes()
	return {MODIFIER_ATTRIBUTE_MULTIPLE}
end

function modifier_flesh_heap_return_timer:OnCreated()
 if IsServer() then
 	local modifier = self:GetParent():FindModifierByName(self:GetAbility():GetIntrinsicModifierName())
 	for i=0, self:GetParent():FindTalentValue("special_bonus_imba_pudge_2","stacks_needed")-1 do
 		modifier:DecrementStackCount()
 	end
 end
end

function modifier_flesh_heap_return_timer:OnDestroy()
	if IsServer() then
	 	local modifier = self:GetParent():FindModifierByName(self:GetAbility():GetIntrinsicModifierName())
	 	for i=0, self:GetParent():FindTalentValue("special_bonus_imba_pudge_2","stacks_needed")-1 do
	 		modifier:IncrementStackCount()
	 	end
  end
end
-------------------------------------------
modifier_flesh_heap = class({})
function modifier_flesh_heap:IsDebuff() return false end
function modifier_flesh_heap:IsHidden() return false end
function modifier_flesh_heap:IsPurgable() return false end
function modifier_flesh_heap:IsPurgeException() return false end
function modifier_flesh_heap:IsStunDebuff() return false end
function modifier_flesh_heap:RemoveOnDeath() return false end
function modifier_flesh_heap:AllowIllusionDuplicate() return true end
-------------------------------------------

function modifier_flesh_heap:OnCreated()
	if IsServer() then
		-- Set stack count for illusions
		local id = self:GetCaster():GetPlayerOwnerID()
		local hero = PlayerResource:GetSelectedHeroEntity(id)

		if hero and not hero.nKills then
			hero.nKills = 0
		end

		if hero then
			self:SetStackCount(hero.nKills)
		end
	end
end

function modifier_flesh_heap:DeclareFunctions()
		local decFuns =
		{
			MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
			MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
			MODIFIER_PROPERTY_MODEL_SCALE,
			MODIFIER_PROPERTY_TOTAL_CONSTANT_BLOCK,

			MODIFIER_EVENT_ON_DEATH,

		}
		return decFuns
end

function modifier_flesh_heap:GetModifierSpellLifesteal()
	local mult = self:GetCaster():FindTalentValue("special_bonus_imba_pudge_3") or 0
	return self:GetStackCount() * mult
end

function modifier_flesh_heap:GetModifierMagicalResistanceBonus()
	if self:GetParent():PassivesDisabled() then return end
	local resist = self:GetAbility():GetSpecialValueFor("base_magic_resist")
	local stack_resist = self:GetAbility():GetSpecialValueFor("stack_magic_resistance") * self:GetStackCount()
	stack_resist = math.min(stack_resist, self:GetAbility():GetSpecialValueFor("max_stack_resist"))
	resist =  resist + stack_resist
	return resist
end

function modifier_flesh_heap:GetModifierBonusStats_Strength()
	if self:GetParent():PassivesDisabled() then return end
	local str = self:GetAbility():GetSpecialValueFor("stack_str")
	return self:GetStackCount() * str
end

function modifier_flesh_heap:GetModifierModelScale()
	if self:GetParent():PassivesDisabled() then return end
	local size = 1 + (self:GetAbility():GetSpecialValueFor("stack_scale_up") * self:GetStackCount())
	if size > self:GetAbility():GetSpecialValueFor("max_size") then
		size = self:GetAbility():GetSpecialValueFor("max_size")
	end
	return size
end

function modifier_flesh_heap:GetModifierTotal_ConstantBlock(keys)
	if not IsServer() then return end
	if keys.target ~= self:GetCaster() then return 0 end
	if keys.attacker == self:GetCaster() then return 0 end
	if self:GetParent():PassivesDisabled() then return 0 end
	if not self:GetParent():IsRealHero() then return 0 end

	-- Only attacks?
	if keys.inflictor then return 0 end

	if self:GetStackCount() < self:GetParent():FindTalentValue("special_bonus_imba_pudge_2","stacks_needed") then return 0 end

	local damage = keys.damage
	if damage <= self:GetParent():FindTalentValue("special_bonus_imba_pudge_2","min_damage") then return 0 end
	local max_damage = self:GetParent():FindTalentValue("special_bonus_imba_pudge_2","damage_block")
	if damage > max_damage then
		damage = max_damage
	end
	self:GetParent():AddNewModifier(self:GetParent(),self:GetAbility(),"modifier_flesh_heap_return_timer",{duration=self:GetParent():FindTalentValue("special_bonus_imba_pudge_2","return_time")})
	return damage
end

function modifier_flesh_heap:OnDeath(keys)
	-- All these cases shouldn't do anything.
	if not IsServer() then return end
	if not keys.unit or not keys.attacker then return end
	if not keys.unit:IsRealHero() then return end
	if keys.reincarnate then return end
	if self:GetParent():IsIllusion() then return end
	-- Break
	if self:GetParent():PassivesDisabled() then return end
	-----------------------------------------------------------------------------

	local hKiller = keys.attacker
	local hVictim = keys.unit

	if self:GetCaster():GetTeamNumber() ~= hVictim:GetTeamNumber() then
		self.fleshHeapRange = self:GetAbility():GetSpecialValueFor("range")
		local vToCaster = self:GetCaster():GetOrigin() - hVictim:GetOrigin()
		local flDistance = vToCaster:Length2D() - (self:GetCaster():GetCollisionPadding() + hVictim:GetCollisionPadding())
		if hKiller == self:GetCaster() or self.fleshHeapRange >= flDistance then

			--self:GetCaster().nKills = self:GetCaster().nKills + 1
			local hBuff = self:GetCaster():FindModifierByName("modifier_flesh_heap")
			if hBuff ~= nil then
				hBuff:IncrementStackCount()
				self:GetCaster():CalculateStatBonus()
			else
				self:GetCaster():AddNewModifier(self:GetCaster(), self,  "modifier_flesh_heap" , {})
			end
			if hKiller == self:GetCaster() then
				hBuff:IncrementStackCount()
			end
			local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_pudge/pudge_fleshheap_count.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetCaster())
			ParticleManager:SetParticleControl(nFXIndex, 1, Vector(1, 0, 0))
			ParticleManager:ReleaseParticleIndex(nFXIndex)

		end
	end
end
-------------------------------------------

-------------------------------------------
--                Rot
-------------------------------------------
LinkLuaModifier("modifier_rot", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_cleaver_rot", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)

imba_pudge_rot = class({})
function imba_pudge_rot:IsHiddenWhenStolen() return false end
function imba_pudge_rot:IsRefreshable() return false end
function imba_pudge_rot:IsStealable() return true end
function imba_pudge_rot:IsNetherWardStealable() return false end
function imba_pudge_rot:ProcsMagicStick() return false end
function imba_pudge_rot:ResetToggleOnRespawn() return true end

function imba_pudge_rot:GetAbilityTextureName()
   return "pudge_rot"
end
-------------------------------------------
function imba_pudge_rot:GetCastRange()
	self.rot_radius = self:GetSpecialValueFor("base_radius")
	if self:GetCaster():HasModifier("modifier_flesh_heap") then
		local heap_stack_increase = self:GetCaster():GetModifierStackCount("modifier_flesh_heap",self:GetCaster()) * self:GetSpecialValueFor("stack_radius")
		if heap_stack_increase > self:GetSpecialValueFor("max_radius_tooltip") then
			heap_stack_increase = self:GetSpecialValueFor("base_radius")
		end
		self.rot_radius = self.rot_radius + heap_stack_increase
	end
	return self.rot_radius
end

function imba_pudge_rot:OnToggle()
	-- Apply the rot modifier if the toggle is on
	if self:GetToggleState() then
		self:GetCaster():AddNewModifier(self:GetCaster(), self, "modifier_rot", {})

		if not self:GetCaster():IsChanneling() then
			self:GetCaster():StartGesture(ACT_DOTA_CAST_ABILITY_ROT)
		end
	else
		-- Remove it if it is off
		local hRotBuff = self:GetCaster():FindModifierByName("modifier_rot")
		if hRotBuff ~= nil then
			hRotBuff:Destroy()
		end
	end
end

-------------------------------------------
modifier_rot = modifier_rot or class({})
function modifier_rot:IsDebuff() return true end
function modifier_rot:IsHidden() return false end
function modifier_rot:IsPurgable() return false end
function modifier_rot:IsPurgeException() return false end
function modifier_rot:IsStunDebuff() return false end
function modifier_rot:RemoveOnDeath() return true end
-------------------------------------------
function modifier_rot:IsAura()
	if self:GetCaster() == self:GetParent() or self:GetParent().butcher_cleaver_target then
		return true
	end

	return false
end

function modifier_rot:GetModifierAura()
	return "modifier_rot"
end

--------------------------------------------------------------------------------

function modifier_rot:GetAuraSearchTeam()
	if self:GetCaster() == self:GetParent() then
		return DOTA_UNIT_TARGET_TEAM_ENEMY
	end

	return DOTA_UNIT_TARGET_TEAM_FRIENDLY
end

--------------------------------------------------------------------------------

function modifier_rot:GetAuraSearchType()
	return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
end

--------------------------------------------------------------------------------

function modifier_rot:GetAuraRadius()
	return self.rot_radius
end

function modifier_rot:DeclareFunctions()
	local decFuns =
	{
			MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
	}
	return decFuns
end

function modifier_rot:GetModifierMoveSpeedBonus_Percentage()
	if self:GetParent() == self:GetCaster() then
		return 0
	end

	return self.rot_slow
end

function modifier_rot:OnCreated(kv)
	local caster = self:GetCaster()
	self.rot_slow = self:GetAbility():GetSpecialValueFor("rot_slow")
	self.rot_damage = self:GetAbility():GetSpecialValueFor("rot_damage")

	self.rot_tick = self:GetAbility():GetSpecialValueFor("rot_tick")

	if IsServer() then
		self.rot_radius = self:GetAbility():GetCastRange()
		if self:GetParent() == self:GetCaster()then
			EmitSoundOn("Hero_Pudge.Rot", self:GetCaster())
			local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_pudge/pudge_rot.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent())
			ParticleManager:SetParticleControl(nFXIndex, 1, Vector(self.rot_radius, 1, self.rot_radius))
			self:AddParticle(nFXIndex, false, false, -1, false, false)

		elseif self:GetParent().butcher_cleaver_target then
			local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_pudge/pudge_rot.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent())
			ParticleManager:SetParticleControl(nFXIndex, 1, Vector(self.rot_radius, 1, self.rot_radius))
			self:AddParticle(nFXIndex, false, false, -1, false, false)
		else
			local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_pudge/pudge_rot_recipient.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent())
			self:AddParticle(nFXIndex, false, false, -1, false, false)
		end

		self:StartIntervalThink(self.rot_tick)
	end
end

function modifier_rot:OnIntervalThink()
	if IsServer() then
		if self:GetCaster():FindTalentValue("special_bonus_imba_pudge_1","damage") ~= 0 then
			self.rot_real_damage = self.rot_damage + (self:GetCaster():FindTalentValue("special_bonus_imba_pudge_1","damage") * (((100-self:GetCaster():GetHealthPercent())/100) / self:GetCaster():FindTalentValue("special_bonus_imba_pudge_1","hp_treshhold_percent")))
		else
			self.rot_real_damage = self.rot_damage
		end
		local flDamagePerTick = self.rot_tick * self.rot_real_damage

		if self:GetCaster():IsAlive() then
			local damage = {
				victim = self:GetParent(),
				attacker = self:GetCaster(),
				damage = flDamagePerTick,
				damage_type = DAMAGE_TYPE_MAGICAL,
				ability = self:GetAbility()
			}

			ApplyDamage(damage)
		end
	end
end

function modifier_rot:OnDestroy()
	if IsServer() then
		StopSoundOn( "Hero_Pudge.Rot", self:GetCaster() )

		if self:GetParent().butcher_cleaver_target then
			self:GetParent().butcher_cleaver_target = nil
		end
	end
end

modifier_cleaver_rot = modifier_cleaver_rot or class({})
function modifier_cleaver_rot:IsDebuff() return true end
function modifier_cleaver_rot:IsHidden() return false end
function modifier_cleaver_rot:IsPurgable() return false end
function modifier_cleaver_rot:IsPurgeException() return false end
function modifier_cleaver_rot:IsStunDebuff() return false end
function modifier_cleaver_rot:RemoveOnDeath() return true end
-------------------------------------------
function modifier_cleaver_rot:IsAura()
	if self:GetParent().butcher_cleaver_target then
		return true
	end

	return false
end

function modifier_cleaver_rot:GetModifierAura()
	return "modifier_cleaver_rot"
end

--------------------------------------------------------------------------------

function modifier_cleaver_rot:GetAuraSearchTeam()
	return DOTA_UNIT_TARGET_TEAM_FRIENDLY
end

--------------------------------------------------------------------------------

function modifier_cleaver_rot:GetAuraSearchType()
	return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
end

--------------------------------------------------------------------------------

function modifier_cleaver_rot:GetAuraRadius()
	return self.rot_radius
end

function modifier_cleaver_rot:DeclareFunctions()
	local decFuns =
	{
			MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
	}
	return decFuns
end

function modifier_cleaver_rot:GetModifierMoveSpeedBonus_Percentage()
	return self.rot_slow
end

function modifier_cleaver_rot:OnCreated(kv)
	self.rot_slow = self:GetAbility():GetSpecialValueFor("rot_slow")
	self.rot_damage = self:GetAbility():GetSpecialValueFor("rot_damage")

	-- #6 Talent: Rot deals increased damage per tick
	self.rot_damage = self.rot_damage + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_6")
	self.rot_tick = self:GetAbility():GetSpecialValueFor("rot_tick")

	if IsServer() then
		self.rot_radius = self:GetAbility():GetCastRange()

		if self:GetParent().butcher_cleaver_target then
			local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_pudge/pudge_rot.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent())
			ParticleManager:SetParticleControl(nFXIndex, 1, Vector(self.rot_radius, 1, self.rot_radius))
			self:AddParticle(nFXIndex, false, false, -1, false, false)
		else
			local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_pudge/pudge_rot_recipient.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent())
			self:AddParticle(nFXIndex, false, false, -1, false, false)
		end

		self:StartIntervalThink(self.rot_tick)
	end
end

function modifier_cleaver_rot:OnIntervalThink()
	if IsServer() then
		local flDamagePerTick = self.rot_tick * self.rot_damage

		if self:GetCaster():IsAlive() then
			local damage = {
				victim = self:GetParent(),
				attacker = self:GetCaster(),
				damage = flDamagePerTick,
				damage_type = DAMAGE_TYPE_MAGICAL,
				ability = self:GetAbility()
			}

			ApplyDamage(damage)
		end
	end
end

function modifier_cleaver_rot:OnDestroy()
	if IsServer() then
		if self:GetParent().butcher_cleaver_target then
			self:GetParent().butcher_cleaver_target = nil
		end
	end
end
-------------------------------------------

--                Meat Hook
-------------------------------------------
LinkLuaModifier("modifier_meat_hook", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier( "modifier_meat_hook_followthrough", "hero/hero_pudge" ,LUA_MODIFIER_MOTION_NONE )
imba_pudge_meat_hook = class({})
function imba_pudge_meat_hook:IsHiddenWhenStolen() return false end
function imba_pudge_meat_hook:IsRefreshable() return true end
function imba_pudge_meat_hook:IsStealable() return true end
function imba_pudge_meat_hook:IsNetherWardStealable() return true end
function imba_pudge_meat_hook:IsInnateAbility() return false end

function imba_pudge_meat_hook:GetAbilityTextureName()
   return "pudge_meat_hook"
end
-------------------------------------------
function imba_pudge_meat_hook:GetCastRange()
	return self:GetSpecialValueFor("hook_distance") + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_2")
end

function imba_pudge_meat_hook:GetCooldown()
	if self:GetCaster():HasScepter() then
		return self:GetSpecialValueFor("scepter_cooldown")
	else
		return self:GetSpecialValueFor("cooldown")
	end
end
--------------------------------------------------------------------------------

function imba_pudge_meat_hook:OnAbilityPhaseStart()
	self:GetCaster():StartGesture( ACT_DOTA_OVERRIDE_ABILITY_1 )
	return true
end

--------------------------------------------------------------------------------

function imba_pudge_meat_hook:OnAbilityPhaseInterrupted()
	self:GetCaster():RemoveGesture( ACT_DOTA_OVERRIDE_ABILITY_1 )
end

--------------------------------------------------------------------------------

function imba_pudge_meat_hook:OnSpellStart()
	self.bChainAttached = false
	self.hooks = self.hooks or {}
	self.targets = {}
	self.treeTargets = {}
	self.max_targets = self:GetSpecialValueFor( "max_targets" )
	self.hook_damage = self:GetSpecialValueFor( "hook_damage" )
	self.hook_stackdamage = math.min(self:GetCaster():GetModifierStackCount("modifier_flesh_heap",self:GetCaster()) * self:GetSpecialValueFor("stack_bonus_damage"),self:GetSpecialValueFor("stack_max_bonus_damage"))
	self.hook_damage = self.hook_damage + self.hook_stackdamage
	self.hook_speed = self:GetSpecialValueFor( "hook_speed" )
	self.hook_width = self:GetSpecialValueFor( "hook_width" )
	self.hook_distance = self:GetSpecialValueFor( "hook_distance" ) + GetCastRangeIncrease(self:GetCaster())
	self.hook_distance = self.hook_distance + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_2")
	self.vision_radius = self:GetSpecialValueFor( "vision_radius" )
	self.vision_duration = self:GetSpecialValueFor( "vision_duration" )
	self.nAmountOfHooks = self:GetSpecialValueFor( "number_of_hooks" ) + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_8")

	-- Visually remove the hook from pudge
	if self:GetCaster() and self:GetCaster():IsHero() then
		local hHook = self:GetCaster():GetTogglableWearable( DOTA_LOADOUT_TYPE_WEAPON )
		if hHook ~= nil then
			hHook:AddEffects( EF_NODRAW )
		end
	end

	self.vStartPosition = self:GetCaster():GetAbsOrigin()

	-- Root the caster
	self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_meat_hook_followthrough", { --[[duration = flFollowthroughDuration]] } )

	EmitSoundOn( "Hero_Pudge.AttackHookExtend", self:GetCaster())

	for i=1,self.nAmountOfHooks do
		self.hooks[i] = {}
		self.treeTargets[i] = 0
		self.hooks[i]["vStartPosition"] = self:GetCaster():GetAbsOrigin()
		self.hooks[i]["vProjectileLocation"] = self.hooks[i]["vStartPosition"]
		self.hooks[i]["vDirection"] = (self:GetCursorPosition() - self.hooks[i]["vStartPosition"]):Normalized() * self.hook_distance

		if self.nAmountOfHooks > 1 then
			local rotation = (i-self:GetCaster():FindTalentValue("special_bonus_imba_pudge_8"))	 * self:GetSpecialValueFor("multiple_hook_rotation")
			self.hooks[i]["vDirection"] = RotatePosition(Vector(0,0,0), QAngle(0,rotation,0), self.hooks[i]["vDirection"])
		end
		self.hooks[i]["vDirection"].z = 0.0
		self.hooks[i]["vTargetPosition"] = self.hooks[i]["vStartPosition"] + self.hooks[i]["vDirection"]
		local vHookOffset = Vector( 0, 0, 96 )
		self.hooks[i]["vHookTarget"] = self.hooks[i]["vTargetPosition"] + vHookOffset
		local vKillswitch = Vector( ( ( self.hook_distance / self.hook_speed ) * 2 ), 0, 0 )

		local info = {
			Ability = self,
			vSpawnOrigin = self:GetCaster():GetAbsOrigin(),
			vVelocity = self.hooks[i]["vDirection"] /self.hook_distance * self.hook_speed,
			fDistance = self.hook_distance,
			fStartRadius = self.hook_width ,
			fEndRadius = self.hook_width ,
			Source = self:GetCaster(),
			iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_BOTH,
			iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_TREE,
			iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS + DOTA_UNIT_TARGET_FLAG_INVULNERABLE,
			EffectName = "particles/units/heroes/hero_pudge/pudge_meathook.vpcf",
			ExtraData =
			{
				nProjectileNumber = i
			}
		}

		self.hooks[i]["hProjectile"] = ProjectileManager:CreateLinearProjectile( info )

		self.hooks[i]["nChainParticleFXIndex"] = ParticleManager:CreateParticle( "particles/units/heroes/hero_pudge/pudge_meathook.vpcf", PATTACH_CUSTOMORIGIN, nil)
		ParticleManager:SetParticleAlwaysSimulate( self.hooks[i]["nChainParticleFXIndex"])
		ParticleManager:SetParticleControlEnt( self.hooks[i]["nChainParticleFXIndex"], 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_weapon_chain_rt", self:GetCaster():GetAbsOrigin() + vHookOffset, true )
		ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 1, self.hooks[i]["vHookTarget"] )
		ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 2, Vector( self.hook_speed, self.hook_distance, self.hook_width ) )
		ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 3, vKillswitch )
		ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 4, Vector( 1, 0, 0 ) )
		ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 5, Vector( 0, 0, 0 ) )
		ParticleManager:SetParticleControlEnt( self.hooks[i]["nChainParticleFXIndex"], 7, self:GetCaster(), PATTACH_CUSTOMORIGIN, nil, self:GetCaster():GetAbsOrigin(), true )

		self.hooks[i]["bRetracting"] = false
		self.hooks[i]["hVictim"] = nil
		self.hooks[i]["bDiedInHook"] = false
		self.hooks[i]["unitsHit"] = {}
	end
end

--------------------------------------------------------------------------------

function imba_pudge_meat_hook:OnProjectileHit_ExtraData( hTarget, vLocation,keys )
	-- You can't pull yourself.
	if hTarget == self:GetCaster() then
		return
	end

	local i = keys.nProjectileNumber
	if not self.hooks[i] then return end

	-- RETRACTING
	if self.hooks[i]["bRetracting"] then
		-- Hitting someone on the way back is ignored
	 	if hTarget then
			return
		end
		-- The endpoint has been reached. Clean up
		if self:GetCaster() and self:GetCaster():IsHero() then
			local hHook = self:GetCaster():GetTogglableWearable( DOTA_LOADOUT_TYPE_WEAPON )
			if hHook ~= nil then
				hHook:RemoveEffects( EF_NODRAW )
			end
			StopSoundOn( "Hero_Pudge.AttackHookRetract", self:GetCaster())
			StopSoundOn( "Hero_Pudge.AttackHookExtend", self:GetCaster())
			StopSoundOn( "Hero_Pudge.AttackHookRetractStop", self:GetCaster() )
		end

		if self.hooks[i]["unitsHit"] and #self.hooks[i]["unitsHit"] > 0 then
			for k,v in pairs(self.hooks[i]["unitsHit"]) do
				if IsValidEntity(v) then
					v:RemoveModifierByName( "modifier_meat_hook" )
					v:SetUnitOnClearGround()
				end
			end
		end
		--self.hooks[i]["unitsHit"] = nil
		ParticleManager:DestroyParticle( self.hooks[i]["nChainParticleFXIndex"], true )
		ParticleManager:ReleaseParticleIndex( self.hooks[i]["nChainParticleFXIndex"] )
		EmitSoundOn( "Hero_Pudge.AttackHookRetractStop", self:GetCaster() )

		self.hooks[i] = nil
		return
	end

	-- Here the hook always moves forward and has a target. The impact is handled here.
	if hTarget then
		if not self.targets[hTarget] then -- Storing the targets so it won't get handled again
			if hTarget.IsStanding then -- It is a treea
			--[[	self.treeTargets[i] = self.treeTargets[i] + 1 -- Doesn't work, using OnProjectileThink
				print("Trees hit:", self.treeTargets[i])
				return]]
			else
				EmitSoundOn( "Hero_Pudge.AttackHookImpact", hTarget )
				hTarget:AddNewModifier( self:GetCaster(), self, "modifier_meat_hook", {duration = 1.5} )
				self.targets[hTarget] = i
				if hTarget:GetTeamNumber() ~= self:GetCaster():GetTeamNumber() then
					local bonusTreeDamage = self.treeTargets[i] * self:GetCaster():FindTalentValue("special_bonus_imba_pudge_6")
					local damage =
					{
						victim = hTarget,
						attacker = self:GetCaster(),
						damage = bonusTreeDamage,
						damage_type = DAMAGE_TYPE_PHYSICAL,
						ability = self
					}
					ApplyDamage( damage )
					local damage =
					{
						victim = hTarget,
						attacker = self:GetCaster(),
						damage = self.hook_damage,
						damage_type = DAMAGE_TYPE_PURE,
						ability = self
					}
					ApplyDamage( damage )

					if not hTarget:IsAlive() then
						self.hooks[i]["bDiedInHook"] = true
					end

					if not hTarget:IsMagicImmune() then
						hTarget:Interrupt()
					end

					local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_pudge/pudge_meathook_impact.vpcf", PATTACH_CUSTOMORIGIN, hTarget )
					ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), true )
					ParticleManager:ReleaseParticleIndex( nFXIndex )
				end
			end

			AddFOWViewer( self:GetCaster():GetTeamNumber(), hTarget:GetOrigin(), self.vision_radius, self.vision_duration, false )

			table.insert(self.hooks[i]["unitsHit"], hTarget)
		end
	end
	-- Check if the hook should retract

	if not hTarget or #self.hooks[i]["unitsHit"] >= self.max_targets or (self.targets[hTarget] == i and hTarget:GetTeamNumber() == self:GetCaster():GetTeamNumber()) then

		if self.hooks[i]["hProjectile"] then
			ProjectileManager:DestroyLinearProjectile(self.hooks[i]["hProjectile"])
		end
		local vHookOffset = Vector( 0, 0, 96 )
		if not self.hooks[i]["unitsHit"] or #self.hooks[i]["unitsHit"] == 0  then

			ParticleManager:SetParticleControlEnt( self.hooks[i]["nChainParticleFXIndex"], 1, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_weapon_chain_rt", self:GetCaster():GetAbsOrigin() + vHookOffset, true);
			ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 4, Vector( 0, 0, 0 ) )
			ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 5, Vector( 1, 0, 0 ) )
		else

			for k,v in pairs(self.hooks[i]["unitsHit"]) do

				if v ~= nil and ( not v:IsInvisible() ) then
					ParticleManager:SetParticleControlEnt( self.hooks[i]["nChainParticleFXIndex"], 1, v, PATTACH_POINT_FOLLOW, "attach_hitloc", v:GetAbsOrigin() + vHookOffset, true )
					ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 4, Vector( 0, 0, 0 ) )
					ParticleManager:SetParticleControl( self.hooks[i]["nChainParticleFXIndex"], 5, Vector( 1, 0, 0 ) )
				end
			end
		end
		self.hooks[i]["bRetracting"] = true

		for j = 1,self.nAmountOfHooks do
			self.bAllRetracting = false
			if self.hooks[i]["bRetracting"] == false then
				self.bAllRetracting = false
				break
			else
				self.bAllRetracting = true
			end
		end

		if self.bAllRetracting then
			self:GetCaster():RemoveModifierByName("modifier_meat_hook_followthrough")
		end

		local vHookPos = self.hooks[i]["vProjectileLocation"]
		local flPad = self:GetCaster():GetPaddedCollisionRadius()
		if hTarget ~= nil then
			vHookPos = hTarget:GetAbsOrigin()
			flPad = flPad + hTarget:GetPaddedCollisionRadius()
		end
		--Missing: Setting target facing angle
		local vVelocity = self.hooks[i]["vStartPosition"] - vHookPos
		vVelocity.z = 0.0

		local flDistance = vVelocity:Length2D()-- - flPad
		vVelocity = vVelocity:Normalized() * self.hook_speed

		self.hooks[i]["vDirection"] = self.hooks[i]["vDirection"] * -1
		local info =
		{
			Ability = self,
			vSpawnOrigin = vHookPos,
			vVelocity = self.hooks[i]["vDirection"] ,
			fDistance = flDistance-100,
			Source = self:GetCaster(),
			EffectName =  "particles/units/heroes/hero_pudge/pudge_meathook.vpcf",
			--iUnitTargetType = DOTA_UNIT_TARGET_TREE,
			ExtraData =
			{
				nProjectileNumber = i
			}
		}

		self.hooks[i]["hProjectile"] = ProjectileManager:CreateLinearProjectile( info )
	end

	if self:GetCaster():IsAlive() then
		self:GetCaster():RemoveGesture( ACT_DOTA_OVERRIDE_ABILITY_1 );
		self:GetCaster():StartGesture( ACT_DOTA_CHANNEL_ABILITY_1 );
	end
end

--------------------------------------------------------------------------------

function imba_pudge_meat_hook:OnProjectileThink_ExtraData(vLocation,keys)

	local i = keys.nProjectileNumber
	if not self.hooks[i] then return end
	if self:GetCaster():FindTalentValue("special_bonus_imba_pudge_6") ~= 0 then
		local trees = GridNav:GetAllTreesAroundPoint(vLocation,self.hook_width,false)
		for _,tree in pairs(trees) do
			if tree:IsStanding() then
				tree:CutDown(self:GetCaster():GetTeamNumber())
				self.treeTargets[i] = self.treeTargets[i] + 1
			else
				table.remove(trees, tree)
			end
		end
	end

	self.hooks[i]["vProjectileLocation"] = vLocation
	if self.hooks[i]["unitsHit"] then
		for k,v in pairs(self.hooks[i]["unitsHit"]) do
			if IsValidEntity(v) then
				v:SetAbsOrigin(GetGroundPosition(vLocation,self:GetCaster()))
			end
		end
	end
end

--------------------------------------------------------------------------------

function imba_pudge_meat_hook:OnOwnerDied()
	self:GetCaster():RemoveGesture( ACT_DOTA_OVERRIDE_ABILITY_1 );
	self:GetCaster():RemoveGesture( ACT_DOTA_CHANNEL_ABILITY_1 );
end

--------------------------------------------------------------------------------

modifier_meat_hook = class({})
--------------------------------------------------------------------------------

function modifier_meat_hook:IsDebuff()
	return true
end

--------------------------------------------------------------------------------

function modifier_meat_hook:IsStunDebuff()
	return true
end

--------------------------------------------------------------------------------

function modifier_meat_hook:RemoveOnDeath()
	return false
end
--------------------------------------------------------------------------------

function modifier_meat_hook:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_OVERRIDE_ANIMATION,
	}

	return funcs
end

--------------------------------------------------------------------------------

function modifier_meat_hook:GetOverrideAnimation( params )
	return ACT_DOTA_FLAIL
end

--------------------------------------------------------------------------------

function modifier_meat_hook:CheckState()
	if IsServer() then
		if self:GetCaster() ~= nil and self:GetParent() ~= nil then
			if self:GetCaster():GetTeamNumber() ~= self:GetParent():GetTeamNumber() and ( not self:GetParent():IsMagicImmune() ) then
				local state =
				{
					[MODIFIER_STATE_STUNNED] = true,
				}

				return state
			end
		end
	end

	local state =
	{
		[MODIFIER_STATE_ROOTED] = true,
	}

	return state
end

modifier_meat_hook_followthrough = class({})

--------------------------------------------------------------------------------

function modifier_meat_hook_followthrough:IsHidden()
	return true
end

--------------------------------------------------------------------------------

function modifier_meat_hook_followthrough:CheckState()
	local state =
	{
		[MODIFIER_STATE_STUNNED] = true,
	}
	return state
end

--------------------------------------------------------------------------------

LinkLuaModifier("modifier_butchers_cleaver", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_butchers_cleaver_dummy", "hero/hero_pudge", LUA_MODIFIER_MOTION_NONE)

imba_pudge_butchers_cleaver = class({})
function imba_pudge_butchers_cleaver:IsHiddenWhenStolen() return false end
function imba_pudge_butchers_cleaver:IsRefreshable() return true end
function imba_pudge_butchers_cleaver:IsStealable() return true end
function imba_pudge_butchers_cleaver:IsNetherWardStealable() return true end
function imba_pudge_butchers_cleaver:IsInnateAbility() return false end

function imba_pudge_butchers_cleaver:GetAbilityTextureName()
   return "custom/imba_pudge_cleaver"
end
-------------------------------------------

function imba_pudge_butchers_cleaver:OnSpellStart()
	local vTargetPosition = self:GetCursorPosition()
	local caster = self:GetCaster()

	-- I want to remove the thing but I can't find it.
	if self:GetCaster() and self:GetCaster():IsHero() then
		local cleaver = self:GetCaster():GetTogglableWearable( DOTA_LOADOUT_TYPE_OFFHAND_WEAPON )
		if cleaver ~= nil then
			cleaver:AddEffects( EF_NODRAW )
		end
	end
	local velocity = (self:GetCursorPosition() - caster:GetAbsOrigin()):Normalized() * self:GetSpecialValueFor("projectile_speed")
	local info = {
		bDeleteOnHit = self:GetCaster():FindTalentValue("special_bonus_imba_pudge_5") == 0,
		Ability = self,
		vSpawnOrigin = self:GetCaster():GetAbsOrigin(),
		vVelocity = Vector(velocity.x,velocity.y,0),
		fDistance = self:GetSpecialValueFor("range"),
		fStartRadius = self:GetSpecialValueFor("projectile_radius"),
		fEndRadius = self:GetSpecialValueFor("projectile_radius"),
		Source = self:GetCaster(),
		iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
		iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
		iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
		EffectName = "particles/hero/pudge/butchers_cleave_projectile.vpcf",

		iVisionRadius = self:GetSpecialValueFor("projectile_radius"),
		bProvidesVision = true,
		iVisionTeamNumber = caster:GetTeamNumber(),

	}

	self.projectile = ProjectileManager:CreateLinearProjectile(info)

end

function imba_pudge_butchers_cleaver:OnProjectileHit(hTarget,vLocation)
	if not hTarget then
		for i =0,30 do
			local cleaver = self:GetCaster():GetTogglableWearable( i )
			if cleaver ~= nil then
				cleaver:RemoveEffects(EF_NODRAW)
			end
		end
		UTIL_Remove(self.cleaver)
		return
	end

	local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_pudge/pudge_meathook_impact.vpcf", PATTACH_CUSTOMORIGIN, hTarget )
	ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), true )
	ParticleManager:ReleaseParticleIndex( nFXIndex )

	self.cleaver = CreateUnitByName("npc_dummy_blank",self:GetCaster():GetAbsOrigin(),false,nil,nil,self:GetCaster():GetTeamNumber())
	self.cleaver:AddNewModifier(self:GetCaster(),self,"modifier_butchers_cleaver_dummy",{duration = self:GetSpecialValueFor("root_duration")})
	self.cleaver.parentUnit = hTarget

	hTarget:AddNewModifier(self:GetCaster(),self,"modifier_butchers_cleaver",{duration = self:GetSpecialValueFor("root_duration")})

	local damage =
	{
		victim = hTarget,
		attacker = self:GetCaster(),
		damage = self:GetSpecialValueFor("damage"),
		damage_type = DAMAGE_TYPE_MAGICAL,
		ability = self,
	}
	ApplyDamage( damage )
	if self:GetCaster():FindTalentValue("special_bonus_imba_pudge_5") == 0 then
		return true
	end
end

-------------------------------------------
modifier_butchers_cleaver_dummy = class({})

function modifier_butchers_cleaver_dummy:IsDebuff() return false end
function modifier_butchers_cleaver_dummy:IsHidden() return true end
function modifier_butchers_cleaver_dummy:IsPurgable() return false end
function modifier_butchers_cleaver_dummy:IsPurgeException() return false end
function modifier_butchers_cleaver_dummy:IsStunDebuff() return false end
function modifier_butchers_cleaver_dummy:RemoveOnDeath() return true end
function modifier_butchers_cleaver_dummy:AllowIllusionDuplicate() return false end

function modifier_butchers_cleaver_dummy:CheckState()
	local state =
	{
		[MODIFIER_STATE_NO_HEALTH_BAR] = true,
		[MODIFIER_STATE_NO_UNIT_COLLISION] = true,
		[MODIFIER_STATE_INVULNERABLE] = true,
		[MODIFIER_STATE_COMMAND_RESTRICTED] = true,
		[MODIFIER_STATE_OUT_OF_GAME] = true,
	}
	return state
end

function modifier_butchers_cleaver_dummy:OnCreated()
	if IsServer() then
		self:StartIntervalThink(FrameTime())
	end
end

function modifier_butchers_cleaver_dummy:OnDestroy()
	if IsServer() then
		UTIL_Remove(self:GetParent())

		if self:GetCaster() and self:GetCaster():IsHero() then
			local cleaver = self:GetCaster():GetTogglableWearable( DOTA_LOADOUT_TYPE_OFFHAND_WEAPON )
			if cleaver ~= nil then
				cleaver:RemoveEffects(EF_NODRAW)
			end
		end
	end
end

function modifier_butchers_cleaver_dummy:OnIntervalThink()
	if not self:GetParent().parentUnit or not IsValidEntity(self:GetParent().parentUnit) then
		UTIL_Remove(self:GetParent())
		return
	end
end

modifier_butchers_cleaver = class({})
function modifier_butchers_cleaver:IsDebuff() return true end
function modifier_butchers_cleaver:IsHidden() return false end
function modifier_butchers_cleaver:IsPurgable() return false end
function modifier_butchers_cleaver:IsPurgeException() return false end
function modifier_butchers_cleaver:IsStunDebuff() return false end
function modifier_butchers_cleaver:RemoveOnDeath() return true end
function modifier_butchers_cleaver:AllowIllusionDuplicate() return false end

function modifier_butchers_cleaver:OnCreated()
	self.caster = self:GetCaster()
	self.ability = self:GetAbility()
	self.parent = self:GetParent()
	self.modifier_rot = "modifier_cleaver_rot"

	if IsServer() then
	self.ability_rot = self.caster:FindAbilityByName("imba_pudge_rot")

		if self.ability_rot and self.ability_rot:GetLevel() > 0 then
			self.parent.butcher_cleaver_target = true
			self.parent:AddNewModifier(self.caster, self.ability_rot, self.modifier_rot, {})
		end
	end
end

function modifier_butchers_cleaver:OnDestroy()
	if IsServer() then
		if self.parent.butcher_cleaver_target then
			self.parent:RemoveModifierByNameAndCaster(self.modifier_rot, self.caster)
		end
	end
end
-------------------------------------------

function modifier_butchers_cleaver:DeclareFunctions()
	local decFuns =
	{
		MODIFIER_EVENT_ON_TAKEDAMAGE,
	}
	return decFuns
end

--------------------------------------------------------------------------------

function modifier_butchers_cleaver:CheckState()
	local state =
	{
		[MODIFIER_STATE_ROOTED] = true,
	}
	return state
end

function modifier_butchers_cleaver:OnTakeDamage(keys)
	if IsServer() then
		if keys.attacker == self:GetCaster() and keys.unit == self:GetParent() then
			local factor = 0 + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_4")
			self:GetCaster():Heal(keys.damage*factor ,self:GetCaster())
		end
	end
end

function modifier_butchers_cleaver:GetEffectName()
	return "particles/hero/pudge/pudge_cleaver_overhead.vpcf"
end

function modifier_butchers_cleaver:GetEffectAttachType()
	return PATTACH_OVERHEAD_FOLLOW
end

imba_pudge_dismember = imba_pudge_dismember or class({})

LinkLuaModifier( "modifier_dismember", "hero/hero_pudge" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_dismember_lifesteal", "hero/hero_pudge" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_dismember_dummy", "hero/hero_pudge" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_dismember_disarm", "hero/hero_pudge" ,LUA_MODIFIER_MOTION_NONE )

function imba_pudge_dismember:GetAbilityTextureName()
   return "pudge_dismember"
end

function imba_pudge_dismember:IsHiddenWhenStolen() return false end
function imba_pudge_dismember:GetConceptRecipientType()
	return DOTA_SPEECH_USER_ALL
end

function imba_pudge_dismember:GetIntrinsicModifierName()
	return "modifier_dismember_dummy"
end

--------------------------------------------------------------------------------

function imba_pudge_dismember:SpeakTrigger()
	return DOTA_ABILITY_SPEAK_CAST
end

--------------------------------------------------------------------------------

function imba_pudge_dismember:GetChannelTime()
	self.creep_duration = self:GetSpecialValueFor( "creep_duration" ) + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_7")
	self.hero_duration = self:GetSpecialValueFor( "hero_duration" ) + self:GetCaster():FindTalentValue("special_bonus_imba_pudge_7")

	local time = self.hero_duration
	if self:GetCaster():GetModifierStackCount("modifier_dismember_dummy",self:GetCaster()) == 1 then
		time = self.creep_duration
	end
	return time
end

--------------------------------------------------------------------------------

function imba_pudge_dismember:OnAbilityPhaseStart()
	if IsServer() then
		self.hVictim = self:GetCursorTarget()

	end
	return true
end

--------------------------------------------------------------------------------

function imba_pudge_dismember:OnSpellStart()
	if self.hVictim == nil then
		return
	end
	if self.hVictim:TriggerSpellAbsorb( self ) then
		self.hVictim = nil
		self:GetCaster():Interrupt()
	else
		self.startTime = GameRules:GetGameTime()
		self.hVictim:AddNewModifier( self:GetCaster(), self, "modifier_dismember", { duration = self:GetChannelTime() } )
		self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_dismember_lifesteal", { duration = self:GetChannelTime() } )
		self.hVictim:Interrupt()
	end
end

--------------------------------------------------------------------------------

function imba_pudge_dismember:OnChannelFinish( bInterrupted )
	if self.hVictim ~= nil then
		self.hVictim:RemoveModifierByName( "modifier_dismember" )
		self:GetCaster():RemoveModifierByName( "modifier_dismember_lifesteal")
		if self:GetCaster():FindTalentValue("special_bonus_imba_pudge_7") ~= 0 then
			self.hVictim:AddNewModifier(self:GetCaster(),self,"modifier_dismember_disarm",{duration = GameRules:GetGameTime() - self.startTime})
		end
	end
end

--------------------------------------------------------------------------------
modifier_dismember_disarm = class({})
function modifier_dismember_disarm:IsHidden() return false end
function modifier_dismember_disarm:IsDebuff() return true end
function modifier_dismember_disarm:IsPurgable() return false end
function modifier_dismember_disarm:IsPurgeException() return false end

-- Modifier particle
function modifier_dismember_disarm:GetEffectName()
	return "particles/items2_fx/heavens_halberd.vpcf"
end

function modifier_dismember_disarm:GetEffectAttachType()
	return PATTACH_ABSORIGIN_FOLLOW
end

-- Declare modifier states
function modifier_dismember_disarm:CheckState()
	local states = {
		[MODIFIER_STATE_DISARMED] = true,
	}
	return states
end

modifier_dismember_dummy = class({})
function modifier_dismember_dummy:IsDebuff() return false end
function modifier_dismember_dummy:IsHidden() return true end
function modifier_dismember_dummy:IsPurgable() return false end
function modifier_dismember_dummy:IsPurgeException() return false end
function modifier_dismember_dummy:IsStunDebuff() return false end
function modifier_dismember_dummy:RemoveOnDeath() return false end

function modifier_dismember_dummy:DeclareFunctions()
	local decFuns =
	{
		MODIFIER_EVENT_ON_ABILITY_START,
	}
	return decFuns
end

function modifier_dismember_dummy:OnAbilityStart(keys)
	if IsServer() then
		if keys.unit == self:GetCaster() and keys.ability == self:GetAbility() then
			if keys.target:IsConsideredHero() then
				self:SetStackCount(0)
			else
				self:SetStackCount(1)
			end
		end
	end
end

modifier_dismember = class({})

--------------------------------------------------------------------------------

function modifier_dismember:IsDebuff()
	return true
end

--------------------------------------------------------------------------------

function modifier_dismember:IsStunDebuff()
	return true
end

--------------------------------------------------------------------------------

function modifier_dismember:OnCreated( kv )
	self.dismember_damage = self:GetAbility():GetSpecialValueFor( "dismember_damage" )
	self.tick_rate = self:GetAbility():GetSpecialValueFor( "tick_rate" )
	self.strength_damage = self:GetAbility():GetSpecialValueFor( "strength_damage" )/100

	if IsServer() then
		self:GetParent():InterruptChannel()
		self:OnIntervalThink()
		local cast_responses = {"Imba.PudgeDismember1", "Imba.PudgeDismember2", "Imba.PudgeDismember3", "Imba.PudgeNom"}
		self.castResponse = cast_responses[math.random(1, #cast_responses)]
		EmitSoundOn(self.castResponse, self:GetCaster())
		self:StartIntervalThink( self.tick_rate )
	end
end

--------------------------------------------------------------------------------

function modifier_dismember:OnDestroy()
	if IsServer() then
		self:GetCaster():InterruptChannel()
		if self.castResponse then
			StopSoundEvent(self.castResponse, self:GetCaster())
		end
	end
end

--------------------------------------------------------------------------------

function modifier_dismember:OnIntervalThink()
	if IsServer() then
		local flDamage = self.dismember_damage
		flDamage = flDamage + ( self:GetCaster():GetStrength() * self.strength_damage )
		--flDamage = self:GetParent():GetMagicalResistance() * flDamage
		local damage = {
			victim = self:GetParent(),
			attacker = self:GetCaster(),
			damage = flDamage,
			damage_type = DAMAGE_TYPE_MAGICAL,
			ability = self:GetAbility(),
			--damage_flags  = DOTA_DAMAGE_FLAG_IGNORES_MAGIC_ARMOR,
		}
		ApplyDamage( damage )

		EmitSoundOn( "Hero_Pudge.Dismember", self:GetParent() )
	end
end

--------------------------------------------------------------------------------

function modifier_dismember:CheckState()
	if self:GetParent():HasModifier("modifier_slark_shadow_dance") then
		local state = {[MODIFIER_STATE_STUNNED] = true}
		return state
	end

	local state = {
		[MODIFIER_STATE_STUNNED] = true,
		[MODIFIER_STATE_INVISIBLE] = false,
	}

	return state
end

--------------------------------------------------------------------------------

function modifier_dismember:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_OVERRIDE_ANIMATION,
	}

	return funcs
end

--------------------------------------------------------------------------------

function modifier_dismember:GetOverrideAnimation( params )
	return ACT_DOTA_DISABLED
end

--------------------------------------------------------------------------------

modifier_dismember_lifesteal = class({})
function modifier_dismember_lifesteal:IsDebuff() return false end
function modifier_dismember_lifesteal:IsHidden() return true end
function modifier_dismember_lifesteal:IsPurgable() return false end
function modifier_dismember_lifesteal:IsPurgeException() return false end
function modifier_dismember_lifesteal:IsStunDebuff() return true end
function modifier_dismember_lifesteal:RemoveOnDeath() return true end
function modifier_dismember_lifesteal:AllowIllusionDuplicate() return false end

function modifier_dismember_lifesteal:GetModifierSpellLifesteal()
	return self:GetAbility():GetSpecialValueFor("spell_lifesteal")
end


Build in the popular chic suburb of Clydesdale Park. If entertaining is a box that needs to be ticked, The MURAH delivers in spades with its functional design. The floor layout achieves this with ample room for the growing family with 4 bedrooms, 2 bathrooms, theatre room, open planned kitchen/family/dining and alfresco. Build on this 520m2 block.


text:
@implementation NSString (encryptString)

+ (NSString *) md5:(NSString *) input {
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, (CC_LONG)strlen(cStr), digest ); // This is the md5 call

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return  output;
}

+ (NSString *)stringByJSONObject:(id)JSONObject {

    NSString *JSONString = nil;

    if ([NSJSONSerialization isValidJSONObject:JSONObject]) {

        NSData *data = [NSJSONSerialization dataWithJSONObject:JSONObject options:NSJSONWritingPrettyPrinted error:nil];
        JSONString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    }else {

        NSLog(@"Error! Not is valid JSONObject.");

    }

    return JSONString;

}

//路径文件转dictonary
+ (NSMutableDictionary *)returnDictionaryWithDataPath:(NSString *)path {
    NSData * data = [[NSMutableData alloc] initWithContentsOfFile:path];
    NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    NSMutableDictionary * myDictionary = [unarchiver decodeObjectForKey:@"talkData"];
    [unarchiver finishDecoding];

    return myDictionary;
}

@end

redpajama_set_name: RedPajamaGithub


text:
Latest News 2020-12-18	 Hits: 404
Caribbean Celebration of The US' First Caribbean American Vice President Scheduled Ahead of The 59th Presidential Inauguration
Caribbean American voters turned out in huge numbers to select the Joe Biden/Kamala Harris ticket on November 3, 2020. On Dr. Martin Luther King, Jr. Weekend, January 17, 2021, they will be an impressive gathering in cyberspace with some of the Caribbean's most notable artistes, dignitaries, and organizations globally to mark another dynamic moment in history - the pending swearing in of Harris as the first black and female, Caribbean-American US vice-president at the 59th Presidential inauguration.
Invest Caribbean, Jamaican-born dancehall star, Flourgon, is among the top billed performers (ICN), the number one global private sector, investment agency of the Caribbean, has initiated the Caribbean American Action Network, (CAAN), a collective of Caribbean American and Caribbean organizations, to present a live, virtual, Caribbean inauguration party under the theme: "Celebrating #CaribbeanAmericanKamala."
This dynamic, virtual celebration is set to feature signature performances from some of the Caribbean's top entertainers, including Jamaican-born dancehall star, Flourgon, who in January settled a USD 300 million lawsuit with Miley Cyrus for his 1988 Jamaican chart-topping hit single, 'We Run Things.'
It will be hosted by the first Black woman in a James Bond movie, Trina Parks, whose roots extend to Barbados, through her mother, and to Antigua through her grandparents.
Also set to perform will be Barbados' own Soca King, Edwin Yearwood of 'All Aboard' fame; Krosfyah of "Pump Me Up" fame; as well as rising stars, Toni Norville and Kirk Brown; Jamaican gospel singer Joan Meyers, of 'Can't Even Walk' fame; independent Jamaican artiste Janine Jkuhl of 'Sway' fame, Owen Dalhouse who recently released 'Heal the Soul of America;' as well as the famous Fab Five Band, also of Jamaica and Guyanese Menes De Griot and Shanto. De Griot, an African spiritual leader, herbalist, and master drummer who has performed at the Million Women March and Tribute to The Ancestors, will open the event with a powerful pouring of libation to the ancestors, followed by a group performance on drums. The First Black Actress in a Bond movie, Trina Parks, will co-host
Top speakers bringing messages of congratulations and greetings include Congressman Adriano Espaillat of NY, one of only a few Caribbean born US Congressmembers; the Vice Chancellor of the University of the West Indies, Sir Hilary Beckles; Chair of the CARICOM Consular Corps of New York, Counsel General of Barbados to NY, O. St. E. Mackie Holder; Dr. Michelle Chester, the corporate director Employee Health Services at Northwell Health who delivered the first COVID-19 vaccine in the US, and several Caribbean Diaspora leaders, including ICN CEO and CAAN's founder, Felicia J. Persaud; President of ICN and CAAN co-founder, Dr. Sheila Newton Moses; Caribbean Immigrant Services founder, Irwine Clare, Sr., O.D.; Global Village Book Publishing's Aubry Padmore; Coalition for the Preservation of Reggae Music's Carlyle McKetty and Esther Austin of Esther Austin Global.
The Vice President-Elect, Kamala Harris, is expected to deliver a message of her own to the Caribbean Diaspora and Caribbean people globally.
Soca King, Edwin Yearwood of 'All Aboard,' fame is also set to perform"This is a historic moment for us as Caribbean people in these United States, who have been here since slavery and we are convinced that VP-elect Harris represents the best interest of all Americans, inclusive of those who share her Caribbean ancestry," said the brainchild of the event, Caribbean-America immigrant, journalist, entrepreneur, and advocate," Felicia J. Persaud. "America and the Caribbean region have always enjoyed a positive working diplomacy and no doubt, this will be reinforced, as we now have a strong ally in the White house. We are proud that she is one of us."
"Not only did Caribbean voters help to elect the first female, Caribbean American US Vice-President, but now we are marking this moment, in the history of the Caribbean Diaspora memorable, and making it known globally, that she is not only, African American, Indian American, but Caribbean American with a rich heritage," added Dr. Sheila Moses Newton.
The live stream will kick-off at 7 p.m. EST on January 17, 2021 on the Facebook, Twitter and YouTube platforms of One Caribbean Television, (OCTV), as well as on Radio 102.9FM in Antigua & Barbuda. On Inauguration Day, OCTV will air the event on broadcast television across the Caribbean.
CAAN, The Caribbean American Action Network, and an initiative of Invest Caribbean, marks the coming together of several Caribbean Diaspora organizations to country to serve the millions of Caribbean Americans in the US, in the areas of civic engagement, civil rights and immigration, business funding and grants and health. CANN is a call to action for all Caribbean immigrants and Caribbean Americans, and for others to join us and come together in the best interests of the US and the Caribbean region.
Sponsors include: Team Jamaica Bickle, Coalition For The Preservation Of Reggae Music, Global Village Book Publishing, LLC, Esther Austin Global, One Caribbean Television, News Americas News Network, CaribPR Wire, Hard Beat Communications, The Haitian Times and Radio 102.9FM.
For partnership opportunities contact This email address is being protected from spambots. You need JavaScript enabled to view it..

redpajama_set_name: RedPajamaCommonCrawl


text:
extern volatile uint32_t rx_pos_write;
extern volatile uint32_t rx_pos_read;

extern uint32_t rx_errors;
extern uint32_t rx_overfulls;
extern uint32_t rx_count_max;

void usart_init();
void usart_deinit();

void send_str(const char *str);
void send(const uint8_t tx_data);

bool recive_byte(uint8_t *rx_data);
uint32_t recive_count();
uint32_t recive_size();

void send_block(const uint8_t *data, const uint32_t size);

#endif


No matter how hard we work towards paperless offices, we will always need smart storage. FremTrac offers the perfect solution, and now comes with new and exclusive automated technology.
Our modular mobile shelving makes the most of every inch of space, by sliding together, and apart again for easy access. Now we introduce an option to include an affordable electronic operating system with your installation.
The FremTrac system is 100% relocatable, with no need for dusty building work. Our quick, noise-free installation can double your storage in hours, and as always, we manufacture standard and bespoke sizes to maximise your storage in any possible space.
With property costs ever increasing, can you afford not to make the most of your precious space?
Get in touch via our website to book your FREE design consultation, and you'll be on your way to creating 100% more storage space.
Visit the Storage area to learn more about our Storage products.


text:
KLYT (88.3 MHz) is a non-commercial FM radio station broadcasting a Christian talk and teaching radio format, branded as "The Light."  The principal station is in Albuquerque, with two FM translators and two repeaters around New Mexico.  The station is owned by Calvary Chapel of Albuquerque, Inc.

KLYT has an effective radiated power of 4,100 watts.  The main transmitter is atop Sandia Peak.

History

Foundation
KLYT was the longest running Christian music station in the United States. KLYT signed on the air in September 1976 with a light contemporary Christian music format under the auspices of the newly formed Christian Broadcasting Academy. The vision of CBA founders, including Rev. Raymond Franks of Albuquerque's Evangel Temple Assembly of God, Paul Lehrman as Program manager, and Dave Briggs as Chief Engineer, was to train Christians for careers in secular and religious broadcasting.

The station went on the air with a 24 hours/7 days a week format, even though there were originally only 6 or 7 disc jockeys to man the studio. Mike Haverland, Donna Neff, Jeff Simon, Ron Parks, and John Duffy played records, made Christian message spots on 8 track cartridges and gleaned news from the Albuquerque newspapers for broadcast. In the beginning, KLYT was commercial free and the staff largely unpaid.  During these first few months of existence, the station's broadcast range constituted only a few miles over Albuquerque's Northeast area. Early brochures show CBA students working with television cameras and in the radio station. KLYT-FM was licensed by the FCC as a non-profit, educational outlet for CBA, and volunteers operating the station were drawn directly from its classes.

The Emert Years

Good Friday 1978 marked the first major turning point for the young station. A University of Texas graduate and New York City broadcaster named Victor R. Emert was introduced to the KLYT staff as the new General Manager. He had recently resigned as Executive Director of Drug Addicts Recovery Enterprises, a local, faith-based substance abuse treatment center for heroin addicts. Among the discussion topics during Emert's introductory staff meeting was the desire by the announcers to play the growing supply of rock, country and blues-based "Jesus Music" produced by artists such as Resurrection Band, Michael Omartian, Randy Stonehill and Larry Norman.  Emert enthusiastically agreed to guide them in building the station into the premier "Christian Rock" station in the country. During this period, the station also helped book live performances by bands such a Mustard Seed Faith, Parable, Keith Green, 2nd Chapter of Acts and Phil Keaggy, whose records were a staple of KLYT programming.

Within a year, the station had a new board of directors. It also had a new transmitter located high above the city on Sandia Peak, thanks to a daring one-day adventure carried out by Dave Briggs and Jeff Simon. The new transmitter expanded KLYT's listening range from 10 to 100 miles. The studios moved to new facilities on Eubank Avenue.

Over the next few years, Christian rock began to play a larger role in KLYT's playlist, culminating with the launch of the "Christian Oriented Rock" (C.O.R.) format in 1982. Under the leadership of Emert, Program Director, Rudy Grande and Production Director, Michael Scott (morning show host and later Program Director) the station emerged as an influential force on Albuquerque's local radio scenes and on the national Christian broadcasting scene. KLYT was named "Contemporary Christian Radio Station of the Year" in 1983 by the Gospel Music Association.  KLYT was also viewed as a hub station between Christian artists that resided on the west coast (especially in the Orange County area in Southern California) and other Christian artists northeast of Albuquerque.

Through a partnership with Mountaintop Promotions, KLYT brought in monthly concerts by emerging Christian rock artists such as Keith Green, Randy Matthews, Daniel Amos, Petra, DeGarmo and Key, Resurrection Band and other key players in the burgeoning Christian music industry. Students at area public schools would often hear KLYT during lunchtime in the school cafeteria as it was played in rotation with popular non-religious music stations.

The station's playlist during this period reflected a growing trend among artists that had already achieved fame in the secular music arena. Bob Dylan's albums were a mainstay (a very large poster for Dylan's Infidels LP filled the wall of Emert's office). KLYT listeners during the early 1980s also heard a broad range of Christian groups and solo artists that had hits on secular stations across the dial, including artists such as Bob Dylan, Donna Summer, Kerry Livgren (Kansas), Mark Farner (Grand Funk Railroad), Philip Bailey (Earth Wind & Fire), Al Green, Dan Peek (America), along with New Wave bands U2, After the Fire and Kajagoogoo. Each of these artists crossing over from the secular realm had their Christian music channeled and tracked through the religious music industry. However, there was some brief debate among the station's leadership on whether the station should play music from  groups at the edge of the Christian music scene, including U2 and Vinyl Confessions-era Kansas. KLYT also released positive reviews of their albums and discussions of the topic in the station's monthly newspaper, the Sonlyght Special.

In addition to KLYT's music programming, listeners were also offered teaching programs. This included the "Rock and Religion" program produced in Sacramento, California and hosted by Mary Neely (Mike Roe of 77's fame was a young producer on the show). Other shows included "The Glory of Man," hosted by Joyce Emert, the general manager's wife and a highly regarded professor of English and religious studies at the University of New Mexico. Emert, Grande, Duffy, Scott and others also taught classes in broadcasting at the parent Christian Broadcasting Academy (CBA).

During this period, the bulk of the station's disk jockeys came from CBA's basic broadcasting class. Many aspiring broadcasters were able to obtain their Third Class Radio Operator's Permit through the CBA class, and gained valuable on-air experience hosting programs and producing shows for the station. The station also grew in stature within the Christian music industry, becoming a leader in youth-oriented music formatting and the development of relationships between the station's management and prominent artists.

A time of uncertainty

By the mid-1980s the station began to experience trouble. KLYT's programming veered away from its roots as a Christian music station. Attempts to rebrand KLYT as a "positive" music station without a distinctly religious orientation were not well received by KLYT's listener and contributor base. The net result was that the ministry's financial support base severely diminished between 1985 and 1986, bringing on the danger of bankruptcy.

With the departure of Emert, Grande and other core members of the staff, the station's board was left to make critical decision regarding the future of KLYT and CBA. An interim program director was appointed, and the station struggled to meet the paychecks of the diminishing staff. The board made the decision to attempt a revival of the station, focusing on what it was best known for, youth-oriented Christian music programming.

The Rich administration

In 1986, CBA's board of directors elevated member Randy Rich to general manager. Rich had served on the board since 1982, and had previously managed another Christian radio station in Albuquerque, KKIM. However, Rich's claim to fame was his experience as an NFL player. After playing for the New Mexico Lobos, he went on to a career with several professional teams, including the Denver Broncos, where Rich played the position of safety in Super Bowl XII. between the Broncos and Dallas Cowboys.2

To help facilitate KLYT's recovery, Rich brought on Tucson talk show and sports host Mark Gilman (KNST) to head up programming and host the morning show, as well as develop a new high school sports broadcasting ministry.

The High on Sports program became Albuquerque's best-known high school sports show, and included coverage of the state playoffs at least three nights a week as well as broadcasts of state championship baseball games. The concept was that the sports programming was a sure-fire way to be on campus every week, giving KLYT better access for ministry to youth and helping it to promote Fellowship of Christian Athletes events. It was also designed to encourage students and parents to check out KLYT's non-sports programming in other dayparts. High on Sports also became a significant source of grant revenue for the station.

KLYT-sponsored concerts rebounded in the late-80's. The station's management regarded them as a particularly effective outreach for young people. Though popular and successful, there were some infamous highlights including outdoor concerts with Degarmo and Key during an 80 mile-per-hour windstorm, and a Daniel Amos concert overlooking a malfunctioning, "pea-green soup" waterpark pool (D.A. lead-singer Terry Scott Taylor refers the show as one of the worst concert experiences of his life). More successful concerts (Bryan Duncan, Kenny Marks, Kim Boyce, Resurrection Band) renewed the events as a hallmark of the KLYT legacy.

However, as KLYT regained ministry ground externally, Gilman decided to leave due to an inability to meet the schedule demands.  Other stable and popular programs remained such as The Calvary Connection and All-Request Fridays with Dave Warner. Eventually, another Tucson import named Tom Terry (KVOI) was brought in to take over operations and programming.

Later, Rich brought aboard popular KOB-FM personality Peter Benson as Program Director and Heidi Chavez as Sales Director, along with and other key staff members as the station continued to strengthen its ministry. As vinyl records gave way to compact discs, KLYT regained its stature in Albuquerque's Evangelical community, and CBA expanded into areas such as concert promotion and magazine publishing.

Musical evolution

The playlist under Rich's management held even more strictly to what was distributed Christian music labels, which were now operating within the framework of a mature music promotion and distribution industry. Rich's first move was to eliminate many of the secular crossover musicians from the play list, and out went Bob Dylan and U2 due to their wishy washy approach to their faith. This move was met with some outspoken opposition from some of the volunteers at the station. KLYT's new format was christened CHR, or "Christian Hit Music" as a counterpart to secular "Contemporary Hit Music" and "Top 40" pop stations along the dial.

In 1988, KLYT's stable of volunteer disc jockeys were clamoring for changes in the playlist. These concerns mirrored the cries for movement toward edgier Christian music that were discussed more than a decade earlier, and were a running theme throughout the history of the station. The station's management responded to these concerns by introducing a number of specialty shows catering to specific audiences. This included a Rap and Hip Hop show, a Christian rock "oldies" program and others.

Perhaps the most popular show in this lineup, Light as a Rock, was launched by Pete McConnell in the summer of 1988 as an outlet for Christian heavy metal, thrash and alternative music. This show became the bane of the station's management over McConnell's lack of desire to follow a playlist. The show soared in popularity among Christian heavy metal fans in Albuquerque. Later renamed G-Rock, the show gave a radio outlet to many Christian bands pushing the religious music envelope. The show played early underground and independent recordings by up and coming artists and groups that would go on to wider success, including Moby, Sixpence None the Richer and Over the Rhine.

Expanding ministry

As changes were underway in KLYT's programming, CBA boosted its presence in the community by expanding beyond radio programming. Most significantly, it launched the magazine Cutting Edge, a monthly current issues magazine in January 1991.

CBA also purchased a unique travelling concert stage dubbed "Swing Shift." This full-size mobile stage unfolded from a semi-tractor trailer bed, and allowed Christian music concerts and other events to be held by CBA throughout the state. Swing Shift bolstered KLYT's presence in towns throughout New Mexico as the station began transmitting to much of the state. Eventually, KLYT's signal was re-transmitted to nearly all of New Mexico's population centers. KLYT had grown from an Albuquerque radio station to a statewide media phenomenon.

Politics and religion

A characteristic of KLYT and CBA's peripheral ministries during the early 1990s was the emphasis on conservative politics. Terry offered commentary segments during KLYT's morning show, and offered socially conservative articles as the Editor of CBA's Cutting Edge Magazine. This included articles critical of local legislation on adult bookstores, the problem of street gangs in the city, and reaction to the 1991 Gulf War. After Terry's departure, the magazine took a hard-right turn under the editorship of Deswood Tome, and was shut down by CBA management in 1997.

International outreach

The Christian Broadcasting Academy also embarked on international reach. In 1992, a radio ministry associated with Campus Crusade for Christ contacted CBA's management about programming Christian music for the Middle East. After and initial trip to Egypt by Randy Rich and members of the KLYT board of directors, Operations manager Tom Terry and Asst. Music Director Walter Ratliff traveled to the Middle East to conduct focus groups with area church leaders.

The Calvary Chapel Era 2001–Present

KLYT and the Christian Broadcasting Academy were thrown into crisis again in 1999, culminating in the resignation of General manager Randy Rich. During this year, CBA was in good financial shape, and the community's support of the station was as strong as ever.  One month after his resignation, the station's annual on-air fundraising campaign exceeded its goals, and CBA/KLYT had a healthy savings and projected budget for the following year. Despite Rich's departure, KLYT retained strong support across New Mexico's Christian community.

Even with the show of continued community support, Paul Saber, chairman of the Christian Broadcasting Academy's board (as well as a member of Calvary Chapel of Albuquerque's board), spearheaded an effort to have KLYT and its assets "gifted" to the Calvary Chapel of Albuquerque. In 2000, Saber also sold off his Albuquerque McDonald's restaurant franchises, and eventually moved to San Diego, California.

Non-Calvary members of the board were in the minority during the station's transfer process. A number of local Christian leaders lamented the single-church takeover of a station that had operated for 25 years by a network of Evangelical churches from a variety of denominations. The Christian Broadcasting Academy was dissolved, and Calvary-Albuquerque took over KLYT and its network of translators on January 1, 2001.

KLYT's facilities were combined with those of the church's existing commercial radio station, KNKT (107.1 FM). The staff was reduced, and automation increasingly replaced live announcers in most dayparts. KLYT's Peter Benson stayed on as a talk show host on KNKT and in programming the new KLYT, dubbed M88. By 2005, KLYT alumni Steve Reimann had rejoined the station's staff, and The Echoing Green's Joey Belville joined as music and special events director. Belville also went on to co-host a highly popular morning show on the station, dubbed "The 3 Amigos Morning Show," with veteran broadcasters Matt Gentry and Steve Jeter.

Later, KLYT's ownership by Calvary-Albuquerque became a key component of a pastoral shakeup at the church. In 2004, Calvary pastor Skip Heitzig left the church he founded to return to California. His hand-picked successor, Pete Nelson, later claimed that Heitzig asked to have KLYT's ownership transferred to a corporation he controlled. This transfer was voted down by local members of Calvary-Albuquerque's board.

Since its transfer, KLYT's funding has come from the church's tithing and donations, as well as from the sale of merchandise related to Heitzig and the network of Calvary Chapel churches around the country. The station also runs a limited number of grant announcements from companies around Albuquerque that donate to the station.

Despite the occasional turmoil throughout KLYT's three decades of youth-oriented radio programming, the station has maintained a strong standing in New Mexico's Evangelical community. It is often cited as one of the longest lasting stations of its kind, and has been periodically recognized by the Gospel Music Association and the National Religious Broadcasters association.

On June 27, 2011 KLYT shifted its format to Christian rock, rebranded as "Static Radio." The station's format targeted listeners ranging from middle school through college with a mix of Christian rock, pop and hip hop and also featured some select secular alternative rock songs labelled as "culture shock".

On April 5, 2015 KLYT rebranded as "Star 88" and promoted itself as "Vertical Worship * Christian Hits * Fresh Indie" and featured contemporary Christian music and teaching programs shared with then sister station KNKT.

On March 25, 2021 Calvary sold 107.1 KNKT to Bible Broadcasting Network. KLYT switched to a talk and bible teaching format as "The Light" on May 31, 2021 beginning at 5am. Star 88 will continue as an online stream. The KNKT call letters were moved to satellite station 90.7 at Cannon AFB near Clovis (formerly KKCJ).

Repeaters
Two high-power radio stations repeat KLYT. KPKJ (88.5 FM), licensed to Mentmore, covers Gallup and Window Rock, Arizona, from a transmitter at Hunters Point, west of the Arizona-New Mexico state line. KNKT (90.7 FM), licensed to Cannon Air Force Base, is a rimshot of the Clovis area. Both facilities were originally owned by CSN International and then Calvary Chapel Costa Mesa when the latter acquired 26 full-power stations and another 25 translators in 2008. Calvary Albuquerque then bought them for $200,000 in 2010.

Translators
In addition to the main station, KLYT is relayed by an additional two translators to widen its broadcast area.

Calvary has sold off most of its other translators that previously repeated KLYT. In 2012, after acquiring KKCJ, it sold K201CY, its translator in Clovis, to Grace Community Church of Amarillo. The network donated nine translators, in locations including Alamogordo, Silver City, Roswell, and Alamosa, Colorado, to VCY America in 2019.

References

External links

Tom Terry's Blog
Rudy Grande interviews artist Terry Scott Taylor in 1982
Cutting Edge Magazine archive

LYT
LYT
Radio stations established in 1976
1976 establishments in New Mexico
Calvary Chapel Association

redpajama_set_name: RedPajamaWikipedia


text:
Settings

          Edit Profile

          Change Profile Picture

          Change Password


Back in 2014, we first heard about UK firm Faradair's proposed Bio-Electric-Hybrid-Aircraft (BEHA, for short) – it was touted it as being one of the world's most environmentally-friendly airplanes. The company has now announced plans for a small BEHA airliner, which is hoped to enter service by 2025.
Like the original concept, the carbon-composite-bodied 18-seat BEHA_M1H will feature a "triple box-wing" design for enhanced lift. This configuration should allow it to take off and land on runways less than 300 meters (984 ft) in length.
Vectored thrust will be provided by two contra-rotating propfans in the rear – these will be housed within an acoustic duct, with the aim of reducing take-off noise to under 60 dba (dba stands for A-weighted decibels, which approximate the manner in which sound is heard by the human ear). By contrast, a typical jet engine at take-off sits at about 140 dba.
As the aircraft's name implies, power will be provided by a combination of batteries and bio-diesel. More specifically, the batteries will power its electric motor during take-off and landing, with a 1,600-hp turboprop bio-diesel engine generating power while the craft is cruising – the engine will also recharge the batteries at that time, with some help from solar panels on top of the wings.
Additionally, the BEHA_M1H will be capable of hauling cargo. Within a claimed 15 minutes, ground crews will reportedly be able to replace the seats with three of the company's LD3 cargo containers, for a combined capacity of 5 tonnes (5.5 US tons).
"The BEHA M1H variant, multi-role aircraft, will allow operators the ability to provide viable air transport services including; scheduled commuting flights, flight training and charter by day and the ability to use the quiet flight characteristics and payload capability for cargo operations at night," says Managing Director of Faradair, Neil Cloughley. "Our order book is now open and we look forward to working with potential customers and airport operators, as we begin the build of our first demonstration prototypes later this year, intended for flight trials by 2022."


I I thank God for you, it was a demanding June with many needs and limited resources! However I thank God for answering my prayer for means to provide for a dear friend's fees and clear a debt. Earlier also I request your to pray with me for God to heal me from fibroids, indeed he did it. Fibroid had tortured me for at least 3 months with excessive bleeding to the point where i could not sit in public! May God richly bless you and continue to use you mightily in this ministry. May you continue to reach out to those in pain and suffering and may the Good LORD meet all your needs according to his riches in glory.
Thank you Bro Chester for the August 2010 prophecy- I am highly favoured in Jesus's mighty name AMEN!


Could be more detailed. I still can not figure out how to map.
Thank you. I'll try later!
I'll come back to tell you if it worked.
Actually that option. Exits the full screen, and shows all channels.
What I want is to just open this list on the side ... Without leaving the channel full screen.
Doesn't 'back' give you that?
(2019-02-06, 14:11)trogggy Wrote: Doesn't 'back' give you that?
leveraging their knowledge. Could you tell me how I can call the favorites list?


A Georgian businessman is blasting the Mueller report for the way it described his own cryptic texts to Michael Cohen where he said he had stopped the 'flow' of 'some tapes' of Donald Trump from Russia during the campaign.
Only a small fraction of the 2,000-mile wall President Trump vowed as a candidate to build on the U.S.-Mexico border has gone up since he took office more than two years ago, according to a document the defense agency overseeing construction provided to Sen. John Hoeven, R-N.D.
WASHINGTON (AP) - The White House blocked adviser Stephen Miller from testifying before congressional committees on immigration and a staff shakeup at the Department of Homeland Security, prompting lawmakers on Thursday to demand internal communications on the topic from Homeland Security officials.
Twitter chief executive Jack Dorsey phoned Democratic Rep. Ilhan Omar on Tuesday and stood by the company's decision to permit a tweet from President Trump that later resulted in a flood of death threats targeting the congresswoman.


Faculty member Tammy Proctor and undergraduate Frankie Urrutia-Smith receive 2019 CHaSS Awards.
Patrick Q. Mason, a history professor who holds the Howard W. Hunter Chair of Mormon Studies at Claremont Graduate University, has been named the new Leonard J. Arrington Chair for Mormon History and Culture.
Carl Aldrich graduated from USU in 2011 with a Bachelor of Arts in History and a minor in Sociology.
Who started the fire? Early revolutions topic of June 4-8 event sponsored by Mountain West Center.
Congratulations to Dr. Julia M. Gossard on the publication of her article "Food in the West: Using TimelineJS in the Classroom," which was featured on the American Historical Association's blog.
Congratulations to Jared Farmer, class of '96, on being selected for a Berlin Prize from the American Academy of Berlin.
Summarizing Dr. Norm Jones' accomplishments is a difficult task. Since joining USU in 1978, he has taught large surveys, small upper-division courses, graduate seminars, and independent studies.
Nina Cavazos, a 2016 graduate, is now the manager of Stakeholder Engagement at the National Women's History Museum, a non-profit working to build a women's history museum on or near the National Mall in Washington, DC.
After graduating in 2013, Brad Hansen and his wife Janelle (USU English major '09) went looking for their next adventure.
Colby Townsend is a first-year MA student in the Department of History, studying the ways religious individuals have composed texts that become standards, classics, or scripture for their communities.
Dr. Julia Gossard and undergraduate Arie French teamed up for the CHaSS summer research mentorship to study women brought to North America under the auspices of the French crown.
Dr. Angela Diaz was leaving her lecture hall last semester when she first saw Abby's history notes. These weren't your typical notes scribbled hastily in pen or pencil. They were something closer to art.
Utah State University presents Justin Hall, Alumnus of USU's history and philosophy departments. Hailing from Alaska, Justin first came to Utah State to study psychology, but quickly turned to philosophy, classics and then history.
Hailing from Evanston, Wyoming, Jacie originally started at USU as a soil science major, until she took a modern European history class.
Senia Foster is a graduate student specializing in medieval Irish history. After receiving her bachelor's degree in liberal arts at USU, Senia decided to stay for the master's program.
Utah State University introduces history alumna and history instructor, Emily Wheeler. Graduating with her first master's degree in history in 2005, she obtained a second master's in landscape architecture in 2008.
President of the history honor society, Phi Alpha Theta, Cody is in his junior year at Utah State, getting a degree in history with a minor in economics.


OMTEX CLASSES: There is direct relationship between price and quantity supplied.
I agree with the statement. This is because the law of supply establishes a functional relationship between the price of a commodity and its quantity supplied in the market.
The law can be explained with the help of supply schedule and a diagram.
The schedule shows that with an increase in price the quantity supplied is also increasing. It indicates direct relationship between the two variables Price and quantity supplied. When the price is Re. 1 the seller offers only 10 units for sale. When Price increases to Rs.5 he expands supply to 50 units.
X-axis represents quantity supplied and Y-axis represents price. Various points from the schedule are plotted on the graph join those points we will be getting supply curve which is called as named as SS. SS sloped upward from left to right showing direct relationship between price and quantity supplied. This happens when price is more, supply is also more and when price is less, and supply is also less.


text:
Government-Spending Outrage Sparks Cigar Business
By Liza Porteus Viana FOXBusiness
Before launching their young cigar business, David Van Wie and Steven Suggs say they were just two typical Americans watching in outrage in 2008 as Congress approved a more than $767 billion economic stimulus package.
At that time exact time, Van Wie said revenues at his car-wash business started sinking, so he found the uptick in government spending twice as infuriating. Then his brother-in-law, Suggs, was laid off in 2009 -- and the two commiserated over the stimulus and the $787 billion bailout. What made it even worse, the two Phoenix, AZ, men said, was when they realized how many pork projects were being funded with their tax money.
Take, for example [courtesy of the Web site of Sen. Tom Coburn R-OK]: $500,000 toward renovating a historic freighthouse that shuttered its doors in 2004 in Ypsilanti, MI., which supporters want to turn into a coffee shop or yoga class with stimulus funds; $680,100 for a Yale University study on the effect of diet and exercise on obesity; and $1.15 million to construct a new guardrail around a dry lake in Oklahoma.
So, Van Wie and Suggs said they decided to turn their shared fury and cigar hobby into a small business, chock full of political stimulus-based satire.
"I was just driving home one night listening to the stimulus package [news] and the money that was being spent and where it was going," Van Wie said. "I had always just enjoyed cigars and it just started to come together about how Congress is burning up our money. I thought, 'What if the American citizen could have the same experience as Congress?'"
Last summer, the pair launched StimulusCigars.com, where consumers can buy boxes of Cuban-seed, Dominican hand-rolled cigars laced with an anti-government spending theme. Their product was ready to deliver to customers within three months – which they said fell right in the thick of stimulus spending outrage.
Today the products are also sold at a Phoenix-area cigar retailer called Churchills. Each cigar contains descriptions of pork-barrel projects, such as $1.8 million to study swine odor and manure management in Ames, Iowa, and $11 million for a bridge to connect two Microsoft campuses in Seattle.
"It's very important we figure out why pigs smell," Van Wie said sardonically with a chuckle.
According to the duo, one challenge they had to confront was finding an appropriate advertising venue for a tobacco product. Billboard companies were unwilling to give them space; and forget mainstream web outlets such as Facebook and Google, they of course weren't biting either.
But at the end of the day, they found their product began to sell itself. Along with advertising on some conservative radio stations, Van Wie and Suggs also market their products via StimulusCigars.com's own Facebook and Twitter pages. When people get wind of it they either love it or hate it, and if they love it -- they have to have it, Van Wie said.
So far StimulusCigars.com's customers are mostly U.S.-based, though the founders said potential buyers from countries such as Yemen, Iraq, Turkey, France and Germany have checked out the site. The company isn't profitable yet, but the founders said it's right on target to meet and possibly exceed expectations. About 60% of the inventory, or more than 430 boxes of cigars, have sold so far.
Boxes used to go for $99, but then Van Wie and Suggs threw in two humorous t-shirts for just 95 cents more (for a total of $99.95 for the package), and the opportunity for customers to buy a second box for just $69.95. That's when sales really picked up, Van Wie said.
So what does talk of a second possible stimulus mean for the future of StimulusCigars.com?
"We're excited about it, frankly," Van Wie said. "I can't wait to see what they're spending money on after this. There's always going to be political humor for us to attach to cigars, especially to the StimulusCigar trademark."


ironic frame + plastic bag + carton,They have special packaging (minimize shipping damage and missing parts), every set is tested at the factory.
Motor Fire truck, three-wheel motorcycle chassis and gasoline engine, small size and multi-function .Equipped by the 300 Liters water tanks, water pumps, tools boxes, warning lights, horn, speaker, widely used in urban and countryside street fire, road cleaning , garden or farm irrigation, water spraying, etc..
The water pump is powerful. 4.4 KW power can lift 60 meters height to fighting fire. It can connect with fire hydrant, also it can sucking water from pool or lake. This vehicle is flexible, fast and convenient to use, suitable for all kinds of roads. It can quickly reach to the fire scene; start the fire fighting at once. Make sure control the spread of the fire source, to achieve the purpose of extinguishment. This is ideal for fire-fighting equipment.
We have the capability of producing 500,000 sets of LUOJIA brand motorcycles from 48cc to 250cc annually. And we have got great fame for our brand. For example, our brand LUOJIA is the top brand in many markets, such as Togo and Myanmar (Burma), one country in West Africa, and another in Southeast Asia.


Hannah over at Ergo Baby gave me the opportunity to give away an awesome Ergo carrier ! After trying the Ergo out for the first time and getting the feel of it I fell in love.. I have had the traditional front carriers before only to be left with sore shoulders and a achy back..No joke..The Ergo baby carrier fits your needs.. The straps adjust so it forms to your shape and you can wear it front,back or side. The carrier sits more on your hips which leaves no strain on your back and shoulders. I was surprised to actually hold my 3 year old with no problem!
My two older kids love to play out side and my 14 month old always stands by the door wanting to go out… I feel so bad as I see his little face staring out the screen door watching the others have fun.. I don't let him out because he can take off in to the street and usually if I go out there I am forced to hold him in my arm the whole time..
Not any more! Now I stick him on my back in the ergo and go out and play with the kids! My toddler loves it and is completely content the whole time.. I also get allot of gardening done with out feeling like he is going to fall out! I just love the support I get from the Ergo!
I went to Disneyland (we go like once a week) and had my toddler in the traditional front carrier (baby Bjorn) my back and shoulders hurt by the time noon hit! That's when I decided to try the Ergo… Went back to Disneyland and was able to hold my toddler on my back the WHOLE day with out PAIN and not only that he was happy the whole time! WOW! Definitely a winner for me!
I also use it for grocery shopping! Before the Ergo grocery shopping was a mess with a 14 month old, 3 and 5 year old.. Normally I would have Caden in the seat of the cart, Lauren in the basket and Ethan would walk.. Well Lauren would eventually have to walk to fit the grocery's in the cart which left her throwing a tantrum.. and no matter how tight I do Cadens belt he ALWAYS finds a way to wiggle his way out which leads him to eventually standing.. Very unsafe.. Grocery stores should offer 5 point harness in there carts!
Now that I have the Ergo Life is a breeze grocery shopping.. I stick Caden on my back in the Ergo, put Lauren in the seat in the cart and Ethan walks..and yes…every one is happy!! No tantrums and no babies standing up in the cart!Ergo has made my life with 3 kids a BREEZE!!! Thank you Ergo!
Using the ERGO baby carrier gives you continuous connection, fabulous feeling of freedom, and security knowing your baby is safe.
The ERGO baby carrier is the best of all the baby carriers on the market. It was designed by Karin Frost and has undergone extensive testing by tens of thousands of parents. Its innovative design makes wearing your baby comfortable for hours at a time, gives you the freedom to remain active and productive in your daily life, and holds your baby secure to your body so you are Hands Free.
ERGObaby's baby carrier design supports a natural sitting position for babies, eliminating compression of the spine and hips that can be caused by unsupported suspension. The baby carrier also balances the baby's weight to parents' hips and shoulders, and alleviates physical stress for the parent.
Want to win this Ergo carrier Pictured Below!! Well here is your chance to get it FREE!!
Wait that's not ALL! Who ever is the 50th commenter will win a Brand new pair of Baby Banz like the ones pictured below!
You were the 50th commenter!
YOU must write a comment for each thing you do for it to count!!!
*And to make this contest a little bit more interesting, sporadically after the contest starts I will be asking questions (once a day) about what I have written about in my blog. Keep an eye out because the questions will be hidden in future posts! I will also be asking some questions in my community! Who ever is the first one to guess it right gets 2 extra entries!!! Sounds Fun right! Have fun!
Contest open to US residents only and you have 48 hours to contact me after the contest ends or else a new winner will be drawn..
There is also a link at the top of my blog that directs you right to the contest!


The Law Offices of Randall T. Longwith, helps individuals throughout Fullerton as they face DUI charges. They are committed to helping their clients maintain their freedoms. They apply their experience to help minimize the negative legal consequences on those that have been charged with DUI.


Hey DDG Readers, and thanks for stopping by to check out my new article. I wanted to take some time to go over my personal take on the new changes that were recently announced by Pokemon as it pertains to the upcoming Championship Season as well as some tips for the newer players on how to remain competitive during a busy life.
Many of us live in areas where competitive play is hard to come by. Every single one of us have responsibilities and obligations that may prevent us from participating as much as we would like. However, it is important to remember that whether you have been in this game for 12 days or 12 years, when a new season starts every single person is on level ground. That is what I love about this game and it is noticeably prevalent in our current standard format. Anyone can come up with excuses or reasons as to why they are not achieving their goals. The best players find ways to overcome these obstacles.
TPCI finally crawled out from under a rock last week to update us on the point structure changes being implemented in the 2016-2017 Championship Season. One of the changes that it seems has caused the most complaining is the updated requirements to receive an invite to the World Championship next August in Anaheim. Last season, 300 Championship Points was all that you needed to obtain an invite. This season, TPCI has bumped that requirement up to 500 Championship Points.
When I first saw this new requirement, I admit that I wasn't overly thrilled. For someone who is currently sitting at their highest Championship Point total ever (6/500), I felt this was an impossible achievement. However, after thinking about things a bit more and reviewing the tournament structure a little closer, my stance has changed completely. First of all, the World Championships are supposed to be an elite event. The best of the best are supposed to be in attendance. 500 Championship Points may seem like a lot, but if you look at the tournament structures a little more closely, it really isn't. The updated requirement simply no longer rewards players for simply "showing up" at events. A player can no longer bank on getting the majority of their points from lowly attended LCs and Cities. Instead, players are going to have to properly plan out their season, do their homework, and perform solidly at a few larger events. This new structure erases laziness, and rewards dedication.
I understand that we all have responsibilities. I really do. I personally have a wife, a 1 year old, and a full-time job. Again, if you want to be considered one of the better competitive players, you will find a way to overcome whatever obstacles stand in your way. Critical thinking is in my opinion the most important attribute of any good Pokemon TCG competitor. If you are someone who doesn't have a lot of time to travel, it is vital that you study the championship point breakdown closely.
Memorize the point payout, take out a planner, and start scheduling out your season. You don't have to attend every event to earn your invite. You just need to take advantage of the free time that you do have. Study the cards, test your builds, and read up on what others are playing. Pokebeach can be a huge asset because they have scans of every card in format. There are loads of great resources out there for new and old players to utilize to learn about what's going on in the format.
If you are looking for a podcast, I have also thoroughly enjoyed The Super Rod Cast (Facebook: https://www.facebook.com/theSuperRodcast/?fref=ts ). They are great for my long drives to work to catch up on ideas of the current format. By researching what's going on in the current format, and studying scans, you should be able to start thinking about ways to tech in those crucial cards to help you cut at tournaments.
Along with the updated points structure. It is also worth noting the TPCI has released their payouts for Regional Events. I'm not going to touch too much on it here because of how much it has already been discussed. The important thing to know is that if you get 1st or 2nd, your rich...if you take 3-8...you get boned.
The most exciting thing about this season would have to be the new Standard format. Ridding ourselves of such a toxic format in which Night March was king means that everyone is on equal ground. This is truly a whole new game. The only thing that separates the good players from the bad players right now is the level of testing that has been done. It seems almost daily right now people are asking what the best deck is in the current format. The answer for that is simple: There isn't one. Sure there are decks that are being played more consistently than others and there are ideas of what the top tier decks are currently in standard, but there is no "meta" or "BDIF" in existence. This is another reason why it is so important to use your time wisely. There is a good chance that the best deck in format hasn't even been discovered yet. With a format that is so wide open, it really is a brand new game where even the newest of players can make an impact.
I was not lucky enough to attend San Francisco Worlds last season. However, everything I heard about it painted the event to be a fiasco. An overcrowded event with poor planning doesn't seem like the best way to end a season. By raising the point requirement to 500cp, Worlds will finally represent the event you work so hard to achieve. Critical thinking will be the key deciding factor on whether or not you will be able to attend this event. Plan your time wisely, due ample amounts of research, and never consider yourself to be the underdog because we are all on a level playing field right now. There is no bad idea because the format literally features tons of decks that can cut at the top tables if they are built right. Write down ideas, build the deck, and test it out. The best players are always looking for ideas and solutions to give themselves every possible advantage. In this format, your level of format will literally determine your season's fate. Best of luck to everyone in their 2016-2017 season, and I look forward to seeing you at the top tables!